Merge pull request #2331 from the1812/preview

Update to v1.12.19
This commit is contained in:
Grant Howard 2021-09-27 22:56:20 +08:00 committed by GitHub
commit 9f4e62f509
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
92 changed files with 1285 additions and 567 deletions

View File

@ -68,6 +68,7 @@
"repo", "repo",
"repost", "repost",
"reposts", "reposts",
"squirtle",
"superchat", "superchat",
"tabindex", "tabindex",
"truetype", "truetype",

View File

@ -26,7 +26,7 @@
**注意事项** **注意事项**
- 近期番剧区改版, 大部分视频功能都不支持番剧. - 近期番剧区改版, 大部分视频功能都不支持番剧.
- 港澳台等地区限定内容一概不支持. - 港澳台等地区限定内容一概不支持.
- 如果你只是来下载视频的, 不需要其他功能, 建议找个专门支持下载的软件/插件. 本脚本的下载视频如果下载失败我可懒得管. - 如果你只是来下载视频的, 不需要其他功能, 建议找个专门支持下载的软件/插件. 本脚本的下载视频就是凑合用用的, 如果下载失败我可懒得管.
- 做好觉悟, 脚本开启后不能使用弹幕点赞和举报, 全景视频不能用鼠标拖拽视角(只能用键盘操作), 对性能也有较大影响. - 做好觉悟, 脚本开启后不能使用弹幕点赞和举报, 全景视频不能用鼠标拖拽视角(只能用键盘操作), 对性能也有较大影响.
- 某些破坏性的大更新会使旧版脚本**完全**无法运行, 请及时检查更新. - 某些破坏性的大更新会使旧版脚本**完全**无法运行, 请及时检查更新.
- 使用 aria2 RPC 时脚本管理器可能会提示"脚本试图访问跨域资源", 请选择"始终允许". - 使用 aria2 RPC 时脚本管理器可能会提示"脚本试图访问跨域资源", 请选择"始终允许".

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -19,6 +19,27 @@
| 时间 | 用户名 | 单号后4位 | 金额 | | 时间 | 用户名 | 单号后4位 | 金额 |
| ------------------- | ------------- | --------- | ------ | | ------------------- | ------------- | --------- | ------ |
| 2021.09.25 13:56:04 | T*n | 3051 | ¥2.55 |
| 2021.09.24 12:03:07 | ** | 7134 | ¥1.66 |
| 2021.09.23 15:46:45 | *涛 | 6217 | ¥1.00 |
| 2021.09.19 23:29:23 | *M | 5595 | ¥5.00 |
| 2021.09.16 22:38:31 | *俊 | 9954 | ¥10.00 |
| 2021.09.12 15:53:40 | 1*2 | 2582 | ¥5.00 |
| 2021.09.12 05:04:22 | Damokles | 0826 | ¥10.00 |
| 2021.09.11 13:49:10 | X*X | 9088 | ¥5.00 |
| 2021.09.11 04:03:50 | 匿名 | 5617 | ¥8.88 |
| 2021.09.08 11:01:34 | *锐 | 2023 | ¥1.00 |
| 2021.09.06 23:37:57 | 匿名 | 7988 | ¥5.00 |
| 2021.09.01 00:15:50 | *沅 | 3822 | ¥2.00 |
| 2021.09.01 00:09:40 | *申 | 7942 | ¥10.00 |
| 2021.08.31 16:02:14 | ChanJohann | 6165 | ¥5.00 |
| 2021.08.30 19:05:11 | superuser | 7591 | ¥10.00 |
| 2021.08.28 23:12:02 | *经 | 4613 | ¥2.00 |
| 2021.08.27 07:54:22 | *喲 | 2626 | ¥1.00 |
| 2021.08.26 16:00:53 | *毅 | 5904 | ¥10.00 |
| 2021.08.23 12:24:30 | *锋 | 5739 | ¥1.50 |
| 2021.08.23 09:49:45 | *原 | 7547 | ¥5.00 |
| 2021.08.22 23:03:13 | *涛 | 4972 | ¥66.00 |
| 2021.08.17 09:37:58 | 匿名 | 0602 | ¥10.00 | | 2021.08.17 09:37:58 | 匿名 | 0602 | ¥10.00 |
| 2021.08.16 20:42:21 | 匿名 | 6994 | ¥1.00 | | 2021.08.16 20:42:21 | 匿名 | 6994 | ¥1.00 |
| 2021.08.16 20:40:53 | 匿名 | 8715 | ¥5.00 | | 2021.08.16 20:40:53 | 匿名 | 8715 | ¥5.00 |

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>(e,t)=>{const r=async()=>{if(dq(".international-home")){const e=await SpinQuery.condition((()=>unsafeWindow["__INITIAL_STATE__"]),(e=>e!==undefined));return dqa(".first-screen .home-slide .item").slice(0,5).map(((t,r)=>{const i=t.querySelector("a").getAttribute("data-loc-id");return{url:e.locsData[i][r].url,title:t.querySelector(".title").textContent.trim(),isAd:Boolean(t.querySelector(".gg-icon,.bypb-icon")),imageUrl:t.querySelector("img").getAttribute("src").replace(/@.+$/,"")}}))}else{const e=dq(".chief-recommend-module .panel");const t=e.querySelector(".pic");const r=e.querySelectorAll(".title > a");return[...t.querySelectorAll("li")].map(((e,t)=>{const i=r[t];return{url:i.getAttribute("href"),title:i.innerText.trim(),isAd:Boolean(i.querySelector(".gg-pic")),imageUrl:e.querySelector("img").getAttribute("src").replace(/@.+$/,"")}}))}};return{export:{getBlackboards:r}}})(); (()=>(s,t)=>{const o=async()=>{const s=4694;const t=`https://api.bilibili.com/x/web-show/res/locs?pf=0&ids=${s}`;const{code:o,message:a,data:e}=await Ajax.getJson(t);if(o!==0){throw new Error(`获取活动卡片失败: ${a}`)}const r=e[s];return r.map((s=>({url:s.url,title:s.name,isAd:s.is_ad_loc,imageUrl:s.pic})))};return{export:{getBlackboards:o}}})();

View File

@ -1 +1 @@
(()=>(a,r)=>{const i=`<div class=blackboards><div class=header><div class=title>活动</div><a class=more href=https://www.bilibili.com/blackboard/x/act_list/ target=_blank><icon type=mdi icon=dots-horizontal></icon>更多</a></div><input class="hidden-input blackboard-radio"type=radio name=blackboard v-for="(b, i) of blackboards":checked="i === 0":id="'blackboard' + i":data-index=i :key=i><div class=blackboard-cards><a class=blackboard-card target=_blank v-for="(b, i) of blackboards":key=i :href=b.url :title=b.title><dpi-img :src=b.imageUrl :alt=b.title :size="{width: 500, height: 250}":root=cardsContainer></dpi-img><div class=title>{{b.title}}</div></a></div><div class=jump-dots><label v-for="(b, i) of blackboards":for="'blackboard' + i":key=i><div class=jump-dot></div></label></div></div>`;r.applyStyleFromText(`.simple-home .blackboards{position:relative;display:grid;grid-template-areas:"header header" "cards cards";grid-template-columns:8px 1fr;grid-template-rows:1fr 250px;row-gap:16px;column-gap:16px;align-self:start}.simple-home .blackboards .jump-dots{position:absolute;top:50%;left:8px;transform:translateY(-50%);grid-area:cards;align-self:center;justify-self:center}.simple-home .blackboards .jump-dots label{display:block}.simple-home .blackboards .jump-dots label:not(:last-child){margin-bottom:6px}.simple-home .blackboards .jump-dots .jump-dot{background-color:#8884;border:1px solid #8888;box-sizing:border-box;width:8px;height:20px;border-radius:8px;cursor:pointer}.simple-home .blackboards .blackboard-cards{grid-area:cards;--blackboard-width:568.5px;--blackboard-height:250px;width:var(--blackboard-width);height:var(--blackboard-height);border-radius:16px;overflow:hidden}.simple-home .blackboards .blackboard-cards .blackboard-card{width:100%;height:100%;position:relative;display:block;transition:.8s cubic-bezier(.44,.29,.13,1)}.simple-home .blackboards .blackboard-cards .blackboard-card img{width:100%;height:100%;object-fit:fill;display:block;border-radius:12px}.simple-home .blackboards .blackboard-cards .blackboard-card .title{position:absolute;bottom:8px;left:50%;transform:translateX(-50%);padding:4px 16px;color:#fff;background-color:#000a;font-size:14px;font-weight:700;border-radius:14px;white-space:nowrap;opacity:0}.simple-home .blackboards .blackboard-cards .blackboard-card:hover .title{opacity:1}`,"blackboard-style");return{export:Object.assign({template:i},{components:{Icon:()=>r.importAsync("icon.vue"),"dpi-img":()=>r.importAsync("dpi-img.vue")},data(){return{blackboards:[],interval:0}},destroyed(){if(this.interval){clearInterval(this.interval)}},computed:{cardsContainer(){return this.$el.querySelector(".blackboard-cards")}},async mounted(){const{getBlackboards:a}=await r.importAsync("blackboard");this.blackboards=(await a()).filter((a=>!a.isAd));const i=dq(".blackboards");this.interval=setInterval((()=>{if(!document.hasFocus()||i.matches(".blackboards:hover")){return}const a=parseInt(dq(`.blackboard-radio:checked`).getAttribute("data-index"));let r;if(a===this.blackboards.length-1){r=0}else{r=a+1}dq(`.blackboard-radio[data-index='${r}']`).checked=true}),5e3)}})}})(); (()=>(a,r)=>{const i=`<div class=blackboards><div class=header><div class=title>活动</div><a class=more href=https://www.bilibili.com/blackboard/x/act_list/ target=_blank><icon type=mdi icon=dots-horizontal></icon>更多</a></div><input class="hidden-input blackboard-radio"type=radio name=blackboard v-for="(b, i) of blackboards":checked="i === 0":id="'blackboard' + i":data-index=i :key=i><div class=blackboard-cards><a class=blackboard-card target=_blank v-for="(b, i) of blackboards":key=i :href=b.url :title=b.title><dpi-img :src=b.imageUrl :alt=b.title :size="{width: 500, height: 250}":root=cardsContainer></dpi-img><div class=title :title=b.title>{{b.title}}</div></a></div><div class=jump-dots><label v-for="(b, i) of blackboards":for="'blackboard' + i":key=i><div class=jump-dot></div></label></div></div>`;r.applyStyleFromText(`.simple-home .blackboards{position:relative;display:grid;grid-template-areas:"header header" "cards cards";grid-template-columns:8px 1fr;grid-template-rows:1fr 250px;row-gap:16px;column-gap:16px;align-self:start}.simple-home .blackboards .jump-dots{position:absolute;left:50%;bottom:0;transform:translateX(-50%);grid-area:cards;align-self:center;justify-self:center;display:flex;align-items:center}.simple-home .blackboards .jump-dots label{display:block;padding:8px 6px;cursor:pointer}.simple-home .blackboards .jump-dots .jump-dot{background-color:#8884;box-sizing:border-box;width:20px;height:8px;border-radius:8px}.simple-home .blackboards .blackboard-cards{display:flex;grid-area:cards;--blackboard-width:350px;--blackboard-height:250px;--image-height:197px;width:var(--blackboard-width);height:var(--blackboard-height);border-radius:16px;overflow:hidden;background-color:#fff;box-shadow:0 4px 8px 0 #0001}body.dark .simple-home .blackboards .blackboard-cards{background-color:#282828}.simple-home .blackboards .blackboard-cards .blackboard-card{flex:0 0 auto;width:100%;height:100%;position:relative;display:block;transition:.8s cubic-bezier(.44,.29,.13,1)}.simple-home .blackboards .blackboard-cards .blackboard-card img{width:100%;height:var(--image-height);object-fit:fill;display:block;border-radius:12px;transition-duration:inherit}.simple-home .blackboards .blackboard-cards .blackboard-card .title{position:absolute;bottom:24px;left:50%;transform:translateX(-50%);padding:0 16px;font-size:14px;font-weight:700;border-radius:14px;max-width:var(--blackboard-width);box-sizing:border-box;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}`,"blackboard-style");return{export:Object.assign({template:i},{components:{Icon:()=>r.importAsync("icon.vue"),"dpi-img":()=>r.importAsync("dpi-img.vue")},data(){return{blackboards:[],interval:0}},destroyed(){if(this.interval){clearInterval(this.interval)}},computed:{cardsContainer(){return this.$el.querySelector(".blackboard-cards")}},async mounted(){const{getBlackboards:a}=await r.importAsync("blackboard");this.blackboards=(await a()).filter((a=>!a.isAd));const i=dq(".blackboards");this.interval=setInterval((()=>{if(!document.hasFocus()||i.matches(".blackboards:hover")){return}const a=parseInt(dq(`.blackboard-radio:checked`).getAttribute("data-index"));let r;if(a===this.blackboards.length-1){r=0}else{r=a+1}dq(`.blackboard-radio[data-index='${r}']`).checked=true}),5e3)}})}})();

View File

@ -15,12 +15,12 @@
"auto-draw.min.js": "303469718E41C156C763AE085FC62B42AEFD654B7E6083DAF111C5D5EE4CA619", "auto-draw.min.js": "303469718E41C156C763AE085FC62B42AEFD654B7E6083DAF111C5D5EE4CA619",
"auto-play.min.js": "67A4735A629EC325009C8F79838FC1A852AB9AF15DFF8A2B60F0F0943DC3A4A9", "auto-play.min.js": "67A4735A629EC325009C8F79838FC1A852AB9AF15DFF8A2B60F0F0943DC3A4A9",
"auto-play-control.min.js": "2133E452091800D15F858CB9C26CE5D6AD3A9B46020EE669C39077843039B358", "auto-play-control.min.js": "2133E452091800D15F858CB9C26CE5D6AD3A9B46020EE669C39077843039B358",
"bangumi-timeline.vue.min.js": "BDC87EB6BE6C5D12DC6E9C75813E5BB2174C4A2D43A657F55874B31A533BAD9C", "bangumi-timeline.vue.min.js": "C24D3F9D45C57ED653F085BA3A9E9B67296F4E1D1E16215D9C5206DB2D48A48C",
"batch-download.min.js": "044D6945486C5C7E76B8E6C2F98973F4D7C554BE0A09DB2055C9030B284C1B78", "batch-download.min.js": "044D6945486C5C7E76B8E6C2F98973F4D7C554BE0A09DB2055C9030B284C1B78",
"batch-warning.min.js": "15A2134D855D9098B9485AA8023B5D98838F67D18FAB414B0C1FCD32F9BD05DD", "batch-warning.min.js": "15A2134D855D9098B9485AA8023B5D98838F67D18FAB414B0C1FCD32F9BD05DD",
"biliplus-redirect.min.js": "EEFF7EE484A8D214E8FA110694E99F8BB62BD7263D1458DC83E7047F4CD6B9D4", "biliplus-redirect.min.js": "EEFF7EE484A8D214E8FA110694E99F8BB62BD7263D1458DC83E7047F4CD6B9D4",
"blackboard.min.js": "1B48B1630D016D3F91B4804FBB73E299696E2BCDB3498FF1191B5A86B48CF9DE", "blackboard.min.js": "09E24A83A4B0AFDC1AFC22CD48E3DB443B557B432C147A9B8E64635983200CB7",
"blackboard.vue.min.js": "4B5AA62C98113E4280DE14B970C1DD60DE73CE40AD6A808FAE891F9ACC9311CF", "blackboard.vue.min.js": "3AA5E607BBB54CC8302741EFDBB03D43CBEEA1DC045A17E9F72C524862033CB2",
"blur-video-control.min.css": "B72FA7AD198ED1C9A9620A83881441F96F9FF3083ED12203A324B9753A7CCFFD", "blur-video-control.min.css": "B72FA7AD198ED1C9A9620A83881441F96F9FF3083ED12203A324B9753A7CCFFD",
"blur-video-control.min.js": "F5C4C5E45BEB5BB671788FB72677FE121D6834C775912D7B1BCFE4A4EAFA599A", "blur-video-control.min.js": "F5C4C5E45BEB5BB671788FB72677FE121D6834C775912D7B1BCFE4A4EAFA599A",
"bpx-player-adaptor.min.js": "CCB4037F9925C7605AB54BE1FD7A9E48BE2493FEE1633E40AE79DF520AAAF3F6", "bpx-player-adaptor.min.js": "CCB4037F9925C7605AB54BE1FD7A9E48BE2493FEE1633E40AE79DF520AAAF3F6",
@ -33,7 +33,7 @@
"collapse-live-side-bar.min.js": "9B4296F88C32FD081E4FD0DD48B4353C243A423446CF1CA047EB3B574D597F80", "collapse-live-side-bar.min.js": "9B4296F88C32FD081E4FD0DD48B4353C243A423446CF1CA047EB3B574D597F80",
"column-image-exporter.min.js": "C8FA96C64E21D0195D95F1B7A5E67EFFC778DD46E2FCB4ACBE69C48E76B5E046", "column-image-exporter.min.js": "C8FA96C64E21D0195D95F1B7A5E67EFFC778DD46E2FCB4ACBE69C48E76B5E046",
"combo-like.min.js": "E32FE23747479132F90C3D66CA6EB78031B4F7388F77CC56668E41B3F05FE954", "combo-like.min.js": "E32FE23747479132F90C3D66CA6EB78031B4F7388F77CC56668E41B3F05FE954",
"comment.min.css": "B713BFCF8A251A65B502C1B522E00DD1D7B085C8F475FD23235F34172B16A9C8", "comment.min.css": "8D8B635B1020DDCCCF748F34B4EEC60CBB409166C53F70800836960B40D0BD05",
"comment.min.js": "1634EEADF5BF2A29E6D39AFDA17804AB2442CDA3BCB0B4D9DBAA6F6E7E965F72", "comment.min.js": "1634EEADF5BF2A29E6D39AFDA17804AB2442CDA3BCB0B4D9DBAA6F6E7E965F72",
"comment-apis.min.js": "D0E6EF724B5C068AD55EE9F740090A782447CE373080848FCA24879FC56E5E8B", "comment-apis.min.js": "D0E6EF724B5C068AD55EE9F740090A782447CE373080848FCA24879FC56E5E8B",
"comment-dark.min.css": "E980508E86203743C36FEE4F7149BFF53961ECBC4EC140E8C162D18D395B940A", "comment-dark.min.css": "E980508E86203743C36FEE4F7149BFF53961ECBC4EC140E8C162D18D395B940A",
@ -44,9 +44,9 @@
"copy-feeds-link.min.js": "36D7C804F088A6C6905CD91C5F9D2D58E20634C7E0814AE03740CCEC790F6BB4", "copy-feeds-link.min.js": "36D7C804F088A6C6905CD91C5F9D2D58E20634C7E0814AE03740CCEC790F6BB4",
"custom-control-background.min.css": "1981FD2BF3B17ECF33F98D5DEDAF0D32ACBE9532A51FDB70822286991AB98EF3", "custom-control-background.min.css": "1981FD2BF3B17ECF33F98D5DEDAF0D32ACBE9532A51FDB70822286991AB98EF3",
"custom-control-background.min.js": "483F57DDD56F5B3A77C9CB35EB7CA191BF34CB6B3EEF5E12A4C10A42ADE563A2", "custom-control-background.min.js": "483F57DDD56F5B3A77C9CB35EB7CA191BF34CB6B3EEF5E12A4C10A42ADE563A2",
"custom-navbar.min.css": "66B12A504E09B5CBAD985668A09887322210A9525279EFF0611290CCDE518ED2", "custom-navbar.min.css": "3ADECA5A15ABD723ADE914BECC5D351A2ACA672A1C02CEA89C3F6AB0044B8A87",
"custom-navbar.min.html": "1F95ABCE9F19727CAF3B48C40E517EA4C2F602E9C2A73BD822B56BF91AB3F631", "custom-navbar.min.html": "1F95ABCE9F19727CAF3B48C40E517EA4C2F602E9C2A73BD822B56BF91AB3F631",
"custom-navbar.min.js": "2A7B441224DE0D9C91A787EE99629D8F59919CB3050FE0B0E246758E1DAE2878", "custom-navbar.min.js": "F82FC5A3A7A794A0F77433DDA5AFADD9B4C72CE97073EC707EF146F040D504E7",
"custom-navbar-activities.min.js": "A7AB41C75EFEF45F3186D5A110629FA98F16C552E3B6F58BA0A735CB86E58547", "custom-navbar-activities.min.js": "A7AB41C75EFEF45F3186D5A110629FA98F16C552E3B6F58BA0A735CB86E58547",
"custom-navbar-blank.min.js": "E8F08DA7CD2C67F9D064B959A64CFC6658103DBCBE2B9B58D978A1742E02D829", "custom-navbar-blank.min.js": "E8F08DA7CD2C67F9D064B959A64CFC6658103DBCBE2B9B58D978A1742E02D829",
"custom-navbar-category.min.js": "F5E2A5D316D372BF43769D20095C4700A3A3E5F63CE3607F17030AF0784F1D34", "custom-navbar-category.min.js": "F5E2A5D316D372BF43769D20095C4700A3A3E5F63CE3607F17030AF0784F1D34",
@ -58,7 +58,7 @@
"custom-navbar-logo.min.js": "CE70A2E60EBDB145FC07D97A1DDABD1077DAA66CE83574B97788216D788BA4C5", "custom-navbar-logo.min.js": "CE70A2E60EBDB145FC07D97A1DDABD1077DAA66CE83574B97788216D788BA4C5",
"custom-navbar-messages.min.js": "17F42493B555476F3F1E4A6BF0E3AD0F0B4D8742F235B0FF60BD450AAA97588E", "custom-navbar-messages.min.js": "17F42493B555476F3F1E4A6BF0E3AD0F0B4D8742F235B0FF60BD450AAA97588E",
"custom-navbar-rank.min.js": "3661DA6EB1485C71FCDC6BA50EF432252AB7019C9398031D4243C679183466E1", "custom-navbar-rank.min.js": "3661DA6EB1485C71FCDC6BA50EF432252AB7019C9398031D4243C679183466E1",
"custom-navbar-search-box.min.js": "93FC05E77233A288D78200DE2824E9766D8D7DC9EFC2A5E724B095C3253E7288", "custom-navbar-search-box.min.js": "E1813FD6A9B597A1E906C91DF4377006227ED50C6ADB1CF411A1779AE0C4F73B",
"custom-navbar-settings.min.js": "B41F2AF7AF10B968472DCF2539E9C530F4117D7D3811378D2DE163536CF31E51", "custom-navbar-settings.min.js": "B41F2AF7AF10B968472DCF2539E9C530F4117D7D3811378D2DE163536CF31E51",
"custom-navbar-simple-link.min.js": "51E2FDD06832E585E86884890D1DC6321A802D43332D7E7B5758A20BC1AB1E03", "custom-navbar-simple-link.min.js": "51E2FDD06832E585E86884890D1DC6321A802D43332D7E7B5758A20BC1AB1E03",
"custom-navbar-subscriptions.min.js": "D99A25DE4ABB104FA95166F51EB4FEE9DFDC4AE162CF189ECBCF99CA2E5E0E6C", "custom-navbar-subscriptions.min.js": "D99A25DE4ABB104FA95166F51EB4FEE9DFDC4AE162CF189ECBCF99CA2E5E0E6C",
@ -69,9 +69,9 @@
"danmaku-converter.min.js": "C54666E9910A927B54051EAB7C3DB6F93C1F6010A47614A619AFD7487C3F7183", "danmaku-converter.min.js": "C54666E9910A927B54051EAB7C3DB6F93C1F6010A47614A619AFD7487C3F7183",
"danmaku-segment.min.js": "43CC3236AFABA89BD0AE24D640809BE333772824E3994541AFC3CDDD9F881613", "danmaku-segment.min.js": "43CC3236AFABA89BD0AE24D640809BE333772824E3994541AFC3CDDD9F881613",
"danmaku-send-bar.min.css": "F309FC17E7657BAA676D446458750D8069051617B44DD3D1457B4A9C519B2ED1", "danmaku-send-bar.min.css": "F309FC17E7657BAA676D446458750D8069051617B44DD3D1457B4A9C519B2ED1",
"danmaku-send-bar.min.js": "3F635F4209092B6BA41865A945496861F4B1E0D9F2D31ABB5C021967B1B9FA19", "danmaku-send-bar.min.js": "7F694676C4A4EA608C02981C2ABC27945270CC89C89F2F1FB66FD01327DD9066",
"dark.min.css": "0406EDF1A0549F6CD7B43D891CE373F395870950DB3E4719234138C3ACE2317C", "dark.min.css": "6BAECA6516337A697B614422A6619D1E018B5A67B2170C9C3A6EB042D4947715",
"dark.user.css": "209259CD8781584CF3B392C67F22DA273E7F15E15FF3113E075E552C98324FBC", "dark.user.css": "50E546B4C7419DC7D89EAE1CE419653F0F7E4C605FDACED8D23BDC5E926EB6C9",
"dark-color-scheme.min.js": "7C89C14ACEE44CCE2E402A63768A3B53251B4B1D82675DD85532AABB8F2082FA", "dark-color-scheme.min.js": "7C89C14ACEE44CCE2E402A63768A3B53251B4B1D82675DD85532AABB8F2082FA",
"dark-important.min.css": "29FAC0857FB4BDF4EAD24582D4984471E80FC83EF9BD9A108B17D5AC5617DE75", "dark-important.min.css": "29FAC0857FB4BDF4EAD24582D4984471E80FC83EF9BD9A108B17D5AC5617DE75",
"dark-navbar.min.css": "7FAD547E326B768904B3739C978DF86FFDDD5E5064FB8F490710D197CCC3018B", "dark-navbar.min.css": "7FAD547E326B768904B3739C978DF86FFDDD5E5064FB8F490710D197CCC3018B",
@ -82,7 +82,7 @@
"default-danmaku-settings.min.js": "901EA05F842932F436F0ABEAC99802D286575F9033CE078AA246FD1453B98998", "default-danmaku-settings.min.js": "901EA05F842932F436F0ABEAC99802D286575F9033CE078AA246FD1453B98998",
"default-live-quality.min.js": "3DE4EC96DE1CB7F187E61B7045EC14EBBF74B1853A990B4FE32372F27D47F4E4", "default-live-quality.min.js": "3DE4EC96DE1CB7F187E61B7045EC14EBBF74B1853A990B4FE32372F27D47F4E4",
"default-player-layout.min.js": "2F018C09DCCB9D0DD671ED4868A1EAC365D63CC51618EE076598C6624E3BEA7E", "default-player-layout.min.js": "2F018C09DCCB9D0DD671ED4868A1EAC365D63CC51618EE076598C6624E3BEA7E",
"default-player-mode.min.js": "97798995F580FC6869CA7AD2A6134EEEC1FCCF4AEA69B7234642D6BF4F1A17DF", "default-player-mode.min.js": "76BBFE1C953134B744ADB70038C0EAA0DD53291B1879555A7513CBDB4411365D",
"default-video-quality.min.js": "20C0F41F683D685CCD22BD91F0EB4C2227146DD5586EB65388EE8FA97F46F7D2", "default-video-quality.min.js": "20C0F41F683D685CCD22BD91F0EB4C2227146DD5586EB65388EE8FA97F46F7D2",
"default-video-speed.min.js": "720B588D410C267C1EE411927C9FC9FBBAE693A6938134416962E7B5A0682D25", "default-video-speed.min.js": "720B588D410C267C1EE411927C9FC9FBBAE693A6938134416962E7B5A0682D25",
"disable-danmaku-highlights.min.js": "1F8C7267B7015ABB737D2457FCCC2E48CC31364E63ACF330770D61B152C9ABC6", "disable-danmaku-highlights.min.js": "1F8C7267B7015ABB737D2457FCCC2E48CC31364E63ACF330770D61B152C9ABC6",
@ -98,7 +98,7 @@
"download-video.min.css": "ABED6E1EE0F75AE64E1698FEF98CE9DF94EBDC707AABE4C305108CA73156C7A5", "download-video.min.css": "ABED6E1EE0F75AE64E1698FEF98CE9DF94EBDC707AABE4C305108CA73156C7A5",
"download-video.min.html": "BBF00C1AE2C6C0FE534F72C9C7D513AB1039E2390C1E5742D452296F52AAA4F3", "download-video.min.html": "BBF00C1AE2C6C0FE534F72C9C7D513AB1039E2390C1E5742D452296F52AAA4F3",
"download-video.min.js": "FC561BFA1B57590209892BDC4AB982F09A7D7B99E91D7A25BDD7316014243E9D", "download-video.min.js": "FC561BFA1B57590209892BDC4AB982F09A7D7B99E91D7A25BDD7316014243E9D",
"dpi-img.vue.min.js": "791188F92FC0FD6257F26F27379A6B4EF3447C04355A6B6EA8B330008A238FCD", "dpi-img.vue.min.js": "006E641C11D51051F13BDE630DBC57E4F9FA58E3F106D6D073FBB7A100E9D222",
"expand-danmaku.min.js": "1D855006799D56AF09697EB8F6488303DB05811E8F3C84298AC08A4FE3A4CFA1", "expand-danmaku.min.js": "1D855006799D56AF09697EB8F6488303DB05811E8F3C84298AC08A4FE3A4CFA1",
"expand-description.min.css": "4B8023CD9C6AFFD65A8FB33F3735480AF1151DC1F3E2AC551442266268A6F873", "expand-description.min.css": "4B8023CD9C6AFFD65A8FB33F3735480AF1151DC1F3E2AC551442266268A6F873",
"expand-description.min.js": "528ED5892BDDE16EAA4F60BD962FCC7A70E0E4E322ED3F798AFC6D72D6C3C99B", "expand-description.min.js": "528ED5892BDDE16EAA4F60BD962FCC7A70E0E4E322ED3F798AFC6D72D6C3C99B",
@ -132,13 +132,13 @@
"full-tweets-title.min.js": "5A32D349D6DDD4F1DE73175D9A0AFE520B316F73A852B2BBE6A0436C8D8CBBB2", "full-tweets-title.min.js": "5A32D349D6DDD4F1DE73175D9A0AFE520B316F73A852B2BBE6A0436C8D8CBBB2",
"gbk.min.js": "0EDFCB94F519365A8CCA9BF3AECE57DC6DB273EF3F41545095B8F03625782F0D", "gbk.min.js": "0EDFCB94F519365A8CCA9BF3AECE57DC6DB273EF3F41545095B8F03625782F0D",
"get-number.min.js": "E644267B8A2DCEF2577BB9270F5C738BCE89C1C128071EBD3645903A930E08E0", "get-number.min.js": "E644267B8A2DCEF2577BB9270F5C738BCE89C1C128071EBD3645903A930E08E0",
"gui-settings.min.css": "1B1D6F4FFE7E3FEB26CB0FD5F19A3EF2F6C9AD7356F2D56660E75DE1061DE201", "gui-settings.min.css": "54ABFAE9B7A91CB8D7D2A6D3FAB844C256DFC2286710D592E85FB9A8479823F2",
"gui-settings.min.html": "ED34D4DF52333541FDF96C47091924E6016655E8DF82D75871E3B99D70F46AC5", "gui-settings.min.html": "93F0A4FA7D83E5E9E71F919D5C26D8413BCDCA51AED0DA4C3D821B3ABACEBB02",
"gui-settings.min.js": "3AF95BAF62666E0C2FE990FB6F15A3A4B459F42F49E04FFF06848CFFEC350B12", "gui-settings.min.js": "7E18926B9A9F0BDFDFD8755EAF237951195DA849835A6C266F15E3A5A191EB40",
"haruna-scale.min.js": "2410662D47006D2AC49FE43DEB85F8D2C1B6F6D353DD767C2F11F7802A81F605", "haruna-scale.min.js": "2410662D47006D2AC49FE43DEB85F8D2C1B6F6D353DD767C2F11F7802A81F605",
"hide-bangumi-reviews.min.js": "0E8D100A27D523008041BAF95B7809855B505F4C02D4EE32CC62917528E46DBE", "hide-bangumi-reviews.min.js": "0E8D100A27D523008041BAF95B7809855B505F4C02D4EE32CC62917528E46DBE",
"hide-bangumi-sponsors.min.js": "61CF35F5F1DDD9BA068196E4D02C8F206178D58A6DFD43DE5024A7AE50A2029D", "hide-bangumi-sponsors.min.js": "61CF35F5F1DDD9BA068196E4D02C8F206178D58A6DFD43DE5024A7AE50A2029D",
"hide-banner.min.css": "68D798C7FE5D4C94B6BA1FB0075EFDFA285EAF1B04D4F54A8D37B031B560994B", "hide-banner.min.css": "FB801F7DD61622B0DFD1AD48AC6B3A5CC649D6A949E677423D957D7BC9FCE762",
"hide-banner.min.js": "1FC0511F83C87E07F2BDE94A10D7AB2F7067E77AC93261D563BB699BECFB035D", "hide-banner.min.js": "1FC0511F83C87E07F2BDE94A10D7AB2F7067E77AC93261D563BB699BECFB035D",
"hide-category.min.css": "2EB4AB96C9EA12E91910AB3F1EAAFD76CFED77890CF2138232388415E1418C46", "hide-category.min.css": "2EB4AB96C9EA12E91910AB3F1EAAFD76CFED77890CF2138232388415E1418C46",
"hide-category.min.js": "343424E56C09D06ECC9CEFEF79B8F780B7E1D9082F1878CF3D35ADD33FA294D6", "hide-category.min.js": "343424E56C09D06ECC9CEFEF79B8F780B7E1D9082F1878CF3D35ADD33FA294D6",
@ -148,13 +148,13 @@
"hide-related-videos.min.js": "B0FF19C6080EB7C3D64C3BFF91FDF68D70FEC4E5445717175E74245A2DEABBB9", "hide-related-videos.min.js": "B0FF19C6080EB7C3D64C3BFF91FDF68D70FEC4E5445717175E74245A2DEABBB9",
"hide-top-search.min.js": "36FF3FCBEC3ABB61E2458AA94C0B9F59224AE38A483B354FB17C671190592892", "hide-top-search.min.js": "36FF3FCBEC3ABB61E2458AA94C0B9F59224AE38A483B354FB17C671190592892",
"home-hidden.min.css": "BF0142F2C96EE72EBC76D5D4909A5CE5BA382C142F19E5E54248A177D9585E99", "home-hidden.min.css": "BF0142F2C96EE72EBC76D5D4909A5CE5BA382C142F19E5E54248A177D9585E99",
"home-hidden.min.js": "5326DE89A99FA3913A89DF7713DACDBB41E3BD89FD46BCDA322535949373FDF3", "home-hidden.min.js": "71B082DFC0EF6C1996FAD37699A4F4F4AF64B7AB691167F5462B2ED13F82206B",
"home-video.vue.min.js": "ACD3918903369692BF0AA0ADBE3E77B8D6B942EA1DAAB7138B362D263E9DC1F4", "home-video.vue.min.js": "ACD3918903369692BF0AA0ADBE3E77B8D6B942EA1DAAB7138B362D263E9DC1F4",
"horizontal-scroll.min.js": "BCD68AB83706669D24A782219F3D45EA0AF0A9C0317309CB003924444452519C", "horizontal-scroll.min.js": "BCD68AB83706669D24A782219F3D45EA0AF0A9C0317309CB003924444452519C",
"i18n.de-DE.min.js": "540CD614C274A80578B8F759B437675ECFEB6C16DF62BA0E39AB113F26C9852F", "i18n.de-DE.min.js": "540CD614C274A80578B8F759B437675ECFEB6C16DF62BA0E39AB113F26C9852F",
"i18n.en-US.min.js": "481D6038EC4EEEE518217B03E32850A339F9D7BC4E55EC471BA5C26B2464D6B1", "i18n.en-US.min.js": "481D6038EC4EEEE518217B03E32850A339F9D7BC4E55EC471BA5C26B2464D6B1",
"i18n.ja-JP.min.js": "8270B398C684EE98459C3C73BC9B2BB8D28E8F2E2E9833AA788C82DA20659830", "i18n.ja-JP.min.js": "8270B398C684EE98459C3C73BC9B2BB8D28E8F2E2E9833AA788C82DA20659830",
"i18n.min.css": "FAA94965C122C7F1DE6DC82C298E50FACE1C8C37256605BD7B3FD4AB56037BCB", "i18n.min.css": "E8D2E9E5231CE9C1AB581FC0C0341057C095B65E635B0B81DF426841AD0E8A47",
"i18n.min.js": "369DC13D72758D1DF42387931D7E0165F22CF05EBB8DC24F800EF463472A1600", "i18n.min.js": "369DC13D72758D1DF42387931D7E0165F22CF05EBB8DC24F800EF463472A1600",
"i18n.zh-TW.min.js": "803F67270809E3258E2B302ADE542B12EF222C83EDC67FB8C68301C5F4E3A1CC", "i18n.zh-TW.min.js": "803F67270809E3258E2B302ADE542B12EF222C83EDC67FB8C68301C5F4E3A1CC",
"icon.vue.min.js": "15324A41E910361F9A245D6B3EB16019075EE460287570CBEA0F12AC71E1F158", "icon.vue.min.js": "15324A41E910361F9A245D6B3EB16019075EE460287570CBEA0F12AC71E1F158",
@ -166,8 +166,8 @@
"index.min.html": "94B83D9EBB9005C1286A7E0759A7683932F8DADA20D07E5E9D8FF867B04D4B95", "index.min.html": "94B83D9EBB9005C1286A7E0759A7683932F8DADA20D07E5E9D8FF867B04D4B95",
"key-binding-presets.min.js": "550BC7B2441DFE4744B54A161207EA4B5DB949AB7B3C377C66F549E710D8CE22", "key-binding-presets.min.js": "550BC7B2441DFE4744B54A161207EA4B5DB949AB7B3C377C66F549E710D8CE22",
"key-bindings.min.js": "88736417D177F7F6173D087441220979B76C63A510BE75E09DF4B27D4DEBFB57", "key-bindings.min.js": "88736417D177F7F6173D087441220979B76C63A510BE75E09DF4B27D4DEBFB57",
"keymap.min.css": "B66149AAE8D4267E413A26F0577C4FCE4C0D13ECBB9B573916FDA8E58099C939", "keymap.min.css": "331DE00E7A7A9B7727CA7F4A1411158477A8EE5EE38E596DEEE9B6ADB4C0B321",
"keymap.min.js": "CE9AB2A4D39F14858C5A29942FB46CD4C65A522660C40D04E3EE45C6A5598B88", "keymap.min.js": "7767C27DE7A8BE8B784D94A876D1CBF3CAC7D209AF8687AE211601C94522B143",
"live-control-bar.min.js": "5AA182EB22062DEB54D727E7B42F6DA8535F982DA303963BA9AD4BE19889467A", "live-control-bar.min.js": "5AA182EB22062DEB54D727E7B42F6DA8535F982DA303963BA9AD4BE19889467A",
"live-pip.min.js": "2112A21139895537DCD4DDA6EC2719B31D312E8C34BBBA690D388FB24200C5D9", "live-pip.min.js": "2112A21139895537DCD4DDA6EC2719B31D312E8C34BBBA690D388FB24200C5D9",
"live-socket.min.js": "8AB690D1979FB64E7BA6126417700C0DD96C0E5C43712543590753B8344996C8", "live-socket.min.js": "8AB690D1979FB64E7BA6126417700C0DD96C0E5C43712543590753B8344996C8",
@ -187,13 +187,14 @@
"no-banner.min.css": "DA096F94E7FA26992F3F71245E704D69A1C222D0ADA6F1990FA5D948507CE15F", "no-banner.min.css": "DA096F94E7FA26992F3F71245E704D69A1C222D0ADA6F1990FA5D948507CE15F",
"no-live-autoplay.min.js": "31917BE96EE9B8F8AC7E5FA17465AC8873ED7BB48AC3A44F4374E79C85363B70", "no-live-autoplay.min.js": "31917BE96EE9B8F8AC7E5FA17465AC8873ED7BB48AC3A44F4374E79C85363B70",
"no-mini-video-autoplay.min.js": "D0738ED56C685C3B02F39C0D1A0694ACE71A07397A59C6FE37CD9BC496592462", "no-mini-video-autoplay.min.js": "D0738ED56C685C3B02F39C0D1A0694ACE71A07397A59C6FE37CD9BC496592462",
"notify-new-version.min.js": "D922DCE08CFD1729BB778885E5EFB905FBE23A2878437AE2E9CF2263C22E196B", "notify-new-version.min.js": "08A418212A8078EE83864E3AED782D597DE8E41AA2E4DD4B7D6FBBF83696B627",
"online-info-row.vue.min.js": "48D42BADAD3F52BAFE20E2810567ED404A82DA78C8B7ECEB97C0D3E76CC61138", "online-info-row.vue.min.js": "A1BE0481CEE968FE2239B05B9473751B4E9931BE5EF40D677E46B3C0ED43C974",
"outer-watchlater.min.css": "BB56A80224F7B37869C17C976C301623C47BBCCDB18F7E009A4F97B6C685C0DC", "outer-watchlater.min.css": "BB56A80224F7B37869C17C976C301623C47BBCCDB18F7E009A4F97B6C685C0DC",
"outer-watchlater.min.js": "5FC13134BBC69E8A1061A33D4BE6ED24508A8093D569B1CF33680AF2DE1BF86E", "outer-watchlater.min.js": "5FC13134BBC69E8A1061A33D4BE6ED24508A8093D569B1CF33680AF2DE1BF86E",
"override-navbar.min.css": "E5AA612841281169CA367A238FB934F807900A385CE2298B7352FF3CA4623757", "override-navbar.min.css": "E5AA612841281169CA367A238FB934F807900A385CE2298B7352FF3CA4623757",
"override-navbar.min.js": "0FF50371A02F47EE384515544EB87D34CEE2DB449B9B864B5627A9645F921DAB", "override-navbar.min.js": "0FF50371A02F47EE384515544EB87D34CEE2DB449B9B864B5627A9645F921DAB",
"pako-inflate.min.js": "1B89766B342D4A561B0CF7D5A68B2900B6D1772E507EEB1AF56FA7CABE40BCEC", "pako-inflate.min.js": "1B89766B342D4A561B0CF7D5A68B2900B6D1772E507EEB1AF56FA7CABE40BCEC",
"player-agent.min.js": "FCD128055BD5414ED97B49E44000D6EE74C1FA181582C1BD7E433BAD5F1B05C0",
"player-context-menu.min.js": "D84439ABC219CBCDF4C431DAA73E799265485F3C5C07AE57F9A251C7CF967E4A", "player-context-menu.min.js": "D84439ABC219CBCDF4C431DAA73E799265485F3C5C07AE57F9A251C7CF967E4A",
"player-focus.min.js": "9A290D6749E68A4A88563983413A296BFA9B5C18B978F9CF80799196AEC0F9EE", "player-focus.min.js": "9A290D6749E68A4A88563983413A296BFA9B5C18B978F9CF80799196AEC0F9EE",
"player-on-top.min.js": "0D9AA8561E97A6FFCEABDA206B6A57EB87C1B3EF5D0D53EDABA3ED5EFB0DF687", "player-on-top.min.js": "0D9AA8561E97A6FFCEABDA206B6A57EB87C1B3EF5D0D53EDABA3ED5EFB0DF687",
@ -202,13 +203,13 @@
"quality-errors.min.js": "A691A407FC4F80C6B2D243CBFADC636FCFFC4DC35B9E305AEF4184AD3ECFC56B", "quality-errors.min.js": "A691A407FC4F80C6B2D243CBFADC636FCFFC4DC35B9E305AEF4184AD3ECFC56B",
"quick-favorite.min.css": "7829AE09EC0F9057C3970CDF4CEADC76A86269C1DA714E7BC64E6D783621076B", "quick-favorite.min.css": "7829AE09EC0F9057C3970CDF4CEADC76A86269C1DA714E7BC64E6D783621076B",
"quick-favorite.min.js": "0E9F058A2843A0D7F860E78E157FAA1A3DA8E63F5E12C2A35D4BFC48E62D284C", "quick-favorite.min.js": "0E9F058A2843A0D7F860E78E157FAA1A3DA8E63F5E12C2A35D4BFC48E62D284C",
"rank-list.vue.min.js": "EC5DDEE0798F779687676E7FDE251FB29A7A0079EACA1994DD73A802C742055F", "rank-list.vue.min.js": "A47750316E45D61F2AA56FDDD08F1D2D715BA103B42C4000D0C348020998737F",
"record-live-danmaku.min.js": "CF1C55683CB20688FAA39B9150144F5C907D8150BF42C1AD2729FB44AB06A604", "record-live-danmaku.min.js": "CF1C55683CB20688FAA39B9150144F5C907D8150BF42C1AD2729FB44AB06A604",
"record-live-danmaku.vue.min.js": "CFBB560D1C9C1D3510A4217E141FEDD4A7F227F3825859BB7F729544A1B86DAC", "record-live-danmaku.vue.min.js": "CFBB560D1C9C1D3510A4217E141FEDD4A7F227F3825859BB7F729544A1B86DAC",
"remember-video-speed.min.js": "207AB95275A06977CE46AE37C5892FB7823A696C67DC40B4B13EAE82DED330C6", "remember-video-speed.min.js": "207AB95275A06977CE46AE37C5892FB7823A696C67DC40B4B13EAE82DED330C6",
"remove-guide-popup.min.js": "801E2EAA47B55CBBF8DF2570781A76C411BB3EA3A8C3A87BB0A8369FF9E6D9EB", "remove-guide-popup.min.js": "801E2EAA47B55CBBF8DF2570781A76C411BB3EA3A8C3A87BB0A8369FF9E6D9EB",
"remove-promotions.min.css": "DE7F28B81D660117F5C515D6F6360CD63F1CAF31AF06DE8BEF492FD3552C4B60", "remove-promotions.min.css": "0BF20D07A075A2F6F2B59A3234B53FCBDC87D4A3640707B604B187D681100758",
"remove-promotions.min.js": "AE5C33D42077619647218BF635B7EBF371966C0245641856E18CD0F4039D225A", "remove-promotions.min.js": "A59D69F284C865B414B63B855EE25EC6614E1205C38267BC76E3C034A1C1751D",
"remove-top-mask.min.js": "AD087C766DF146FDF8DCFF5F98950DBFAA4A43E3848FEEA0EC8D3A0A5CD276EA", "remove-top-mask.min.js": "AD087C766DF146FDF8DCFF5F98950DBFAA4A43E3848FEEA0EC8D3A0A5CD276EA",
"remove-video-popup.min.js": "97E6C386E85D79BFA9FA86422F06FB7723DED0AA25F27A7F94BCFB222AF7865E", "remove-video-popup.min.js": "97E6C386E85D79BFA9FA86422F06FB7723DED0AA25F27A7F94BCFB222AF7865E",
"remove-vote-popup.min.js": "00FB123A3E41AC0EB8D35F1C37E2E6A38C87E6DFD8666488E3A37E8B6B12BABF", "remove-vote-popup.min.js": "00FB123A3E41AC0EB8D35F1C37E2E6A38C87E6DFD8666488E3A37E8B6B12BABF",
@ -229,23 +230,23 @@
"settings-tooltip.loader.min.js": "477DE4B69F477D67BCBC72CE33C91986EB2A5620D6F2D1D8367BBC388C5E3E5C", "settings-tooltip.loader.min.js": "477DE4B69F477D67BCBC72CE33C91986EB2A5620D6F2D1D8367BBC388C5E3E5C",
"settings-tooltip.min.css": "031B4E11744977C54496A3DB0FAB794401DC1FED2E53D9F729DA4218CD98E8D5", "settings-tooltip.min.css": "031B4E11744977C54496A3DB0FAB794401DC1FED2E53D9F729DA4218CD98E8D5",
"settings-tooltip.min.js": "C7F9A79EB623BF58CB81DE4A9E74FC6C2EDB2613403EFE6D09B36FB460159A13", "settings-tooltip.min.js": "C7F9A79EB623BF58CB81DE4A9E74FC6C2EDB2613403EFE6D09B36FB460159A13",
"settings-tooltip.zh-CN.min.js": "0B4B075F32E0ED6E5A73232D318FDFA8DD207B94EDF4ABC3EB636708583FC2DA", "settings-tooltip.zh-CN.min.js": "21CD103B470AC97288304D4471D733E43BD89E82A2D2A6CD4CF70F4D448293D9",
"show-cover-before-play.min.css": "E4050D66F8014029270CB5A4DEFDE2F847B095BA9ED4274BFED3E131B737B06D", "show-cover-before-play.min.css": "E4050D66F8014029270CB5A4DEFDE2F847B095BA9ED4274BFED3E131B737B06D",
"show-cover-before-play.min.js": "5614929DD8CEB3B11D184F037235D91B741AD167B08A4F5B7341C6A50A0838FF", "show-cover-before-play.min.js": "59A0FB3D33643BAA3E11813ABF290B26F286CC4FF19EE0089A90DFE3FE768BCF",
"show-dead-video-title.min.js": "5B968442E71F947F70C57C9FDA083935200CBA9B1038131F1587E70A2B723798", "show-dead-video-title.min.js": "5B968442E71F947F70C57C9FDA083935200CBA9B1038131F1587E70A2B723798",
"simple-home.vue.min.js": "A1036F3AF1D4BB1BBADAC642691D18D158C47FC409BE64B9CB978E32D9E5DCAF", "simple-home.vue.min.js": "EFF4A221F6A94B3AA6FEACF840699B691017B771E532C17963194C21C11DD488",
"simple-home-bangumi-category.vue.min.js": "5E0DBCA5694737CA6FFFEABB28B3FA29716C62355D8FBF14D86C4810BCF53E91", "simple-home-bangumi-category.vue.min.js": "5E0DBCA5694737CA6FFFEABB28B3FA29716C62355D8FBF14D86C4810BCF53E91",
"simple-home-categories.vue.min.js": "1A61EE248042E90865DDD1C23FA3981E551285EF7FC50FB8BA4944582659562E", "simple-home-categories.vue.min.js": "D80410884A163ACAF39C71640B21F69FA0330290ECCFD53A9591FBC777D07684",
"simple-home-feeds.vue.min.js": "5CF5FC40DB715756234B234D955EF8D4B2C127779F8BFA3038141D7EBE68C1D3", "simple-home-feeds.vue.min.js": "5217FE9FCE4C7434BED5FFCEE352935E572F6D950379D4FBF01E4F2AEB9BF8DD",
"simple-home-normal-category.vue.min.js": "354311133748055CB493D2668F8467D5E69B2607CC1F86F09EF8E7C097FAA344", "simple-home-normal-category.vue.min.js": "354311133748055CB493D2668F8467D5E69B2607CC1F86F09EF8E7C097FAA344",
"simplify-home.min.css": "A4D6FDE358B047A88ADF6D7F16207C383439EB1A635F8AF5D8CA7E7A29A59306", "simplify-home.min.css": "80191DE93D093D6F10A49145F39C14211120F2ED1C73F7CA40D63760EFFA3C73",
"simplify-home.min.js": "1E19F28B357C24B9B7F53ADC782DD6D4EEED6751EA879984D967C5FB4C925A9D", "simplify-home.min.js": "1E19F28B357C24B9B7F53ADC782DD6D4EEED6751EA879984D967C5FB4C925A9D",
"simplify-home.vue.min.js": "94BA1874DBB0D5448F3DD12EB822F1AF6AB6C053D5C17F85A54A8DEE07999BF7", "simplify-home.vue.min.js": "2C5AA3B459FF43C040D490AC2A121B56B118722DD6CC299A0EC033657A84F838",
"simplify-liveroom.min.css": "81C475E785347471D10AA6C16A5D74FDAB4BAAE25CEA93247A0B6BF258973D23", "simplify-liveroom.min.css": "270C1FEFD6DDDF65959752C6092761477149E74561C9D40927EADC1657CE6515",
"simplify-liveroom.min.js": "5D3D3D008C7E5D79E6E08F31D0CFB183A2F90E2749AE31BE1CA75B52D63A1A6B", "simplify-liveroom.min.js": "5D3D3D008C7E5D79E6E08F31D0CFB183A2F90E2749AE31BE1CA75B52D63A1A6B",
"skip-charge-list.min.css": "D3C988CE131CEBFAC8A60360529C83EC4AE1B9EA122F9A6924F19963E25A4FE9", "skip-charge-list.min.css": "D3C988CE131CEBFAC8A60360529C83EC4AE1B9EA122F9A6924F19963E25A4FE9",
"skip-charge-list.min.js": "3F89374310F5F7BD66E782C629FEE09FA9E5E15076F17075E871F0E984656157", "skip-charge-list.min.js": "3F89374310F5F7BD66E782C629FEE09FA9E5E15076F17075E871F0E984656157",
"slideshow-cards.vue.min.js": "DCA8626ECE417FCC7792D6A1CEBE3BA3BF86D2CF0E88244239B2320D54A3DAD2", "slideshow-cards.vue.min.js": "A787FF3B86C074173CECF4E58630D1F20AE249F7C15B07EC22F371D0FD423B7E",
"slip.min.js": "407C046F6F04D990F4EFD59AB1A26FC995D8BE277CEA9E50C4621136D46D5875", "slip.min.js": "407C046F6F04D990F4EFD59AB1A26FC995D8BE277CEA9E50C4621136D46D5875",
"subtitle-converter.min.js": "DFE6DC4471D1119B486811BB3D07336EEA90E92D90A67646D5CA2CC1CB43F833", "subtitle-converter.min.js": "DFE6DC4471D1119B486811BB3D07336EEA90E92D90A67646D5CA2CC1CB43F833",
"superchat-translate.min.css": "F4874FE716A750AE0D21DA44393F286E5AABFFA949476E2FA06CDBE2748CF095", "superchat-translate.min.css": "F4874FE716A750AE0D21DA44393F286E5AABFFA949476E2FA06CDBE2748CF095",
@ -259,14 +260,14 @@
"touch-navbar.min.js": "A97A7E536A45DE1DF3F7CC174CF95D855FA6034FB9F7D98B818A7363BADDFE48", "touch-navbar.min.js": "A97A7E536A45DE1DF3F7CC174CF95D855FA6034FB9F7D98B818A7363BADDFE48",
"touch-player.min.css": "63AB17E935430EDB022DF196F6FFC22AE9F29976A764D56E781FAD4D936CF320", "touch-player.min.css": "63AB17E935430EDB022DF196F6FFC22AE9F29976A764D56E781FAD4D936CF320",
"touch-player.min.js": "FDFCB93C336C5FA9C8EE133B8F7CC697DBAD5803BBBDC3D7651802ED4E0A4FC4", "touch-player.min.js": "FDFCB93C336C5FA9C8EE133B8F7CC697DBAD5803BBBDC3D7651802ED4E0A4FC4",
"trending-videos.min.js": "9676C06A5EB98CF9F399CEA04A17E59A31CD40DC710683EA564E82F690ABCB76", "trending-videos.min.js": "48C91D2D5589C2AA7EA112A21F3DEBF012ABAD8C0654396A4039684A52703745",
"trending-videos.vue.min.js": "2BC48041D09F31A1CFB86EB1110CBD3894FD805882739F81C43929848E82B68B", "trending-videos.vue.min.js": "6B72D00C8A04F1B32A5BA0950FBDBFE51BD1F0597DED29B012DB11058BBA8C52",
"tweets.min.css": "9015C1F165C91B9205ABBE4E8A3B5FA83DB1EB4B5CF2442846AF61E44FF178A8", "tweets.min.css": "9015C1F165C91B9205ABBE4E8A3B5FA83DB1EB4B5CF2442846AF61E44FF178A8",
"unfold-feeds.min.js": "586FFB95BF24CA22E68ACE4CC4ABF25F5A2CE84C70D657D0CD62E666C4589B5B", "unfold-feeds.min.js": "586FFB95BF24CA22E68ACE4CC4ABF25F5A2CE84C70D657D0CD62E666C4589B5B",
"url-params-clean.min.js": "AAE0C3DEE0886E0E7B0D5CB117A4103D634358F92626498C03E22F756CE137F8", "url-params-clean.min.js": "AAE0C3DEE0886E0E7B0D5CB117A4103D634358F92626498C03E22F756CE137F8",
"v-checkbox.vue.min.js": "D630823220562A011DDF7164A8D12E775548C6B81907EB6525B3211B822590B1", "v-checkbox.vue.min.js": "D630823220562A011DDF7164A8D12E775548C6B81907EB6525B3211B822590B1",
"v-dropdown.vue.min.js": "3D1D4DC0D8DD06C58C88A530A04DC1D5BEE6690119709B809CD3FA24C8C51C83", "v-dropdown.vue.min.js": "3D1D4DC0D8DD06C58C88A530A04DC1D5BEE6690119709B809CD3FA24C8C51C83",
"video-card.vue.min.js": "E6BD1BA3DA663BF9A2D569570CDB320A24CA2C305F587D04B3CE60136BF7924F", "video-card.vue.min.js": "D2B6151ABD2010C05A5AFE9C9B32124C0D2A263E8386043E4F585E75FF0AD4F9",
"video-card-info.min.js": "D0738ED56C685C3B02F39C0D1A0694ACE71A07397A59C6FE37CD9BC496592462", "video-card-info.min.js": "D0738ED56C685C3B02F39C0D1A0694ACE71A07397A59C6FE37CD9BC496592462",
"video-danmaku.min.js": "225DDECB97C854DC57A857BB7AABE9C490D7EA464C81A4C67780E1684AC30CB1", "video-danmaku.min.js": "225DDECB97C854DC57A857BB7AABE9C490D7EA464C81A4C67780E1684AC30CB1",
"video-dash.min.js": "B731A15492D933AF1CDFBD9EAE09D9264D2B4BCAAE3F5FD2C522ADABD6F1F44B", "video-dash.min.js": "B731A15492D933AF1CDFBD9EAE09D9264D2B4BCAAE3F5FD2C522ADABD6F1F44B",
@ -274,7 +275,7 @@
"video-info.min.js": "A81B4F409A75D818DF23C41A3F2D95E77BD0520DB6C03712F0FE30EAECDF4FBE", "video-info.min.js": "A81B4F409A75D818DF23C41A3F2D95E77BD0520DB6C03712F0FE30EAECDF4FBE",
"video-list.vue.min.js": "D4764DC983B24BB9F5089E0D4AB5CEB89275F181A5ED75364CAEB1DFC44B2726", "video-list.vue.min.js": "D4764DC983B24BB9F5089E0D4AB5CEB89275F181A5ED75364CAEB1DFC44B2726",
"video-speed-common.min.js": "1F8A81026E35390558C8D11EBCDC5455319D83B65EF16F54FD2AD4335E40CFD6", "video-speed-common.min.js": "1F8A81026E35390558C8D11EBCDC5455319D83B65EF16F54FD2AD4335E40CFD6",
"video-speed-controller.min.js": "6E96628C42F92F4C32766D5268EFECF455628000084D277AAEF70F5BE37F91AE", "video-speed-controller.min.js": "07DEB5145EEF3C1899CA865E2458C94BF3B4AC9CDDBE542EDD03B0E10D0535D0",
"video-story.min.js": "DC3811422EE8696E12408E3CA6AD2E3D7068AAC1B0E3577A40C5613BAD5C6467", "video-story.min.js": "DC3811422EE8696E12408E3CA6AD2E3D7068AAC1B0E3577A40C5613BAD5C6467",
"view-cover.min.js": "436B4D6408F375E822BA12CE31FF82CA7ECDF565A2D74AD26FF39DDA342C2C13", "view-cover.min.js": "436B4D6408F375E822BA12CE31FF82CA7ECDF565A2D74AD26FF39DDA342C2C13",
"volume-overdrive.min.js": "10FDFBC393D785195039FD7A66E5E5D3E62BC0E7AC142DC8074CA84A226A48EE", "volume-overdrive.min.js": "10FDFBC393D785195039FD7A66E5E5D3E62BC0E7AC142DC8074CA84A226A48EE",

Binary file not shown.

2
min/comment.min.css vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>(e,t)=>{(async()=>{const{waitForControlBar:e}=await t.importAsync("live-control-bar");let n=false;let a;const l="danmaku-send-bar";e({init:()=>{t.applyStyle("danmakuSendBarStyle")},callback:async e=>{const t=dq(e,".left-area");const s=await SpinQuery.select(".chat-input-ctnr .chat-input");const r=await SpinQuery.select(".chat-input-ctnr ~ .bottom-actions .bl-button--primary");if([t,s,r].some((e=>e===null))){console.warn("[danmakuSendBar] ref elements not found",t===null,s===null,r===null);return}if(dq(e,`.${l}`)){return}if(!a){const e=Vue.extend({template:`\n<div class="${l}">\n<input\n type="text"\n placeholder="发个弹幕呗~"\n :value="value"\n @keydown.enter="send()"\n @input="updateValue($event.target.value)"\n maxlength="30"\n />\n</div>\n`,data(){return{value:s.value}},mounted(){s.addEventListener("input",this.listenChange);s.addEventListener("change",this.listenChange);if(!n){const e=Object.getOwnPropertyDescriptors(HTMLTextAreaElement.prototype).value;Object.defineProperty(s,"value",{...e,set(t){e.set.call(this,t);raiseEvent(s,"input")}});n=true}},beforeDestroy(){s.removeEventListener("input",this.listenChange);s.removeEventListener("change",this.listenChange)},methods:{updateValue(e){s.value=e;raiseEvent(s,"input")},send(){if(!r.disabled){this.value="";r.click()}},listenChange(e){this.value=e.target.value}}});a=(new e).$mount().$el}t.insertAdjacentElement("afterend",a)}})})();return{reload:()=>document.body.classList.remove("danmaku-send-bar-unloaded"),unload:()=>document.body.classList.add("danmaku-send-bar-unloaded")}})(); (()=>(e,t)=>{(async()=>{const{waitForControlBar:e}=await t.importAsync("live-control-bar");let n=false;let a;const l="danmaku-send-bar";e({init:()=>{t.applyStyle("danmakuSendBarStyle")},callback:async e=>{const t=dq(e,".left-area");const r=await SpinQuery.select(".control-panel-ctnr .chat-input-ctnr .chat-input");const s=await SpinQuery.select(".control-panel-ctnr .chat-input-ctnr ~ .bottom-actions .bl-button--primary");if([t,r,s].some((e=>e===null))){console.warn("[danmakuSendBar] ref elements not found",t===null,r===null,s===null);return}if(dq(e,`.${l}`)){return}if(!a){const e=Vue.extend({template:`\n<div class="${l}">\n<input\n type="text"\n placeholder="发个弹幕呗~"\n :value="value"\n @keydown.enter="send()"\n @input="updateValue($event.target.value)"\n maxlength="30"\n />\n</div>\n`,data(){return{value:r.value}},mounted(){r.addEventListener("input",this.listenChange);r.addEventListener("change",this.listenChange);if(!n){const e=Object.getOwnPropertyDescriptors(HTMLTextAreaElement.prototype).value;Object.defineProperty(r,"value",{...e,set(t){e.set.call(this,t);raiseEvent(r,"input")}});n=true}},beforeDestroy(){r.removeEventListener("input",this.listenChange);r.removeEventListener("change",this.listenChange)},methods:{updateValue(e){r.value=e;raiseEvent(r,"input")},send(){if(!s.disabled){this.value="";s.click()}},listenChange(e){this.value=e.target.value}}});a=(new e).$mount().$el}t.insertAdjacentElement("afterend",a)}})})();return{reload:()=>document.body.classList.remove("danmaku-send-bar-unloaded"),unload:()=>document.body.classList.add("danmaku-send-bar-unloaded")}})();

2
min/dark.min.css vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>(e,i)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}const t=[{name:"常规",action:()=>{}},{name:"宽屏",action:async()=>{document.querySelector(".bilibili-player-video-btn-widescreen").click()}},{name:"网页全屏",action:()=>{document.querySelector(".bilibili-player-video-web-fullscreen").click()}},{name:"全屏",action:async()=>{const e=await SpinQuery.condition((()=>document.querySelector(".bilibili-player-video video")),(e=>e!==null&&e.readyState===4&&document.readyState==="complete"&&document.hasFocus()));if(e===null){console.warn("[默认播放器模式] 未能应用全屏模式, 等待超时.");return}document.querySelector(".bilibili-player-video-btn-fullscreen").click()}}];let n=()=>{};let a=()=>{};async function l(){if(e.autoLightOff){await SpinQuery.unsafeJquery();const e=await SpinQuery.any((()=>unsafeWindow.$(".bilibili-player-video-btn-setting")));if(!e){return}e.mouseover().mouseout();const i=async e=>{const i=await SpinQuery.select(".bilibili-player-video-btn-setting-right-others-content-lightoff .bui-checkbox-input");i.checked=e;raiseEvent(i,"change")};n=()=>i(true);a=()=>i(false)}}async function o(){await l();await SpinQuery.condition((()=>$(".bilibili-player-video,.bilibili-player-video-btn-start,.bilibili-player-area")),(e=>e.length===3&&$("video").length>0&&$("video").prop("duration")));const i=dq("video");if(!i){return}const o=t.find((i=>i.name===e.defaultPlayerMode));{const t=()=>{if(o&&$("#bilibiliPlayer[class*=mode-]").length===0){o.action()}};const l=_.get(JSON.parse(localStorage.getItem("bilibili_player_settings")),"video_status.autoplay",false);if(e.applyPlayerModeOnPlay&&!l){i.addEventListener("play",t,{once:true})}else{t()}if(l){n()}i.addEventListener("ended",a);i.addEventListener("pause",a);i.addEventListener("play",n)}}Observer.videoChange(o)})(); (()=>(e,t)=>{if(typeof isEmbeddedPlayer!=="undefined"&&isEmbeddedPlayer()){return}const a=[{name:"常规",action:()=>{}},{name:"宽屏",action:async()=>{const{playerAgent:e}=await t.importAsync("player-agent");await e.widescreen()}},{name:"网页全屏",action:async()=>{const{playerAgent:e}=await t.importAsync("player-agent");await e.webFullscreen()}},{name:"全屏",action:async()=>{const{playerAgent:e}=await t.importAsync("player-agent");const a=await SpinQuery.condition((()=>document.querySelector(e.query.video.element.selector)),(e=>e!==null&&e.readyState===4&&document.readyState==="complete"&&document.hasFocus()));if(a===null){console.warn("[默认播放器模式] 未能应用全屏模式, 等待超时.");return}await e.fullscreen()}}];let n=()=>{};let i=()=>{};async function r(){const{playerAgent:a}=await t.importAsync("player-agent");if(e.autoLightOff){await SpinQuery.unsafeJquery();const e=await a.query.control.buttons.settings();if(!e){return}e.mouseover().mouseout();const t=async e=>{const t=await SpinQuery.select(".bilibili-player-video-btn-setting-right-others-content-lightoff .bui-checkbox-input");t.checked=e;raiseEvent(t,"change")};n=()=>t(true);i=()=>t(false)}}async function o(){await r();const{playerReady:o}=await t.importAsync("player-ready");const{playerAgent:s}=await t.importAsync("player-agent");await o();const c=await s.query.video.element();if(!c){return}const l=a.find((t=>t.name===e.defaultPlayerMode));const y=async()=>{const e=await s.query.bilibiliPlayer();const t=e.getAttribute("data-screen");const a=!e.className.includes("mode-")&&(t===null||t==="normal");if(l&&a){l.action()}};const u=_.get(JSON.parse(localStorage.getItem("bilibili_player_settings")),"video_status.autoplay",false);if(e.applyPlayerModeOnPlay&&!u){c.addEventListener("play",y,{once:true})}else{y()}if(u){n()}c.addEventListener("ended",i);c.addEventListener("pause",i);c.addEventListener("play",n)}Observer.videoChange(o)})();

View File

@ -1 +1 @@
(()=>(t,e)=>{const s=`<img :width=width :height=height :srcset=srcset :src=actualSrc :class="{placeholder: isPlaceholderActive}":style={filter}>`;return{export:Object.assign({template:s},{props:{size:[Object,Number],src:String,blur:Number,root:HTMLElement,rootMargin:String,threshold:Number,placeholderImage:Boolean},data(){return{srcset:null,actualSrc:null,isPlaceholderActive:false}},watch:{size(){this.sourceChange()},src(){this.sourceChange()}},methods:{sourceChange(){if(this.actualSrc===null||this.srcset===null){return}this.calcSrc()},calcSrc(){const t=!this.src||!this.size;this.isPlaceholderActive=t&&this.placeholderImage;if(t){this.srcset=null;if(this.placeholderImage){this.actualSrc=`https://s1.hdslb.com/bfs/static/blive/live-web-center/static/img/no-cover.1ebe4d5.jpg`}else{this.actualSrc=null}return}let e=this.src;if(e.startsWith("http:")){e=e.replace("http:","https:")}if(e.includes("//static.hdslb.com/images/member/noface.gif")){this.srcset=e;this.actualSrc=e;return}this.srcset=getDpiSourceSet(e,this.size);this.actualSrc=e}},mounted(){const t={root:this.root,rootMargin:this.rootMargin||"200px",threshold:this.threshold};const e=new IntersectionObserver((t=>{t.forEach((t=>{if(t.isIntersecting){this.calcSrc();e.disconnect()}}))}),t);e.observe(this.$el)},computed:{width(){if(typeof this.size==="object"&&"width"in this.size){return this.size.width}return null},height(){if(typeof this.size==="object"&&"height"in this.size){return this.size.height}return null},filter(){const t=[];if(this.blur){t.push(`blur(${this.blur}px)`)}return t.join(" ")}}})}})(); (()=>(t,e)=>{const s=`<img :width=width :height=height :srcset=srcset :src=actualSrc :class="{placeholder: isPlaceholderActive}":style={filter}>`;return{export:Object.assign({template:s},{props:{size:[Object,Number],src:String,blur:Number,root:HTMLElement,rootMargin:String,threshold:Number,placeholderImage:Boolean},data(){return{srcset:null,actualSrc:EmptyImageUrl,isPlaceholderActive:false}},watch:{size(){this.sourceChange()},src(){this.sourceChange()}},methods:{sourceChange(){if(this.actualSrc===null||this.srcset===null){return}this.calcSrc()},calcSrc(){const t=!this.src||!this.size;this.isPlaceholderActive=t&&this.placeholderImage;if(t){this.srcset=null;if(this.placeholderImage){this.actualSrc=`https://s1.hdslb.com/bfs/static/blive/live-web-center/static/img/no-cover.1ebe4d5.jpg`}else{this.actualSrc=EmptyImageUrl}return}let e=this.src;if(e.startsWith("http:")){e=e.replace("http:","https:")}if(e.includes("//static.hdslb.com/images/member/noface.gif")){this.srcset=e;this.actualSrc=e;return}this.srcset=getDpiSourceSet(e,this.size);this.actualSrc=e}},mounted(){const t={root:this.root,rootMargin:this.rootMargin||"200px",threshold:this.threshold};const e=new IntersectionObserver((t=>{t.forEach((t=>{if(t.isIntersecting){this.calcSrc();e.disconnect()}}))}),t);e.observe(this.$el)},computed:{width(){if(typeof this.size==="object"&&"width"in this.size){return this.size.width}return null},height(){if(typeof this.size==="object"&&"height"in this.size){return this.size.height}return null},filter(){const t=[];if(this.blur){t.push(`blur(${this.blur}px)`)}return t.join(" ")}}})}})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
#banner_link,.custom-navbar .blur-layer,.z-top-container.has-banner>.header{display:none!important}.b-header-mask-wrp .b-header-mask-bg,div.blur-bg{opacity:0!important}.international-header .bili-banner,.international-home .bili-banner{visibility:hidden!important;height:50px!important;min-height:unset!important} #banner_link,.bili-header__banner,.custom-navbar .blur-layer,.z-top-container.has-banner>.header{display:none!important}.b-header-mask-wrp .b-header-mask-bg,div.blur-bg{opacity:0!important}.international-header .bili-banner,.international-home .bili-banner{visibility:hidden!important;height:50px!important;min-height:unset!important}

View File

@ -1 +1 @@
(()=>(e,n)=>{const i=()=>{if(document.URL==="https://www.bilibili.com/"){return!e.simplifyHome}return document.URL.includes("https://www.bilibili.com/")};const t=[{name:"categories",displayName:"分区栏",style:`\n .bili-header-m>.bili-wrapper {\n visibility: hidden !important;\n height: 18px !important;\n }\n .primary-menu-itnl {\n visibility: hidden !important;\n height: 24px !important;\n padding: 0 !important;\n }\n`},{name:"trends",displayName:"活动/热门视频",style:`\n .first-screen #reportFirst1 { display: none !important; }\n .first-screen .space-between {\n margin-bottom: 0 !important;\n }\n .rcmd-box-wrap { display: none !important; }\n`},{name:"online",displayName:"在线列表",style:`\n .first-screen #reportFirst2 { display: none !important; }\n`},{name:"ext-box",displayName:"电竞赛事",style:`\n .first-screen #reportFirst3 { display: none !important; } `},{name:"special",displayName:"特别推荐",style:`\n #bili_report_spe_rec { display: none !important; }\n`},{name:"contact",displayName:"联系方式",style:`\n .international-footer { display: none !important; }\n`},{name:"elevator",displayName:"右侧分区导航",style:`\n .storey-box .elevator { display: none !important; }\n`}];const s=i=>{if(!e.homeHiddenItems.includes(i.name)){if(i.style){var t;(t=dq(`#home-hidden-style-${i.name}`))===null||t===void 0?void 0:t.remove()}else{document.body.classList.remove(`home-hidden-${i.name}`)}}else{if(i.style){n.applyImportantStyleFromText(i.style,`home-hidden-style-${i.name}`)}else{document.body.classList.add(`home-hidden-${i.name}`)}}};(async()=>{if(!i()){return}const e=(await SpinQuery.condition((()=>dqa(".proxy-box > div")),(e=>e.length>0||document.URL!=="https://www.bilibili.com/"))).map((e=>{var n,i,t;return{name:e.id.replace(/^bili_/,""),displayName:(n=(i=e.querySelector("header .name"))===null||i===void 0?void 0:(t=i.textContent)===null||t===void 0?void 0:t.trim())!==null&&n!==void 0?n:"未知分区"}}));t.push(...e);t.forEach(s);const o=e.map((({name:e})=>`\nbody.home-hidden-${e} .storey-box .proxy-box #bili_${e} {\n display: none !important;\n}\n`.trim())).join("\n");const d=n.import("homeHiddenStyle");n.applyImportantStyleFromText(o+d,"home-hidden-style")})();return{widget:{condition:i,content:`\n<div class="gui-settings-flat-button" style="position: relative" id="home-hidden">\n<i class="mdi mdi-24px mdi-settings"></i>\n<span>首页过滤</span>\n<div class="home-hidden-settings popup">\n<div v-for="item in items" @click="toggle(item)" :key="item.name" class="home-hidden-settings-item" :class="{ 'home-hidden': hiddenItems.includes(item.name) }">\n<i class="mdi mdi-18px mdi-eye"></i>\n<i class="mdi mdi-18px mdi-eye-off"></i>\n {{ item.displayName }}\n</div>\n</div>\n</div>\n`,success:async()=>{const n=dq("#home-hidden");new Vue({el:dq(n,".popup"),data(){return{items:t,hiddenItems:[...e.homeHiddenItems]}},watch:{hiddenItems(n){e.homeHiddenItems=[...n]}},mounted(){const e=this.$el;n.addEventListener("click",(n=>{if(n.target===e||e.contains(n.target)){return}e.classList.toggle("opened")}))},methods:{async toggle(e){const n=this.hiddenItems;const i=n.indexOf(e.name);if(i!==-1){n.splice(i,1)}else{n.push(e.name)}await this.$nextTick();s(e)}}})}}}})(); (()=>(e,n)=>{const i=()=>{if(document.URL==="https://www.bilibili.com/"){return!e.simplifyHome}return document.URL.includes("https://www.bilibili.com/")};const t=[{name:"categories",displayName:"分区栏",style:`\n .bili-header-m>.bili-wrapper {\n visibility: hidden !important;\n height: 18px !important;\n }\n .primary-menu-itnl {\n visibility: hidden !important;\n height: 24px !important;\n padding: 0 !important;\n }\n .bili-header__channel {\n height: 12px !important;\n }\n .bili-header__channel > * {\n display: none !important;\n }\n`},{name:"trends",displayName:"活动/热门视频",style:`\n .first-screen #reportFirst1 { display: none !important; }\n .first-screen .space-between {\n margin-bottom: 0 !important;\n }\n .bili-layout .bili-grid:first-child,\n .rcmd-box-wrap {\n display: none !important;\n }\n`},{name:"online",displayName:"在线列表(旧版)",style:`\n .first-screen #reportFirst2 { display: none !important; }\n`},{name:"ext-box",displayName:"赛事(旧版)",style:`\n .first-screen #reportFirst3 { display: none !important; } `},{name:"special",displayName:"特别推荐(旧版)",style:`\n #bili_report_spe_rec { display: none !important; }\n`},{name:"contact",displayName:"联系方式",style:`\n .bili-footer .b-footer-wrap,\n .international-footer {\n display: none !important;\n }\n`},{name:"elevator",displayName:"右侧分区导航(旧版)",style:`\n .storey-box .elevator { display: none !important; }\n`}];const o=i=>{if(!e.homeHiddenItems.includes(i.name)){if(i.style){var t;(t=dq(`#home-hidden-style-${i.name}`))===null||t===void 0?void 0:t.remove()}else{document.body.classList.remove(`home-hidden-${i.name}`)}}else{if(i.style){n.applyImportantStyleFromText(i.style,`home-hidden-style-${i.name}`)}else{document.body.classList.add(`home-hidden-${i.name}`)}}};(async()=>{if(!i()){return}const e=(async()=>{const e=getCookieValue("i-wanna-go-back")==="-1";const n=document.URL!=="https://www.bilibili.com/";if(!e){var i;const e=await SpinQuery.condition((()=>dqa(".proxy-box > div")),(e=>e.length>0||n));return(i=e===null||e===void 0?void 0:e.map((e=>{var n,i,t;return{name:e.id.replace(/^bili_/,""),displayName:(n=(i=e.querySelector("header .name"))===null||i===void 0?void 0:(t=i.textContent)===null||t===void 0?void 0:t.trim())!==null&&n!==void 0?n:"未知分区"}})))!==null&&i!==void 0?i:[]}else{var t;const e=["推广"];const i=await SpinQuery.condition((()=>dqa(".bili-grid .the-world")),(e=>e.length>3||n));console.log(i);const o=e=>{let n=e;while(n.parentElement){if(n.classList.contains("bili-grid")){return n}n=n.parentElement}return null};return(t=i===null||i===void 0?void 0:i.filter((n=>!e.includes(n.id))).map((e=>{const n=o(e);const i=e.id;if(n){n.dataset.area=i;return{name:i,displayName:i}}return null})).filter((e=>e!==null)))!==null&&t!==void 0?t:[]}})();const a=await e;t.push(...a);t.forEach(o);const s=a.map((({name:e})=>`\nbody.home-hidden-${e} .bili-layout .bili-grid[data-area="${e}"],\nbody.home-hidden-${e} .storey-box .proxy-box #bili_${e} {\n display: none !important;\n}\n`.trim())).join("\n");const d=n.import("homeHiddenStyle");n.applyImportantStyleFromText(s+d,"home-hidden-style")})();return{widget:{condition:i,content:`\n<div class="gui-settings-flat-button" style="position: relative" id="home-hidden">\n<i class="mdi mdi-24px mdi-settings"></i>\n<span>首页过滤</span>\n<div class="home-hidden-settings popup">\n<div v-for="item in items" @click="toggle(item)" :key="item.name" class="home-hidden-settings-item" :class="{ 'home-hidden': hiddenItems.includes(item.name) }">\n<i class="mdi mdi-18px mdi-eye"></i>\n<i class="mdi mdi-18px mdi-eye-off"></i>\n {{ item.displayName }}\n</div>\n</div>\n</div>\n`,success:async()=>{const n=dq("#home-hidden");new Vue({el:dq(n,".popup"),data(){return{items:t,hiddenItems:[...e.homeHiddenItems]}},watch:{hiddenItems(n){e.homeHiddenItems=[...n]}},mounted(){const e=this.$el;n.addEventListener("click",(n=>{if(n.target===e||e.contains(n.target)){return}e.classList.toggle("opened")}))},methods:{async toggle(e){const n=this.hiddenItems;const i=n.indexOf(e.name);if(i!==-1){n.splice(i,1)}else{n.push(e.name)}await this.$nextTick();o(e)}}})}}}})();

2
min/i18n.min.css vendored

File diff suppressed because one or more lines are too long

2
min/keymap.min.css vendored
View File

@ -1 +1 @@
.keymap-tip-container{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);padding:8px 16px;background-color:#000a;color:#fff;pointer-events:none;opacity:0;z-index:100;display:flex;align-items:center;font-size:14pt;border-radius:4px;transition:.2s ease-out}.keymap-tip-container.show{opacity:1}.keymap-tip-container i{line-height:1;margin-right:8px;font-size:18pt}.bilibili-player .bilibili-player-area .bilibili-player-video-wrap .bilibili-player-volumeHint{background-color:#000a;color:#fff}.bilibili-player .bilibili-player-area .bilibili-player-video-wrap .bilibili-player-volumeHint-icon{line-height:1} .keymap-tip-container{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);padding:8px 16px;background-color:#000a;color:#fff;pointer-events:none;opacity:0;z-index:150;display:flex;align-items:center;font-size:14pt;border-radius:4px;transition:.2s ease-out}.keymap-tip-container.show{opacity:1}.keymap-tip-container i{line-height:1;margin-right:8px;font-size:18pt}.bilibili-player .bilibili-player-area .bilibili-player-video-wrap .bilibili-player-volumeHint{background-color:#000a;color:#fff}.bilibili-player .bilibili-player-area .bilibili-player-video-wrap .bilibili-player-volumeHint-icon{line-height:1}

2
min/keymap.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>(e,t)=>{const n={less:-1,equal:0,greater:1,incomparable:NaN};class s{constructor(e){if(!/^[\d\.]+$/.test(e)){throw new Error("Invalid version string")}this.parts=e.split(".").map((e=>parseInt(e)));this.versionString=e}compareTo(e){for(let t=0;t<this.parts.length;++t){if(e.parts.length===t){return n.greater}if(this.parts[t]===e.parts[t]){continue}if(this.parts[t]>e.parts[t]){return n.greater}return n.less}if(this.parts.length!==e.parts.length){return n.less}return n.equal}greaterThan(e){return this.compareTo(e)===n.greater}lessThan(e){return this.compareTo(e)===n.less}equals(e){return this.compareTo(e)===n.equal}}let r;async function i(){if(typeof offlineData!=="undefined"||isIframe()){return false}if(e.lastNewVersionCheck!==undefined){const t=Number(new Date);const n=t-e.lastNewVersionCheck;if(n<e.newVersionCheckInterval){return false}}try{const t=GM.info.script.name.match(/Bilibili Evolved \((.*)\)/);const n=t?"."+t[1].replace(/ /g,"-").toLowerCase():"";const i=n===".preview";r=`https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@${i?"preview":"master"}/bilibili-evolved${n}.user.js`;let a;try{const e=await Ajax.monkey({url:r});a=e.match(/@version[ ]*([\d\.]+)/)[1]}catch(e){a=await Ajax.monkey({url:Resource.cdnRoot||Resource.root+"version.txt"})}const o=new s(a);const l=new s(e.currentVersion);const c=o.greaterThan(l);if(c){const e=`新版本<span>${o.versionString}</span>已发布. <a id="new-version-link" class="link" href="${r}">安装</a><a class="link" target="_blank" href="https://github.com/the1812/Bilibili-Evolved/releases">查看</a>`;const t=Toast.info(e,"检查更新");SpinQuery.select("#new-version-link").then((e=>e.addEventListener("click",(()=>{t&&t.dismiss()}))))}return c}catch(e){return false}finally{e.lastNewVersionCheck=Number(new Date)}}const a=i();return{widget:{content:`\n<button class="gui-settings-flat-button" id="new-version-update">\n<a href="${r}" style="display:none"></a>\n<i class="icon-update"></i>\n<span>安装更新</span>\n</button>\n<button class="gui-settings-flat-button" id="new-version-info">\n<a target="blank" style="display:none" href="https://github.com/the1812/Bilibili-Evolved/releases"></a>\n<i class="icon-info"></i>\n<span>查看更新</span>\n</button>\n`,condition:()=>a,success:()=>{document.querySelector("#new-version-update").addEventListener("click",(e=>{if(e.target.nodeName.toLowerCase()!=="a"){document.querySelector("#new-version-update a").click()}}));document.querySelector("#new-version-info").addEventListener("click",(e=>{if(e.target.nodeName.toLowerCase()!=="a"){document.querySelector("#new-version-info a").click()}}))}}}})(); (()=>(e,t)=>{const n={less:-1,equal:0,greater:1,incomparable:NaN};class s{constructor(e){if(!/^[\d\.]+$/.test(e)){throw new Error("Invalid version string")}this.parts=e.split(".").map((e=>parseInt(e)));this.versionString=e}compareTo(e){for(let t=0;t<this.parts.length;++t){if(e.parts.length===t){return n.greater}if(this.parts[t]===e.parts[t]){continue}if(this.parts[t]>e.parts[t]){return n.greater}return n.less}if(this.parts.length!==e.parts.length){return n.less}return n.equal}greaterThan(e){return this.compareTo(e)===n.greater}lessThan(e){return this.compareTo(e)===n.less}equals(e){return this.compareTo(e)===n.equal}}let i;async function r(){if(typeof offlineData!=="undefined"||isIframe()){return false}if(e.lastNewVersionCheck!==undefined){const t=Number(new Date);const n=t-e.lastNewVersionCheck;if(n<e.newVersionCheckInterval){return false}}try{const t=GM.info.script.name.match(/Bilibili Evolved \((.*)\)/);const n=t?"."+t[1].replace(/ /g,"-").toLowerCase():"";const r=n===".preview";i=`https://cdn.jsdelivr.net/gh/the1812/Bilibili-Evolved@${r?"preview":"master"}/bilibili-evolved${n}.user.js`;let a;try{const e=await Ajax.monkey({url:i});a=e.match(/@version[ ]*([\d\.]+)/)[1]}catch(e){a=await Ajax.monkey({url:Resource.cdnRoot||Resource.root+"version.txt"})}const o=new s(a);if(o.parts[0]>=2&&!e.noNotifyV2){const t=`新版本<span>${o.versionString}</span>已发布, 请前往项目的<a class="link" target="_blank" href="https://github.com/the1812/Bilibili-Evolved/releases">更新日志</a>或者<a class="link" target="_blank" href="https://github.com/the1812/Bilibili-Evolved/discussions">讨论区</a>了解如何安装和使用. <a class="link" href="javascript:void(0)" id="no-notify-v2">不再提示</a>`;const n=Toast.info(t,"检查更新");SpinQuery.select("#no-notify-v2").then((t=>t.addEventListener("click",(()=>{e.noNotifyV2=true;n&&n.dismiss()}))));return false}const l=new s(e.currentVersion);const c=o.greaterThan(l);if(c){const e=`新版本<span>${o.versionString}</span>已发布. <a id="new-version-link" class="link" href="${i}">安装</a><a class="link" target="_blank" href="https://github.com/the1812/Bilibili-Evolved/releases">查看</a>`;const t=Toast.info(e,"检查更新");SpinQuery.select("#new-version-link").then((e=>e.addEventListener("click",(()=>{t&&t.dismiss()}))))}return c}catch(e){return false}finally{e.lastNewVersionCheck=Number(new Date)}}const a=r();return{widget:{content:`\n<button class="gui-settings-flat-button" id="new-version-update">\n<a href="${i}" style="display:none"></a>\n<i class="icon-update"></i>\n<span>安装更新</span>\n</button>\n<button class="gui-settings-flat-button" id="new-version-info">\n<a target="blank" style="display:none" href="https://github.com/the1812/Bilibili-Evolved/releases"></a>\n<i class="icon-info"></i>\n<span>查看更新</span>\n</button>\n`,condition:()=>a,success:()=>{document.querySelector("#new-version-update").addEventListener("click",(e=>{if(e.target.nodeName.toLowerCase()!=="a"){document.querySelector("#new-version-update a").click()}}));document.querySelector("#new-version-info").addEventListener("click",(e=>{if(e.target.nodeName.toLowerCase()!=="a"){document.querySelector("#new-version-info a").click()}}))}}}})();

File diff suppressed because one or more lines are too long

1
min/player-agent.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
#home_popularize .adpos,#home_popularize .l-con,#reportFirst2 .extension,#slide_ad,.ad-report,.bili-header-m .nav-menu .nav-con .nav-item .text-red,.bilibili-player-promote-wrap,.bypb-window .operate-card,.gg-floor-module,.gg-window .operate-card,.home-app-download,.home-content .ad-panel,.international-home .banner-card,.mascot,.mobile-link-l,.rank-container .cm-module,.recommend-list .rec-list>:not(.video-page-card),.v-wrap .vcd,.video-page-game-card,.video-page-special-card,body.remove-game-match-module #reportFirst3,body.remove-game-match-module .bili-wrapper>.home-match,body:not(.preserve-event-banner) .activity-m{display:none!important}.recommend-list .rec-list>:not(.video-page-card)+.video-page-card{padding-top:0!important}#home_popularize{position:relative!important}.gg-window .online,.popularize-module .online{position:absolute!important;top:50%!important;right:.5%!important;transform:translateY(-100%)!important}.gg-window .online{right:0!important;padding:0 16px!important}#reportFirst2{position:relative;margin-bottom:4px}.blocked{width:440px;height:220px;display:flex;color:#888;background-color:#8882;font-size:24pt;font-weight:700;align-items:center;justify-content:space-evenly}.blocked.new{width:100%;height:100%;background-color:#eee}body.dark .blocked.new{background-color:#333}body.compact .blocked{width:480px;height:240px} #home_popularize .adpos,#home_popularize .l-con,#reportFirst2 .extension,#slide_ad,.ad-report,.bili-header-m .nav-menu .nav-con .nav-item .text-red,.bilibili-player-promote-wrap,.bypb-window .operate-card,.eva-banner,.eva-extension-area,.gg-floor-module,.gg-window .operate-card,.home-app-download,.home-content .ad-panel,.international-home .banner-card,.mascot,.mobile-link-l,.rank-container .cm-module,.recommend-list .rec-list>:not(.video-page-card),.v-wrap .vcd,.video-page-game-card,.video-page-special-card,body.remove-game-match-module #reportFirst3,body.remove-game-match-module .bili-wrapper>.home-match,body:not(.preserve-event-banner) .activity-m{display:none!important}.recommend-list .rec-list>:not(.video-page-card)+.video-page-card{padding-top:0!important}#home_popularize{position:relative!important}.gg-window .online,.popularize-module .online{position:absolute!important;top:50%!important;right:.5%!important;transform:translateY(-100%)!important}.gg-window .online{right:0!important;padding:0 16px!important}#reportFirst2{position:relative;margin-bottom:4px}.blocked{width:440px;height:220px;display:flex;color:#888;background-color:#8882;font-size:24pt;font-weight:700;align-items:center;justify-content:space-evenly}.blocked.new{width:100%;height:100%;background-color:#eee}body.dark .blocked.new{background-color:#333}body.compact .blocked{width:480px;height:240px}

View File

@ -1 +1 @@
(()=>(e,n)=>{if(document.URL.replace(window.location.search,"")==="https://www.bilibili.com/"){SpinQuery.any((()=>dqa(".gg-pic")),(n=>{n.forEach((n=>{const t=n.parentElement;t.style.display="none";const l=[...t.parentElement.childNodes].indexOf(t)+1;const i=t.parentElement.parentElement.querySelector(`.pic li:nth-child(${l})`);if(i){i.style.display="flex";const n=i.querySelector("a:not(.more-text)");n.insertAdjacentHTML("afterend",`\n<div class="blocked">${e.showBlockedAdsTip?"🚫已屏蔽广告":""}</div>\n`);n.style.visibility="hidden";i.querySelector("a.more-text").style.display="none";i.querySelector("img").style.display="none"}}))}));SpinQuery.select(".focus-carousel.home-slide").then((n=>{if(!n){return}[...n.querySelectorAll(".gg-icon,.bypb-icon")].map((e=>e.parentElement.parentElement)).forEach((n=>{n.style.display="none";n.insertAdjacentHTML("afterend",`\n<div class="blocked new">${e.showBlockedAdsTip?"🚫已屏蔽广告":""}</div>\n`)}))}))}addSettingsListener("preserveEventBanner",(e=>{document.body.classList.toggle("preserve-event-banner",e)}),true)})(); (()=>(e,n)=>{if(document.URL.replace(window.location.search,"")==="https://www.bilibili.com/"){SpinQuery.select(".eva-extension-area").then((e=>{e.parentElement.style.margin="12px"}));SpinQuery.any((()=>dqa(".gg-pic")),(n=>{n.forEach((n=>{const t=n.parentElement;t.style.display="none";const l=[...t.parentElement.childNodes].indexOf(t)+1;const i=t.parentElement.parentElement.querySelector(`.pic li:nth-child(${l})`);if(i){i.style.display="flex";const n=i.querySelector("a:not(.more-text)");n.insertAdjacentHTML("afterend",`\n<div class="blocked">${e.showBlockedAdsTip?"🚫已屏蔽广告":""}</div>\n`);n.style.visibility="hidden";i.querySelector("a.more-text").style.display="none";i.querySelector("img").style.display="none"}}))}));SpinQuery.select(".focus-carousel.home-slide").then((n=>{if(!n){return}[...n.querySelectorAll(".gg-icon,.bypb-icon")].map((e=>e.parentElement.parentElement)).forEach((n=>{n.style.display="none";n.insertAdjacentHTML("afterend",`\n<div class="blocked new">${e.showBlockedAdsTip?"🚫已屏蔽广告":""}</div>\n`)}))}))}addSettingsListener("preserveEventBanner",(e=>{document.body.classList.toggle("preserve-event-banner",e)}),true)})();

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>(e,o)=>{const t={include:["//www.bilibili.com/video/","//www.bilibili.com/bangumi/"]};const n="showCoverBeforePlayStyle";let r;const i=()=>{if(t.include.every((e=>!document.URL.includes(e)))){return}o.applyStyle(n);const e=()=>document.body.style.removeProperty("--cover-url");const i=HTMLVideoElement.prototype.play;HTMLVideoElement.prototype.play=function(...o){e();return i.call(this,...o)};const l=async()=>{const e=await SpinQuery.select((()=>unsafeWindow.aid));if(!e){console.warn("[播放前显示封面] 未找到av号");return}const{cid:t}=unsafeWindow;if(t===r||!t){return}r=t;const{VideoInfo:n}=await o.importAsync("video-info");const i=new n(e);await i.fetchInfo();document.body.style.setProperty("--cover-url",`url('${i.coverUrl}')`)};Observer.videoChange(l)};i();return{reload:()=>o.applyStyle(n),unload:()=>o.removeStyle(n)}})(); (()=>(e,o)=>{const n={include:["//www.bilibili.com/video/","//www.bilibili.com/bangumi/"]};const t="showCoverBeforePlayStyle";let i;const r=()=>{if(n.include.every((e=>!document.URL.includes(e)))){return}o.applyStyle(t);const e=()=>document.body.style.removeProperty("--cover-url");const r=unsafeWindow.__ENABLE_WASM_PLAYER__||dq("bwp-video");const c=r?BwpElement.prototype:HTMLVideoElement.prototype;const l=c.play;c.play=function(...o){e();return l.call(this,...o)};const s=async()=>{const e=await SpinQuery.select((()=>unsafeWindow.aid));if(!e){console.warn("[播放前显示封面] 未找到av号");return}const{cid:n}=unsafeWindow;if(n===i||!n){return}i=n;const{VideoInfo:t}=await o.importAsync("video-info");const r=new t(e);await r.fetchInfo();document.body.style.setProperty("--cover-url",`url('${r.coverUrl}')`)};Observer.videoChange(s)};r();return{reload:()=>o.applyStyle(t),unload:()=>o.removeStyle(t)}})();

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>(e,t)=>{const a=`<div class=feeds><div class=header><div class=tabs><div class=title>动态</div><div class=tab v-for="tab in tabs":key=tab.type @click=changeTab(tab) :class="{active: currentTab === tab}"><div class=tab-name>{{tab.name}}</div></div></div><div class=grow></div><a class=online target=_blank href=https://www.bilibili.com/video/online.html>在线列表</a><div class=grow></div><div class=page><div class=prev-page @click=scroll(-1)><icon type=extended icon=left-arrow></icon></div><div class=next-page @click=scroll(1)><icon type=extended icon=right-arrow></icon></div></div><a class=more href=//t.bilibili.com/ target=_blank><icon type=home icon=activity></icon>全部动态</a></div><div class=contents ref=contents><div class=card-wrapper v-for="card in feedCards":key=card.id><video-card :data=card orientation=vertical></video-card></div><div class=empty v-if="feedCards.length === 0">没有动态哦(´・_・\`)</div></div></div>`;t.applyStyleFromText(`.simple-home.snap .feeds .contents{scroll-snap-type:x mandatory}.simple-home .feeds{justify-self:start;display:flex;flex-direction:column}.simple-home .feeds .header,.simple-home .feeds .sub-header{grid-area:unset;margin-bottom:16px;padding:0 8px}.simple-home .feeds .header .page,.simple-home .feeds .sub-header .page{margin-right:8px;display:flex;align-items:center}.simple-home .feeds .header .page>*,.simple-home .feeds .sub-header .page>*{display:flex;align-items:center;justify-content:center;padding:4px;background-color:#8882;border-radius:50%;margin-left:8px;cursor:pointer}.simple-home .feeds .header .page>:hover,.simple-home .feeds .sub-header .page>:hover{background-color:#8884}.simple-home .feeds .header .page .prev-page .be-icon,.simple-home .feeds .sub-header .page .prev-page .be-icon{transform:translateX(-1px)}.simple-home .feeds .header .page .next-page .be-icon,.simple-home .feeds .sub-header .page .next-page .be-icon{transform:translateX(1px)}.simple-home .feeds .header .tab:nth-child(2),.simple-home .feeds .sub-header .tab:nth-child(2){margin-left:32px}.simple-home .feeds .header .grow,.simple-home .feeds .sub-header .grow{flex-grow:1}.simple-home .feeds .header .online,.simple-home .feeds .sub-header .online{padding:8px 16px;height:32px;border-radius:16px;background-color:#8882;color:inherit;font-size:12px;display:flex;align-items:center;box-sizing:border-box}.simple-home .feeds .contents{display:flex;overflow:auto;--card-width:200px;--card-height:250px;--card-count:4;width:calc((var(--card-width) + 16px) * var(--card-count));padding-bottom:16px;scrollbar-width:none!important;min-height:calc(var(--card-height) + 16px)}@media screen and (max-width:900px){.simple-home .feeds .contents{--card-count:3}}@media screen and (min-width:1100px){.simple-home .feeds .contents{--card-count:3}}@media screen and (min-width:1300px){.simple-home .feeds .contents{--card-count:4}}@media screen and (min-width:1550px){.simple-home .feeds .contents{--card-count:5}}@media screen and (min-width:1850px){.simple-home .feeds .contents{--card-count:6}}.simple-home .feeds .contents::-webkit-scrollbar{width:0!important;height:0!important}.simple-home .feeds .contents .card-wrapper{padding:0 8px;scroll-snap-align:start;flex-shrink:0}.simple-home .feeds .contents .empty{display:flex;align-items:center;justify-content:center;width:100%;font-size:16px}`,"simple-home-feeds-style");const s=[{name:"视频",type:"video",url:"https://t.bilibili.com/?tab=8"},{name:"番剧",type:"bangumi",url:"https://t.bilibili.com/?tab=512"}];return{export:Object.assign({template:a},{components:{VideoCard:()=>t.importAsync("video-card.vue"),Icon:()=>t.importAsync("icon.vue")},data(){return{online:"--",tabs:s,currentTab:s[0],feedCards:[]}},watch:{currentTab(e){this.updateFeedCards(e)}},methods:{async updateFeedCards(e){const{getVideoFeeds:a}=await t.importAsync("feeds-apis");this.feedCards=await a(e.type)},changeTab(e){if(this.currentTab===e){open(e.url,"_blank")}else{this.currentTab=e}},scroll(e){const t=this.$refs.contents;const a=getComputedStyle(t);const s=parseFloat(a.getPropertyValue("--card-count"));const i=parseFloat(a.getPropertyValue("--card-width"));const d=16;const n=s*(i+d);t.scrollBy(e*n,0)}},async mounted(){this.updateFeedCards(this.currentTab);let e;addSettingsListener("simpleHomeWheelScroll",(async a=>{if(a){const a=this.$refs.contents;const{enableHorizontalScroll:s}=await t.importAsync("horizontal-scroll");e=s(a)}else{e&&e()}}),true)}})}})(); (()=>(e,t)=>{const s=`<div class=feeds><div class=header><div class=tabs><div class=title>动态</div><div class=tab v-for="tab in tabs":key=tab.type @click=changeTab(tab) :class="{active: currentTab === tab}"><div class=tab-name>{{tab.name}}</div></div></div><div class=grow></div><a class=online target=_blank href=https://www.bilibili.com/video/online.html>在线列表</a><div class=grow></div><div class=page><div class=prev-page @click=scroll(-1)><icon type=extended icon=left-arrow></icon></div><div class=next-page @click=scroll(1)><icon type=extended icon=right-arrow></icon></div></div><a class=more href=//t.bilibili.com/ target=_blank><icon type=home icon=activity></icon>全部动态</a></div><div class="contents edge-gradient"ref=contents @scroll=checkScrollPosition :class="{ 'is-bottom': isBottom }"><div class=card-wrapper v-for="card in feedCards":key=card.id><video-card :data=card orientation=vertical></video-card></div><div class=empty v-if="feedCards.length === 0">没有动态哦(´・_・\`)</div></div></div>`;t.applyStyleFromText(`.simple-home.snap .feeds .contents{scroll-snap-type:x mandatory}.simple-home .feeds{justify-self:start;display:flex;flex-direction:column}.simple-home .feeds .header,.simple-home .feeds .sub-header{grid-area:unset;margin-bottom:16px;padding:0 8px}.simple-home .feeds .header .page,.simple-home .feeds .sub-header .page{margin-right:8px;display:flex;align-items:center}.simple-home .feeds .header .page>*,.simple-home .feeds .sub-header .page>*{display:flex;align-items:center;justify-content:center;padding:4px;background-color:#8882;border-radius:50%;margin-left:8px;cursor:pointer}.simple-home .feeds .header .page>:hover,.simple-home .feeds .sub-header .page>:hover{background-color:#8884}.simple-home .feeds .header .page .prev-page .be-icon,.simple-home .feeds .sub-header .page .prev-page .be-icon{transform:translateX(-1px)}.simple-home .feeds .header .page .next-page .be-icon,.simple-home .feeds .sub-header .page .next-page .be-icon{transform:translateX(1px)}.simple-home .feeds .header .tab:nth-child(2),.simple-home .feeds .sub-header .tab:nth-child(2){margin-left:32px}.simple-home .feeds .header .grow,.simple-home .feeds .sub-header .grow{flex-grow:1}.simple-home .feeds .header .online,.simple-home .feeds .sub-header .online{padding:8px 16px;height:32px;border-radius:16px;background-color:#8882;color:inherit;font-size:12px;display:flex;align-items:center;box-sizing:border-box}.simple-home .feeds .contents{display:flex;overflow:auto;--card-width:200px;--card-height:250px;--card-count:4;width:calc((var(--card-width) + 16px) * var(--card-count));scrollbar-width:none!important;min-height:calc(var(--card-height) + 16px)}@media screen and (max-width:900px){.simple-home .feeds .contents{--card-count:3}}@media screen and (min-width:1100px){.simple-home .feeds .contents{--card-count:3}}@media screen and (min-width:1300px){.simple-home .feeds .contents{--card-count:4}}@media screen and (min-width:1550px){.simple-home .feeds .contents{--card-count:5}}@media screen and (min-width:1850px){.simple-home .feeds .contents{--card-count:6}}.simple-home .feeds .contents::-webkit-scrollbar{width:0!important;height:0!important}.simple-home .feeds .contents .card-wrapper{padding:0 8px;scroll-snap-align:start;flex-shrink:0}.simple-home .feeds .contents .empty{display:flex;align-items:center;justify-content:center;width:100%;font-size:16px}`,"simple-home-feeds-style");const i=[{name:"视频",type:"video",url:"https://t.bilibili.com/?tab=8"},{name:"番剧",type:"bangumi",url:"https://t.bilibili.com/?tab=512"}];return{export:Object.assign({template:s},{components:{VideoCard:()=>t.importAsync("video-card.vue"),Icon:()=>t.importAsync("icon.vue")},data(){return{online:"--",isBottom:false,tabs:i,currentTab:i[0],feedCards:[]}},watch:{currentTab(e){this.updateFeedCards(e)}},methods:{async updateFeedCards(e){const{getVideoFeeds:s}=await t.importAsync("feeds-apis");this.feedCards=await s(e.type)},changeTab(e){if(this.currentTab===e){open(e.url,"_blank")}else{this.currentTab=e}},scroll(e){const t=this.$refs.contents;const s=getComputedStyle(t);const i=parseFloat(s.getPropertyValue("--card-count"));const a=parseFloat(s.getPropertyValue("--card-width"));const o=16;const d=i*(a+o);t.scrollBy(e*d,0)},checkScrollPosition:_.debounce((function e(t){const s=t.target;this.isBottom=s.scrollWidth-s.scrollLeft===s.clientWidth}),200)},async mounted(){this.updateFeedCards(this.currentTab);let e;addSettingsListener("simpleHomeWheelScroll",(async s=>{if(s){const s=this.$refs.contents;const{enableHorizontalScroll:i}=await t.importAsync("horizontal-scroll");e=i(s)}else{e&&e()}}),true)}})}})();

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
#app>.bili-header-m.stardust-common>.bili-wrapper,#app>.bili-wrapper,#app>.elevator-module,.bili-header-m .head-banner .head-content .head-logo,.international-footer,.international-header .b-wrap,.international-home>:not(.international-header){position:fixed;visibility:hidden;top:100vh;left:0;height:0!important;padding:0!important;margin:0!important} #app>.bili-header-m.stardust-common>.bili-wrapper,#app>.bili-wrapper,#app>.elevator-module,#i_cecream .bili-header__channel,#i_cecream>:not(.bili-header),.bili-header-m .head-banner .head-content .head-logo,.international-footer,.international-header .b-wrap,.international-home>:not(.international-header){position:fixed;visibility:hidden;top:100vh;left:0;height:0!important;padding:0!important;margin:0!important}

View File

@ -1 +1 @@
(()=>(e,o)=>{const m=`<div class=simplify-home><component class=simplify-home-component :is=activeComponent></component></div>`;o.applyStyleFromText(`.simplify-home{padding-top:32px;display:flex;align-items:flex-start;justify-content:center;min-height:100vh;background-color:#f4f4f4;font-size:12px}body.dark .simplify-home{background-color:#181818}.simplify-home .simplify-home-component{max-width:100%}html{scroll-behavior:smooth}`,"simplify-home-style");return{export:Object.assign({template:m},{components:{"minimal-home":()=>o.importAsync("minimal-home.vue"),"simple-home":()=>o.importAsync("simple-home.vue")},computed:{activeComponent(){return this.homeStyle==="清爽"?"simple-home":"minimal-home"}},props:{homeStyle:String}})}})(); (()=>(m,e)=>{const o=`<div class=simplify-home><component class=simplify-home-component :is=activeComponent></component></div>`;e.applyStyleFromText(`.simplify-home{padding:32px 72px 0;display:flex;align-items:flex-start;justify-content:center;min-height:100vh;--simplify-home-background:#f4f4f4;background-color:var(--simplify-home-background);font-size:12px}body.dark .simplify-home{--simplify-home-background:#181818}.simplify-home .simplify-home-component{max-width:100%}html{scroll-behavior:smooth}`,"simplify-home-style");return{export:Object.assign({template:o},{components:{"minimal-home":()=>e.importAsync("minimal-home.vue"),"simple-home":()=>e.importAsync("simple-home.vue")},computed:{activeComponent(){return this.homeStyle==="清爽"?"simple-home":"minimal-home"}},props:{homeStyle:String}})}})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
(()=>(t,e)=>{const a=async()=>{const{isVideoCardBlocked:t}=await e.importAsync("feeds-apis");if(!unsafeWindow.__INITIAL_STATE__){throw new Error("unsafeWindow.__INITIAL_STATE__ not available")}if(unsafeWindow.__INITIAL_STATE__.recommendData){return unsafeWindow.__INITIAL_STATE__.recommendData.item.map((t=>({id:t.id,aid:t.id,bvid:t.bvid,description:t.desc,duration:t.duration,durationText:formatDuration(t.duration),coverUrl:t.pic.replace("http:","https:"),title:t.title,playCount:formatCount(t.stat.view),upName:t.owner.name,upFaceUrl:t.owner.face.replace("http:","https:")}))).filter((e=>!t(e)))}return unsafeWindow.__INITIAL_STATE__.recommendList.map((t=>({id:t.aid,aid:t.aid,bvid:t.bvid,timestamp:t.ctime*1e3,time:new Date(t.ctime*1e3),description:t.desc,duration:t.duration,durationText:formatDuration(t.duration),coverUrl:t.pic.replace("http:","https:"),title:t.title,coins:formatCount(t.stat.coin),danmakuCount:formatCount(t.stat.danmaku),like:formatCount(t.stat.like),playCount:formatCount(t.stat.view),upName:t.owner.name,upFaceUrl:t.owner.face.replace("http:","https:")}))).filter((e=>!t(e)))};return{export:{getTrendingVideos:a}}})(); (()=>(t,e)=>{const i=async()=>{const{isVideoCardBlocked:i}=await e.importAsync("feeds-apis");const o="https://api.bilibili.com/x/web-interface/index/top/rcmd?fresh_type=0&version=1";const a=Boolean(getUID())&&t.simpleHomePersonalized;const n=a?"getJsonWithCredentials":"getJson";const{code:r,message:s,data:d}=await Ajax[n](o);if(r!==0){throw new Error(`获取${a?"推荐":"热门"}视频失败: ${s}`)}const p=d.item;return p.map((t=>{const e={id:t.id,aid:t.id,bvid:t.bvid,coverUrl:t.pic.replace("http:","https:"),title:t.title,description:"",duration:t.duration,durationText:formatDuration(t.duration),timestamp:t.pubdate*1e3,time:new Date(t.pubdate*1e3),upName:t.owner.name,upID:t.owner.mid,upFaceUrl:t.owner.face.replace("http:","https:"),like:formatCount(t.stat.like),playCount:formatCount(t.stat.view)};return e})).filter((t=>!i(t)))};return{export:{getTrendingVideos:i}}})();

View File

@ -1 +1 @@
(()=>(e,n)=>{const t=`<div class=trendings><div class=header><div class=title>热门</div><div class=page><div class=prev-page @click=scroll(-1)><icon type=extended icon=left-arrow></icon></div><div class=next-page @click=scroll(1)><icon type=extended icon=right-arrow></icon></div></div></div><div class=contents ref=contents><div class=card-wrapper v-for="card in trendingCards":key=card.id><video-card :data=card orientation=vertical></video-card></div></div></div>`;n.applyStyleFromText(`.simple-home .trendings{display:flex;flex-direction:column}.simple-home .trendings .header{padding:0 8px}.simple-home .trendings .header .page{display:flex;align-items:center}.simple-home .trendings .header .page>*{display:flex;align-items:center;justify-content:center;padding:4px;background-color:#8882;border-radius:50%;margin-left:8px;cursor:pointer}.simple-home .trendings .header .page>:hover{background-color:#8884}.simple-home .trendings .header .page .prev-page .be-icon{transform:translateX(-1px)}.simple-home .trendings .header .page .next-page .be-icon{transform:translateX(1px)}.simple-home .trendings .contents{--card-width:200px;--card-height:250px;--card-count:3;margin-top:16px;display:flex;overflow:auto;height:calc(var(--card-height) + 16px);width:calc((var(--card-width) + 16px) * var(--card-count));scrollbar-width:none!important}@media screen and (max-width:1300px) and (min-width:900px){.simple-home .trendings .contents{--card-count:2}}@media screen and (max-width:1100px) and (min-width:900px){.simple-home .trendings .contents{--card-count:4}}@media screen and (min-width:1550px){.simple-home .trendings .contents{--card-count:4}}@media screen and (min-width:1850px){.simple-home .trendings .contents{--card-count:5}}.simple-home .trendings .contents::-webkit-scrollbar{width:0!important;height:0!important}.simple-home .trendings .contents .card-wrapper{padding:0 8px;scroll-snap-align:start;flex-shrink:0}`,"trending-videos-style");return{export:Object.assign({template:t},{components:{VideoCard:()=>n.importAsync("video-card.vue"),Icon:()=>n.importAsync("icon.vue")},data(){return{trendingCards:[]}},methods:{scroll(e){const n=this.$refs.contents;const t=getComputedStyle(n);const i=parseFloat(t.getPropertyValue("--card-count"));const r=parseFloat(t.getPropertyValue("--card-width"));const a=16;const s=i*(r+a);n.scrollBy(e*s,0)}},async created(){const{getTrendingVideos:e}=await n.importAsync("trending-videos");this.trendingCards=await e()},async mounted(){let e;addSettingsListener("simpleHomeWheelScroll",(async t=>{if(t){const t=this.$refs.contents;const{enableHorizontalScroll:i}=await n.importAsync("horizontal-scroll");e=i(t)}else{e&&e()}}),true);const t=this.$refs.contents;await SpinQuery.condition((()=>t),(()=>t.childElementCount>0));n.applyImportantStyleFromText(`\n .simple-home.snap .trendings .contents {\n scroll-snap-type: x mandatory;\n }\n`,"trending-videos-snap-fix")}})}})(); (()=>(e,t)=>{const n=`<div class=trendings><div class=header><div class=title>{{ trendingTitle }}</div><div class=page><div v-if=personalized class=refresh @click=refreshCards><icon type=mdi icon=refresh></icon></div><div class=prev-page @click=scroll(-1)><icon type=extended icon=left-arrow></icon></div><div class=next-page @click=scroll(1)><icon type=extended icon=right-arrow></icon></div></div></div><div class="contents edge-gradient"ref=contents @scroll=checkScrollPosition :class="{ 'is-bottom': isBottom }"><div class=card-wrapper v-for="card in trendingCards":key=card.id><video-card :data=card orientation=vertical></video-card></div></div></div>`;t.applyStyleFromText(`.simple-home .trendings{display:flex;flex-direction:column}.simple-home .trendings .header{padding:0 8px}.simple-home .trendings .header .page{display:flex;align-items:center}.simple-home .trendings .header .page>*{display:flex;align-items:center;justify-content:center;padding:4px;background-color:#8882;border-radius:50%;margin-left:8px;cursor:pointer}.simple-home .trendings .header .page>:hover{background-color:#8884}.simple-home .trendings .header .page .prev-page .be-icon{transform:translateX(-1px)}.simple-home .trendings .header .page .next-page .be-icon{transform:translateX(1px)}.simple-home .trendings .header .page .refresh .be-icon{transition-duration:.5s;transform:scale(.9)}.simple-home .trendings .header .page .refresh:hover .be-icon{transform:scale(.9) rotate(360deg)}.simple-home .trendings .contents{--card-width:200px;--card-height:250px;--card-count:4;margin-top:16px;display:flex;overflow:auto;height:calc(var(--card-height) + 16px);width:calc((var(--card-width) + 16px) * var(--card-count));scrollbar-width:none!important}@media screen and (max-width:1300px) and (min-width:900px){.simple-home .trendings .contents{--card-count:3}}@media screen and (max-width:1100px) and (min-width:900px){.simple-home .trendings .contents{--card-count:5}}@media screen and (min-width:1550px){.simple-home .trendings .contents{--card-count:5}}@media screen and (min-width:1850px){.simple-home .trendings .contents{--card-count:6}}.simple-home .trendings .contents::-webkit-scrollbar{width:0!important;height:0!important}.simple-home .trendings .contents .card-wrapper{padding:0 8px;scroll-snap-align:start;flex-shrink:0}`,"trending-videos-style");return{export:Object.assign({template:n},{components:{VideoCard:()=>t.importAsync("video-card.vue"),Icon:()=>t.importAsync("icon.vue")},data(){const t=getUID()&&e.simpleHomePersonalized;return{personalized:t,isBottom:false,trendingTitle:t?"推荐":"热门",trendingCards:[]}},methods:{async refreshCards(){const{getTrendingVideos:e}=await t.importAsync("trending-videos");this.trendingCards=await e()},scroll(e){const t=this.$refs.contents;const n=getComputedStyle(t);const i=parseFloat(n.getPropertyValue("--card-count"));const r=parseFloat(n.getPropertyValue("--card-width"));const s=16;const o=i*(r+s);t.scrollBy(e*o,0)},checkScrollPosition:_.debounce((function e(t){const n=t.target;this.isBottom=n.scrollWidth-n.scrollLeft===n.clientWidth}),200)},async created(){await this.refreshCards()},async mounted(){let e;addSettingsListener("simpleHomeWheelScroll",(async n=>{if(n){const n=this.$refs.contents;const{enableHorizontalScroll:i}=await t.importAsync("horizontal-scroll");e=i(n)}else{e&&e()}}),true);const n=this.$refs.contents;await SpinQuery.condition((()=>n),(()=>n.childElementCount>0));t.applyImportantStyleFromText(`\n .simple-home.snap .trendings .contents {\n scroll-snap-type: x mandatory;\n }\n`,"trending-videos-snap-fix")}})}})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
// ==UserScript== // ==UserScript==
// @name Bilibili Evolved (Preview) // @name Bilibili Evolved (Preview)
// @version 1.12.16 // @version 1.12.19
// @description Bilibili Evolved 的预览版, 可以抢先体验新功能. // @description Bilibili Evolved 的预览版, 可以抢先体验新功能.
// @author Grant Howard, Coulomb-G // @author Grant Howard, Coulomb-G
// @copyright 2021, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G) // @copyright 2021, Grant Howard (https://github.com/the1812) & Coulomb-G (https://github.com/Coulomb-G)

View File

@ -494,6 +494,7 @@ Resource.manifest = {
simplifyHome: '简化首页', simplifyHome: '简化首页',
simplifyHomeStyle: '首页风格', simplifyHomeStyle: '首页风格',
simpleHomeWheelScroll: '允许横向滚动', simpleHomeWheelScroll: '允许横向滚动',
simpleHomePersonalized: '个性化推荐',
}, },
dropdown: { dropdown: {
key: 'simplifyHomeStyle', key: 'simplifyHomeStyle',

View File

@ -165,6 +165,11 @@ export const settings = {
doubleClickFullscreenPreventSingleClick: false, doubleClickFullscreenPreventSingleClick: false,
simplifyHome: false, simplifyHome: false,
simplifyHomeStyle: '清爽', simplifyHomeStyle: '清爽',
simpleHomeCategoryOrders: { ...simpleHomeCategoryDefaultOrders },
simpleHomeBangumiLayout: '时间表',
simpleHomeWheelScroll: true,
simpleHomePersonalized: true,
simpleHomeLayoutFill: true,
minimalHomeSettings: { minimalHomeSettings: {
showSearch: true, showSearch: true,
backgroundImage: '', backgroundImage: '',
@ -193,17 +198,12 @@ export const settings = {
defaultMedalID: 0, defaultMedalID: 0,
autoMatchMedal: false, autoMatchMedal: false,
customStyles: [], customStyles: [],
simpleHomeCategoryOrders: { ...simpleHomeCategoryDefaultOrders },
simpleHomeBangumiLayout: '时间表',
simpleHomeWheelScroll: true,
keymapJumpSeconds: 85, keymapJumpSeconds: 85,
urlParamsClean: true, urlParamsClean: true,
collapseLiveSideBar: true, collapseLiveSideBar: true,
noDarkOnMember: true, noDarkOnMember: true,
feedsTranslate: false,
feedsTranslateProvider: 'Bing', feedsTranslateProvider: 'Bing',
feedsTranslateLanguage: '', feedsTranslateLanguage: '',
commentsTranslate: false,
downloadVideoQuality: 120, downloadVideoQuality: 120,
defaultLiveQuality: '原画', defaultLiveQuality: '原画',
foregroundColorMode: '自动', foregroundColorMode: '自动',
@ -225,7 +225,7 @@ export const settings = {
quickFavoriteID: 0, quickFavoriteID: 0,
bilibiliSimpleNewHomeCompatible: false, bilibiliSimpleNewHomeCompatible: false,
disableFeedsDetails: true, disableFeedsDetails: true,
elegantScrollbar: true, elegantScrollbar: !navigator.platform.toLowerCase().includes('mac'),
danmakuSendBar: false, danmakuSendBar: false,
watchLaterRedirectNavbar: true, watchLaterRedirectNavbar: true,
watchLaterRedirectPage: true, watchLaterRedirectPage: true,
@ -262,9 +262,12 @@ export const settings = {
scrollOutPlayerAutoLightOn: true, scrollOutPlayerAutoLightOn: true,
disableDanmakuHighlights: false, disableDanmakuHighlights: false,
disableUpDanmakuStyle: false, disableUpDanmakuStyle: false,
noNotifyV2: false,
cache: {}, cache: {},
} }
const fixedSettings = { const fixedSettings = {
feedsTranslate: false,
commentsTranslate: false,
seedsToCoins: false, seedsToCoins: false,
autoSeedsToCoins: false, autoSeedsToCoins: false,
lastSeedsToCoinsDate: 0, lastSeedsToCoinsDate: 0,

View File

@ -173,12 +173,13 @@ export const getDpiSourceSet = (src, baseSize, forceExtension = '') => {
}).join(",") }).join(",")
} }
export const isOffline = () => typeof offlineData !== 'undefined' export const isOffline = () => typeof offlineData !== 'undefined'
export const getUID = () => document.cookie.replace(/(?:(?:^|.*;\s*)DedeUserID\s*\=\s*([^;]*).*$)|^.*$/, '$1') export const getCookieValue = (name) => document.cookie.replace(new RegExp(`(?:(?:^|.*;\\s*)${name}\\s*\\=\\s*([^;]*).*$)|^.*$`), '$1')
export const getUID = () => getCookieValue('DedeUserID')
export const scriptVersion = (() => { export const scriptVersion = (() => {
const match = GM.info.script.name.match(/Evolved \((.*)\)/) const match = GM.info.script.name.match(/Evolved \((.*)\)/)
return match ? match[1] : 'Stable' return match ? match[1] : 'Stable'
})() })()
export const getCsrf = () => document.cookie.replace(/(?:(?:^|.*;\s*)bili_jct\s*\=\s*([^;]*).*$)|^.*$/, '$1') export const getCsrf = () => getCookieValue('bili_jct')
export const formatCount = (count) => { export const formatCount = (count) => {
if (typeof count === 'string') { if (typeof count === 'string') {
count = parseInt(count) count = parseInt(count)

16
src/global.d.ts vendored
View File

@ -193,10 +193,10 @@ declare global {
} }
interface Document { interface Document {
pictureInPictureElement: HTMLElement | null pictureInPictureElement: HTMLElement | null
exitPictureInPicture: () => void
} }
interface HTMLVideoElement { const BwpElement: {
requestPictureInPicture: () => void new(): HTMLVideoElement
prototype: HTMLVideoElement
} }
class SpinQuery { class SpinQuery {
static condition<T>(query: () => T, condition: (queryResult: T) => boolean, success: (queryResult: T) => void, failed?: () => void): void static condition<T>(query: () => T, condition: (queryResult: T) => boolean, success: (queryResult: T) => void, failed?: () => void): void
@ -422,6 +422,11 @@ declare global {
doubleClickFullscreenPreventSingleClick: boolean doubleClickFullscreenPreventSingleClick: boolean
simplifyHome: boolean, simplifyHome: boolean,
simplifyHomeStyle: '清爽' | '极简', simplifyHomeStyle: '清爽' | '极简',
simpleHomeCategoryOrders: SimpleHomeCategoryOrders,
simpleHomeBangumiLayout: '时间表' | '动态',
simpleHomeWheelScroll: boolean,
simpleHomePersonalized: boolean,
simpleHomeLayoutFill: boolean,
minimalHomeSettings: { minimalHomeSettings: {
showSearch: boolean, showSearch: boolean,
backgroundImage: string, backgroundImage: string,
@ -451,9 +456,6 @@ declare global {
defaultMedalID: number, defaultMedalID: number,
autoMatchMedal: boolean, autoMatchMedal: boolean,
customStyles: CustomStyle[], customStyles: CustomStyle[],
simpleHomeCategoryOrders: SimpleHomeCategoryOrders,
simpleHomeBangumiLayout: '时间表' | '动态',
simpleHomeWheelScroll: boolean,
keymapJumpSeconds: number, keymapJumpSeconds: number,
urlParamsClean: boolean, urlParamsClean: boolean,
collapseLiveSideBar: boolean, collapseLiveSideBar: boolean,
@ -525,6 +527,7 @@ declare global {
scrollOutPlayerAutoLightOn: boolean, scrollOutPlayerAutoLightOn: boolean,
disableDanmakuHighlights: boolean, disableDanmakuHighlights: boolean,
disableUpDanmakuStyle: boolean, disableUpDanmakuStyle: boolean,
noNotifyV2: boolean,
} }
const GM_info: MonkeyInfo const GM_info: MonkeyInfo
function GM_xmlhttpRequest(details: MonkeyXhrDetails): { abort: () => void } function GM_xmlhttpRequest(details: MonkeyXhrDetails): { abort: () => void }
@ -571,6 +574,7 @@ declare global {
const descendingSort: <T>(itemProp: (item: T) => number) => (a: T, b: T) => number const descendingSort: <T>(itemProp: (item: T) => number) => (a: T, b: T) => number
const getDpiSourceSet: (src: string, baseSize: number | string | { width?: number | string, height?: number | string }, extension?: string) => string const getDpiSourceSet: (src: string, baseSize: number | string | { width?: number | string, height?: number | string }, extension?: string) => string
const isOffline: () => boolean const isOffline: () => boolean
const getCookieValue: (name: string) => string
const getUID: () => string const getUID: () => string
const getCsrf: () => string const getCsrf: () => string
const formatCount: (count: number | string) => string const formatCount: (count: number | string) => string

View File

@ -10,8 +10,8 @@
}, },
callback: async controlBar => { callback: async controlBar => {
const leftController = dq(controlBar, '.left-area') as HTMLDivElement const leftController = dq(controlBar, '.left-area') as HTMLDivElement
const originalTextArea = await SpinQuery.select('.chat-input-ctnr .chat-input') as HTMLTextAreaElement const originalTextArea = await SpinQuery.select('.control-panel-ctnr .chat-input-ctnr .chat-input') as HTMLTextAreaElement
const sendButton = await SpinQuery.select('.chat-input-ctnr ~ .bottom-actions .bl-button--primary') as HTMLButtonElement const sendButton = await SpinQuery.select('.control-panel-ctnr .chat-input-ctnr ~ .bottom-actions .bl-button--primary') as HTMLButtonElement
if ([leftController, originalTextArea, sendButton].some(it => it === null)) { if ([leftController, originalTextArea, sendButton].some(it => it === null)) {
console.warn('[danmakuSendBar] ref elements not found', leftController === null, originalTextArea === null, sendButton === null) console.warn('[danmakuSendBar] ref elements not found', leftController === null, originalTextArea === null, sendButton === null)

View File

@ -18,6 +18,7 @@
&-kanban .live-haruna-ctnr, &-kanban .live-haruna-ctnr,
&-enterPrompt .chat-item.important-prompt-item, &-enterPrompt .chat-item.important-prompt-item,
&-enterPrompt .chat-history-panel .brush-prompt, &-enterPrompt .chat-history-panel .brush-prompt,
&-enterPrompt .chat-item.convention-msg,
&-pk .chaos-pk, &-pk .chaos-pk,
&-topRank .chat-item.top3-notice, &-topRank .chat-item.top3-notice,
&-topRank .chat-item .rank-icon { &-topRank .chat-item .rank-icon {

View File

@ -173,12 +173,16 @@
background-color: #fff; background-color: #fff;
} }
.comment-submit { .comment-submit {
height: 64px !important;
padding: 4px 15px !important; padding: 4px 15px !important;
position: relative !important; position: relative !important;
right: 0 !important; right: 0 !important;
margin-left: 10px !important; margin-left: 10px !important;
} }
// .comment-submit, .textarea-container .baffle {
line-height: 65px !important;
}
.textarea-container .baffle,
.textarea-container .ipt-txt { .textarea-container .ipt-txt {
height: 65px !important; height: 65px !important;
width: calc(100% - 80px) !important; width: calc(100% - 80px) !important;
@ -499,5 +503,5 @@ body.dark .panel-area .bb-comment {
top: -72px !important; top: -72px !important;
} }
.v-wrap #comment { .v-wrap #comment {
z-index: 1 !important; z-index: 21 !important;
} }

View File

@ -152,7 +152,9 @@ li.nav-item[report-id="playpage_dynamic"] .i-frame,
.international-header .mini-header, .international-header .mini-header,
.bili-header-m .head-banner .head-content .head-logo, .bili-header-m .head-banner .head-content .head-logo,
#biliMainHeader .mini-header, #biliMainHeader .mini-header,
#biliMainHeader .base-mini-header { #biliMainHeader .base-mini-header,
.home-header .mini-header-container,
.bili-header__bar {
display: none !important; display: none !important;
} }
.van-popover { .van-popover {
@ -205,6 +207,9 @@ li.nav-item[report-id="playpage_dynamic"] .i-frame,
display: flex; display: flex;
justify-content: center; justify-content: center;
body.player-fullscreen-fix & {
z-index: 1;
}
&:not(.fill) .custom-navbar-iconfont { &:not(.fill) .custom-navbar-iconfont {
color: var(--theme-color); color: var(--theme-color);
} }

View File

@ -74,7 +74,7 @@ export default (() => {
true true
) )
}) })
SpinQuery.select('#banner_link,.international-header .bili-banner').then(banner => { SpinQuery.select('#banner_link,.international-header .bili-banner, .bili-header__banner').then(banner => {
if (banner === null || !(banner instanceof HTMLElement)) { if (banner === null || !(banner instanceof HTMLElement)) {
return return
} }

View File

@ -338,6 +338,9 @@ export class SearchBox extends NavbarComponent {
} }
}) })
keywordInput.addEventListener('keydown', e => { keywordInput.addEventListener('keydown', e => {
if (e.isComposing) {
return
}
if (e.key === 'ArrowDown' && searchList.items.length > 0) { if (e.key === 'ArrowDown' && searchList.items.length > 0) {
e.preventDefault(); e.preventDefault();
e.stopImmediatePropagation(); e.stopImmediatePropagation();

View File

@ -439,3 +439,276 @@
@include color("a"); @include color("a");
} }
} }
#i_cecream {
@include background-color();
.mini-header {
.header-entry-avatar {
@include border-color("3");
}
.default-entry,
.right-entry-icon,
.mini-header__title > span {
@include color("e");
}
.right-entry-text {
@include color("a");
}
.header-upload-entry {
@include theme-background-color();
@include foreground-color();
.header-upload-entry__icon {
@include foreground-color();
}
&:hover {
@include theme-background-color("90");
}
}
}
.bili-header,
.home-header {
@include background-color();
&__banner {
@include background-color("3");
}
&.fixed-top .home-header__bar {
@include background-color("2");
}
&__channel {
@include background-color();
.channel-entry-more__link,
.channel-link {
@include color("e");
@include background-color("3");
@include border-color();
&:hover {
@include color("e");
@include background-color("5");
}
}
}
.channel-icons {
&__item {
@include color("e");
}
.channel-notify {
@include border-color("2");
}
}
}
.primary-btn {
@include color("e");
@include background-color("3");
@include border-color();
&:hover {
@include background-color("5");
}
}
.area-header {
.roll-btn {
@include color("e");
}
.title {
@include color("e");
&:hover {
@include theme-color();
}
}
.track-switch {
@include background-color("3");
@include color("a");
.switch-bar {
@include theme-background-color();
}
button {
&:hover {
@include background-color("5");
}
&.is-active {
@include foreground-color();
}
}
}
}
:not(.aside-head) > .area-header {
.mouse-switch > * {
@include color("a");
@include background-color("3");
&:hover {
@include color("a");
@include background-color("5");
}
&.is-active {
@include theme-background-color();
@include foreground-color();
}
}
}
.aside-head {
.mouse-switch > * {
@include color("a");
&.is-active {
@include theme-color();
&::after {
@include theme-background-color();
}
}
}
}
.aside-body {
.list-state-error,
.list-state-nothing,
.list-state-loading {
@include background-color("4");
span {
@include color("a");
}
}
}
}
.v-popover-content {
@include border-color();
@include background-color("3");
}
$media-types: (video, bangumi, cheese, live, manga, movie, ogv, article);
@each $type in $media-types {
.bili-rank-list-#{$type} {
&__list {
@include border-color();
@include background-color();
}
&__item:nth-of-type(2n + 1) {
@include background-color("3");
}
&__item:nth-of-type(2n) {
@include background-color("4");
}
.rank-#{$type}-card {
&__popover {
@include background-color();
&--icon,
&--stats,
&--subtitle,
&--author {
@include color("a");
}
&--stats {
@include border-color("4");
}
}
&__cover {
@include background-color("3");
}
&__info--pts,
&__info--schedule,
&__info--styles {
@include color("a");
}
}
}
.bili-#{$type}-card {
&__info--tit {
&:hover {
@include theme-color();
}
}
&__info--living {
@include to-theme("pink");
}
&__info--pub,
&__info--subtitle,
&__info--styles,
&__info--uname {
@include color("a");
}
&__info--owner {
@include color("a");
&:hover {
@include theme-color();
}
}
.v-img,
&__image,
&__cover,
&__image--wrap {
@include background-color("3");
}
&__skeleton {
&--light,
&--text,
&--face,
&--cover {
@include background-color("4");
}
}
&__wrap {
@include background-color();
}
}
}
.n-drawer-container .elevator {
@include background-color("2");
.elevator-head {
@include color("e");
}
.elevator-core {
&.is-active {
@include background-color("3");
}
&:hover {
@include background-color("4");
}
.name {
@include color("e");
}
.icon {
@include color("a");
}
}
}
#bili-footer {
@include background-color();
.split-line {
@include background-color("4");
}
p {
@include color("e");
}
a {
@include color("e");
&:hover {
@include theme-color();
}
}
.link-item .bt {
@include color("a");
}
.text-con {
&__line {
&--link {
@include color("a");
}
}
}
}
.footer-qrcode-popover,
.footer-wechat-popover {
.qrcode-text {
@include color("e");
}
}
.gm-skeleton {
.chat-input-ctnr {
@include border-color("3");
@include background-color("2");
.medal-section {
@include border-color("3");
}
}
}

View File

@ -24,7 +24,7 @@ export default {
data() { data() {
return { return {
srcset: null, srcset: null,
actualSrc: null, actualSrc: EmptyImageUrl,
isPlaceholderActive: false, isPlaceholderActive: false,
} }
}, },
@ -51,7 +51,7 @@ export default {
if (this.placeholderImage) { if (this.placeholderImage) {
this.actualSrc = `https://s1.hdslb.com/bfs/static/blive/live-web-center/static/img/no-cover.1ebe4d5.jpg` this.actualSrc = `https://s1.hdslb.com/bfs/static/blive/live-web-center/static/img/no-cover.1ebe4d5.jpg`
} else { } else {
this.actualSrc = null this.actualSrc = EmptyImageUrl
} }
return return
} }

View File

@ -1,6 +1,7 @@
#banner_link, #banner_link,
.z-top-container.has-banner > .header, .z-top-container.has-banner > .header,
.custom-navbar .blur-layer { .custom-navbar .blur-layer,
.bili-header__banner {
display: none !important; display: none !important;
} }
div.blur-bg, div.blur-bg,

View File

@ -21,6 +21,12 @@ const homeHiddenOptions: HomeHiddenOption[] = [
height: 24px !important; height: 24px !important;
padding: 0 !important; padding: 0 !important;
} }
.bili-header__channel {
height: 12px !important;
}
.bili-header__channel > * {
display: none !important;
}
`, `,
}, },
{ {
@ -29,30 +35,36 @@ const homeHiddenOptions: HomeHiddenOption[] = [
.first-screen .space-between { .first-screen .space-between {
margin-bottom: 0 !important; margin-bottom: 0 !important;
} }
.rcmd-box-wrap { display: none !important; } .bili-layout .bili-grid:first-child,
.rcmd-box-wrap {
display: none !important;
}
`, `,
}, },
{ {
name: 'online', displayName: '在线列表', style: ` name: 'online', displayName: '在线列表(旧版)', style: `
.first-screen #reportFirst2 { display: none !important; } .first-screen #reportFirst2 { display: none !important; }
`, `,
}, },
{ {
name: 'ext-box', displayName: '电竞赛事', style: ` name: 'ext-box', displayName: '赛事(旧版)', style: `
.first-screen #reportFirst3 { display: none !important; } `, .first-screen #reportFirst3 { display: none !important; } `,
}, },
{ {
name: 'special', displayName: '特别推荐', style: ` name: 'special', displayName: '特别推荐(旧版)', style: `
#bili_report_spe_rec { display: none !important; } #bili_report_spe_rec { display: none !important; }
`, `,
}, },
{ {
name: 'contact', displayName: '联系方式', style: ` name: 'contact', displayName: '联系方式', style: `
.international-footer { display: none !important; } .bili-footer .b-footer-wrap,
.international-footer {
display: none !important;
}
`, `,
}, },
{ {
name: 'elevator', displayName: '右侧分区导航', style: ` name: 'elevator', displayName: '右侧分区导航(旧版)', style: `
.storey-box .elevator { display: none !important; } .storey-box .elevator { display: none !important; }
`, `,
}, },
@ -76,17 +88,58 @@ const syncState = (item: HomeHiddenOption) => {
if (!isHome()) { if (!isHome()) {
return return
} }
const generatedOptions: HomeHiddenOption[] = (await SpinQuery.condition( const homeOptions: Promise<HomeHiddenOption[]> = (async () => {
const isNewHome = getCookieValue('i-wanna-go-back') === '-1'
const isNotHome = document.URL !== 'https://www.bilibili.com/'
if (!isNewHome) {
const list = await SpinQuery.condition(
() => dqa('.proxy-box > div'), () => dqa('.proxy-box > div'),
elements => elements.length > 0 || document.URL !== 'https://www.bilibili.com/', elements => elements.length > 0 || isNotHome,
)).map(it => ({ )
return list?.map(it => ({
name: it.id.replace(/^bili_/, ''), name: it.id.replace(/^bili_/, ''),
displayName: it.querySelector('header .name')?.textContent?.trim() ?? '未知分区', displayName: it.querySelector('header .name')?.textContent?.trim() ?? '未知分区',
})) })) ?? []
} else {
const skipIds = ['推广']
const headers = await SpinQuery.condition(
() => dqa('.bili-grid .the-world'),
elements => elements.length > 3 || isNotHome,
)
console.log(headers)
const getContainer = (header: Element) => {
let currentElement = header
while (currentElement.parentElement) {
if (currentElement.classList.contains('bili-grid')) {
return currentElement
}
currentElement = currentElement.parentElement
}
return null
}
return headers
?.filter(element => !skipIds.includes(element.id))
.map(element => {
const container = getContainer(element) as HTMLElement
const name = element.id
if (container) {
container.dataset.area = name
return {
name,
displayName: name,
}
}
return null
})
.filter((it): it is HomeHiddenOption => it !== null) ?? []
}
})()
const generatedOptions = await homeOptions
homeHiddenOptions.push(...generatedOptions) homeHiddenOptions.push(...generatedOptions)
homeHiddenOptions.forEach(syncState) homeHiddenOptions.forEach(syncState)
const generatedStyles = generatedOptions.map(({ name }) => { const generatedStyles = generatedOptions.map(({ name }) => {
return ` return `
body.home-hidden-${name} .bili-layout .bili-grid[data-area="${name}"],
body.home-hidden-${name} .storey-box .proxy-box #bili_${name} { body.home-hidden-${name} .storey-box .proxy-box #bili_${name} {
display: none !important; display: none !important;
} }

View File

@ -272,10 +272,7 @@ export default {
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 1; z-index: 1;
background-color: #f4f4f4; background-color: var(--simplify-home-background);
body.dark & {
background-color: #181818;
}
.icon { .icon {
grid-area: icon; grid-area: icon;
justify-self: center; justify-self: center;

View File

@ -5,33 +5,48 @@ export interface Blackboard {
imageUrl: string imageUrl: string
} }
export const getBlackboards = async (): Promise<Blackboard[]> => { export const getBlackboards = async (): Promise<Blackboard[]> => {
if (dq('.international-home')) { const locId = 4694
const initData = await SpinQuery.condition(() => unsafeWindow['__INITIAL_STATE__'], it => it !== undefined) const api = `https://api.bilibili.com/x/web-show/res/locs?pf=0&ids=${locId}`
return dqa('.first-screen .home-slide .item') const { code, message, data } = await Ajax.getJson(api)
.slice(0, 5) if (code !== 0) {
.map((it, index) => { throw new Error(`获取活动卡片失败: ${message}`)
const locID = it.querySelector('a')!.getAttribute('data-loc-id')!
return {
url: initData.locsData[locID][index].url,
title: (it.querySelector('.title') as HTMLElement).textContent!.trim(),
isAd: Boolean(it.querySelector('.gg-icon,.bypb-icon')),
imageUrl: it.querySelector('img')!.getAttribute('src')!.replace(/@.+$/, ''),
} as Blackboard
})
} else {
const panel = dq('.chief-recommend-module .panel') as HTMLElement
const images = panel.querySelector('.pic') as HTMLElement
const titles = panel.querySelectorAll('.title > a')
return [...images.querySelectorAll('li')].map((li, index) => {
const title = titles[index] as HTMLElement
return {
url: title.getAttribute('href'),
title: title.innerText!.trim(),
isAd: Boolean(title.querySelector('.gg-pic')),
imageUrl: li.querySelector('img')!.getAttribute('src')!.replace(/@.+$/, ''),
} as Blackboard
})
} }
const list: any[] = data[locId]
return list.map(it => {
return {
url: it.url,
title: it.name,
isAd: it.is_ad_loc,
imageUrl: it.pic,
} as Blackboard
})
// if (dq('.international-home')) {
// const initData = await SpinQuery.condition(() => unsafeWindow['__INITIAL_STATE__'], it => it !== undefined)
// return dqa('.first-screen .home-slide .item')
// .slice(0, 5)
// .map((it, index) => {
// const locID = it.querySelector('a')!.getAttribute('data-loc-id')!
// return {
// url: initData.locsData[locID][index].url,
// title: (it.querySelector('.title') as HTMLElement).textContent!.trim(),
// isAd: Boolean(it.querySelector('.gg-icon,.bypb-icon')),
// imageUrl: it.querySelector('img')!.getAttribute('src')!.replace(/@.+$/, ''),
// } as Blackboard
// })
// } else {
// const panel = dq('.chief-recommend-module .panel') as HTMLElement
// const images = panel.querySelector('.pic') as HTMLElement
// const titles = panel.querySelectorAll('.title > a')
// return [...images.querySelectorAll('li')].map((li, index) => {
// const title = titles[index] as HTMLElement
// return {
// url: title.getAttribute('href'),
// title: title.innerText!.trim(),
// isAd: Boolean(title.querySelector('.gg-pic')),
// imageUrl: li.querySelector('img')!.getAttribute('src')!.replace(/@.+$/, ''),
// } as Blackboard
// })
// }
} }
export default { export default {
export: { export: {

View File

@ -26,7 +26,7 @@
:title="b.title" :title="b.title"
> >
<dpi-img :src="b.imageUrl" :alt="b.title" :size="{width: 500, height: 250}" :root="cardsContainer"></dpi-img> <dpi-img :src="b.imageUrl" :alt="b.title" :size="{width: 500, height: 250}" :root="cardsContainer"></dpi-img>
<div class="title">{{b.title}}</div> <div class="title" :title="b.title">{{b.title}}</div>
</a> </a>
</div> </div>
<div class="jump-dots"> <div class="jump-dots">
@ -99,37 +99,45 @@ $first-row-height: 250px;
.jump-dots { .jump-dots {
position: absolute; position: absolute;
top: 50%; left: 50%;
left: 8px; bottom: 0;
transform: translateY(-50%); transform: translateX(-50%);
grid-area: cards; grid-area: cards;
align-self: center; align-self: center;
justify-self: center; justify-self: center;
display: flex;
align-items: center;
& label { & label {
display: block; display: block;
} padding: 8px 6px;
& label:not(:last-child) { cursor: pointer;
margin-bottom: 6px;
} }
.jump-dot { .jump-dot {
background-color: #8884; background-color: #8884;
border: 1px solid #8888;
box-sizing: border-box; box-sizing: border-box;
width: 8px; width: 20px;
height: 20px; height: 8px;
border-radius: 8px; border-radius: 8px;
cursor: pointer;
} }
} }
.blackboard-cards { .blackboard-cards {
display: flex;
grid-area: cards; grid-area: cards;
--blackboard-width: 568.5px; --blackboard-width: 350px;
--blackboard-height: 250px; --blackboard-height: 250px;
--image-height: 197px;
width: var(--blackboard-width); width: var(--blackboard-width);
height: var(--blackboard-height); height: var(--blackboard-height);
border-radius: 16px; border-radius: 16px;
overflow: hidden; overflow: hidden;
background-color: #fff;
box-shadow: 0 4px 8px 0 #0001;
body.dark & {
background-color: #282828;
}
.blackboard-card { .blackboard-card {
flex: 0 0 auto;
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative; position: relative;
@ -137,27 +145,26 @@ $first-row-height: 250px;
transition: 0.8s cubic-bezier(0.44, 0.29, 0.13, 1); transition: 0.8s cubic-bezier(0.44, 0.29, 0.13, 1);
img { img {
width: 100%; width: 100%;
height: 100%; height: var(--image-height);
object-fit: fill; object-fit: fill;
display: block; display: block;
border-radius: 12px; border-radius: 12px;
transition-duration: inherit;
} }
.title { .title {
position: absolute; position: absolute;
bottom: 8px; bottom: 24px;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
padding: 4px 16px; padding: 0 16px;
color: white;
background-color: #000a;
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
border-radius: 14px; border-radius: 14px;
max-width: var(--blackboard-width);
box-sizing: border-box;
white-space: nowrap; white-space: nowrap;
opacity: 0; overflow: hidden;
} text-overflow: ellipsis;
&:hover .title {
opacity: 1;
} }
} }
} }

View File

@ -161,9 +161,9 @@ export default {
--loading-from: #d4d4d4; --loading-from: #d4d4d4;
--loading-to: #ddd; --loading-to: #ddd;
--slideshow-ratio: 0.6; --slideshow-ratio: 0.6;
--rank-width: 370px; --rank-width: 20vw;
--rank-height: calc(var(--rank-width) / 16 * 10); --rank-height: calc(var(--rank-width) / 16 * 10);
--card-height: 280px; --card-height: 22vh;
--card-width: calc(var(--card-height) * (42 / 25)); --card-width: calc(var(--card-height) * (42 / 25));
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@ -179,12 +179,12 @@ export default {
background-color: var(--loading-to); background-color: var(--loading-to);
} }
} }
@for $width from 18 through 7 { // @for $width from 18 through 7 {
@media screen and (max-width: #{$width * 100}px) { // @media screen and (max-width: #{$width * 100}px) {
--card-height: #{280 - 8 * (19 - $width)}px; // --card-height: #{280 - 8 * (19 - $width)}px;
--rank-width: #{370 - 20 * (19 - $width)}px; // --rank-width: #{370 - 20 * (19 - $width)}px;
} // }
} // }
&, &,
& *, & *,
::after, ::after,
@ -219,6 +219,9 @@ export default {
font-weight: bold; font-weight: bold;
font-size: 11pt; font-size: 11pt;
padding-bottom: 12px; padding-bottom: 12px;
margin: 0;
height: 20px;
box-sizing: content-box;
&::before { &::before {
content: ''; content: '';
display: inline-flex; display: inline-flex;

File diff suppressed because one or more lines are too long

View File

@ -113,13 +113,14 @@ export default {
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 1000; z-index: 1000;
background-color: #f4f4f4; background-color: var(--simplify-home-background);
color: black; color: black;
margin: 0;
height: auto;
&:link { &:link {
cursor: pointer; cursor: pointer;
} }
body.dark & { body.dark & {
background-color: #181818;
color: #eee; color: #eee;
} }
} }

View File

@ -32,7 +32,7 @@
<icon type="home" icon="activity"></icon>全部动态 <icon type="home" icon="activity"></icon>全部动态
</a> </a>
</div> </div>
<div class="contents" ref="contents"> <div class="contents edge-gradient" ref="contents" @scroll="checkScrollPosition" :class="{ 'is-bottom': isBottom }">
<div class="card-wrapper" v-for="card in feedCards" :key="card.id"> <div class="card-wrapper" v-for="card in feedCards" :key="card.id">
<video-card :data="card" orientation="vertical"></video-card> <video-card :data="card" orientation="vertical"></video-card>
</div> </div>
@ -82,6 +82,7 @@ export default {
data() { data() {
return { return {
online: '--', online: '--',
isBottom: false,
tabs, tabs,
currentTab: tabs[0], currentTab: tabs[0],
feedCards: [] feedCards: []
@ -112,7 +113,11 @@ export default {
const gap = 16 const gap = 16
const distance = count * (width + gap) const distance = count * (width + gap)
contents.scrollBy(orientation * distance, 0) contents.scrollBy(orientation * distance, 0)
} },
checkScrollPosition: _.debounce(function checkScrollPosition(e: Event) {
const element = e.target as HTMLElement
this.isBottom = element.scrollWidth - element.scrollLeft === element.clientWidth
}, 200),
}, },
async mounted() { async mounted() {
this.updateFeedCards(this.currentTab) this.updateFeedCards(this.currentTab)
@ -209,7 +214,7 @@ export default {
--card-height: 250px; --card-height: 250px;
--card-count: 4; --card-count: 4;
width: calc((var(--card-width) + 16px) * var(--card-count)); width: calc((var(--card-width) + 16px) * var(--card-count));
padding-bottom: 16px; // padding-bottom: 16px;
scrollbar-width: none !important; scrollbar-width: none !important;
min-height: calc(var(--card-height) + 16px); min-height: calc(var(--card-height) + 16px);
@media screen and (max-width: 900px) { @media screen and (max-width: 900px) {

View File

@ -1,5 +1,5 @@
<template> <template>
<div class="simple-home" :class="{ snap }"> <div class="simple-home" :class="{ snap, 'layout-fill': layoutFill }">
<blackboards></blackboards> <blackboards></blackboards>
<trending-videos></trending-videos> <trending-videos></trending-videos>
<info-row></info-row> <info-row></info-row>
@ -19,12 +19,16 @@ export default {
data() { data() {
return { return {
snap: false, snap: false,
layoutFill: true,
} }
}, },
mounted() { mounted() {
addSettingsListener('simpleHomeWheelScroll', (value: boolean) => { addSettingsListener('simpleHomeWheelScroll', (value: boolean) => {
this.snap = !value this.snap = !value
}, true) }, true)
addSettingsListener('simpleHomeLayoutFill', (value: boolean) => {
this.layoutFill = value
}, true)
}, },
} }
</script> </script>
@ -57,14 +61,14 @@ export default {
label:nth-child(#{$i}) label:nth-child(#{$i})
.jump-dot { .jump-dot {
background-color: var(--theme-color); background-color: var(--theme-color);
height: 40px; width: 40px;
} }
&:checked:nth-of-type(#{$i}) ~ .blackboard-cards .blackboard-card { &:checked:nth-of-type(#{$i}) ~ .blackboard-cards .blackboard-card {
transform: translateY(calc(-1 * #{$i - 1} * var(--blackboard-height))) scale(0.95); transform: translateX(calc(-1 * #{$i - 1} * var(--blackboard-width))) scale(0.9);
&:nth-of-type(#{$i}) { &:nth-of-type(#{$i}) {
transform: translateY(calc(-1 * #{$i - 1} * var(--blackboard-height))); transform: translateX(calc(-1 * #{$i - 1} * var(--blackboard-width)));
img { img {
border-radius: 16px; border-radius: 16px 16px 0 0;
} }
} }
} }
@ -187,6 +191,47 @@ export default {
grid-area: categories; grid-area: categories;
padding-bottom: 32px; padding-bottom: 32px;
} }
&.layout-fill {
flex: 1;
.trendings,
.feeds {
justify-self: stretch;
width: 100%;
}
&.layout-fill .edge-gradient {
width: auto;
&::before,
&::after {
content: "";
position: fixed;
bottom: 0;
height: calc(var(--card-height) + 16px);
width: 10%;
pointer-events: none;
z-index: 1;
transition: .2s ease-out;
}
&::before {
background-image: linear-gradient(to left, transparent, var(--simplify-home-background));
left: 0;
opacity: 0;
}
&::after {
background-image: linear-gradient(to right, transparent, var(--simplify-home-background));
right: 0;
opacity: 1;
}
&.is-bottom {
&::before {
opacity: 1;
}
&::after {
opacity: 0;
}
}
}
}
@media screen and (max-width: 1100px) { @media screen and (max-width: 1100px) {
& { & {
grid-template-areas: 'blackboards' 'trendings' 'info' 'feeds' 'categories'; grid-template-areas: 'blackboards' 'trendings' 'info' 'feeds' 'categories';

View File

@ -151,6 +151,7 @@ export default {
} }
@mixin round-button { @mixin round-button {
background-color: #ddd; background-color: #ddd;
color: inherit;
border-radius: 50%; border-radius: 50%;
border: none; border: none;
display: flex; display: flex;
@ -227,6 +228,9 @@ export default {
& > * { & > * {
display: flex; display: flex;
align-items: center; align-items: center;
&:not(:last-child) {
margin-bottom: 6px;
}
} }
.title { .title {
color: inherit !important; color: inherit !important;
@ -234,6 +238,7 @@ export default {
font-weight: bold; font-weight: bold;
line-height: normal; line-height: normal;
text-align: right; text-align: right;
flex-shrink: 0;
@include max-line(2); @include max-line(2);
} }
.up { .up {
@ -258,6 +263,7 @@ export default {
.description { .description {
@include max-line(6); @include max-line(6);
flex-grow: 1; flex-grow: 1;
flex-shrink: 1;
white-space: pre-wrap; white-space: pre-wrap;
text-align: right; text-align: right;
opacity: 0.75; opacity: 0.75;

View File

@ -1,7 +1,7 @@
<template> <template>
<div class="trendings"> <div class="trendings">
<div class="header"> <div class="header">
<div class="title">热门</div> <div class="title">{{ trendingTitle }}</div>
<!-- <div class="tabs"> <!-- <div class="tabs">
<div <div
class="tab" class="tab"
@ -14,6 +14,9 @@
</div> </div>
</div>--> </div>-->
<div class="page"> <div class="page">
<div v-if="personalized" class="refresh" @click="refreshCards">
<icon type="mdi" icon="refresh"></icon>
</div>
<div class="prev-page" @click="scroll(-1)"> <div class="prev-page" @click="scroll(-1)">
<icon type="extended" icon="left-arrow"></icon> <icon type="extended" icon="left-arrow"></icon>
</div> </div>
@ -22,7 +25,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="contents" ref="contents"> <div class="contents edge-gradient" ref="contents" @scroll="checkScrollPosition" :class="{ 'is-bottom': isBottom }">
<div class="card-wrapper" v-for="card in trendingCards" :key="card.id"> <div class="card-wrapper" v-for="card in trendingCards" :key="card.id">
<video-card :data="card" orientation="vertical"></video-card> <video-card :data="card" orientation="vertical"></video-card>
</div> </div>
@ -33,57 +36,25 @@
<script lang="ts"> <script lang="ts">
import { VideoCardInfo } from '../video-card-info' import { VideoCardInfo } from '../video-card-info'
interface Tab {
name: string
day: number
url: string
}
// const tabs: Tab[] = [
// {
// name: '',
// day: 1,
// url: 'https://www.bilibili.com/ranking/all/0/0/1'
// },
// {
// name: '',
// day: 3,
// url: 'https://www.bilibili.com/ranking'
// },
// {
// name: '',
// day: 7,
// url: 'https://www.bilibili.com/ranking/all/0/0/7'
// }
// ]
export default { export default {
components: { components: {
VideoCard: () => import('../video-card.vue'), VideoCard: () => import('../video-card.vue'),
Icon: () => import('../../icon.vue'), Icon: () => import('../../icon.vue'),
}, },
data() { data() {
const personalized = getUID() && settings.simpleHomePersonalized
return { return {
// tabs, personalized,
// currentTab: tabs[0], isBottom: false,
trendingCards: [], trendingTitle: personalized ? '推荐' : '热门',
trendingCards: [] as VideoCardInfo[],
} }
}, },
// watch: {
// currentTab(tab: Tab) {
// this.updateTrendingTab(tab)
// },
// },
methods: { methods: {
// async updateTrendingTab(tab: Tab) { async refreshCards() {
// const { getTrendingVideos } = await import('../trending-videos') const { getTrendingVideos } = await import('../trending-videos')
// this.trendingCards = await getTrendingVideos(tab.day) this.trendingCards = await getTrendingVideos()
// }, },
// changeTab(tab: Tab) {
// if (this.currentTab === tab) {
// open(tab.url, '_blank')
// } else {
// this.currentTab = tab
// }
// },
scroll(orientation: number) { scroll(orientation: number) {
const contents = this.$refs.contents as HTMLElement const contents = this.$refs.contents as HTMLElement
const style = getComputedStyle(contents) const style = getComputedStyle(contents)
@ -92,11 +63,14 @@ export default {
const gap = 16 const gap = 16
const distance = count * (width + gap) const distance = count * (width + gap)
contents.scrollBy(orientation * distance, 0) contents.scrollBy(orientation * distance, 0)
} },
checkScrollPosition: _.debounce(function checkScrollPosition(e: Event) {
const element = e.target as HTMLElement
this.isBottom = element.scrollWidth - element.scrollLeft === element.clientWidth
}, 200),
}, },
async created() { async created() {
const { getTrendingVideos } = await import('../trending-videos') await this.refreshCards()
this.trendingCards = await getTrendingVideos()
}, },
async mounted() { async mounted() {
let cancelHorizontalScroll: () => void let cancelHorizontalScroll: () => void
@ -123,7 +97,8 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
.simple-home .trendings { .simple-home {
.trendings {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
.header { .header {
@ -150,12 +125,19 @@ export default {
.next-page .be-icon { .next-page .be-icon {
transform: translateX(1px); transform: translateX(1px);
} }
.refresh .be-icon {
transition-duration: .5s;
transform: scale(0.9);
}
.refresh:hover .be-icon {
transform: scale(0.9) rotate(360deg);
}
} }
} }
.contents { .contents {
--card-width: 200px; --card-width: 200px;
--card-height: 250px; --card-height: 250px;
--card-count: 3; --card-count: 4;
margin-top: 16px; margin-top: 16px;
display: flex; display: flex;
overflow: auto; overflow: auto;
@ -165,22 +147,22 @@ export default {
@media screen and (max-width: 1300px) and (min-width: 900px) { @media screen and (max-width: 1300px) and (min-width: 900px) {
& { & {
--card-count: 2; --card-count: 3;
} }
} }
@media screen and (max-width: 1100px) and (min-width: 900px) { @media screen and (max-width: 1100px) and (min-width: 900px) {
& { & {
--card-count: 4; --card-count: 5;
} }
} }
@media screen and (min-width: 1550px) { @media screen and (min-width: 1550px) {
& { & {
--card-count: 4; --card-count: 5;
} }
} }
@media screen and (min-width: 1850px) { @media screen and (min-width: 1850px) {
& { & {
--card-count: 5; --card-count: 6;
} }
} }
&::-webkit-scrollbar { &::-webkit-scrollbar {
@ -193,5 +175,6 @@ export default {
flex-shrink: 0; flex-shrink: 0;
} }
} }
}
} }
</style> </style>

View File

@ -4,7 +4,9 @@
#app > .bili-wrapper, #app > .bili-wrapper,
#app > .elevator-module, #app > .elevator-module,
#app > .bili-header-m.stardust-common > .bili-wrapper, #app > .bili-header-m.stardust-common > .bili-wrapper,
.bili-header-m .head-banner .head-content .head-logo { .bili-header-m .head-banner .head-content .head-logo,
#i_cecream .bili-header__channel,
#i_cecream > :not(.bili-header) {
position: fixed; position: fixed;
visibility: hidden; visibility: hidden;
top: 100vh; top: 100vh;

View File

@ -21,16 +21,17 @@ export default {
</script> </script>
<style lang="scss"> <style lang="scss">
.simplify-home { .simplify-home {
padding-top: 32px; padding: 32px 72px 0;
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
justify-content: center; justify-content: center;
min-height: 100vh; min-height: 100vh;
background-color: #f4f4f4; --simplify-home-background: #f4f4f4;
background-color: var(--simplify-home-background);
font-size: 12px; font-size: 12px;
body.dark & { body.dark & {
background-color: #181818; --simplify-home-background: #181818;
} }
.simplify-home-component { .simplify-home-component {
max-width: 100%; max-width: 100%;

View File

@ -2,86 +2,34 @@ import { VideoCardInfo } from './video-card-info'
export const getTrendingVideos = async () => { export const getTrendingVideos = async () => {
const { isVideoCardBlocked } = await import('../../activity/feeds-apis') const { isVideoCardBlocked } = await import('../../activity/feeds-apis')
// const json = await Ajax.getJsonWithCredentials( const api = 'https://api.bilibili.com/x/web-interface/index/top/rcmd?fresh_type=0&version=1'
// `https://api.bilibili.com/x/web-interface/ranking/index?day=${days}` const personalized = Boolean(getUID()) && settings.simpleHomePersonalized
// ) const requestMethod: keyof typeof Ajax = personalized ? 'getJsonWithCredentials' : 'getJson'
// if (getUID() && watchlaterList === undefined) { const { code, message, data } = await Ajax[requestMethod](api)
// const { getWatchlaterList } = await import( if (code !== 0) {
// '../../video/watchlater-api' throw new Error(`获取${personalized ? '推荐' : '热门'}视频失败: ${message}`)
// )
// watchlaterList = await getWatchlaterList()
// }
// if (json.code !== 0) {
// throw new Error(json.message)
// }
// return json.data.map(
// (card: any) => ({
// id: card.aid + '-' + days,
// aid: parseInt(card.aid),
// title: card.title,
// upID: card.mid,
// upName: card.author,
// coverUrl: card.pic.replace('http://', 'https://'),
// description: card.description,
// durationText: card.duration,
// playCount: formatCount(card.play),
// coins: formatCount(card.coins),
// favorites: formatCount(card.favorites),
// watchlater: true,
// // watchlater: watchlaterList ? watchlaterList.includes(parseInt(card.aid)) : null
// })
// )
if (!unsafeWindow.__INITIAL_STATE__) {
throw new Error('unsafeWindow.__INITIAL_STATE__ not available')
} }
if (unsafeWindow.__INITIAL_STATE__.recommendData) { const list: any[] = data.item
return (unsafeWindow.__INITIAL_STATE__.recommendData.item as any[]).map( return list.map(it => {
it => { const card: VideoCardInfo = {
return {
id: it.id, id: it.id,
aid: it.id, aid: it.id,
bvid: it.bvid, bvid: it.bvid,
// timestamp: it.ctime * 1000,
// time: new Date(it.ctime * 1000),
description: it.desc,
duration: it.duration,
durationText: formatDuration(it.duration),
coverUrl: it.pic.replace('http:', 'https:'), coverUrl: it.pic.replace('http:', 'https:'),
title: it.title, title: it.title,
// coins: formatCount(it.stat.coin), description: '',
// danmakuCount: formatCount(it.stat.danmaku), duration: it.duration,
// favorites: formatCount(it.stat.favorite), durationText: formatDuration(it.duration),
// like: formatCount(it.stat.like), timestamp: it.pubdate * 1000,
playCount: formatCount(it.stat.view), time: new Date(it.pubdate * 1000),
upName: it.owner.name, upName: it.owner.name,
upID: it.owner.mid,
upFaceUrl: it.owner.face.replace('http:', 'https:'), upFaceUrl: it.owner.face.replace('http:', 'https:'),
} as VideoCardInfo
},
).filter(it => !isVideoCardBlocked(it))
}
return (unsafeWindow.__INITIAL_STATE__.recommendList as any[]).map(
it => {
return {
id: it.aid,
aid: it.aid,
bvid: it.bvid,
timestamp: it.ctime * 1000,
time: new Date(it.ctime * 1000),
description: it.desc,
duration: it.duration,
durationText: formatDuration(it.duration),
coverUrl: it.pic.replace('http:', 'https:'),
title: it.title,
coins: formatCount(it.stat.coin),
danmakuCount: formatCount(it.stat.danmaku),
// favorites: formatCount(it.stat.favorite),
like: formatCount(it.stat.like), like: formatCount(it.stat.like),
playCount: formatCount(it.stat.view), playCount: formatCount(it.stat.view),
upName: it.owner.name, }
upFaceUrl: it.owner.face.replace('http:', 'https:'), return card
} as VideoCardInfo }).filter(card => !isVideoCardBlocked(card))
},
).filter(it => !isVideoCardBlocked(it))
} }
export default { export default {
export: { export: {

View File

@ -39,23 +39,23 @@
<div class="name" :title="upName">{{upName}}</div> <div class="name" :title="upName">{{upName}}</div>
</a> </a>
<div class="stats"> <div class="stats">
<template v-if="like && !vertical"> <Icon type="extended" icon="play"></Icon>
<Icon type="extended" icon="like-outline"></Icon> <span>{{playCount}}</span>
{{like}} <template v-if="danmakuCount">
<Icon type="extended" icon="danmaku"></Icon>
<span>{{danmakuCount}}</span>
</template> </template>
<template v-if="coins && !vertical"> <template v-if="like">
<Icon type="extended" icon="like-outline"></Icon>
<span>{{like}}</span>
</template>
<template v-if="coins">
<Icon type="home" icon="coin-outline"></Icon> <Icon type="home" icon="coin-outline"></Icon>
{{coins}} <span>{{coins}}</span>
</template> </template>
<template v-if="favorites"> <template v-if="favorites">
<Icon type="home" icon="favorites-outline"></Icon> <Icon type="home" icon="favorites-outline"></Icon>
{{favorites}} <span>{{favorites}}</span>
</template>
<Icon type="extended" icon="play"></Icon>
{{playCount}}
<template v-if="danmakuCount">
<Icon type="extended" icon="danmaku"></Icon>
{{danmakuCount}}
</template> </template>
</div> </div>
</a> </a>
@ -176,6 +176,9 @@ export default {
justify-self: start; justify-self: start;
margin-bottom: 8px; margin-bottom: 8px;
margin-right: 0; margin-right: 0;
> :nth-child(n + 5) {
display: none;
}
} }
} }
& > * { & > * {

View File

@ -110,6 +110,7 @@
<checkbox indent="0" key="simplifyHome" dependencies=""></checkbox> <checkbox indent="0" key="simplifyHome" dependencies=""></checkbox>
<dropdown indent="1" key="simplifyHomeStyle" dependencies="simplifyHome"></dropdown> <dropdown indent="1" key="simplifyHomeStyle" dependencies="simplifyHome"></dropdown>
<checkbox indent="1" key="simpleHomeWheelScroll" dependencies="simplifyHome"></checkbox> <checkbox indent="1" key="simpleHomeWheelScroll" dependencies="simplifyHome"></checkbox>
<checkbox indent="1" key="simpleHomePersonalized" dependencies="simplifyHome"></checkbox>
<checkbox indent="0" key="hideBanner" dependencies=""></checkbox> <checkbox indent="0" key="hideBanner" dependencies=""></checkbox>
<checkbox indent="0" key="playerShadow" dependencies=""></checkbox> <checkbox indent="0" key="playerShadow" dependencies=""></checkbox>
<checkbox indent="0" key="narrowDanmaku" dependencies=""></checkbox> <checkbox indent="0" key="narrowDanmaku" dependencies=""></checkbox>
@ -129,9 +130,9 @@
<checkbox indent="0" key="fullTweetsTitle" dependencies=""></checkbox> <checkbox indent="0" key="fullTweetsTitle" dependencies=""></checkbox>
<checkbox indent="0" key="fullActivityContent" dependencies=""></checkbox> <checkbox indent="0" key="fullActivityContent" dependencies=""></checkbox>
<checkbox indent="0" key="feedsFilter" dependencies=""></checkbox> <checkbox indent="0" key="feedsFilter" dependencies=""></checkbox>
<checkbox indent="0" key="feedsTranslate" dependencies=""></checkbox> <!-- <checkbox indent="0" key="feedsTranslate" dependencies=""></checkbox>
<dropdown indent="1" key="feedsTranslateProvider" dependencies="feedsTranslate"></dropdown> <dropdown indent="1" key="feedsTranslateProvider" dependencies="feedsTranslate"></dropdown>
<checkbox indent="1" key="commentsTranslate" dependencies="feedsTranslate"></checkbox> <checkbox indent="1" key="commentsTranslate" dependencies="feedsTranslate"></checkbox> -->
<checkbox indent="0" key="fixedSidebars" dependencies=""></checkbox> <checkbox indent="0" key="fixedSidebars" dependencies=""></checkbox>
<checkbox indent="0" key="extendFeedsLive" dependencies=""></checkbox> <checkbox indent="0" key="extendFeedsLive" dependencies=""></checkbox>
<checkbox indent="0" key="disableFeedsDetails" dependencies=""></checkbox> <checkbox indent="0" key="disableFeedsDetails" dependencies=""></checkbox>

View File

@ -138,7 +138,16 @@ function checkOfflineData () {
} }
const preCheckCompatibility = () => { const preCheckCompatibility = () => {
// empty SpinQuery.select('meta[name=spm_prefix]').then(spm => {
if (spm) {
spm.remove()
SpinQuery.select(() => unsafeWindow.__spm_prefix).then(() => {
if (unsafeWindow.__spm_prefix) {
delete unsafeWindow.__spm_prefix
}
})
}
})
} }
function checkCompatibility () { function checkCompatibility () {
if (window.devicePixelRatio === 1) { if (window.devicePixelRatio === 1) {

View File

@ -17,6 +17,9 @@
transform: rotate(360deg); transform: rotate(360deg);
font-size: 12px; font-size: 12px;
} }
body.player-fullscreen-fix & {
z-index: 1;
}
} }
.gui-settings, .gui-settings,
.gui-settings-widgets { .gui-settings-widgets {

View File

@ -209,6 +209,7 @@ export const toolTips = new Map<keyof BilibiliEvolvedSettings, string>([
[`unfoldFeeds`, /*html*/`自动展开被折叠的动态.`], [`unfoldFeeds`, /*html*/`自动展开被折叠的动态.`],
[`commentsTranslate`, /*html*/`为评论也添加翻译按钮.`], [`commentsTranslate`, /*html*/`为评论也添加翻译按钮.`],
[`simpleHomeWheelScroll`, /*html*/`在横向的卡片列表中, 允许鼠标滚轮上下滚动时变成对此列表的横向滚动. (因为是模拟的, 可能会有点卡顿)`], [`simpleHomeWheelScroll`, /*html*/`在横向的卡片列表中, 允许鼠标滚轮上下滚动时变成对此列表的横向滚动. (因为是模拟的, 可能会有点卡顿)`],
[`simpleHomePersonalized`, /*html*/`是否允许展示个性化推荐视频, 关闭后则展示热门视频.`],
[`downloadPackageEmitMode`, /*html*/`选择多个文件下载时的行为, 打包会先打成一个 zip 再下载, 分别下载会对每一个文件触发下载.`], [`downloadPackageEmitMode`, /*html*/`选择多个文件下载时的行为, 打包会先打成一个 zip 再下载, 分别下载会对每一个文件触发下载.`],
[`columnImageExporter`, /*html*/`在专栏页面中可在附加功能中导出所有图片.`], [`columnImageExporter`, /*html*/`在专栏页面中可在附加功能中导出所有图片.`],
[`feedsImageExporter`, /*html*/`在动态的右上角菜单中可选择导出图片来下载当前动态里的所有图片.`], [`feedsImageExporter`, /*html*/`在动态的右上角菜单中可选择导出图片来下载当前动态里的所有图片.`],

View File

@ -40,6 +40,10 @@
white-space: nowrap !important; white-space: nowrap !important;
} }
} }
.header-login-entry span {
white-space: nowrap !important;
font-size: smaller;
}
.live-sidebar-ctnr .sidebar-btn, .live-sidebar-ctnr .sidebar-btn,
.up-info .up-focus-btn, .up-info .up-focus-btn,
.attention-btn-ctnr .left-part, .attention-btn-ctnr .left-part,

View File

@ -69,6 +69,15 @@ async function checkNewVersion () {
latestVersionText = await Ajax.monkey({ url: Resource.cdnRoot || Resource.root + 'version.txt' }) latestVersionText = await Ajax.monkey({ url: Resource.cdnRoot || Resource.root + 'version.txt' })
} }
const latestVersion = new Version(latestVersionText) const latestVersion = new Version(latestVersionText)
if (latestVersion.parts[0] >= 2 && !settings.noNotifyV2) {
const message = /* html */`新版本<span>${latestVersion.versionString}</span>已发布, 请前往项目的<a class="link" target="_blank" href="https://github.com/the1812/Bilibili-Evolved/releases">更新日志</a>或者<a class="link" target="_blank" href="https://github.com/the1812/Bilibili-Evolved/discussions">讨论区</a>了解如何安装和使用. <a class="link" href="javascript:void(0)" id="no-notify-v2">不再提示</a>`
const toast = Toast.info(message, '检查更新')
SpinQuery.select('#no-notify-v2').then(span => span.addEventListener('click', () => {
settings.noNotifyV2 = true
toast && toast.dismiss()
}))
return false
}
const currentVersion = new Version(settings.currentVersion) const currentVersion = new Version(settings.currentVersion)
const hasNewVersion = latestVersion.greaterThan(currentVersion) const hasNewVersion = latestVersion.greaterThan(currentVersion)
if (hasNewVersion) { if (hasNewVersion) {

View File

@ -2,6 +2,9 @@ if (document.URL.replace(window.location.search, '') === 'https://www.bilibili.c
// addSettingsListener('removeGameMatchModule', value => { // addSettingsListener('removeGameMatchModule', value => {
// document.body.classList.toggle('remove-game-match-module', value) // document.body.classList.toggle('remove-game-match-module', value)
// }, true) // }, true)
SpinQuery.select('.eva-extension-area').then(it => {
it.parentElement.style.margin = '12px'
})
SpinQuery.any( SpinQuery.any(
() => dqa('.gg-pic'), () => dqa('.gg-pic'),
it => { it => {

View File

@ -20,7 +20,10 @@ body:not(.preserve-event-banner) .activity-m,
body.remove-game-match-module .bili-wrapper > .home-match, body.remove-game-match-module .bili-wrapper > .home-match,
body.remove-game-match-module #reportFirst3, body.remove-game-match-module #reportFirst3,
.home-content .ad-panel, .home-content .ad-panel,
.recommend-list .rec-list > :not(.video-page-card) { .recommend-list .rec-list > :not(.video-page-card),
.eva-extension-area,
.eva-banner
{
display: none !important; display: none !important;
} }
.recommend-list .rec-list > :not(.video-page-card) + .video-page-card { .recommend-list .rec-list > :not(.video-page-card) + .video-page-card {

View File

@ -9,21 +9,23 @@ const playerModes = [
{ {
name: '宽屏', name: '宽屏',
action: async () => { action: async () => {
document.querySelector('.bilibili-player-video-btn-widescreen').click() const { playerAgent } = await import('./player-agent')
// document.querySelector("#bilibili-player").scrollIntoView({ behavior: "smooth" }); await playerAgent.widescreen()
} }
}, },
{ {
name: '网页全屏', name: '网页全屏',
action: () => { action: async () => {
document.querySelector('.bilibili-player-video-web-fullscreen').click() const { playerAgent } = await import('./player-agent')
await playerAgent.webFullscreen()
} }
}, },
{ {
name: '全屏', name: '全屏',
action: async () => { action: async () => {
const { playerAgent } = await import('./player-agent')
const video = await SpinQuery.condition( const video = await SpinQuery.condition(
() => document.querySelector('.bilibili-player-video video'), () => document.querySelector(playerAgent.query.video.element.selector),
it => { it => {
return it !== null && it.readyState === 4 && return it !== null && it.readyState === 4 &&
document.readyState === 'complete' && document.hasFocus() document.readyState === 'complete' && document.hasFocus()
@ -32,16 +34,17 @@ const playerModes = [
console.warn('[默认播放器模式] 未能应用全屏模式, 等待超时.') console.warn('[默认播放器模式] 未能应用全屏模式, 等待超时.')
return return
} }
document.querySelector('.bilibili-player-video-btn-fullscreen').click() await playerAgent.fullscreen()
} }
} }
] ]
let lightOff = () => { } let lightOff = () => { }
let lightOn = () => { } let lightOn = () => { }
async function initLights () { async function initLights () {
const { playerAgent } = await import('./player-agent')
if (settings.autoLightOff) { if (settings.autoLightOff) {
await SpinQuery.unsafeJquery() await SpinQuery.unsafeJquery()
const settingsButton = await SpinQuery.any(() => unsafeWindow.$('.bilibili-player-video-btn-setting')) const settingsButton = await playerAgent.query.control.buttons.settings()
if (!settingsButton) { if (!settingsButton) {
return return
} }
@ -59,37 +62,20 @@ async function initLights () {
} }
async function main () { async function main () {
await initLights() await initLights()
await SpinQuery.condition( const { playerReady } = await import('./player-ready')
() => $('.bilibili-player-video,.bilibili-player-video-btn-start,.bilibili-player-area'), const { playerAgent } = await import('./player-agent')
it => it.length === 3 && $('video').length > 0 && $('video').prop('duration')) await playerReady()
const video = dq('video') const video = await playerAgent.query.video.element()
if (!video) { if (!video) {
return return
} }
const info = playerModes.find(it => it.name === settings.defaultPlayerMode) const info = playerModes.find(it => it.name === settings.defaultPlayerMode)
// if (info.name === "全屏") const onplay = async () => {
// { const container = await (playerAgent.query.bilibiliPlayer())
// const unsafe$ = await SpinQuery.unsafeJquery(); const attribute = container.getAttribute('data-screen')
// const playButton = document.querySelector(".bilibili-player-video-btn-start"); const isNormalMode = !container.className.includes('mode-') && (attribute === null || attribute === 'normal')
// const playerButtonClick = () => if (info && isNormalMode) {
// {
// const events = unsafe$(".bilibili-player-video-btn-fullscreen").data("events");
// if (events.click && events.click[0] && events.click[0].handler)
// {
// const handler = unsafe$(".bilibili-player-video-btn-fullscreen").data("events").click[0].handler;
// console.log(handler);
// handler();
// }
// playButton.removeEventListener("click", playerButtonClick);
// };
// playButton.addEventListener("click", playerButtonClick);
// }
// else
{
const onplay = () => {
if (info && $('#bilibiliPlayer[class*=mode-]').length === 0) {
info.action() info.action()
} }
} }
@ -111,6 +97,5 @@ async function main () {
video.addEventListener('ended', lightOn) video.addEventListener('ended', lightOn)
video.addEventListener('pause', lightOn) video.addEventListener('pause', lightOn)
video.addEventListener('play', lightOff) video.addEventListener('play', lightOff)
}
} }
Observer.videoChange(main) Observer.videoChange(main)

View File

@ -9,7 +9,7 @@
color: white; color: white;
pointer-events: none; pointer-events: none;
opacity: 0; opacity: 0;
z-index: 100; z-index: 150;
display: flex; display: flex;
align-items: center; align-items: center;
font-size: 14pt; font-size: 14pt;

View File

@ -10,37 +10,43 @@ const supportedUrls = [
'https://www.bilibili.com/festival/2021bnj', 'https://www.bilibili.com/festival/2021bnj',
] ]
let config: { enable: boolean, bindings: KeyBinding[] } | undefined = undefined let config: { enable: boolean, bindings: KeyBinding[] } | undefined = undefined;
if (supportedUrls.some(url => document.URL.startsWith(url))) { (async () => {
const clickElement = (target: string | HTMLElement) => { if (!supportedUrls.some(url => document.URL.startsWith(url))) {
return ({ event }: KeyBindingActionContext) => { return
}
const { playerAgent } = await import('../player-agent')
const clickElement = (target: string | HTMLElement | Promise<HTMLElement | null>) => {
return async ({ event }: KeyBindingActionContext) => {
const mouseEvent = new MouseEvent('click', { const mouseEvent = new MouseEvent('click', {
..._.pick(event, 'ctrlKey', 'shiftKey', 'altKey', 'metaKey') ..._.pick(event, 'ctrlKey', 'shiftKey', 'altKey', 'metaKey')
}) })
if (typeof target === 'string') { if (typeof target === 'string') {
(dq(target) as HTMLElement)?.dispatchEvent(mouseEvent) (dq(target) as HTMLElement)?.dispatchEvent(mouseEvent)
} else { } else {
target.dispatchEvent(mouseEvent) const element = await target
element?.dispatchEvent(mouseEvent)
} }
} }
} }
const changeVideoTime = (delta: number) => { const changeVideoTime = (delta: number) => {
return () => { return async () => playerAgent.changeTime(delta)
const video = dq('.bilibili-player-video video') as HTMLVideoElement // return async () => {
console.log(`[keymap] requested video time change, delta = ${delta}`) // const video = await playerAgent.query.video.element() as HTMLVideoElement
if (!video) { // console.log(`[keymap] requested video time change, delta = ${delta}`)
console.log('[keymap] video element not found') // if (!video) {
return // console.log('[keymap] video element not found')
} // return
if (!unsafeWindow.player) { // }
// fallback // if (!unsafeWindow.player) {
console.log('[keymap] fallback') // // fallback
video.currentTime += delta // console.log('[keymap] fallback')
return // video.currentTime += delta
} // return
console.log('[keymap] player API seek') // }
unsafeWindow.player.seek(video.currentTime + delta, video.paused) // console.log('[keymap] player API seek')
} // unsafeWindow.player.seek(video.currentTime + delta, video.paused)
// }
} }
/** 提示框用的`setTimeout`句柄 */ /** 提示框用的`setTimeout`句柄 */
let tipTimeoutHandle: number let tipTimeoutHandle: number
@ -49,10 +55,10 @@ if (supportedUrls.some(url => document.URL.startsWith(url))) {
* @param text ( HTML) * @param text ( HTML)
* @param icon MDI class * @param icon MDI class
*/ */
const showTip = (text: string, icon: string) => { const showTip = async (text: string, icon: string) => {
let tip = dq('.keymap-tip') as HTMLDivElement let tip = dq('.keymap-tip') as HTMLDivElement
if (!tip) { if (!tip) {
const player = dq('.bilibili-player-video-wrap') const player = await playerAgent.query.playerArea() as HTMLElement
if (!player) { if (!player) {
return return
} }
@ -86,37 +92,34 @@ if (supportedUrls.some(url => document.URL.startsWith(url))) {
} }
} }
const actions = { const actions = {
fullscreen: clickElement('.bilibili-player-video-btn-fullscreen'), fullscreen: () => playerAgent.fullscreen(),
webFullscreen: clickElement('.bilibili-player-video-web-fullscreen'), webFullscreen: () => playerAgent.webFullscreen(),
wideScreen: clickElement('.bilibili-player-video-btn-widescreen'), wideScreen: () => playerAgent.widescreen(),
volumeUp: () => { volumeUp: async () => {
const current = unsafeWindow.player.volume() const volume = await playerAgent.changeVolume(10)
unsafeWindow.player.volume(current + 0.1) showTip(`${volume}%`, 'mdi-volume-high')
showTip(`${Math.round(unsafeWindow.player.volume() * 100)}%`, 'mdi-volume-high')
}, },
volumeDown: () => { volumeDown: async () => {
const current = unsafeWindow.player.volume() const volume = await playerAgent.changeVolume(-10)
unsafeWindow.player.volume(current - 0.1) if (volume === 0) {
const after = Math.round(unsafeWindow.player.volume() * 100)
if (after === 0) {
showTip('静音', 'mdi-volume-off') showTip('静音', 'mdi-volume-off')
} else { } else {
showTip(`${after}%`, 'mdi-volume-high') showTip(`${volume}%`, 'mdi-volume-high')
} }
}, },
mute: (context: KeyBindingActionContext) => { mute: async () => {
clickElement('.bilibili-player-video-btn-volume .bilibili-player-iconfont-volume')(context) await playerAgent.toggleMute()
const isMute = unsafeWindow.player.isMute() const isMute = await playerAgent.isMute()
if (isMute) { if (isMute) {
showTip('已静音', 'mdi-volume-off') showTip('已静音', 'mdi-volume-off')
} else { } else {
showTip('已取消静音', 'mdi-volume-high') showTip('已取消静音', 'mdi-volume-high')
} }
}, },
pictureInPicture: clickElement('.bilibili-player-video-btn-pip'), pictureInPicture: () => playerAgent.togglePip(),
coin: clickElement('.video-toolbar .coin,.tool-bar .coin-info, .video-toolbar-module .coin-box, .play-options-ul > li:nth-child(2)'), coin: clickElement('.video-toolbar .coin,.tool-bar .coin-info, .video-toolbar-module .coin-box, .play-options-ul > li:nth-child(2)'),
favorite: clickElement('.video-toolbar .collect, .video-toolbar-module .fav-box, .play-options-ul > li:nth-child(3)'), favorite: clickElement('.video-toolbar .collect, .video-toolbar-module .fav-box, .play-options-ul > li:nth-child(3)'),
pause: clickElement('.bilibili-player-video-btn-start'), pause: () => playerAgent.togglePlay(),
like: (() => { like: (() => {
/** 长按`L`三连使用的记忆变量 */ /** 长按`L`三连使用的记忆变量 */
let likeClick = true let likeClick = true
@ -140,26 +143,21 @@ if (supportedUrls.some(url => document.URL.startsWith(url))) {
}) as KeyBindingAction }) as KeyBindingAction
})(), })(),
danmaku: () => { danmaku: () => {
const checkbox = dq('.bilibili-player-video-danmaku-switch input') as HTMLInputElement playerAgent.toggleDanmaku()
if (!checkbox) {
return
}
checkbox.checked = !checkbox.checked
raiseEvent(checkbox, 'change')
}, },
longJumpBackward: changeVideoTime(-settings.keymapJumpSeconds), longJumpBackward: changeVideoTime(-settings.keymapJumpSeconds),
longJumpForward: changeVideoTime(settings.keymapJumpSeconds), longJumpForward: changeVideoTime(settings.keymapJumpSeconds),
jumpBackward: changeVideoTime(-5), jumpBackward: changeVideoTime(-5),
jumpForward: changeVideoTime(5), jumpForward: changeVideoTime(5),
playerMenu: () => { playerMenu: async () => {
// menu size: 386.6 x 311 (2020-03-29) // menu size: 386.6 x 311 (2020-03-29)
// menu size: 176.65 x 194 (2020-06-09) // menu size: 176.65 x 194 (2020-06-09)
const player = dq('.bilibili-player-video-wrap') as HTMLElement const container = await playerAgent.query.video.container() as HTMLElement
if (!player) { if (!container) {
return return
} }
const rect = player.getBoundingClientRect() const rect = container.getBoundingClientRect()
player.dispatchEvent(new MouseEvent('contextmenu', { container.dispatchEvent(new MouseEvent('contextmenu', {
bubbles: true, bubbles: true,
cancelable: false, cancelable: false,
view: unsafeWindow, view: unsafeWindow,
@ -186,19 +184,7 @@ if (supportedUrls.some(url => document.URL.startsWith(url))) {
takeScreenshot: clickElement('.video-take-screenshot'), takeScreenshot: clickElement('.video-take-screenshot'),
previousFrame: clickElement('.prev-frame'), previousFrame: clickElement('.prev-frame'),
nextFrame: clickElement('.next-frame'), nextFrame: clickElement('.next-frame'),
seekBegin: () => { seekBegin: () => playerAgent.seek(0),
if (!unsafeWindow.player) {
return
}
unsafeWindow.player.play()
setTimeout(() => {
unsafeWindow.player.seek(0)
const toastText = dq(".bilibili-player-video-toast-bottom .bilibili-player-video-toast-item:first-child .bilibili-player-video-toast-item-text span:nth-child(2)")
if (toastText) {
toastText.textContent = " 00:00"
}
})
},
} }
const defaultBindings: { [action in keyof typeof actions]: string } = { const defaultBindings: { [action in keyof typeof actions]: string } = {
fullscreen: 'f', fullscreen: 'f',
@ -234,12 +220,10 @@ if (supportedUrls.some(url => document.URL.startsWith(url))) {
const keys = keyString.split(' ').filter(it => it !== '') const keys = keyString.split(' ').filter(it => it !== '')
return { return {
keys, keys,
action: (actions as any)[actionName] || (() => {}), action: (actions as any)[actionName] || (() => { }),
} as KeyBinding } as KeyBinding
}) })
} }
;(async () => {
const { loadKeyBindings } = await import('./key-bindings') const { loadKeyBindings } = await import('./key-bindings')
const { presets } = await import('./key-binding-presets') const { presets } = await import('./key-binding-presets')
addSettingsListener('keymapPreset', () => { addSettingsListener('keymapPreset', () => {
@ -255,8 +239,7 @@ if (supportedUrls.some(url => document.URL.startsWith(url))) {
} }
}, true) }, true)
resources.applyImportantStyle('keymapStyle') resources.applyImportantStyle('keymapStyle')
})() })()
}
export default { export default {
reload: () => config && (config.enable = true), reload: () => config && (config.enable = true),

295
src/video/player-agent.ts Normal file
View File

@ -0,0 +1,295 @@
/** 元素查询函数, 调用时执行 `SpinQuery.select` 查询, 可访问 `selector` 获取选择器 */
type ElementQuery<Target = HTMLElement> = {
(): Promise<Target | null>
selector: string
}
interface CustomNestedQuery<QueryResult> {
[key: string]: QueryResult | CustomNestedQuery<QueryResult>
}
interface CustomQuery<QueryResult> extends CustomNestedQuery<QueryResult> {
[key: string]: QueryResult
}
type AgentType = 'video' | 'bwp' | 'bangumi'
type CustomQueryProvider<TargetType> = {
[key in AgentType]?: TargetType
} & { video: TargetType }
interface PlayerQuery<QueryResult> extends CustomNestedQuery<QueryResult> {
playerWrap: QueryResult
bilibiliPlayer: QueryResult
playerArea: QueryResult
video: {
element: QueryResult
wrap: QueryResult
top: QueryResult
state: QueryResult
panel: QueryResult
popup: QueryResult
subtitle: QueryResult
basDanmaku: QueryResult
advDanmaku: QueryResult
danmaku: QueryResult
container: QueryResult
}
control: {
element: QueryResult
wrap: QueryResult
mask: QueryResult
top: QueryResult
progress: QueryResult
bottom: QueryResult
bottomLeft: QueryResult
bottomCenter: QueryResult
bottomRight: QueryResult
buttons: {
start: QueryResult
next: QueryResult
time: QueryResult
quality: QueryResult
pageList: QueryResult
speed: QueryResult
subtitle: QueryResult
volume: QueryResult
settings: QueryResult
pip: QueryResult
widescreen: QueryResult
webFullscreen: QueryResult
fullscreen: QueryResult
}
}
toastWrap: QueryResult
danmakuTipLayer: QueryResult
danmakuSwitch: QueryResult
}
const select = (selector: string): ElementQuery => {
const func = () => SpinQuery.select(selector)
func.selector = selector
return func
}
const selectorWrap = (query: CustomNestedQuery<string>): CustomNestedQuery<ElementQuery> => {
const map = (value: string | Record<string, any>): ElementQuery | Record<string, any> => {
if (typeof value !== 'string') {
return _.mapValues(value, map)
}
return select(value)
}
return _.mapValues(query, map) as CustomNestedQuery<ElementQuery>
}
export abstract class PlayerAgent {
abstract type: AgentType
abstract query: PlayerQuery<ElementQuery>
protected async click(target: () => Promise<HTMLElement | null>) {
const button = await target()
button?.click()
}
provideCustomQuery<CustomQueryType extends CustomQuery<string>>(config: CustomQueryProvider<CustomQueryType>) {
const custom = selectorWrap(config[this.type] ?? config.video) as CustomQuery<ElementQuery>
return { ...this, custom } as (this & { custom: { [key in keyof CustomQueryType]: ElementQuery } })
}
async widescreen() {
await this.click(this.query.control.buttons.widescreen)
}
async webFullscreen() {
await this.click(this.query.control.buttons.webFullscreen)
}
async fullscreen() {
await this.click(this.query.control.buttons.fullscreen)
}
async togglePlay() {
await this.click(this.query.control.buttons.start)
}
async togglePip() {
await this.click(this.query.control.buttons.pip)
}
async toggleMute() {
await this.click(this.query.control.buttons.volume)
}
async toggleDanmaku() {
const checkbox = await this.query.danmakuSwitch() as HTMLInputElement
if (!checkbox) {
return
}
checkbox.checked = !checkbox.checked
raiseEvent(checkbox, 'change')
}
abstract isMute(): Promise<boolean>
/** 更改音量 (%) */
abstract changeVolume(change: number): Promise<number>
/** 跳转到指定时间 */
abstract seek(time: number): Promise<number>
/** 更改时间 */
abstract changeTime(change: number): Promise<number>
}
export class VideoPlayerAgent extends PlayerAgent {
type: AgentType = 'video'
get nativeApi() { return unsafeWindow.player }
query = selectorWrap({
playerWrap: '.player-wrap',
bilibiliPlayer: '.bilibili-player',
playerArea: '.bilibili-player-area',
video: {
element: 'video',
wrap: '.bilibili-player-video-wrap',
top: '.bilibili-player-top',
state: '.bilibili-player-state',
panel: '.bilibili-player-video-panel',
popup: '.bilibili-player-video-popup',
subtitle: '.bilibili-player-video-subtitle',
basDanmaku: '.bilibili-player-bas-danmaku',
advDanmaku: '.bilibili-player-adv-danmaku',
danmaku: '.bilibili-player-danmaku',
container: '.bilibili-player-video',
},
control: {
element: '.bilibili-player-control',
wrap: '.bilibili-player-control-wrap',
mask: '.bilibili-player-control-mask',
top: '.bilibili-player-control-top',
progress: '.bilibili-player-video-progress',
bottom: '.bilibili-player-control-bottom',
bottomLeft: '.bilibili-player-control-bottom-left',
bottomCenter: '.bilibili-player-control-bottom-center',
bottomRight: '.bilibili-player-control-bottom-right',
buttons: {
start: '.bilibili-player-video-btn-start',
next: '.bilibili-player-video-btn-next',
time: '.bilibili-player-video-time',
quality: '.bilibili-player-btn-quality',
pageList: '.bilibili-player-video-btn-pagelist',
speed: '.bilibili-player-video-btn-speed',
subtitle: '.bilibili-player-video-btn-subtitle',
volume: '.bilibili-player-video-btn-volume .bilibili-player-iconfont-volume',
settings: '.bilibili-player-video-btn-setting',
pip: '.bilibili-player-video-btn-pip',
widescreen: '.bilibili-player-video-btn-widescreen',
webFullscreen: '.bilibili-player-video-web-fullscreen',
fullscreen: '.bilibili-player-video-btn-fullscreen',
}
},
toastWrap: '.bilibili-player-video-toast-wrp',
danmakuTipLayer: '.bilibili-player-dm-tip-wrap',
danmakuSwitch: '.bilibili-player-video-danmaku-switch input',
}) as PlayerQuery<ElementQuery>
async isMute() {
return this.nativeApi.isMute()
}
async changeVolume(change: number) {
const current = this.nativeApi.volume()
this.nativeApi.volume(current + change / 100)
return Math.round(this.nativeApi.volume() * 100)
}
async seek(time: number) {
this.nativeApi.play()
setTimeout(() => {
this.nativeApi.seek(time)
const toastText = dq(".bilibili-player-video-toast-bottom .bilibili-player-video-toast-item:first-child .bilibili-player-video-toast-item-text span:nth-child(2)")
if (toastText) {
toastText.textContent = " 00:00"
}
})
return this.nativeApi.getCurrentTime()
}
async changeTime(change: number) {
const video = await this.query.video.element() as HTMLVideoElement
this.nativeApi.seek(video.currentTime + change, video.paused)
return this.nativeApi.getCurrentTime()
}
}
export class BwpPlayerAgent extends VideoPlayerAgent {
type: AgentType = 'bwp'
constructor() {
super()
this.query.video.element = select('bwp-video')
}
}
export class BangumiPlayerAgent extends PlayerAgent {
type: AgentType = 'bangumi'
query = selectorWrap({
playerWrap: '.player-module',
bilibiliPlayer: '.bpx-player-container',
playerArea: '.bpx-player-primary-area',
video: {
element: 'video',
wrap: '.bpx-player-video-area',
top: '.bpx-player-top-wrap',
state: '.bpx-player-state-wrap',
panel: '.bpx-player-ending-panel',
popup: '.bpx-player-dialog-wrap',
subtitle: '.bpx-player-subtitle-wrap',
basDanmaku: '.bpx-player-bas-dm-wrap',
advDanmaku: '.bpx-player-adv-dm-wrap',
danmaku: '.bpx-player-row-dm-wrap',
container: '.bpx-player-video-wrap',
},
control: {
element: '.squirtle-controller',
wrap: '.bpx-player-control-wrap',
mask: '.bpx-player-control-mask',
top: '.bpx-player-control-top',
progress: '.squirtle-progress-wrap',
bottom: '.squirtle-controller-wrap',
bottomLeft: '.squirtle-controller-wrap-left',
bottomCenter: '.squirtle-controller-wrap-center',
bottomRight: '.squirtle-controller-wrap-right',
buttons: {
start: '.squirtle-video-start',
next: '.squirtle-video-next',
time: '.squirtle-video-time',
quality: '.squirtle-video-quality',
pageList: '.squirtle-video-pagelist',
speed: '.squirtle-video-speed',
subtitle: '.squirtle-video-subtitle',
volume: '.squirtle-video-volume .squirtle-volume-icon',
settings: '.squirtle-video-setting',
pip: '.squirtle-video-pip',
widescreen: '.squirtle-video-widescreen',
webFullscreen: '.squirtle-video-pagefullscreen',
fullscreen: '.squirtle-video-fullscreen',
}
},
toastWrap: '.bpx-player-tooltip-area',
danmakuTipLayer: '.bpx-player-dialog-wrap',
danmakuSwitch: '.bpx-player-dm-switch input',
}) as PlayerQuery<ElementQuery>
async isMute() {
const icon = await this.query.control.buttons.volume() as HTMLElement
return icon?.classList.contains('squirtle-volume-mute-state') ?? false
}
async changeVolume(change: number) {
const video = await this.query.video.element() as HTMLVideoElement
video.volume = _.clamp(video.volume + change / 100, 0, 1)
return Math.round(video.volume * 100)
}
async seek(time: number) {
const video = await this.query.video.element() as HTMLVideoElement
video.play()
setTimeout(() => {
video.currentTime = _.clamp(time, 0, video.duration)
const toastText = dq('.bpx-player-toast-row .bpx-player-toast-item .bpx-player-toast-text')
if (toastText?.textContent?.startsWith('已为您定位至')) {
toastText.textContent = '已为您定位至00:00'
}
})
return video.currentTime
}
async changeTime(change: number) {
const video = await this.query.video.element() as HTMLVideoElement
video.currentTime = _.clamp(video.currentTime + change, 0, video.duration)
return video.currentTime
}
}
export const playerAgent = (() => {
if (document.URL.includes('//www.bilibili.com/bangumi/play')) {
return new BangumiPlayerAgent()
}
if (unsafeWindow.__ENABLE_WASM_PLAYER__) {
return new BwpPlayerAgent()
}
return new VideoPlayerAgent()
})()
export default {
export: {
playerAgent,
}
}

View File

@ -12,8 +12,10 @@ const entry = () => {
} }
resources.applyStyle(styleID) resources.applyStyle(styleID)
const removeCover = () => document.body.style.removeProperty('--cover-url') const removeCover = () => document.body.style.removeProperty('--cover-url')
const originalPlay = HTMLVideoElement.prototype.play const isBwpVideo = unsafeWindow.__ENABLE_WASM_PLAYER__ || dq('bwp-video')
HTMLVideoElement.prototype.play = function (...args: any[]) { const proto = isBwpVideo ? BwpElement.prototype : HTMLVideoElement.prototype
const originalPlay = proto.play
proto.play = function (...args: any[]) {
removeCover() removeCover()
return originalPlay.call(this, ...args) return originalPlay.call(this, ...args)
} }

View File

@ -1,5 +1,5 @@
export class VideoSpeedController { export class VideoSpeedController {
static readonly classNameMap = { static classNameMap = {
speedMenuList: "bilibili-player-video-btn-speed-menu", speedMenuList: "bilibili-player-video-btn-speed-menu",
speedMenuItem: "bilibili-player-video-btn-speed-menu-list", speedMenuItem: "bilibili-player-video-btn-speed-menu-list",
speedNameBtn: "bilibili-player-video-btn-speed-name", speedNameBtn: "bilibili-player-video-btn-speed-name",
@ -106,7 +106,7 @@ export class VideoSpeedController {
return new VideoSpeedController(containerElement, videoElement, previousSpeed, nativeSpeed) return new VideoSpeedController(containerElement, videoElement, previousSpeed, nativeSpeed)
} }
static init = _.once(() => { static init = _.once(async () => {
// 分 P 切换时共享同一个倍数,这里指定初始倍数可以是 undefined不需要是 1 // 分 P 切换时共享同一个倍数,这里指定初始倍数可以是 undefined不需要是 1
let sharedSpeed: number | undefined = undefined let sharedSpeed: number | undefined = undefined
// 分 P 切换时共享同一个原生倍速值,初始值设置为 1 // 分 P 切换时共享同一个原生倍速值,初始值设置为 1
@ -114,6 +114,37 @@ export class VideoSpeedController {
// 持有菜单容器元素的引用videoChange 时更换(以前缓存的 VideoController 就没有意义了) // 持有菜单容器元素的引用videoChange 时更换(以前缓存的 VideoController 就没有意义了)
let containerElement: HTMLElement let containerElement: HTMLElement
const { playerAgent } = await import('../player-agent')
const extendedAgent = playerAgent.provideCustomQuery({
video: {
speedMenuList: 'bilibili-player-video-btn-speed-menu',
speedMenuItem: 'bilibili-player-video-btn-speed-menu-list',
speedNameBtn: 'bilibili-player-video-btn-speed-name',
speedContainer: 'bilibili-player-video-btn-speed',
active: 'bilibili-player-active',
show: 'bilibili-player-speed-show',
},
bangumi: {
speedMenuList: 'squirtle-speed-select-list',
speedMenuItem: 'squirtle-select-item',
speedNameBtn: 'squirtle-speed-select-result',
speedContainer: 'squirtle-speed-wrap',
active: 'active',
// bangumi 那边没有这种 class, 随便填一个就行了
show: 'bilibili-player-speed-show',
}
})
const trimLeadingDot = (selector: string) => selector.replace(/^\./, '')
VideoSpeedController.classNameMap = {
speedMenuList: trimLeadingDot(extendedAgent.custom.speedMenuList.selector),
speedMenuItem: trimLeadingDot(extendedAgent.custom.speedMenuItem.selector),
speedNameBtn: trimLeadingDot(extendedAgent.custom.speedNameBtn.selector),
speedContainer: trimLeadingDot(extendedAgent.custom.speedContainer.selector),
active: trimLeadingDot(extendedAgent.custom.active.selector),
show: trimLeadingDot(extendedAgent.custom.show.selector),
video: trimLeadingDot(extendedAgent.query.video.container.selector),
}
Observer.videoChange(async () => { Observer.videoChange(async () => {
const { getExtraSpeedMenuItemElements } = await import("./extend-video-speed") const { getExtraSpeedMenuItemElements } = await import("./extend-video-speed")
const { calcOrder } = await import("./video-speed-common") const { calcOrder } = await import("./video-speed-common")
@ -176,12 +207,20 @@ export class VideoSpeedController {
return controller return controller
} }
this._videoElement = videoElement this._videoElement = videoElement
this._containerElement = containerElement this._containerElement = containerElement
this._previousSpeedVal = previousSpeed this._previousSpeedVal = previousSpeed
this._nativeSpeedVal = nativeSpeed ?? (previousSpeed && VideoSpeedController.nativeSupportedRates.includes(previousSpeed) ? previousSpeed : 1) this._nativeSpeedVal = nativeSpeed ?? (previousSpeed && VideoSpeedController.nativeSupportedRates.includes(previousSpeed) ? previousSpeed : 1)
this._nameBtn = this._containerElement.querySelector(`.${VideoSpeedController.classNameMap.speedNameBtn}`) as HTMLButtonElement this._nameBtn = this._containerElement.querySelector(`.${VideoSpeedController.classNameMap.speedNameBtn}`) as HTMLButtonElement
this._menuListElement = this._containerElement.querySelector(`.${VideoSpeedController.classNameMap.speedMenuList}`) as HTMLElement this._menuListElement = this._containerElement.querySelector(`.${VideoSpeedController.classNameMap.speedMenuList}`) as HTMLElement
this._menuListElement.querySelectorAll(`.${VideoSpeedController.classNameMap.speedMenuItem}`).forEach(it => {
if (!it.hasAttribute('data-value')) {
const speed = parseFloat(it.textContent!).toString()
it.setAttribute('data-value', speed)
}
})
VideoSpeedController.instanceMap.set(containerElement, this) VideoSpeedController.instanceMap.set(containerElement, this)
} }

View File

@ -1 +1 @@
1.12.16 1.12.19