<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>TwilightRain</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://twilightraindev-github-io.pages.dev/</id>
  <link href="https://twilightraindev-github-io.pages.dev/" rel="alternate"/>
  <link href="https://twilightraindev-github-io.pages.dev/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, TwilightRain</rights>
  <subtitle>TwilightRain 的个人博客，记录技术探索与日常思考</subtitle>
  <title>TwilightRain</title>
  <updated>2026-07-24T13:36:26.197Z</updated>
  <entry>
    <author>
      <name>TwilightRain</name>
    </author>
    <category term="项目故事" scheme="https://twilightraindev-github-io.pages.dev/categories/%E9%A1%B9%E7%9B%AE%E6%95%85%E4%BA%8B/"/>
    <category term="BiliCompact" scheme="https://twilightraindev-github-io.pages.dev/tags/BiliCompact/"/>
    <category term="Tampermonkey" scheme="https://twilightraindev-github-io.pages.dev/tags/Tampermonkey/"/>
    <category term="JavaScript" scheme="https://twilightraindev-github-io.pages.dev/tags/JavaScript/"/>
    <category term="前端" scheme="https://twilightraindev-github-io.pages.dev/tags/%E5%89%8D%E7%AB%AF/"/>
    <category term="产品设计" scheme="https://twilightraindev-github-io.pages.dev/tags/%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1/"/>
    <category term="架构" scheme="https://twilightraindev-github-io.pages.dev/tags/%E6%9E%B6%E6%9E%84/"/>
    <content>
      <![CDATA[<blockquote><p>BiliCompact 是一个非侵入式的 B 站首页精简用户脚本。本文从动机、设计、技术三个维度完整回顾这个项目。</p></blockquote><h2 id="缘起：为什么要写这个脚本"><a href="#缘起：为什么要写这个脚本" class="headerlink" title="缘起：为什么要写这个脚本"></a>缘起：为什么要写这个脚本</h2><p>写了一天代码，晚上瘫在椅子上，打开 B 站想刷两个视频放松一下。</p><p>结果首页一刷新，直播，番剧，推广，付费课程铺了一整屏。我就想看两三个视频，信息量却先灌一脸，反而更累了。</p><p>这种憋屈感持续了挺久。不是说直播没人爱看，番剧没人追，但 B 站不管你想看什么，一股脑全塞给你。</p><p>我忍过，也试过假装看不见。但每次打开首页都像被按着头喂饭。后来想通了，与其每次都烦，不如自己动手。</p><p>于是有了 <strong>BiliCompact</strong>。</p><span id="more"></span><p>要求很简单，首页想显示几个视频就显示几个。十个太多？五个。五个还多？三个也行。直播，广告，番剧推广，不想看就别出现。评论区满屏的 @某某某 刷屏，能自动清掉最好。</p><p>然后就动手了。</p><h2 id="痛点：B-站首页的信息过载"><a href="#痛点：B-站首页的信息过载" class="headerlink" title="痛点：B 站首页的信息过载"></a>痛点：B 站首页的信息过载</h2><p>打开 B 站首页，扑面而来的是：</p><ul><li>直播流 — 大量正在直播的推荐</li><li>番剧推荐 — 你不一定感兴趣</li><li>广告 &#x2F; 推广 — 商业内容</li><li>付费课程 — 推销入口</li></ul><p>真正想看的视频，被淹没在其中。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">直播 ████████████████████████████████████ 100%</span><br><span class="line">番剧 ██████████████████████████████ 80%</span><br><span class="line">广告 ████████████████████ 50%</span><br><span class="line">付费 ██████████ 20%</span><br><span class="line">真正想看的 ██████ 12%</span><br></pre></td></tr></table></figure><h3 id="之前-vs-之后"><a href="#之前-vs-之后" class="headerlink" title="之前 vs 之后"></a>之前 vs 之后</h3><p><strong>之前</strong>：3 列密集网格，信息拥挤</p><p><strong>之后</strong>：2 列宽松布局，一目了然</p><h2 id="设计哲学：非侵入式"><a href="#设计哲学：非侵入式" class="headerlink" title="设计哲学：非侵入式"></a>设计哲学：非侵入式</h2><p>很多同类脚本会在页面注入 UI 元素——按钮、浮窗、侧边栏。好处是交互直观，坏处是<strong>耦合太深</strong>。B 站的前端频繁改版，每次 DOM 结构调整，注入的 UI 就可能错位、失效，甚至阻塞页面渲染。</p><p>BiliCompact 的做法相反：</p><ul><li><strong>不在 B 站页面注入任何 UI 元素</strong></li><li>配置面板通过 Tampermonkey 的 <code>GM_registerMenuCommand</code> 唤起，以浮层形式展示</li><li>所有过滤逻辑在后台执行，页面外观无变化</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">GM_registerMenuCommand(T(&#x27;MenuSettings&#x27;), () =&gt; OpenConfigPanel());</span><br><span class="line">GM_registerMenuCommand(T(&#x27;MenuRefresh&#x27;), () =&gt; LimitVideos());</span><br><span class="line">GM_registerMenuCommand(T(&#x27;MenuToggle&#x27;), () =&gt; &#123; IsActive = !IsActive; &#125;);</span><br></pre></td></tr></table></figure><p>这样做的代价是交互入口不那么直观（藏在扩展菜单里），但换来的是<strong>高稳定性</strong>——B 站改版几次了，脚本还能正常工作。</p><h2 id="功能速览"><a href="#功能速览" class="headerlink" title="功能速览"></a>功能速览</h2><table><thead><tr><th>功能</th><th>说明</th></tr></thead><tbody><tr><td>数量限制</td><td>设置每页最大显示视频数量，不同页面可独立设置</td></tr><tr><td>智能过滤</td><td>排除直播 &#x2F; 广告 &#x2F; 番剧 &#x2F; 付费课程</td></tr><tr><td>UP 主白名单</td><td>保留指定 UP 主的内容</td></tr><tr><td>一键切换</td><td>快捷开关，随时恢复原始首页</td></tr><tr><td>评论净化</td><td>删除 @ 提及，隐藏短评论</td></tr><tr><td>配置持久化</td><td>跨页面保存所有设置</td></tr></tbody></table><h3 id="配置面板"><a href="#配置面板" class="headerlink" title="配置面板"></a>配置面板</h3><p>通过 Tampermonkey 菜单打开：</p><table><thead><tr><th>设置项</th><th>说明</th><th>默认</th></tr></thead><tbody><tr><td>最大显示数量</td><td>每页最多显示的视频数</td><td>10</td></tr><tr><td>排除直播</td><td>隐藏直播推荐</td><td>✅</td></tr><tr><td>排除广告</td><td>隐藏推广内容</td><td>✅</td></tr><tr><td>排除番剧</td><td>隐藏番剧推荐</td><td>✅</td></tr><tr><td>排除付费课程</td><td>隐藏付费内容</td><td>✅</td></tr><tr><td>保留推广位</td><td>推广内容不计入数量</td><td>❌</td></tr><tr><td>调试模式</td><td>输出日志到控制台</td><td>❌</td></tr><tr><td>评论净化</td><td>自动删除 @ 提及</td><td>❌</td></tr></tbody></table><p>每种页面可以独立配置数量：首页 10、热门 8、分区 10、动态 6、搜索 10。</p><h2 id="技术架构"><a href="#技术架构" class="headerlink" title="技术架构"></a>技术架构</h2><h3 id="选择器探测机制"><a href="#选择器探测机制" class="headerlink" title="选择器探测机制"></a>选择器探测机制</h3><p>B 站首页的 DOM 结构经常变化，直接写死 CSS 选择器是行不通的。脚本实现了一套<strong>多层级降级探测</strong>策略：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">第一层  id / class 精准选择器              覆盖 2%</span><br><span class="line">第二层  data-* 属性探测 (data-video-id)     +3%</span><br><span class="line">第三层  宽泛属性选择器 [class*=&quot;video&quot;]      +5%</span><br><span class="line">第四层  链接文本回退 (&lt;a href=&quot;/video/&quot;&gt;)    +80%</span><br><span class="line">────────────────────────────────────────</span><br><span class="line">最终覆盖率                                  99%+</span><br></pre></td></tr></table></figure><p>具体实现上，每层依次尝试：</p><ol><li><strong>精确类名</strong>（<code>.bili-video-card</code>, <code>.feed-card</code> 等）</li><li><strong>通配类名</strong>（<code>[class*=&quot;video-card&quot;]</code> 等）</li><li><strong>通过链接回退</strong>（查找包含 <code>/video/</code> 链接的父级卡片）</li></ol><p>选择器被缓存，在 URL 变化时自动失效重新探测，适应 SPA 路由切换。</p><h3 id="过滤引擎"><a href="#过滤引擎" class="headerlink" title="过滤引擎"></a>过滤引擎</h3><p>过滤逻辑分为几个阶段，顺序执行：</p><ol><li><strong>去重</strong>：消除嵌套卡片，避免同一个视频被重复计数</li><li><strong>规则过滤</strong>：按配置排除直播、广告、番剧、付费内容</li><li><strong>UP 主白名单</strong>：指定 ID 的 UP 主视频始终保留</li><li><strong>数量截断</strong>：超出限制的视频隐藏</li><li><strong>推广位保护</strong>：配置为保留推广位时，不计入数量限制</li></ol><h3 id="Grid-塌陷处理"><a href="#Grid-塌陷处理" class="headerlink" title="Grid 塌陷处理"></a>Grid 塌陷处理</h3><p>B 站使用 CSS Grid 布局，简单地 <code>display: none</code> 卡片元素不会让网格塌陷，会留下空白。</p><p>BiliCompact 的处理方式是同时设置多个样式：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">El</span>.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line"><span class="title class_">El</span>.<span class="property">style</span>.<span class="property">visibility</span> = <span class="string">&#x27;hidden&#x27;</span>;</span><br><span class="line"><span class="title class_">El</span>.<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line"><span class="title class_">El</span>.<span class="property">style</span>.<span class="property">height</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line"><span class="title class_">El</span>.<span class="property">style</span>.<span class="property">margin</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line"><span class="title class_">El</span>.<span class="property">style</span>.<span class="property">padding</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line"><span class="title class_">El</span>.<span class="property">style</span>.<span class="property">overflow</span> = <span class="string">&#x27;hidden&#x27;</span>;</span><br><span class="line"><span class="title class_">El</span>.<span class="property">style</span>.<span class="property">flex</span> = <span class="string">&#x27;0 0 0&#x27;</span>;</span><br><span class="line"><span class="title class_">El</span>.<span class="property">style</span>.<span class="property">position</span> = <span class="string">&#x27;absolute&#x27;</span>;</span><br></pre></td></tr></table></figure><p>通过 <code>height: 0</code> + <code>padding: 0</code> + <code>position: absolute</code> + <code>overflow: hidden</code> 的组合，确保网格完全塌陷，不留视觉空白。</p><h3 id="MutationObserver-节流"><a href="#MutationObserver-节流" class="headerlink" title="MutationObserver + 节流"></a>MutationObserver + 节流</h3><p>为了应对 B 站 SPA 动态加载内容，BiliCompact 使用 <code>MutationObserver</code> 监听 DOM 变化：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">DOM 变化 → MutationObserver 触发 → 防抖/节流(200ms) → 执行精简</span><br><span class="line">                                                              ↕</span><br><span class="line">                                                      定时回查(5s)</span><br></pre></td></tr></table></figure><ul><li>200ms <strong>节流</strong>：防止高频触发</li><li>300ms <strong>防抖</strong>：等待 DOM 稳定后再执行</li><li>5s <strong>定时回查</strong>：兜底处理动态加载的内容</li></ul><h3 id="Shadow-DOM-穿透"><a href="#Shadow-DOM-穿透" class="headerlink" title="Shadow DOM 穿透"></a>Shadow DOM 穿透</h3><p>B 站新版评论区使用 Web Components 技术，评论内容在多层 Shadow DOM 内部：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&lt;bili-comments&gt;</span><br><span class="line">  └─ shadowRoot →</span><br><span class="line">    &lt;bili-comment-thread-renderer&gt;</span><br><span class="line">      └─ shadowRoot →</span><br><span class="line">        &lt;bili-comment-renderer&gt;</span><br><span class="line">          └─ shadowRoot →</span><br><span class="line">            &lt;bili-rich-text&gt;</span><br><span class="line">              └─ shadowRoot → #contents</span><br></pre></td></tr></table></figure><p>净化器递归访问 <code>element.shadowRoot</code> 属性，穿透所有 Shadow DOM 边界，找到评论内容容器：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">purifierGetContentsEl</span>(<span class="params">renderer</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> richText = renderer.<span class="property">shadowRoot</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-rich-text&#x27;</span>);</span><br><span class="line">    <span class="keyword">if</span> (richText &amp;&amp; richText.<span class="property">shadowRoot</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> richText.<span class="property">shadowRoot</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;contents&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>删除所有 <code>a[data-type=&quot;mention&quot;]</code>（@ 提及标签），然后检查剩余文字长度，不足 5 字的评论整体隐藏。通过 MutationObserver 监听评论区动态加载，新评论出现时自动处理。同时兼容同页面其他脚本，检测到共存时仅做日志标记，不冲突。</p><h3 id="元素去除系统"><a href="#元素去除系统" class="headerlink" title="元素去除系统"></a>元素去除系统</h3><p>除了核心的视频数量限制，脚本还提供了一组可选的 UI 元素去除预设，涵盖首页轮播图、频道导航、创作中心入口、直播入口等 13 个可去除元素。每个预设包含多版本选择器，适配 B 站不同的 DOM 版本。</p><h3 id="多语言支持"><a href="#多语言支持" class="headerlink" title="多语言支持"></a>多语言支持</h3><p>内置完整的 i18n 系统，支持简体中文、繁体中文、英文，自动根据浏览器语言切换：</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">ResolveLanguage</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">Language</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">Language</span> !== <span class="string">&#x27;auto&#x27;</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">Config</span>.<span class="property">Language</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">const</span> <span class="title class_">Nav</span> = (navigator.<span class="property">language</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">    <span class="keyword">if</span> (<span class="regexp">/^zh-(tw|hk|mo)$/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>) || <span class="regexp">/^zh-(hant)$/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>)) <span class="keyword">return</span> <span class="string">&#x27;zh_TW&#x27;</span>;</span><br><span class="line">    <span class="keyword">if</span> (<span class="regexp">/^zh/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>)) <span class="keyword">return</span> <span class="string">&#x27;zh_CN&#x27;</span>;</span><br><span class="line">    <span class="keyword">if</span> (<span class="regexp">/^en/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>)) <span class="keyword">return</span> <span class="string">&#x27;en_US&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&#x27;zh_CN&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>所有用户可见文本通过 <code>T(key, ...args)</code> 函数统一翻译，键缺失时自动回退到中文，不会出现英文报错。语言可在配置面板中手动切换，切换后立即生效。</p><h3 id="持久化与实时生效"><a href="#持久化与实时生效" class="headerlink" title="持久化与实时生效"></a>持久化与实时生效</h3><p>所有配置通过 <code>GM_setValue</code> &#x2F; <code>GM_getValue</code> 持久化，刷新页面不丢失。配置变更后立即生效，无需手动刷新。同时包含定时后备检查（每 5 秒），防止 B 站 SPA 的动态加载导致视频数量超出限制——这是一种防御性编程，确保极端情况下也能正常工作。</p><h2 id="用户反馈"><a href="#用户反馈" class="headerlink" title="用户反馈"></a>用户反馈</h2><p>没想到会有人愿意用这东西。</p><p>一开始只是自己用，顺手传到了 GreasyFork，想着万一有人需要呢。后来真有人说不用被首页轰炸了，还有人问能不能加某某功能。</p><p>看到这些还挺高兴的。</p><p>现在的互联网产品越做越重，功能越堆越多。但用户想要的，有时候就是清静一点。在产品和用户之间，BiliCompact 尝试稍微往用户这边拉一拉。</p><p>如果你也装了它，觉得有用，那我很高兴。觉得哪里不好用，也欢迎提。</p><p>代码完全开源，MIT 协议，想改就改，想删就删，没什么藏着掖着的。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>BiliCompact 在功能上并不复杂，它的设计重心在<strong>稳定性</strong>和<strong>非侵入性</strong>上。一些值得借鉴的点：</p><ol><li><strong>选择器多梯队探测</strong>——应对频繁的前端改版</li><li><strong>非侵入式 UI</strong>——不污染页面 DOM，降低耦合</li><li><strong>Shadow DOM 穿透</strong>——处理现代前端框架的封装</li><li><strong>防御性定时检查</strong>——SPA 动态加载的兜底策略</li></ol><p>项目地址：<a href="https://greasyfork.org/scripts/585777">GreasyFork - BiliCompact</a> | <a href="https://github.com/TwilightRainDev">GitHub</a></p>]]>
    </content>
    <id>https://twilightraindev-github-io.pages.dev/2026/07/22/bilicompact-complete/</id>
    <link href="https://twilightraindev-github-io.pages.dev/2026/07/22/bilicompact-complete/"/>
    <published>2026-07-22T04:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>BiliCompact 是一个非侵入式的 B 站首页精简用户脚本。本文从动机、设计、技术三个维度完整回顾这个项目。</p>
</blockquote>
<h2 id="缘起：为什么要写这个脚本"><a href="#缘起：为什么要写这个脚本" class="headerlink" title="缘起：为什么要写这个脚本"></a>缘起：为什么要写这个脚本</h2><p>写了一天代码，晚上瘫在椅子上，打开 B 站想刷两个视频放松一下。</p>
<p>结果首页一刷新，直播，番剧，推广，付费课程铺了一整屏。我就想看两三个视频，信息量却先灌一脸，反而更累了。</p>
<p>这种憋屈感持续了挺久。不是说直播没人爱看，番剧没人追，但 B 站不管你想看什么，一股脑全塞给你。</p>
<p>我忍过，也试过假装看不见。但每次打开首页都像被按着头喂饭。后来想通了，与其每次都烦，不如自己动手。</p>
<p>于是有了 <strong>BiliCompact</strong>。</p>]]>
    </summary>
    <title>BiliCompact 完全解析：从动机到架构</title>
    <updated>2026-07-24T13:36:26.197Z</updated>
  </entry>
  <entry>
    <author>
      <name>TwilightRain</name>
    </author>
    <category term="代码仓库" scheme="https://twilightraindev-github-io.pages.dev/categories/%E4%BB%A3%E7%A0%81%E4%BB%93%E5%BA%93/"/>
    <category term="BiliCompact" scheme="https://twilightraindev-github-io.pages.dev/tags/BiliCompact/"/>
    <category term="Tampermonkey" scheme="https://twilightraindev-github-io.pages.dev/tags/Tampermonkey/"/>
    <category term="JavaScript" scheme="https://twilightraindev-github-io.pages.dev/tags/JavaScript/"/>
    <category term="源码" scheme="https://twilightraindev-github-io.pages.dev/tags/%E6%BA%90%E7%A0%81/"/>
    <content>
      <![CDATA[<blockquote><p>以下为 BiliCompact 用户脚本 v2.5.1 的完整源码，MIT 协议，可自由使用、修改、分发。<br>安装方法：复制到 Tampermonkey &#x2F; Violentmonkey 新建脚本中保存即可。</p></blockquote><span id="more"></span><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br><span class="line">776</span><br><span class="line">777</span><br><span class="line">778</span><br><span class="line">779</span><br><span class="line">780</span><br><span class="line">781</span><br><span class="line">782</span><br><span class="line">783</span><br><span class="line">784</span><br><span class="line">785</span><br><span class="line">786</span><br><span class="line">787</span><br><span class="line">788</span><br><span class="line">789</span><br><span class="line">790</span><br><span class="line">791</span><br><span class="line">792</span><br><span class="line">793</span><br><span class="line">794</span><br><span class="line">795</span><br><span class="line">796</span><br><span class="line">797</span><br><span class="line">798</span><br><span class="line">799</span><br><span class="line">800</span><br><span class="line">801</span><br><span class="line">802</span><br><span class="line">803</span><br><span class="line">804</span><br><span class="line">805</span><br><span class="line">806</span><br><span class="line">807</span><br><span class="line">808</span><br><span class="line">809</span><br><span class="line">810</span><br><span class="line">811</span><br><span class="line">812</span><br><span class="line">813</span><br><span class="line">814</span><br><span class="line">815</span><br><span class="line">816</span><br><span class="line">817</span><br><span class="line">818</span><br><span class="line">819</span><br><span class="line">820</span><br><span class="line">821</span><br><span class="line">822</span><br><span class="line">823</span><br><span class="line">824</span><br><span class="line">825</span><br><span class="line">826</span><br><span class="line">827</span><br><span class="line">828</span><br><span class="line">829</span><br><span class="line">830</span><br><span class="line">831</span><br><span class="line">832</span><br><span class="line">833</span><br><span class="line">834</span><br><span class="line">835</span><br><span class="line">836</span><br><span class="line">837</span><br><span class="line">838</span><br><span class="line">839</span><br><span class="line">840</span><br><span class="line">841</span><br><span class="line">842</span><br><span class="line">843</span><br><span class="line">844</span><br><span class="line">845</span><br><span class="line">846</span><br><span class="line">847</span><br><span class="line">848</span><br><span class="line">849</span><br><span class="line">850</span><br><span class="line">851</span><br><span class="line">852</span><br><span class="line">853</span><br><span class="line">854</span><br><span class="line">855</span><br><span class="line">856</span><br><span class="line">857</span><br><span class="line">858</span><br><span class="line">859</span><br><span class="line">860</span><br><span class="line">861</span><br><span class="line">862</span><br><span class="line">863</span><br><span class="line">864</span><br><span class="line">865</span><br><span class="line">866</span><br><span class="line">867</span><br><span class="line">868</span><br><span class="line">869</span><br><span class="line">870</span><br><span class="line">871</span><br><span class="line">872</span><br><span class="line">873</span><br><span class="line">874</span><br><span class="line">875</span><br><span class="line">876</span><br><span class="line">877</span><br><span class="line">878</span><br><span class="line">879</span><br><span class="line">880</span><br><span class="line">881</span><br><span class="line">882</span><br><span class="line">883</span><br><span class="line">884</span><br><span class="line">885</span><br><span class="line">886</span><br><span class="line">887</span><br><span class="line">888</span><br><span class="line">889</span><br><span class="line">890</span><br><span class="line">891</span><br><span class="line">892</span><br><span class="line">893</span><br><span class="line">894</span><br><span class="line">895</span><br><span class="line">896</span><br><span class="line">897</span><br><span class="line">898</span><br><span class="line">899</span><br><span class="line">900</span><br><span class="line">901</span><br><span class="line">902</span><br><span class="line">903</span><br><span class="line">904</span><br><span class="line">905</span><br><span class="line">906</span><br><span class="line">907</span><br><span class="line">908</span><br><span class="line">909</span><br><span class="line">910</span><br><span class="line">911</span><br><span class="line">912</span><br><span class="line">913</span><br><span class="line">914</span><br><span class="line">915</span><br><span class="line">916</span><br><span class="line">917</span><br><span class="line">918</span><br><span class="line">919</span><br><span class="line">920</span><br><span class="line">921</span><br><span class="line">922</span><br><span class="line">923</span><br><span class="line">924</span><br><span class="line">925</span><br><span class="line">926</span><br><span class="line">927</span><br><span class="line">928</span><br><span class="line">929</span><br><span class="line">930</span><br><span class="line">931</span><br><span class="line">932</span><br><span class="line">933</span><br><span class="line">934</span><br><span class="line">935</span><br><span class="line">936</span><br><span class="line">937</span><br><span class="line">938</span><br><span class="line">939</span><br><span class="line">940</span><br><span class="line">941</span><br><span class="line">942</span><br><span class="line">943</span><br><span class="line">944</span><br><span class="line">945</span><br><span class="line">946</span><br><span class="line">947</span><br><span class="line">948</span><br><span class="line">949</span><br><span class="line">950</span><br><span class="line">951</span><br><span class="line">952</span><br><span class="line">953</span><br><span class="line">954</span><br><span class="line">955</span><br><span class="line">956</span><br><span class="line">957</span><br><span class="line">958</span><br><span class="line">959</span><br><span class="line">960</span><br><span class="line">961</span><br><span class="line">962</span><br><span class="line">963</span><br><span class="line">964</span><br><span class="line">965</span><br><span class="line">966</span><br><span class="line">967</span><br><span class="line">968</span><br><span class="line">969</span><br><span class="line">970</span><br><span class="line">971</span><br><span class="line">972</span><br><span class="line">973</span><br><span class="line">974</span><br><span class="line">975</span><br><span class="line">976</span><br><span class="line">977</span><br><span class="line">978</span><br><span class="line">979</span><br><span class="line">980</span><br><span class="line">981</span><br><span class="line">982</span><br><span class="line">983</span><br><span class="line">984</span><br><span class="line">985</span><br><span class="line">986</span><br><span class="line">987</span><br><span class="line">988</span><br><span class="line">989</span><br><span class="line">990</span><br><span class="line">991</span><br><span class="line">992</span><br><span class="line">993</span><br><span class="line">994</span><br><span class="line">995</span><br><span class="line">996</span><br><span class="line">997</span><br><span class="line">998</span><br><span class="line">999</span><br><span class="line">1000</span><br><span class="line">1001</span><br><span class="line">1002</span><br><span class="line">1003</span><br><span class="line">1004</span><br><span class="line">1005</span><br><span class="line">1006</span><br><span class="line">1007</span><br><span class="line">1008</span><br><span class="line">1009</span><br><span class="line">1010</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ==UserScript==</span></span><br><span class="line"><span class="comment">// @name         网页端B站主页精简~ BiliCompact</span></span><br><span class="line"><span class="comment">// @namespace    http://tampermonkey.net/</span></span><br><span class="line"><span class="comment">// @version      2.5.1</span></span><br><span class="line"><span class="comment">// @license MIT</span></span><br><span class="line"><span class="comment">// @description  你是否厌倦了B站网页端极多视频？想要更简要的界面？这个插件将帮助你只显示指定数量的视频，支持多种页面、黑/白名单、配置持久化。非侵入式设计，不在B站页面注入任何UI元素。支持简中，繁中，英语。</span></span><br><span class="line"><span class="comment">// @author       TwilightRain</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/?*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/index/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/v/popular/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/v/*/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/dynamic*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/search*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/anime/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/guochuang/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/music/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/dance/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/game/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/technology/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/life/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/food/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/car/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/animal/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/kichiku/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/fashion/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/ent/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/cinephile/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/popular/*</span></span><br><span class="line"><span class="comment">// @run-at       document-end</span></span><br><span class="line"><span class="comment">// @grant        GM_setValue</span></span><br><span class="line"><span class="comment">// @grant        GM_getValue</span></span><br><span class="line"><span class="comment">// @grant        GM_registerMenuCommand</span></span><br><span class="line"><span class="comment">// @grant        GM_addStyle</span></span><br><span class="line"><span class="comment">// @grant        GM_log</span></span><br><span class="line"><span class="comment">// @icon         https://www.bilibili.com/favicon.ico</span></span><br><span class="line"><span class="comment">// @downloadURL https://update.greasyfork.org/scripts/585777/%E7%BD%91%E9%A1%B5%E7%AB%AFB%E7%AB%99%E4%B8%BB%E9%A1%B5%E7%B2%BE%E7%AE%80~%20BiliCompact.user.js</span></span><br><span class="line"><span class="comment">// @updateURL https://update.greasyfork.org/scripts/585777/%E7%BD%91%E9%A1%B5%E7%AB%AFB%E7%AB%99%E4%B8%BB%E9%A1%B5%E7%B2%BE%E7%AE%80~%20BiliCompact.meta.js</span></span><br><span class="line"><span class="comment">// ==/UserScript==</span></span><br><span class="line"></span><br><span class="line">(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="string">&#x27;use strict&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 国际化 (i18n) ========================</span></span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">I18N</span> = &#123;</span><br><span class="line">        <span class="attr">zh_CN</span>: &#123;</span><br><span class="line">            <span class="title class_">LogPrefix</span>: <span class="string">&#x27;[B站精简]&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorData</span>: <span class="string">&#x27;通过data属性探测到选择器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFound</span>: <span class="string">&#x27;探测到选择器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFallback</span>: <span class="string">&#x27;通过链接回退探测到选择器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogNoCards</span>: <span class="string">&#x27;未找到视频卡片，跳过&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStillNoCards</span>: <span class="string">&#x27;仍未找到视频卡片&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogProcessed</span>: <span class="string">&#x27;已处理: 总视频 &#123;0&#125;, 显示 &#123;1&#125;, 隐藏 &#123;2&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogErrorLimit</span>: <span class="string">&#x27;limitVideos 出错:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogContainerFound</span>: <span class="string">&#x27;探测到容器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogConfigLoaded</span>: <span class="string">&#x27;配置加载完成:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatus</span>: <span class="string">&#x27;精简状态: &#123;0&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOn</span>: <span class="string">&#x27;已开启&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOff</span>: <span class="string">&#x27;已关闭&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogQuickSet</span>: <span class="string">&#x27;已设置最大数量:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogTimerRetry</span>: <span class="string">&#x27;定时器检测到可见视频过多，重新执行限制&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitDone</span>: <span class="string">&#x27;脚本初始化完成，当前配置:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitError</span>: <span class="string">&#x27;初始化失败:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogObserverStarted</span>: <span class="string">&#x27;MutationObserver 已启动，监听容器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogUrlChanged</span>: <span class="string">&#x27;URL变化:&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">MenuSettings</span>: <span class="string">&#x27;B站精简设置&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuRefresh</span>: <span class="string">&#x27;手动刷新精简&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuToggle</span>: <span class="string">&#x27;切换精简状态&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuQuickSet</span>: <span class="string">&#x27;快速设数量&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuCommentPurifier</span>: <span class="string">&#x27;切换评论净化&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PanelTitle</span>: <span class="string">&#x27;B站精简设置&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusLabel</span>: <span class="string">&#x27;当前状态&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusActive</span>: <span class="string">&#x27;精简中&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusPaused</span>: <span class="string">&#x27;已暂停&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelMaxVideos</span>: <span class="string">&#x27;最大显示数量&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeLive</span>: <span class="string">&#x27;排除直播&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeAd</span>: <span class="string">&#x27;排除广告&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeBangumi</span>: <span class="string">&#x27;排除番剧&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludePaid</span>: <span class="string">&#x27;排除付费课程&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepPromoted</span>: <span class="string">&#x27;保留推广位&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepUpids</span>: <span class="string">&#x27;保留UP主ID（逗号分隔）&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelDebug</span>: <span class="string">&#x27;调试模式&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelEnableCommentPurifier</span>: <span class="string">&#x27;启用评论净化（删除@提及，隐藏短评论）&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguage</span>: <span class="string">&#x27;界面语言 / Language&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguageAuto</span>: <span class="string">&#x27;自动 (Auto)&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnPause</span>: <span class="string">&#x27;暂停精简&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnResume</span>: <span class="string">&#x27;启用精简&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnReset</span>: <span class="string">&#x27;恢复默认&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnSave</span>: <span class="string">&#x27;保存并应用&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnClose</span>: <span class="string">&#x27;关闭&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PromptQuickSet</span>: <span class="string">&#x27;输入最大显示视频数量（1-100）：&#x27;</span>,</span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="attr">zh_TW</span>: &#123;</span><br><span class="line">            <span class="title class_">LogPrefix</span>: <span class="string">&#x27;[B站精簡]&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorData</span>: <span class="string">&#x27;透過data屬性探測到選擇器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFound</span>: <span class="string">&#x27;探測到選擇器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFallback</span>: <span class="string">&#x27;透過連結回退探測到選擇器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogNoCards</span>: <span class="string">&#x27;未找到影片卡片，跳過&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStillNoCards</span>: <span class="string">&#x27;仍未找到影片卡片&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogProcessed</span>: <span class="string">&#x27;已處理: 總影片 &#123;0&#125;, 顯示 &#123;1&#125;, 隱藏 &#123;2&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogErrorLimit</span>: <span class="string">&#x27;limitVideos 出錯:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogContainerFound</span>: <span class="string">&#x27;探測到容器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogConfigLoaded</span>: <span class="string">&#x27;設定載入完成:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatus</span>: <span class="string">&#x27;精簡狀態: &#123;0&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOn</span>: <span class="string">&#x27;已開啟&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOff</span>: <span class="string">&#x27;已關閉&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogQuickSet</span>: <span class="string">&#x27;已設定最大數量:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogTimerRetry</span>: <span class="string">&#x27;定時器偵測到可見影片過多，重新執行限制&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitDone</span>: <span class="string">&#x27;指令碼初始化完成（非侵入式），目前設定:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitError</span>: <span class="string">&#x27;初始化失敗:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogObserverStarted</span>: <span class="string">&#x27;MutationObserver 已啟動，監聽容器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogUrlChanged</span>: <span class="string">&#x27;URL變化:&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">MenuSettings</span>: <span class="string">&#x27;B站精簡設定&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuRefresh</span>: <span class="string">&#x27;手動重新整理精簡&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuToggle</span>: <span class="string">&#x27;切換精簡狀態&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuQuickSet</span>: <span class="string">&#x27;快速設數量&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuCommentPurifier</span>: <span class="string">&#x27;切換評論淨化&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PanelTitle</span>: <span class="string">&#x27;B站精簡設定&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusLabel</span>: <span class="string">&#x27;目前狀態&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusActive</span>: <span class="string">&#x27;精簡中&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusPaused</span>: <span class="string">&#x27;已暫停&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelMaxVideos</span>: <span class="string">&#x27;最大顯示數量&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeLive</span>: <span class="string">&#x27;排除直播&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeAd</span>: <span class="string">&#x27;排除廣告&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeBangumi</span>: <span class="string">&#x27;排除番劇&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludePaid</span>: <span class="string">&#x27;排除付費課程&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepPromoted</span>: <span class="string">&#x27;保留推廣位&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepUpids</span>: <span class="string">&#x27;保留UP主ID（逗號分隔）&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelDebug</span>: <span class="string">&#x27;除錯模式&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelEnableCommentPurifier</span>: <span class="string">&#x27;啟用評論淨化（刪除@提及，隱藏短評論）&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguage</span>: <span class="string">&#x27;介面語言 / Language&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguageAuto</span>: <span class="string">&#x27;自動 (Auto)&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnPause</span>: <span class="string">&#x27;暫停精簡&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnResume</span>: <span class="string">&#x27;啟用精簡&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnReset</span>: <span class="string">&#x27;回復預設&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnSave</span>: <span class="string">&#x27;儲存並套用&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnClose</span>: <span class="string">&#x27;關閉&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PromptQuickSet</span>: <span class="string">&#x27;輸入最大顯示影片數量（1-100）：&#x27;</span>,</span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="attr">en_US</span>: &#123;</span><br><span class="line">            <span class="title class_">LogPrefix</span>: <span class="string">&#x27;[BiliCompact]&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorData</span>: <span class="string">&#x27;Selector detected via data attribute:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFound</span>: <span class="string">&#x27;Selector detected:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFallback</span>: <span class="string">&#x27;Selector detected via link fallback:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogNoCards</span>: <span class="string">&#x27;No video cards found, skipping&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStillNoCards</span>: <span class="string">&#x27;Still no video cards found&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogProcessed</span>: <span class="string">&#x27;Processed: total &#123;0&#125;, shown &#123;1&#125;, hidden &#123;2&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogErrorLimit</span>: <span class="string">&#x27;limitVideos error:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogContainerFound</span>: <span class="string">&#x27;Container detected:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogConfigLoaded</span>: <span class="string">&#x27;Config loaded:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatus</span>: <span class="string">&#x27;Compact status: &#123;0&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOn</span>: <span class="string">&#x27;Enabled&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOff</span>: <span class="string">&#x27;Disabled&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogQuickSet</span>: <span class="string">&#x27;Max videos set to:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogTimerRetry</span>: <span class="string">&#x27;Timer detected too many visible videos, re-running limit&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitDone</span>: <span class="string">&#x27;BiliCompact initialized (non-invasive), config:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitError</span>: <span class="string">&#x27;Initialization failed:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogObserverStarted</span>: <span class="string">&#x27;MutationObserver started, watching container:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogUrlChanged</span>: <span class="string">&#x27;URL changed:&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">MenuSettings</span>: <span class="string">&#x27;BiliCompact Settings&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuRefresh</span>: <span class="string">&#x27;Refresh Compact&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuToggle</span>: <span class="string">&#x27;Toggle Compact&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuQuickSet</span>: <span class="string">&#x27;Quick Set Count&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuCommentPurifier</span>: <span class="string">&#x27;Toggle Comment Purifier&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PanelTitle</span>: <span class="string">&#x27;BiliCompact Settings&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusLabel</span>: <span class="string">&#x27;Status&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusActive</span>: <span class="string">&#x27;Active&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusPaused</span>: <span class="string">&#x27;Paused&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelMaxVideos</span>: <span class="string">&#x27;Max videos&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeLive</span>: <span class="string">&#x27;Exclude live streams&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeAd</span>: <span class="string">&#x27;Exclude ads&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeBangumi</span>: <span class="string">&#x27;Exclude bangumi&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludePaid</span>: <span class="string">&#x27;Exclude paid courses&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepPromoted</span>: <span class="string">&#x27;Keep promoted items&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepUpids</span>: <span class="string">&#x27;Whitelist UP IDs (comma-separated)&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelDebug</span>: <span class="string">&#x27;Debug mode&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelEnableCommentPurifier</span>: <span class="string">&#x27;Enable comment purifier (remove @mentions, hide short comments)&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguage</span>: <span class="string">&#x27;Language / 語言&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguageAuto</span>: <span class="string">&#x27;Auto&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnPause</span>: <span class="string">&#x27;Pause&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnResume</span>: <span class="string">&#x27;Resume&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnReset</span>: <span class="string">&#x27;Reset Defaults&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnSave</span>: <span class="string">&#x27;Save &amp; Apply&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnClose</span>: <span class="string">&#x27;Close&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PromptQuickSet</span>: <span class="string">&#x27;Enter max videos to show (1-100):&#x27;</span>,</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">CurrentLang</span> = <span class="string">&#x27;zh_CN&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ResolveLanguage</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">Language</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">Language</span> !== <span class="string">&#x27;auto&#x27;</span>) <span class="keyword">return</span> <span class="title class_">Config</span>.<span class="property">Language</span>;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Nav</span> = (navigator.<span class="property">language</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">        <span class="keyword">if</span> (<span class="regexp">/^zh-(tw|hk|mo)$/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>) || <span class="regexp">/^zh-(hant)$/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>)) <span class="keyword">return</span> <span class="string">&#x27;zh_TW&#x27;</span>;</span><br><span class="line">        <span class="keyword">if</span> (<span class="regexp">/^zh/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>)) <span class="keyword">return</span> <span class="string">&#x27;zh_CN&#x27;</span>;</span><br><span class="line">        <span class="keyword">if</span> (<span class="regexp">/^en/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>)) <span class="keyword">return</span> <span class="string">&#x27;en_US&#x27;</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;zh_CN&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">T</span>(<span class="params">Key, ...Args</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Map</span> = <span class="variable constant_">I18N</span>[<span class="title class_">CurrentLang</span>] || <span class="variable constant_">I18N</span>[<span class="string">&#x27;zh_CN&#x27;</span>];</span><br><span class="line">        <span class="keyword">let</span> <span class="title class_">Str</span> = <span class="title class_">Map</span>[<span class="title class_">Key</span>];</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Str</span> === <span class="literal">undefined</span>) <span class="title class_">Str</span> = <span class="variable constant_">I18N</span>[<span class="string">&#x27;zh_CN&#x27;</span>][<span class="title class_">Key</span>];</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Str</span> === <span class="literal">undefined</span>) <span class="keyword">return</span> <span class="title class_">Key</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> I = <span class="number">0</span>; I &lt; <span class="title class_">Args</span>.<span class="property">length</span>; I++) &#123;</span><br><span class="line">            <span class="title class_">Str</span> = <span class="title class_">Str</span>.<span class="title function_">replace</span>(<span class="string">&#x27;&#123;&#x27;</span> + I + <span class="string">&#x27;&#125;&#x27;</span>, <span class="title class_">Args</span>[I]);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">Str</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">DEFAULTS</span> = &#123;</span><br><span class="line">        <span class="title class_">MaxVideos</span>: <span class="number">10</span>,</span><br><span class="line">        <span class="title class_">ExcludeLive</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="title class_">ExcludeAd</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="title class_">ExcludeBangumi</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="title class_">ExcludePaid</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="title class_">KeepSpecialUPIDs</span>: [],</span><br><span class="line">        <span class="title class_">KeepPromoted</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="title class_">Language</span>: <span class="string">&#x27;auto&#x27;</span>,</span><br><span class="line">        <span class="title class_">Debug</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="title class_">EnableCommentPurifier</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="title class_">RemovedElements</span>: &#123;&#125;,</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">Config</span> = &#123;&#125;;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">IsActive</span> = <span class="literal">true</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">EffectiveSelector</span> = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">VideoListContainer</span> = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">Observer</span> = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">DebounceTimer</span> = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">PurifierStarted</span> = <span class="literal">false</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">PurifierObservers</span> = [];</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">LastRun</span> = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">THROTTLE_INTERVAL</span> = <span class="number">200</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">Log</span>(<span class="params">...Args</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">Debug</span>) <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogPrefix&#x27;</span>), ...<span class="title class_">Args</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ErrorLog</span>(<span class="params">...Args</span>) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogPrefix&#x27;</span>), ...<span class="title class_">Args</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">GetConfig</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Cfg</span> = &#123;&#125;;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> [<span class="title class_">Key</span>, <span class="title class_">Def</span>] <span class="keyword">of</span> <span class="title class_">Object</span>.<span class="title function_">entries</span>(<span class="variable constant_">DEFAULTS</span>)) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123; <span class="keyword">const</span> <span class="title class_">Val</span> = <span class="title function_">GM_getValue</span>(<span class="title class_">Key</span>, <span class="title class_">Def</span>); <span class="title class_">Cfg</span>[<span class="title class_">Key</span>] = <span class="title class_">Val</span>; &#125;</span><br><span class="line">            <span class="keyword">catch</span> (E) &#123; <span class="title class_">Cfg</span>[<span class="title class_">Key</span>] = <span class="title class_">Def</span>; &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">Cfg</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">SaveConfig</span>(<span class="params">Cfg</span>) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> [<span class="title class_">Key</span>, <span class="title class_">Val</span>] <span class="keyword">of</span> <span class="title class_">Object</span>.<span class="title function_">entries</span>(<span class="title class_">Cfg</span>)) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123; <span class="title function_">GM_setValue</span>(<span class="title class_">Key</span>, <span class="title class_">Val</span>); &#125; <span class="keyword">catch</span> (E) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 评论净化器 (Comment Purifier) ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">purifierHasBlockerInstalled</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> comments = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-comments&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (!comments?.<span class="property">shadowRoot</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">const</span> threads = comments.<span class="property">shadowRoot</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;bili-comment-thread-renderer&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (threads.<span class="property">length</span> === <span class="number">0</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">return</span> <span class="title class_">Array</span>.<span class="title function_">from</span>(threads).<span class="title function_">some</span>(<span class="function"><span class="params">thread</span> =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">const</span> comment = thread.<span class="property">shadowRoot</span>?.<span class="title function_">getElementById</span>(<span class="string">&#x27;comment&#x27;</span>);</span><br><span class="line">                <span class="keyword">if</span> (!comment?.<span class="property">shadowRoot</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                <span class="keyword">const</span> userInfo = comment.<span class="property">shadowRoot</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-comment-user-info&#x27;</span>);</span><br><span class="line">                <span class="keyword">if</span> (!userInfo?.<span class="property">shadowRoot</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                <span class="keyword">const</span> info = userInfo.<span class="property">shadowRoot</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;info&#x27;</span>);</span><br><span class="line">                <span class="keyword">return</span> !!info?.<span class="title function_">querySelector</span>(<span class="string">&#x27;button[gz_type]&#x27;</span>);</span><br><span class="line">            &#125;);</span><br><span class="line">        &#125; <span class="keyword">catch</span> &#123; <span class="keyword">return</span> <span class="literal">false</span>; &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">purifierGetContentsEl</span>(<span class="params">renderer</span>) &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> richText = renderer.<span class="property">shadowRoot</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-rich-text&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (richText &amp;&amp; richText.<span class="property">shadowRoot</span>) &#123;</span><br><span class="line">                <span class="keyword">return</span> richText.<span class="property">shadowRoot</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;contents&#x27;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">purifierFindRenderers</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> list = [];</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> comments = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-comments&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (comments &amp;&amp; comments.<span class="property">shadowRoot</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> threads = comments.<span class="property">shadowRoot</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;bili-comment-thread-renderer&#x27;</span>);</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> thread <span class="keyword">of</span> threads) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (thread.<span class="property">shadowRoot</span>) &#123;</span><br><span class="line">                        thread.<span class="property">shadowRoot</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;bili-comment-renderer&#x27;</span>).<span class="title function_">forEach</span>(<span class="function"><span class="params">r</span> =&gt;</span> list.<span class="title function_">push</span>(r));</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">        <span class="keyword">return</span> list;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">purifierProcessRenderer</span>(<span class="params">renderer</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> doneKey = <span class="string">&#x27;bcPurified&#x27;</span>;</span><br><span class="line">        <span class="keyword">if</span> (renderer.<span class="property">dataset</span>[doneKey]) <span class="keyword">return</span>;</span><br><span class="line">        renderer.<span class="property">dataset</span>[doneKey] = <span class="string">&#x27;1&#x27;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> contents = <span class="title function_">purifierGetContentsEl</span>(renderer);</span><br><span class="line">        <span class="keyword">if</span> (!contents) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> mentions = contents.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;a[data-type=&quot;mention&quot;]&#x27;</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> m <span class="keyword">of</span> mentions) m.<span class="title function_">remove</span>();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> remaining = contents.<span class="property">textContent</span>.<span class="title function_">replace</span>(<span class="regexp">/\s+/g</span>, <span class="string">&#x27;&#x27;</span>).<span class="title function_">trim</span>();</span><br><span class="line">        <span class="keyword">if</span> (remaining.<span class="property">length</span> &lt; <span class="number">5</span>) &#123;</span><br><span class="line">            renderer.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">const</span> threadRenderer = renderer.<span class="title function_">getRootNode</span>().<span class="property">host</span>;</span><br><span class="line">                <span class="keyword">if</span> (threadRenderer) threadRenderer.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">startCommentPurifier</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">PurifierStarted</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="title class_">PurifierStarted</span> = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">let</span> scanTimer = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">function</span> <span class="title function_">scheduleScan</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (scanTimer) <span class="built_in">clearTimeout</span>(scanTimer);</span><br><span class="line">            scanTimer = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                <span class="title function_">purifierFindRenderers</span>().<span class="title function_">forEach</span>(purifierProcessRenderer);</span><br><span class="line">                scanTimer = <span class="literal">null</span>;</span><br><span class="line">            &#125;, <span class="number">800</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> comments = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-comments&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (comments?.<span class="property">shadowRoot</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> obs = <span class="keyword">new</span> <span class="title class_">MutationObserver</span>(<span class="function">() =&gt;</span> <span class="title function_">scheduleScan</span>());</span><br><span class="line">                obs.<span class="title function_">observe</span>(comments.<span class="property">shadowRoot</span>, &#123; <span class="attr">childList</span>: <span class="literal">true</span>, <span class="attr">subtree</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">                <span class="title class_">PurifierObservers</span>.<span class="title function_">push</span>(obs);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> obsBody = <span class="keyword">new</span> <span class="title class_">MutationObserver</span>(<span class="function">() =&gt;</span> <span class="title function_">scheduleScan</span>());</span><br><span class="line">        obsBody.<span class="title function_">observe</span>(<span class="variable language_">document</span>.<span class="property">body</span>, &#123; <span class="attr">childList</span>: <span class="literal">true</span>, <span class="attr">subtree</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">        <span class="title class_">PurifierObservers</span>.<span class="title function_">push</span>(obsBody);</span><br><span class="line"></span><br><span class="line">        <span class="title function_">purifierFindRenderers</span>().<span class="title function_">forEach</span>(purifierProcessRenderer);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> hasBlocker = <span class="title function_">purifierHasBlockerInstalled</span>();</span><br><span class="line">        <span class="title class_">Log</span>(<span class="string">&#x27;评论净化器已启动&#x27;</span> + (hasBlocker ? <span class="string">&#x27;（检测到 BilibiliBlocker，兼容模式）&#x27;</span> : <span class="string">&#x27;&#x27;</span>));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">stopCommentPurifier</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="title class_">PurifierStarted</span> = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> obs <span class="keyword">of</span> <span class="title class_">PurifierObservers</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123; obs.<span class="title function_">disconnect</span>(); &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="title class_">PurifierObservers</span> = [];</span><br><span class="line">        <span class="title class_">Log</span>(<span class="string">&#x27;评论净化器已停止&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">toggleCommentPurifier</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span> = !<span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span>;</span><br><span class="line">        <span class="title class_">SaveConfig</span>(&#123; <span class="title class_">EnableCommentPurifier</span>: <span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span> &#125;);</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span>) <span class="title function_">startCommentPurifier</span>();</span><br><span class="line">        <span class="keyword">else</span> <span class="title function_">stopCommentPurifier</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 元素去除 (Element Removal) ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span> = [</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;carousel&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;首页轮播图&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; main.bili-feed4-layout:nth-child(3) &gt; div.feed2:last-child &gt; div.recommended-container_floor-aside &gt; div.container.is-version8:first-child &gt; div.recommended-swipe.grid-anchor:first-child &gt; div.recommended-swipe-core &gt; div.recommended-swipe-body:last-child &gt; div.carousel-area &gt; div.carousel&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; main.bili-feed4-layout:nth-child(2) &gt; div.feed2:last-child &gt; div.recommended-container_floor-aside &gt; div.container.is-version8:first-child &gt; div.recommended-swipe:first-child&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; main.bili-feed4-layout:nth-child(3) &gt; div.feed2:last-child &gt; div.recommended-container_floor-aside &gt; div.container.is-version8:first-child &gt; div.recommended-swipe:first-child&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;right-channel&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;右侧频道导航&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__channel:nth-child(3) &gt; div.right-channel-container:last-child&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__channel:last-child &gt; div.right-channel-container:last-child&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;channel-icons&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;频道图标行&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__channel:nth-child(3) &gt; div.channel-icons:first-child&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__channel:last-child &gt; div.channel-icons:first-child&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;channel-bar&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;频道栏（整体）&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__channel:last-child&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;creation-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;创作中心入口&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap.left-loc-entry:nth-child(8) &gt; div&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;upload-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;投稿入口&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap.left-loc-entry:nth-child(9) &gt; div &gt; a.loc-entry.loc-moveclip&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;live-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;直播入口&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap:last-child&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;dynamic-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;动态入口&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap:nth-child(5)&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;vip-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;大会员VIP&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.right-entry:last-child &gt; div.vip-wrap:nth-child(2)&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;adblock-tips&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;广告提示条&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#i_cecream &gt; div.adblock-tips:nth-child(2)&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;left-entries&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;左侧全部入口&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;palette-btn&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;调色板浮窗&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; div.palette-button-outer.palette-feed4:nth-child(4)&#x27;</span></span><br><span class="line">        ]&#125;,</span><br><span class="line">        &#123; <span class="attr">id</span>: <span class="string">&#x27;space-notif&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;space.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;空间-消息通知&#x27;</span>, <span class="attr">selectors</span>: [</span><br><span class="line">            <span class="string">&#x27;#biliMainHeader &gt; div.bili-header &gt; div.bili-header__bar.mini-header:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap:last-child&#x27;</span></span><br><span class="line">        ]&#125;</span><br><span class="line">    ];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">ElementRemovalStates</span> = &#123;&#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">applyElementRemoval</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> enabled = <span class="title class_">Config</span>.<span class="property">RemovedElements</span> || &#123;&#125;;</span><br><span class="line">        <span class="keyword">const</span> host = location.<span class="property">hostname</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> id <span class="keyword">of</span> <span class="title class_">Object</span>.<span class="title function_">keys</span>(<span class="title class_">ElementRemovalStates</span>)) &#123;</span><br><span class="line">            <span class="keyword">if</span> (!enabled[id]) &#123;</span><br><span class="line">                <span class="title class_">ElementRemovalStates</span>[id].<span class="property">element</span>.<span class="property">style</span>.<span class="property">display</span> = <span class="title class_">ElementRemovalStates</span>[id].<span class="property">originalDisplay</span>;</span><br><span class="line">                <span class="keyword">delete</span> <span class="title class_">ElementRemovalStates</span>[id];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> preset <span class="keyword">of</span> <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (preset.<span class="property">host</span> !== host) <span class="keyword">continue</span>;</span><br><span class="line">            <span class="keyword">if</span> (!enabled[preset.<span class="property">id</span>]) <span class="keyword">continue</span>;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">ElementRemovalStates</span>[preset.<span class="property">id</span>]) <span class="keyword">continue</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">const</span> sel <span class="keyword">of</span> preset.<span class="property">selectors</span>) &#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    <span class="keyword">const</span> el = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(sel);</span><br><span class="line">                    <span class="keyword">if</span> (el) &#123;</span><br><span class="line">                        <span class="title class_">ElementRemovalStates</span>[preset.<span class="property">id</span>] = &#123;</span><br><span class="line">                            <span class="attr">element</span>: el,</span><br><span class="line">                            <span class="attr">originalDisplay</span>: el.<span class="property">style</span>.<span class="property">display</span> || <span class="string">&#x27;&#x27;</span></span><br><span class="line">                        &#125;;</span><br><span class="line">                        el.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 选择器探测与缓存 ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">DetectSelector</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">EffectiveSelector</span>) <span class="keyword">return</span> <span class="title class_">EffectiveSelector</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">SpecificCandidates</span> = [</span><br><span class="line">            <span class="string">&#x27;.bili-video-card&#x27;</span>, <span class="string">&#x27;.feed-card&#x27;</span>, <span class="string">&#x27;.bili-feed-card&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;.floor-single-card&#x27;</span>, <span class="string">&#x27;.floor-card&#x27;</span>, <span class="string">&#x27;.video-item&#x27;</span>, <span class="string">&#x27;.feed-item&#x27;</span></span><br><span class="line">        ];</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">BroadCandidates</span> = [</span><br><span class="line">            <span class="string">&#x27;[class*=&quot;video-card&quot;]&#x27;</span>, <span class="string">&#x27;[class*=&quot;bili-video&quot;]&#x27;</span>, <span class="string">&#x27;[class*=&quot;feed-card&quot;]&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;[class*=&quot;feed-item&quot;]&#x27;</span>, <span class="string">&#x27;[class*=&quot;floor-card&quot;]&#x27;</span></span><br><span class="line">        ];</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">MatchedSelectors</span> = [];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">DataCandidates</span> = [<span class="string">&#x27;[data-video-id]&#x27;</span>, <span class="string">&#x27;[data-aid]&#x27;</span>];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">DataCandidates</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Els</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Sel</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Els</span>.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">El</span> <span class="keyword">of</span> <span class="title class_">Els</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Card</span> = <span class="title class_">El</span>.<span class="title function_">closest</span>(<span class="string">&#x27;.bili-video-card, .feed-card, .bili-feed-card, .video-item, .feed-item, .floor-single-card, .floor-card, [class*=&quot;video-card&quot;], [class*=&quot;feed-card&quot;], [class*=&quot;feed-item&quot;], [class*=&quot;floor-card&quot;]&#x27;</span>);</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">Card</span>) &#123;</span><br><span class="line">                        <span class="keyword">const</span> <span class="title class_">CardSel</span> = (<span class="title class_">Card</span>.<span class="property">tagName</span> === <span class="title class_">El</span>.<span class="property">tagName</span>) ? <span class="title class_">Sel</span> :</span><br><span class="line">                            <span class="title class_">Array</span>.<span class="title function_">from</span>(<span class="title class_">Card</span>.<span class="property">classList</span>).<span class="title function_">map</span>(<span class="function"><span class="params">C</span> =&gt;</span> <span class="string">&#x27;.&#x27;</span> + C).<span class="title function_">join</span>(<span class="string">&#x27;&#x27;</span>);</span><br><span class="line">                        <span class="keyword">if</span> (!<span class="title class_">MatchedSelectors</span>.<span class="title function_">includes</span>(<span class="title class_">CardSel</span>)) <span class="title class_">MatchedSelectors</span>.<span class="title function_">push</span>(<span class="title class_">CardSel</span>);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">SpecificCandidates</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123; <span class="keyword">const</span> <span class="title class_">Els</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Sel</span>); <span class="keyword">if</span> (<span class="title class_">Els</span>.<span class="property">length</span> &gt; <span class="number">0</span> &amp;&amp; !<span class="title class_">MatchedSelectors</span>.<span class="title function_">includes</span>(<span class="title class_">Sel</span>)) <span class="title class_">MatchedSelectors</span>.<span class="title function_">push</span>(<span class="title class_">Sel</span>); &#125;</span><br><span class="line">            <span class="keyword">catch</span> (E) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">MatchedSelectors</span>.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="title class_">EffectiveSelector</span> = <span class="title class_">MatchedSelectors</span>.<span class="title function_">join</span>(<span class="string">&#x27;, &#x27;</span>);</span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogSelectorFound&#x27;</span>), <span class="title class_">EffectiveSelector</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="title class_">EffectiveSelector</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">BroadCandidates</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123; <span class="keyword">const</span> <span class="title class_">Els</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Sel</span>); <span class="keyword">if</span> (<span class="title class_">Els</span>.<span class="property">length</span> &gt; <span class="number">0</span>) &#123; <span class="title class_">EffectiveSelector</span> = <span class="title class_">Sel</span>; <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogSelectorFound&#x27;</span>), <span class="title class_">EffectiveSelector</span>); <span class="keyword">return</span> <span class="title class_">EffectiveSelector</span>; &#125; &#125;</span><br><span class="line">            <span class="keyword">catch</span> (E) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">LinkSelectors</span> = [<span class="string">&#x27;a[href*=&quot;/video/&quot;]&#x27;</span>, <span class="string">&#x27;a[href*=&quot;/bangumi/&quot;]&#x27;</span>, <span class="string">&#x27;a[href*=&quot;live.bilibili.com&quot;]&#x27;</span>];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">LinkSel</span> <span class="keyword">of</span> <span class="title class_">LinkSelectors</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Links</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">LinkSel</span>);</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Link</span> <span class="keyword">of</span> <span class="title class_">Links</span>) &#123;</span><br><span class="line">                <span class="keyword">let</span> <span class="title class_">Parent</span> = <span class="title class_">Link</span>.<span class="property">parentElement</span>;</span><br><span class="line">                <span class="keyword">let</span> <span class="title class_">Depth</span> = <span class="number">0</span>;</span><br><span class="line">                <span class="keyword">while</span> (<span class="title class_">Parent</span> &amp;&amp; <span class="title class_">Depth</span> &lt; <span class="number">5</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Cls</span> = <span class="title class_">Parent</span>.<span class="property">className</span> || <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;card&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;item&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;feed&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;video&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;floor&#x27;</span>)) &#123;</span><br><span class="line">                        <span class="title class_">EffectiveSelector</span> = <span class="string">&#x27;.&#x27;</span> + <span class="title class_">Cls</span>.<span class="title function_">split</span>(<span class="string">&#x27; &#x27;</span>).<span class="title function_">join</span>(<span class="string">&#x27;.&#x27;</span>);</span><br><span class="line">                        <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogSelectorFallback&#x27;</span>), <span class="title class_">EffectiveSelector</span>);</span><br><span class="line">                        <span class="keyword">return</span> <span class="title class_">EffectiveSelector</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="title class_">Parent</span> = <span class="title class_">Parent</span>.<span class="property">parentElement</span>;</span><br><span class="line">                    <span class="title class_">Depth</span>++;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">DetectContainer</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">VideoListContainer</span>) <span class="keyword">return</span> <span class="title class_">VideoListContainer</span>;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Containers</span> = [<span class="string">&#x27;.bili-feed4&#x27;</span>, <span class="string">&#x27;.bili-feed&#x27;</span>, <span class="string">&#x27;.feed2&#x27;</span>, <span class="string">&#x27;.feed-list&#x27;</span>, <span class="string">&#x27;.video-list&#x27;</span>, <span class="string">&#x27;.bili-video-list&#x27;</span>, <span class="string">&#x27;.recommend-container&#x27;</span>, <span class="string">&#x27;.recommended-container_floor-aside&#x27;</span>];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">Containers</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">El</span> = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="title class_">Sel</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">El</span>) &#123; <span class="title class_">VideoListContainer</span> = <span class="title class_">El</span>; <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogContainerFound&#x27;</span>), <span class="title class_">Sel</span>); <span class="keyword">return</span> <span class="title class_">El</span>; &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="title class_">VideoListContainer</span> = <span class="variable language_">document</span>.<span class="property">body</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">VideoListContainer</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 卡片显示/隐藏 ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">WRAPPER_CLASSES</span> = [<span class="string">&#x27;bili-feed-card&#x27;</span>, <span class="string">&#x27;feed-card&#x27;</span>];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ApplyHideStyles</span>(<span class="params">El</span>) &#123;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;BiliLimitedHide&#x27;</span>);</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">visibility</span> = <span class="string">&#x27;hidden&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">height</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">margin</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">padding</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">overflow</span> = <span class="string">&#x27;hidden&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">flex</span> = <span class="string">&#x27;0 0 0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">position</span> = <span class="string">&#x27;absolute&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ClearHideStyles</span>(<span class="params">El</span>) &#123;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&#x27;BiliLimitedHide&#x27;</span>);</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">visibility</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">height</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">margin</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">padding</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">overflow</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">position</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">flex</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">HideCardTree</span>(<span class="params">Card</span>) &#123;</span><br><span class="line">        <span class="title class_">ApplyHideStyles</span>(<span class="title class_">Card</span>);</span><br><span class="line">        <span class="keyword">let</span> <span class="title class_">Ancestor</span> = <span class="title class_">Card</span>.<span class="property">parentElement</span>;</span><br><span class="line">        <span class="keyword">while</span> (<span class="title class_">Ancestor</span> &amp;&amp; <span class="title class_">Ancestor</span> !== <span class="variable language_">document</span>.<span class="property">body</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Cls</span> = (<span class="title class_">Ancestor</span>.<span class="property">className</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">IsWrapper</span> = <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">let</span> W = <span class="number">0</span>; W &lt; <span class="variable constant_">WRAPPER_CLASSES</span>.<span class="property">length</span>; W++) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Cls</span>.<span class="title function_">indexOf</span>(<span class="variable constant_">WRAPPER_CLASSES</span>[W]) !== -<span class="number">1</span>) &#123; <span class="title class_">IsWrapper</span> = <span class="literal">true</span>; <span class="keyword">break</span>; &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">IsWrapper</span>) <span class="title class_">ApplyHideStyles</span>(<span class="title class_">Ancestor</span>);</span><br><span class="line">            <span class="title class_">Ancestor</span> = <span class="title class_">Ancestor</span>.<span class="property">parentElement</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ShowCardTree</span>(<span class="params">Card</span>) &#123;</span><br><span class="line">        <span class="title class_">ClearHideStyles</span>(<span class="title class_">Card</span>);</span><br><span class="line">        <span class="keyword">let</span> <span class="title class_">Ancestor</span> = <span class="title class_">Card</span>.<span class="property">parentElement</span>;</span><br><span class="line">        <span class="keyword">while</span> (<span class="title class_">Ancestor</span> &amp;&amp; <span class="title class_">Ancestor</span> !== <span class="variable language_">document</span>.<span class="property">body</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Cls</span> = (<span class="title class_">Ancestor</span>.<span class="property">className</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">IsWrapper</span> = <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">let</span> W = <span class="number">0</span>; W &lt; <span class="variable constant_">WRAPPER_CLASSES</span>.<span class="property">length</span>; W++) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Cls</span>.<span class="title function_">indexOf</span>(<span class="variable constant_">WRAPPER_CLASSES</span>[W]) !== -<span class="number">1</span>) &#123; <span class="title class_">IsWrapper</span> = <span class="literal">true</span>; <span class="keyword">break</span>; &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">IsWrapper</span>) <span class="title class_">ClearHideStyles</span>(<span class="title class_">Ancestor</span>);</span><br><span class="line">            <span class="title class_">Ancestor</span> = <span class="title class_">Ancestor</span>.<span class="property">parentElement</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 核心过滤逻辑 ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">LimitVideos</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="title class_">IsActive</span>) &#123; <span class="title class_">RestoreAllVideos</span>(); <span class="keyword">return</span>; &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Selector</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">            <span class="keyword">if</span> (!<span class="title class_">Selector</span>) &#123; <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogNoCards&#x27;</span>)); <span class="keyword">return</span>; &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">Cards</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Selector</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Cards</span>.<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">LinkSelectors</span> = [<span class="string">&#x27;a[href*=&quot;/video/&quot;]&#x27;</span>, <span class="string">&#x27;a[href*=&quot;/bangumi/&quot;]&#x27;</span>, <span class="string">&#x27;a[href*=&quot;live.bilibili.com&quot;]&#x27;</span>];</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">ParentCards</span> = <span class="keyword">new</span> <span class="title class_">Set</span>();</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">LinkSel</span> <span class="keyword">of</span> <span class="title class_">LinkSelectors</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Links</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">LinkSel</span>);</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Link</span> <span class="keyword">of</span> <span class="title class_">Links</span>) &#123;</span><br><span class="line">                        <span class="keyword">let</span> <span class="title class_">Parent</span> = <span class="title class_">Link</span>.<span class="property">parentElement</span>;</span><br><span class="line">                        <span class="keyword">let</span> <span class="title class_">Depth</span> = <span class="number">0</span>;</span><br><span class="line">                        <span class="keyword">while</span> (<span class="title class_">Parent</span> &amp;&amp; <span class="title class_">Depth</span> &lt; <span class="number">5</span>) &#123;</span><br><span class="line">                            <span class="keyword">if</span> (<span class="title class_">Parent</span>.<span class="property">className</span> &amp;&amp; (<span class="title class_">Parent</span>.<span class="property">className</span>.<span class="title function_">includes</span>(<span class="string">&#x27;card&#x27;</span>) || <span class="title class_">Parent</span>.<span class="property">className</span>.<span class="title function_">includes</span>(<span class="string">&#x27;item&#x27;</span>) || <span class="title class_">Parent</span>.<span class="property">className</span>.<span class="title function_">includes</span>(<span class="string">&#x27;feed&#x27;</span>) || <span class="title class_">Parent</span>.<span class="property">className</span>.<span class="title function_">includes</span>(<span class="string">&#x27;floor&#x27;</span>))) &#123;</span><br><span class="line">                                <span class="title class_">ParentCards</span>.<span class="title function_">add</span>(<span class="title class_">Parent</span>); <span class="keyword">break</span>;</span><br><span class="line">                            &#125;</span><br><span class="line">                            <span class="title class_">Parent</span> = <span class="title class_">Parent</span>.<span class="property">parentElement</span>; <span class="title class_">Depth</span>++;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="title class_">Cards</span> = <span class="title class_">Array</span>.<span class="title function_">from</span>(<span class="title class_">ParentCards</span>);</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Cards</span>.<span class="property">length</span> === <span class="number">0</span>) &#123; <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogStillNoCards&#x27;</span>)); <span class="keyword">return</span>; &#125;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">VideoCards</span> = <span class="title class_">Array</span>.<span class="title function_">from</span>(<span class="title class_">Cards</span>);</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">NestedRemoval</span> = <span class="keyword">new</span> <span class="title class_">Set</span>();</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">let</span> I = <span class="number">0</span>; I &lt; <span class="title class_">VideoCards</span>.<span class="property">length</span>; I++) &#123;</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">let</span> J = <span class="number">0</span>; J &lt; <span class="title class_">VideoCards</span>.<span class="property">length</span>; J++) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (I !== J &amp;&amp; <span class="title class_">VideoCards</span>[I].<span class="title function_">contains</span>(<span class="title class_">VideoCards</span>[J])) &#123; <span class="title class_">NestedRemoval</span>.<span class="title function_">add</span>(I); <span class="keyword">break</span>; &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">NestedRemoval</span>.<span class="property">size</span> &gt; <span class="number">0</span>) <span class="title class_">VideoCards</span> = <span class="title class_">VideoCards</span>.<span class="title function_">filter</span>(<span class="function">(<span class="params">_, Idx</span>) =&gt;</span> !<span class="title class_">NestedRemoval</span>.<span class="title function_">has</span>(<span class="title class_">Idx</span>));</span><br><span class="line"></span><br><span class="line">            <span class="keyword">function</span> <span class="title function_">CardLinksTo</span>(<span class="params">Card, Pattern</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Links</span> = <span class="title class_">Card</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;a[href]&#x27;</span>);</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Link</span> <span class="keyword">of</span> <span class="title class_">Links</span>) &#123; <span class="keyword">if</span> (<span class="title class_">Link</span>.<span class="property">href</span>.<span class="title function_">indexOf</span>(<span class="title class_">Pattern</span>) !== -<span class="number">1</span>) <span class="keyword">return</span> <span class="literal">true</span>; &#125;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">ExcludedCards</span> = [];</span><br><span class="line">            <span class="title class_">VideoCards</span> = <span class="title class_">VideoCards</span>.<span class="title function_">filter</span>(<span class="function"><span class="params">Card</span> =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Text</span> = (<span class="title class_">Card</span>.<span class="property">textContent</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Cls</span> = (<span class="title class_">Card</span>.<span class="property">className</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">FloorTitle</span> = <span class="title class_">Card</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;.floor-title&#x27;</span>);</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">FloorTitleText</span> = <span class="title class_">FloorTitle</span> ? (<span class="title class_">FloorTitle</span>.<span class="property">textContent</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>() : <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">                <span class="keyword">let</span> <span class="title class_">ShouldExclude</span> = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">ExcludeLive</span> &amp;&amp; (</span><br><span class="line">                    <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;live&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;直播&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;正在直播&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;直播中&#x27;</span>) ||</span><br><span class="line">                    <span class="title class_">FloorTitleText</span>.<span class="title function_">includes</span>(<span class="string">&#x27;直播&#x27;</span>) || <span class="title class_">FloorTitleText</span>.<span class="title function_">includes</span>(<span class="string">&#x27;赛事&#x27;</span>) || <span class="title class_">CardLinksTo</span>(<span class="title class_">Card</span>, <span class="string">&#x27;live.bilibili.com&#x27;</span>)</span><br><span class="line">                )) <span class="title class_">ShouldExclude</span> = <span class="literal">true</span>;</span><br><span class="line">                <span class="keyword">if</span> (!<span class="title class_">ShouldExclude</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">ExcludeAd</span> &amp;&amp; (<span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;ad&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;advert&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;广告&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;sponsor&#x27;</span>))) <span class="title class_">ShouldExclude</span> = <span class="literal">true</span>;</span><br><span class="line">                <span class="keyword">if</span> (!<span class="title class_">ShouldExclude</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">ExcludeBangumi</span> &amp;&amp; (</span><br><span class="line">                    <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;bangumi&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;番剧&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;追番&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;国创&#x27;</span>) ||</span><br><span class="line">                    <span class="title class_">FloorTitleText</span>.<span class="title function_">includes</span>(<span class="string">&#x27;番剧&#x27;</span>) || <span class="title class_">FloorTitleText</span>.<span class="title function_">includes</span>(<span class="string">&#x27;国创&#x27;</span>) || <span class="title class_">CardLinksTo</span>(<span class="title class_">Card</span>, <span class="string">&#x27;/bangumi/&#x27;</span>)</span><br><span class="line">                )) <span class="title class_">ShouldExclude</span> = <span class="literal">true</span>;</span><br><span class="line">                <span class="keyword">if</span> (!<span class="title class_">ShouldExclude</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">ExcludePaid</span> &amp;&amp; (<span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;付费&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;课程&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;￥&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;¥&#x27;</span>))) <span class="title class_">ShouldExclude</span> = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">ShouldExclude</span>) &#123; <span class="title class_">ExcludedCards</span>.<span class="title function_">push</span>(<span class="title class_">Card</span>); <span class="keyword">return</span> <span class="literal">false</span>; &#125;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">            &#125;);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">KeepSpecialUPIDs</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">KeepSpecialUPIDs</span>.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">KeepSet</span> = <span class="keyword">new</span> <span class="title class_">Set</span>(<span class="title class_">Config</span>.<span class="property">KeepSpecialUPIDs</span>.<span class="title function_">map</span>(<span class="function"><span class="params">Id</span> =&gt;</span> <span class="title class_">String</span>(<span class="title class_">Id</span>)));</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Kept</span> = []; <span class="keyword">const</span> <span class="title class_">Rest</span> = [];</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Card</span> <span class="keyword">of</span> <span class="title class_">VideoCards</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">UpLink</span> = <span class="title class_">Card</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;a[href*=&quot;/space/&quot;]&#x27;</span>);</span><br><span class="line">                    <span class="keyword">let</span> <span class="title class_">Upid</span> = <span class="literal">null</span>;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">UpLink</span>) &#123; <span class="keyword">const</span> <span class="title class_">Match</span> = <span class="title class_">UpLink</span>.<span class="property">href</span>.<span class="title function_">match</span>(<span class="regexp">/\/space\/(\d+)/</span>); <span class="keyword">if</span> (<span class="title class_">Match</span>) <span class="title class_">Upid</span> = <span class="title class_">Match</span>[<span class="number">1</span>]; &#125;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">Upid</span> &amp;&amp; <span class="title class_">KeepSet</span>.<span class="title function_">has</span>(<span class="title class_">Upid</span>)) <span class="title class_">Kept</span>.<span class="title function_">push</span>(<span class="title class_">Card</span>);</span><br><span class="line">                    <span class="keyword">else</span> <span class="title class_">Rest</span>.<span class="title function_">push</span>(<span class="title class_">Card</span>);</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="title class_">VideoCards</span> = <span class="title class_">Kept</span>.<span class="title function_">concat</span>(<span class="title class_">Rest</span>);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">PromotedCards</span> = [];</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">KeepPromoted</span>) &#123;</span><br><span class="line">                <span class="title class_">PromotedCards</span> = <span class="title class_">VideoCards</span>.<span class="title function_">filter</span>(<span class="function"><span class="params">Card</span> =&gt;</span> &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Text</span> = (<span class="title class_">Card</span>.<span class="property">textContent</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">                    <span class="keyword">return</span> <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;推广&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;广告&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;sponsor&#x27;</span>);</span><br><span class="line">                &#125;);</span><br><span class="line">                <span class="title class_">VideoCards</span> = <span class="title class_">VideoCards</span>.<span class="title function_">filter</span>(<span class="function"><span class="params">Card</span> =&gt;</span> !<span class="title class_">PromotedCards</span>.<span class="title function_">includes</span>(<span class="title class_">Card</span>));</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">TopSelectors</span> = [<span class="string">&#x27;.bili-feed__banner&#x27;</span>, <span class="string">&#x27;.bili-feed__top&#x27;</span>, <span class="string">&#x27;.top-banner&#x27;</span>, <span class="string">&#x27;.recommend-banner&#x27;</span>];</span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">TopCards</span> = [];</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">TopSelectors</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Tops</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Sel</span>);</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Top</span> <span class="keyword">of</span> <span class="title class_">Tops</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">InnerCards</span> = <span class="title class_">Top</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Selector</span>);</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Card</span> <span class="keyword">of</span> <span class="title class_">InnerCards</span>) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="title class_">VideoCards</span>.<span class="title function_">includes</span>(<span class="title class_">Card</span>)) &#123; <span class="title class_">TopCards</span>.<span class="title function_">push</span>(<span class="title class_">Card</span>); <span class="keyword">const</span> <span class="title class_">Idx</span> = <span class="title class_">VideoCards</span>.<span class="title function_">indexOf</span>(<span class="title class_">Card</span>); <span class="keyword">if</span> (<span class="title class_">Idx</span> !== -<span class="number">1</span>) <span class="title class_">VideoCards</span>.<span class="title function_">splice</span>(<span class="title class_">Idx</span>, <span class="number">1</span>); &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Max</span> = <span class="title class_">Math</span>.<span class="title function_">max</span>(<span class="number">1</span>, <span class="title class_">Number</span>(<span class="title class_">Config</span>.<span class="property">MaxVideos</span>) || <span class="number">10</span>);</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">ToShow</span> = <span class="title class_">VideoCards</span>.<span class="title function_">slice</span>(<span class="number">0</span>, <span class="title class_">Max</span>);</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">ToHide</span> = <span class="title class_">VideoCards</span>.<span class="title function_">slice</span>(<span class="title class_">Max</span>);</span><br><span class="line"></span><br><span class="line">            <span class="title class_">ToShow</span>.<span class="title function_">forEach</span>(<span class="function"><span class="params">Card</span> =&gt;</span> <span class="title class_">ShowCardTree</span>(<span class="title class_">Card</span>));</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">AllToHide</span> = <span class="title class_">ToHide</span>.<span class="title function_">concat</span>(<span class="title class_">ExcludedCards</span>);</span><br><span class="line">            <span class="title class_">AllToHide</span>.<span class="title function_">forEach</span>(<span class="function"><span class="params">Card</span> =&gt;</span> <span class="title class_">HideCardTree</span>(<span class="title class_">Card</span>));</span><br><span class="line">            [...<span class="title class_">PromotedCards</span>, ...<span class="title class_">TopCards</span>].<span class="title function_">forEach</span>(<span class="function"><span class="params">Card</span> =&gt;</span> <span class="title class_">ShowCardTree</span>(<span class="title class_">Card</span>));</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Total</span> = <span class="title class_">VideoCards</span>.<span class="property">length</span> + <span class="title class_">ExcludedCards</span>.<span class="property">length</span> + <span class="title class_">PromotedCards</span>.<span class="property">length</span> + <span class="title class_">TopCards</span>.<span class="property">length</span>;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Shown</span> = <span class="title class_">ToShow</span>.<span class="property">length</span> + <span class="title class_">PromotedCards</span>.<span class="property">length</span> + <span class="title class_">TopCards</span>.<span class="property">length</span>;</span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogProcessed&#x27;</span>, <span class="title class_">Total</span>, <span class="title class_">Shown</span>, <span class="title class_">ToHide</span>.<span class="property">length</span> + <span class="title class_">ExcludedCards</span>.<span class="property">length</span>));</span><br><span class="line">        &#125; <span class="keyword">catch</span> (E) &#123; <span class="title class_">ErrorLog</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogErrorLimit&#x27;</span>), E); &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">RestoreAllVideos</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Selector</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">        <span class="keyword">if</span> (!<span class="title class_">Selector</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Cards</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Selector</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Card</span> <span class="keyword">of</span> <span class="title class_">Cards</span>) <span class="title class_">ShowCardTree</span>(<span class="title class_">Card</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== CSS 样式 ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">InjectStyles</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="title function_">GM_addStyle</span>(<span class="string">`.BiliLimitedHide &#123; display: none !important; visibility: hidden !important; opacity: 0 !important; height: 0 !important; margin: 0 !important; padding: 0 !important; overflow: hidden !important; flex: 0 0 0 !important; position: absolute !important; pointer-events: none !important; &#125;`</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 配置面板 ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">InjectPanelStyles</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;BiliCompactPanelStyles&#x27;</span>)) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">StyleEl</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;style&#x27;</span>);</span><br><span class="line">        <span class="title class_">StyleEl</span>.<span class="property">id</span> = <span class="string">&#x27;BiliCompactPanelStyles&#x27;</span>;</span><br><span class="line">        <span class="title class_">StyleEl</span>.<span class="property">textContent</span> = <span class="string">`</span></span><br><span class="line"><span class="string">            .BiliCompactOverlay &#123; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.4); z-index: 2147483646; display: flex; align-items: center; justify-content: center; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 14px; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel &#123; background: #1e1e1e; color: #eee; padding: 24px 30px; border-radius: 16px; box-shadow: 0 8px 40px rgba(0,0,0,0.6); min-width: 340px; max-width: 420px; border: 1px solid #333; backdrop-filter: blur(8px); display: flex; flex-direction: column; gap: 12px; position: relative; max-height: 85vh; overflow-y: auto; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel h3 &#123; margin: 0 0 4px 0; font-weight: 500; color: #fff; font-size: 16px; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel label &#123; display: flex; justify-content: space-between; align-items: center; font-size: 14px; color: #ccc; gap: 8px; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel input[type=&quot;number&quot;], .BiliCompactPanel input[type=&quot;text&quot;] &#123; background: #2a2a2a; border: 1px solid #444; color: #fff; padding: 4px 10px; border-radius: 6px; width: 80px; font-size: 14px; font-family: inherit; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel input[type=&quot;text&quot;] &#123; width: 140px; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel select &#123; background: #2a2a2a; border: 1px solid #444; color: #fff; padding: 4px 8px; border-radius: 6px; font-size: 14px; font-family: inherit; cursor: pointer; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel input[type=&quot;checkbox&quot;] &#123; accent-color: #fb7299; width: 18px; height: 18px; cursor: pointer; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .BtnRow &#123; display: flex; gap: 10px; justify-content: flex-end; margin-top: 6px; flex-wrap: wrap; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel button &#123; background: #fb7299; border: none; color: #fff; padding: 6px 18px; border-radius: 20px; cursor: pointer; font-size: 14px; font-family: inherit; transition: background 0.2s; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel button.Secondary &#123; background: #444; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel button:hover &#123; background: #ff85a8; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel button.Secondary:hover &#123; background: #555; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .Hint &#123; font-size: 12px; color: #888; margin-top: -4px; line-height: 1.4; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .StatusRow &#123; display: flex; align-items: center; justify-content: space-between; font-size: 14px; color: #ccc; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .StatusBadge &#123; background: #fb7299; color: #fff; border-radius: 12px; padding: 2px 12px; font-size: 12px; font-weight: bold; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .StatusBadge.Off &#123; background: #666; &#125;</span></span><br><span class="line"><span class="string">        `</span>;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">head</span>.<span class="title function_">appendChild</span>(<span class="title class_">StyleEl</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">PanelDestroyFn</span> = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">OpenConfigPanel</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">PanelDestroyFn</span>) &#123; <span class="title class_">PanelDestroyFn</span>(); <span class="title class_">PanelDestroyFn</span> = <span class="literal">null</span>; &#125;</span><br><span class="line">        <span class="title class_">InjectPanelStyles</span>();</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Overlay</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;div&#x27;</span>);</span><br><span class="line">        <span class="title class_">Overlay</span>.<span class="property">className</span> = <span class="string">&#x27;BiliCompactOverlay&#x27;</span>;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Panel</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;div&#x27;</span>);</span><br><span class="line">        <span class="title class_">Panel</span>.<span class="property">className</span> = <span class="string">&#x27;BiliCompactPanel&#x27;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">LangOptions</span> = [</span><br><span class="line">            &#123; <span class="title class_">Value</span>: <span class="string">&#x27;auto&#x27;</span>, <span class="title class_">Label</span>: <span class="title function_">T</span>(<span class="string">&#x27;PanelLanguageAuto&#x27;</span>) &#125;,</span><br><span class="line">            &#123; <span class="title class_">Value</span>: <span class="string">&#x27;zh_CN&#x27;</span>, <span class="title class_">Label</span>: <span class="string">&#x27;简体中文&#x27;</span> &#125;,</span><br><span class="line">            &#123; <span class="title class_">Value</span>: <span class="string">&#x27;zh_TW&#x27;</span>, <span class="title class_">Label</span>: <span class="string">&#x27;繁體中文&#x27;</span> &#125;,</span><br><span class="line">            &#123; <span class="title class_">Value</span>: <span class="string">&#x27;en_US&#x27;</span>, <span class="title class_">Label</span>: <span class="string">&#x27;English&#x27;</span> &#125;,</span><br><span class="line">        ];</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">LangSelectHTML</span> = <span class="title class_">LangOptions</span>.<span class="title function_">map</span>(<span class="function"><span class="params">Opt</span> =&gt;</span></span><br><span class="line">            <span class="string">`&lt;option value=&quot;<span class="subst">$&#123;Opt.Value&#125;</span>&quot; <span class="subst">$&#123;Config.Language === Opt.Value ? <span class="string">&#x27;selected&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;<span class="subst">$&#123;Opt.Label&#125;</span>&lt;/option&gt;`</span></span><br><span class="line">        ).<span class="title function_">join</span>(<span class="string">&#x27;&#x27;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="title class_">Panel</span>.<span class="property">innerHTML</span> = <span class="string">`</span></span><br><span class="line"><span class="string">            &lt;h3&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelTitle&#x27;</span>)&#125;</span>&lt;/h3&gt;</span></span><br><span class="line"><span class="string">            &lt;div class=&quot;StatusRow&quot;&gt;&lt;span&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelStatusLabel&#x27;</span>)&#125;</span>&lt;/span&gt;&lt;span class=&quot;StatusBadge <span class="subst">$&#123;IsActive ? <span class="string">&#x27;&#x27;</span> : <span class="string">&#x27;Off&#x27;</span>&#125;</span>&quot; id=&quot;CfgStatusBadge&quot;&gt;<span class="subst">$&#123;IsActive ? T(<span class="string">&#x27;PanelStatusActive&#x27;</span>) : T(<span class="string">&#x27;PanelStatusPaused&#x27;</span>)&#125;</span>&lt;/span&gt;&lt;/div&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelMaxVideos&#x27;</span>)&#125;</span> &lt;input type=&quot;number&quot; id=&quot;CfgMax&quot; value=&quot;<span class="subst">$&#123;Config.MaxVideos&#125;</span>&quot; min=&quot;1&quot; max=&quot;100&quot;&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelExcludeLive&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgExcludeLive&quot; <span class="subst">$&#123;Config.ExcludeLive ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelExcludeAd&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgExcludeAd&quot; <span class="subst">$&#123;Config.ExcludeAd ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelExcludeBangumi&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgExcludeBangumi&quot; <span class="subst">$&#123;Config.ExcludeBangumi ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelExcludePaid&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgExcludePaid&quot; <span class="subst">$&#123;Config.ExcludePaid ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelKeepPromoted&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgKeepPromoted&quot; <span class="subst">$&#123;Config.KeepPromoted ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelDebug&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgDebug&quot; <span class="subst">$&#123;Config.Debug ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelEnableCommentPurifier&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgEnablePurifier&quot; <span class="subst">$&#123;Config.EnableCommentPurifier ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelLanguage&#x27;</span>)&#125;</span> &lt;select id=&quot;CfgLanguage&quot;&gt;<span class="subst">$&#123;LangSelectHTML&#125;</span>&lt;/select&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelKeepUpids&#x27;</span>)&#125;</span> &lt;input type=&quot;text&quot; id=&quot;CfgKeepUids&quot; value=&quot;<span class="subst">$&#123;(Config.KeepSpecialUPIDs || []).join(<span class="string">&#x27;,&#x27;</span>)&#125;</span>&quot;&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;hr style=&quot;margin:8px 0;border:none;border-top:1px solid #333&quot;&gt;</span></span><br><span class="line"><span class="string">            &lt;h4 style=&quot;margin:4px 0 8px;font-size:13px;color:#fb7299&quot;&gt;去除元素&lt;/h4&gt;</span></span><br><span class="line"><span class="string">            <span class="subst">$&#123;ELEMENT_REMOVAL_PRESETS.map(P =&gt;</span></span></span><br><span class="line"><span class="subst"><span class="string">                <span class="string">&#x27;&lt;label&gt;&lt;span style=&quot;flex:1&quot;&gt;&#x27;</span> + P.name + <span class="string">&#x27;&lt;/span&gt; &lt;input type=&quot;checkbox&quot; id=&quot;CfgRm_&#x27;</span> + P.id + <span class="string">&#x27;&quot; &#x27;</span> + ((Config.RemovedElements || &#123;&#125;)[P.id] ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>) + <span class="string">&#x27;&gt;&lt;/label&gt;&#x27;</span></span></span></span><br><span class="line"><span class="subst"><span class="string">            ).join(<span class="string">&#x27;&#x27;</span>)&#125;</span></span></span><br><span class="line"><span class="string">            &lt;div class=&quot;BtnRow&quot;&gt;</span></span><br><span class="line"><span class="string">                &lt;button class=&quot;Secondary&quot; id=&quot;CfgToggle&quot;&gt;<span class="subst">$&#123;IsActive ? T(<span class="string">&#x27;PanelBtnPause&#x27;</span>) : T(<span class="string">&#x27;PanelBtnResume&#x27;</span>)&#125;</span>&lt;/button&gt;</span></span><br><span class="line"><span class="string">                &lt;button class=&quot;Secondary&quot; id=&quot;CfgReset&quot;&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelBtnReset&#x27;</span>)&#125;</span>&lt;/button&gt;</span></span><br><span class="line"><span class="string">                &lt;button id=&quot;CfgSave&quot;&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelBtnSave&#x27;</span>)&#125;</span>&lt;/button&gt;</span></span><br><span class="line"><span class="string">            &lt;/div&gt;</span></span><br><span class="line"><span class="string">        `</span>;</span><br><span class="line"></span><br><span class="line">        <span class="title class_">Overlay</span>.<span class="title function_">appendChild</span>(<span class="title class_">Panel</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>(<span class="title class_">Overlay</span>);</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgSave&#x27;</span>).<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Max</span> = <span class="built_in">parseInt</span>(<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgMax&#x27;</span>).<span class="property">value</span>) || <span class="number">10</span>;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">NewLang</span> = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgLanguage&#x27;</span>).<span class="property">value</span>;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">LangChanged</span> = <span class="title class_">NewLang</span> !== <span class="title class_">Config</span>.<span class="property">Language</span>;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">NewConfig</span> = &#123;</span><br><span class="line">                <span class="title class_">MaxVideos</span>: <span class="title class_">Max</span>,</span><br><span class="line">                <span class="title class_">ExcludeLive</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeLive&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">ExcludeAd</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeAd&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">ExcludeBangumi</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeBangumi&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">ExcludePaid</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludePaid&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">KeepPromoted</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgKeepPromoted&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">Language</span>: <span class="title class_">NewLang</span>,</span><br><span class="line">                <span class="title class_">KeepSpecialUPIDs</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgKeepUids&#x27;</span>).<span class="property">value</span>.<span class="title function_">split</span>(<span class="string">&#x27;,&#x27;</span>).<span class="title function_">map</span>(<span class="function"><span class="params">S</span> =&gt;</span> S.<span class="title function_">trim</span>()).<span class="title function_">filter</span>(<span class="title class_">Boolean</span>).<span class="title function_">map</span>(<span class="title class_">Number</span>),</span><br><span class="line">                <span class="title class_">Debug</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgDebug&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">EnableCommentPurifier</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgEnablePurifier&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">RemovedElements</span>: (<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">                    <span class="keyword">var</span> obj = &#123;&#125;;</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">var</span> I = <span class="number">0</span>; I &lt; <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>.<span class="property">length</span>; I++) &#123;</span><br><span class="line">                        <span class="keyword">var</span> cb = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgRm_&#x27;</span> + <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>[I].<span class="property">id</span>);</span><br><span class="line">                        <span class="keyword">if</span> (cb) obj[<span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>[I].<span class="property">id</span>] = cb.<span class="property">checked</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">return</span> obj;</span><br><span class="line">                &#125;)()</span><br><span class="line">            &#125;;</span><br><span class="line">            <span class="title class_">Object</span>.<span class="title function_">assign</span>(<span class="title class_">Config</span>, <span class="title class_">NewConfig</span>);</span><br><span class="line">            <span class="title class_">SaveConfig</span>(<span class="title class_">Config</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">LangChanged</span>) <span class="title class_">CurrentLang</span> = <span class="title class_">ResolveLanguage</span>();</span><br><span class="line">            <span class="title class_">DestroyPanel</span>();</span><br><span class="line">            <span class="title class_">LimitVideos</span>();</span><br><span class="line">            <span class="title function_">applyElementRemoval</span>();</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">NewConfig</span>.<span class="property">EnableCommentPurifier</span>) <span class="title function_">startCommentPurifier</span>();</span><br><span class="line">            <span class="keyword">else</span> <span class="title function_">stopCommentPurifier</span>();</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">LangChanged</span>) <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> <span class="title class_">OpenConfigPanel</span>(), <span class="number">100</span>);</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgReset&#x27;</span>).<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="title class_">Object</span>.<span class="title function_">assign</span>(<span class="title class_">Config</span>, <span class="variable constant_">DEFAULTS</span>);</span><br><span class="line">            <span class="title class_">SaveConfig</span>(<span class="title class_">Config</span>);</span><br><span class="line">            <span class="title class_">CurrentLang</span> = <span class="title class_">ResolveLanguage</span>();</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgMax&#x27;</span>).<span class="property">value</span> = <span class="title class_">Config</span>.<span class="property">MaxVideos</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeLive&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">ExcludeLive</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeAd&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">ExcludeAd</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeBangumi&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">ExcludeBangumi</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludePaid&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">ExcludePaid</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgKeepPromoted&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">KeepPromoted</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgDebug&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">Debug</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;CfgEnablePurifier&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgKeepUids&#x27;</span>).<span class="property">value</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">var</span> I = <span class="number">0</span>; I &lt; <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>.<span class="property">length</span>; I++) &#123;</span><br><span class="line">                <span class="keyword">var</span> cb = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgRm_&#x27;</span> + <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>[I].<span class="property">id</span>);</span><br><span class="line">                <span class="keyword">if</span> (cb) cb.<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="title function_">stopCommentPurifier</span>();</span><br><span class="line">            <span class="title class_">LimitVideos</span>();</span><br><span class="line">            <span class="title function_">applyElementRemoval</span>();</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgToggle&#x27;</span>).<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="title class_">IsActive</span> = !<span class="title class_">IsActive</span>;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">IsActive</span>) <span class="title class_">LimitVideos</span>();</span><br><span class="line">            <span class="keyword">else</span> <span class="title class_">RestoreAllVideos</span>();</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Badge</span> = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgStatusBadge&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Badge</span>) &#123; <span class="title class_">Badge</span>.<span class="property">textContent</span> = <span class="title class_">IsActive</span> ? <span class="title function_">T</span>(<span class="string">&#x27;PanelStatusActive&#x27;</span>) : <span class="title function_">T</span>(<span class="string">&#x27;PanelStatusPaused&#x27;</span>); <span class="title class_">Badge</span>.<span class="property">className</span> = <span class="string">&#x27;StatusBadge&#x27;</span> + (<span class="title class_">IsActive</span> ? <span class="string">&#x27;&#x27;</span> : <span class="string">&#x27; Off&#x27;</span>); &#125;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">textContent</span> = <span class="title class_">IsActive</span> ? <span class="title function_">T</span>(<span class="string">&#x27;PanelBtnPause&#x27;</span>) : <span class="title function_">T</span>(<span class="string">&#x27;PanelBtnResume&#x27;</span>);</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="title class_">Overlay</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">function</span>(<span class="params">E</span>) &#123; <span class="keyword">if</span> (E.<span class="property">target</span> === <span class="title class_">Overlay</span>) <span class="title class_">DestroyPanel</span>(); &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">function</span> <span class="title function_">OnKeyDown</span>(<span class="params">E</span>) &#123; <span class="keyword">if</span> (E.<span class="property">key</span> === <span class="string">&#x27;Escape&#x27;</span>) <span class="title class_">DestroyPanel</span>(); &#125;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;keydown&#x27;</span>, <span class="title class_">OnKeyDown</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">function</span> <span class="title function_">DestroyPanel</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">removeEventListener</span>(<span class="string">&#x27;keydown&#x27;</span>, <span class="title class_">OnKeyDown</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Overlay</span>.<span class="property">parentNode</span>) <span class="title class_">Overlay</span>.<span class="property">parentNode</span>.<span class="title function_">removeChild</span>(<span class="title class_">Overlay</span>);</span><br><span class="line">            <span class="title class_">PanelDestroyFn</span> = <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="title class_">PanelDestroyFn</span> = <span class="title class_">DestroyPanel</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">CloseConfigPanel</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">PanelDestroyFn</span>) &#123; <span class="title class_">PanelDestroyFn</span>(); <span class="title class_">PanelDestroyFn</span> = <span class="literal">null</span>; &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 观察者 ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">InitObserver</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Observer</span>) &#123; <span class="title class_">Observer</span>.<span class="title function_">disconnect</span>(); <span class="title class_">Observer</span> = <span class="literal">null</span>; &#125;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Container</span> = <span class="title class_">DetectContainer</span>();</span><br><span class="line">        <span class="keyword">if</span> (!<span class="title class_">Container</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="title class_">Observer</span> = <span class="keyword">new</span> <span class="title class_">MutationObserver</span>(<span class="keyword">function</span>(<span class="params">Mutations</span>) &#123;</span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">ShouldProcess</span> = <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Mutation</span> <span class="keyword">of</span> <span class="title class_">Mutations</span>) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Mutation</span>.<span class="property">type</span> === <span class="string">&#x27;childList&#x27;</span> &amp;&amp; (<span class="title class_">Mutation</span>.<span class="property">addedNodes</span>.<span class="property">length</span> &gt; <span class="number">0</span> || <span class="title class_">Mutation</span>.<span class="property">removedNodes</span>.<span class="property">length</span> &gt; <span class="number">0</span>)) &#123;</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Node</span> <span class="keyword">of</span> <span class="title class_">Mutation</span>.<span class="property">addedNodes</span>) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="title class_">Node</span>.<span class="property">nodeType</span> === <span class="number">1</span>) &#123;</span><br><span class="line">                            <span class="keyword">const</span> <span class="title class_">Sel</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">                            <span class="keyword">if</span> (<span class="title class_">Sel</span> &amp;&amp; (<span class="title class_">Node</span>.<span class="title function_">matches</span>(<span class="title class_">Sel</span>) || <span class="title class_">Node</span>.<span class="title function_">querySelector</span>(<span class="title class_">Sel</span>))) &#123; <span class="title class_">ShouldProcess</span> = <span class="literal">true</span>; <span class="keyword">break</span>; &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">if</span> (!<span class="title class_">ShouldProcess</span>) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Node</span> <span class="keyword">of</span> <span class="title class_">Mutation</span>.<span class="property">removedNodes</span>) &#123;</span><br><span class="line">                            <span class="keyword">if</span> (<span class="title class_">Node</span>.<span class="property">nodeType</span> === <span class="number">1</span>) &#123;</span><br><span class="line">                                <span class="keyword">const</span> <span class="title class_">Sel</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">                                <span class="keyword">if</span> (<span class="title class_">Sel</span> &amp;&amp; (<span class="title class_">Node</span>.<span class="title function_">matches</span>(<span class="title class_">Sel</span>) || <span class="title class_">Node</span>.<span class="title function_">querySelector</span>(<span class="title class_">Sel</span>))) &#123; <span class="title class_">ShouldProcess</span> = <span class="literal">true</span>; <span class="keyword">break</span>; &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">ShouldProcess</span>) <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">ShouldProcess</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Now</span> = <span class="title class_">Date</span>.<span class="title function_">now</span>();</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Now</span> - <span class="title class_">LastRun</span> &lt; <span class="variable constant_">THROTTLE_INTERVAL</span>) &#123;</span><br><span class="line">                    <span class="built_in">clearTimeout</span>(<span class="title class_">DebounceTimer</span>);</span><br><span class="line">                    <span class="title class_">DebounceTimer</span> = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123; <span class="title class_">LastRun</span> = <span class="title class_">Date</span>.<span class="title function_">now</span>(); <span class="title class_">LimitVideos</span>(); &#125;, <span class="number">300</span>);</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123; <span class="title class_">LastRun</span> = <span class="title class_">Now</span>; <span class="title class_">LimitVideos</span>(); &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">        <span class="title class_">Observer</span>.<span class="title function_">observe</span>(<span class="title class_">Container</span>, &#123; <span class="attr">childList</span>: <span class="literal">true</span>, <span class="attr">subtree</span>: <span class="literal">true</span>, <span class="attr">attributes</span>: <span class="literal">false</span> &#125;);</span><br><span class="line">        <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogObserverStarted&#x27;</span>), <span class="title class_">Container</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 路由变化监听 ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">WatchUrlChange</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">let</span> <span class="title class_">LastUrl</span> = location.<span class="property">href</span>;</span><br><span class="line">        <span class="built_in">setInterval</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (location.<span class="property">href</span> !== <span class="title class_">LastUrl</span>) &#123;</span><br><span class="line">                <span class="title class_">LastUrl</span> = location.<span class="property">href</span>;</span><br><span class="line">                <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogUrlChanged&#x27;</span>), <span class="title class_">LastUrl</span>);</span><br><span class="line">                <span class="title class_">EffectiveSelector</span> = <span class="literal">null</span>;</span><br><span class="line">                <span class="title class_">VideoListContainer</span> = <span class="literal">null</span>;</span><br><span class="line">                <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123; <span class="title class_">DetectSelector</span>(); <span class="title class_">DetectContainer</span>(); <span class="title class_">LimitVideos</span>(); <span class="title function_">applyElementRemoval</span>(); &#125;, <span class="number">500</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;, <span class="number">1000</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 菜单命令 ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">RegisterMenu</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuSettings&#x27;</span>), <span class="title class_">OpenConfigPanel</span>);</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuRefresh&#x27;</span>), <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="title class_">EffectiveSelector</span> = <span class="literal">null</span>;</span><br><span class="line">            <span class="title class_">VideoListContainer</span> = <span class="literal">null</span>;</span><br><span class="line">            <span class="title class_">LimitVideos</span>();</span><br><span class="line">        &#125;);</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuToggle&#x27;</span>), <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="title class_">IsActive</span> = !<span class="title class_">IsActive</span>;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">IsActive</span>) <span class="title class_">LimitVideos</span>();</span><br><span class="line">            <span class="keyword">else</span> <span class="title class_">RestoreAllVideos</span>();</span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogStatus&#x27;</span>), <span class="title class_">IsActive</span> ? <span class="title function_">T</span>(<span class="string">&#x27;LogStatusOn&#x27;</span>) : <span class="title function_">T</span>(<span class="string">&#x27;LogStatusOff&#x27;</span>));</span><br><span class="line">        &#125;);</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuCommentPurifier&#x27;</span>), toggleCommentPurifier);</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuQuickSet&#x27;</span>), <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Num</span> = <span class="title function_">prompt</span>(<span class="title function_">T</span>(<span class="string">&#x27;PromptQuickSet&#x27;</span>), <span class="title class_">Config</span>.<span class="property">MaxVideos</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Num</span> !== <span class="literal">null</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> N = <span class="built_in">parseInt</span>(<span class="title class_">Num</span>);</span><br><span class="line">                <span class="keyword">if</span> (N &gt;= <span class="number">1</span> &amp;&amp; N &lt;= <span class="number">100</span>) &#123;</span><br><span class="line">                    <span class="title class_">Config</span>.<span class="property">MaxVideos</span> = N;</span><br><span class="line">                    <span class="title class_">SaveConfig</span>(&#123; <span class="title class_">MaxVideos</span>: N &#125;);</span><br><span class="line">                    <span class="keyword">if</span> (!<span class="title class_">IsActive</span>) <span class="title class_">IsActive</span> = <span class="literal">true</span>;</span><br><span class="line">                    <span class="title class_">LimitVideos</span>();</span><br><span class="line">                    <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogQuickSet&#x27;</span>), N);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 初始化 ========================</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">Init</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="title class_">Config</span> = <span class="title class_">GetConfig</span>();</span><br><span class="line">            <span class="title class_">CurrentLang</span> = <span class="title class_">ResolveLanguage</span>();</span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogConfigLoaded&#x27;</span>), <span class="title class_">Config</span>);</span><br><span class="line">            <span class="title class_">InjectStyles</span>();</span><br><span class="line">            <span class="title class_">RegisterMenu</span>();</span><br><span class="line">            <span class="title function_">startCommentPurifier</span>();</span><br><span class="line">            <span class="title class_">InitObserver</span>();</span><br><span class="line">            <span class="title class_">WatchUrlChange</span>();</span><br><span class="line">            <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123; <span class="title class_">DetectSelector</span>(); <span class="title class_">DetectContainer</span>(); <span class="title class_">LimitVideos</span>(); <span class="title function_">applyElementRemoval</span>(); &#125;, <span class="number">500</span>);</span><br><span class="line">            <span class="built_in">setInterval</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">IsActive</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Selector</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">Selector</span>) &#123;</span><br><span class="line">                        <span class="keyword">const</span> <span class="title class_">Cards</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Selector</span>);</span><br><span class="line">                        <span class="keyword">let</span> <span class="title class_">VisibleCount</span> = <span class="number">0</span>;</span><br><span class="line">                        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Card</span> <span class="keyword">of</span> <span class="title class_">Cards</span>) &#123;</span><br><span class="line">                            <span class="keyword">if</span> (!(<span class="title class_">Card</span>.<span class="property">style</span>.<span class="property">display</span> === <span class="string">&#x27;none&#x27;</span> || <span class="title class_">Card</span>.<span class="property">classList</span>.<span class="title function_">contains</span>(<span class="string">&#x27;BiliLimitedHide&#x27;</span>))) <span class="title class_">VisibleCount</span>++;</span><br><span class="line">                        &#125;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="title class_">VisibleCount</span> &gt; <span class="title class_">Config</span>.<span class="property">MaxVideos</span>) &#123; <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogTimerRetry&#x27;</span>)); <span class="title class_">LimitVideos</span>(); &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="title function_">applyElementRemoval</span>();</span><br><span class="line">            &#125;, <span class="number">5000</span>);</span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogInitDone&#x27;</span>), <span class="title class_">Config</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (E) &#123; <span class="title class_">ErrorLog</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogInitError&#x27;</span>), E); &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="property">readyState</span> === <span class="string">&#x27;loading&#x27;</span>) <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;DOMContentLoaded&#x27;</span>, <span class="title class_">Init</span>);</span><br><span class="line">    <span class="keyword">else</span> <span class="title class_">Init</span>();</span><br><span class="line"></span><br><span class="line">&#125;)();</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://twilightraindev-github-io.pages.dev/2026/07/22/bilicompact-source-v2/</id>
    <link href="https://twilightraindev-github-io.pages.dev/2026/07/22/bilicompact-source-v2/"/>
    <published>2026-07-22T04:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>以下为 BiliCompact 用户脚本 v2.5.1 的完整源码，MIT 协议，可自由使用、修改、分发。<br>安装方法：复制到 Tampermonkey &#x2F; Violentmonkey 新建脚本中保存即可。</p>
</blockquote>]]>
    </summary>
    <title>BiliCompact 完整源码（v2.5.1，更新版）</title>
    <updated>2026-07-24T13:36:26.198Z</updated>
  </entry>
  <entry>
    <author>
      <name>TwilightRain</name>
    </author>
    <category term="代码仓库" scheme="https://twilightraindev-github-io.pages.dev/categories/%E4%BB%A3%E7%A0%81%E4%BB%93%E5%BA%93/"/>
    <category term="BiliCompact" scheme="https://twilightraindev-github-io.pages.dev/tags/BiliCompact/"/>
    <category term="Tampermonkey" scheme="https://twilightraindev-github-io.pages.dev/tags/Tampermonkey/"/>
    <category term="JavaScript" scheme="https://twilightraindev-github-io.pages.dev/tags/JavaScript/"/>
    <category term="源码" scheme="https://twilightraindev-github-io.pages.dev/tags/%E6%BA%90%E7%A0%81/"/>
    <content>
      <![CDATA[<blockquote><p>以下为 BiliCompact 用户脚本的完整源码，MIT 协议，可自由使用、修改、分发。<br>安装方法：复制到 Tampermonkey &#x2F; Violentmonkey 新建脚本中保存即可。</p></blockquote><span id="more"></span><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br><span class="line">776</span><br><span class="line">777</span><br><span class="line">778</span><br><span class="line">779</span><br><span class="line">780</span><br><span class="line">781</span><br><span class="line">782</span><br><span class="line">783</span><br><span class="line">784</span><br><span class="line">785</span><br><span class="line">786</span><br><span class="line">787</span><br><span class="line">788</span><br><span class="line">789</span><br><span class="line">790</span><br><span class="line">791</span><br><span class="line">792</span><br><span class="line">793</span><br><span class="line">794</span><br><span class="line">795</span><br><span class="line">796</span><br><span class="line">797</span><br><span class="line">798</span><br><span class="line">799</span><br><span class="line">800</span><br><span class="line">801</span><br><span class="line">802</span><br><span class="line">803</span><br><span class="line">804</span><br><span class="line">805</span><br><span class="line">806</span><br><span class="line">807</span><br><span class="line">808</span><br><span class="line">809</span><br><span class="line">810</span><br><span class="line">811</span><br><span class="line">812</span><br><span class="line">813</span><br><span class="line">814</span><br><span class="line">815</span><br><span class="line">816</span><br><span class="line">817</span><br><span class="line">818</span><br><span class="line">819</span><br><span class="line">820</span><br><span class="line">821</span><br><span class="line">822</span><br><span class="line">823</span><br><span class="line">824</span><br><span class="line">825</span><br><span class="line">826</span><br><span class="line">827</span><br><span class="line">828</span><br><span class="line">829</span><br><span class="line">830</span><br><span class="line">831</span><br><span class="line">832</span><br><span class="line">833</span><br><span class="line">834</span><br><span class="line">835</span><br><span class="line">836</span><br><span class="line">837</span><br><span class="line">838</span><br><span class="line">839</span><br><span class="line">840</span><br><span class="line">841</span><br><span class="line">842</span><br><span class="line">843</span><br><span class="line">844</span><br><span class="line">845</span><br><span class="line">846</span><br><span class="line">847</span><br><span class="line">848</span><br><span class="line">849</span><br><span class="line">850</span><br><span class="line">851</span><br><span class="line">852</span><br><span class="line">853</span><br><span class="line">854</span><br><span class="line">855</span><br><span class="line">856</span><br><span class="line">857</span><br><span class="line">858</span><br><span class="line">859</span><br><span class="line">860</span><br><span class="line">861</span><br><span class="line">862</span><br><span class="line">863</span><br><span class="line">864</span><br><span class="line">865</span><br><span class="line">866</span><br><span class="line">867</span><br><span class="line">868</span><br><span class="line">869</span><br><span class="line">870</span><br><span class="line">871</span><br><span class="line">872</span><br><span class="line">873</span><br><span class="line">874</span><br><span class="line">875</span><br><span class="line">876</span><br><span class="line">877</span><br><span class="line">878</span><br><span class="line">879</span><br><span class="line">880</span><br><span class="line">881</span><br><span class="line">882</span><br><span class="line">883</span><br><span class="line">884</span><br><span class="line">885</span><br><span class="line">886</span><br><span class="line">887</span><br><span class="line">888</span><br><span class="line">889</span><br><span class="line">890</span><br><span class="line">891</span><br><span class="line">892</span><br><span class="line">893</span><br><span class="line">894</span><br><span class="line">895</span><br><span class="line">896</span><br><span class="line">897</span><br><span class="line">898</span><br><span class="line">899</span><br><span class="line">900</span><br><span class="line">901</span><br><span class="line">902</span><br><span class="line">903</span><br><span class="line">904</span><br><span class="line">905</span><br><span class="line">906</span><br><span class="line">907</span><br><span class="line">908</span><br><span class="line">909</span><br><span class="line">910</span><br><span class="line">911</span><br><span class="line">912</span><br><span class="line">913</span><br><span class="line">914</span><br><span class="line">915</span><br><span class="line">916</span><br><span class="line">917</span><br><span class="line">918</span><br><span class="line">919</span><br><span class="line">920</span><br><span class="line">921</span><br><span class="line">922</span><br><span class="line">923</span><br><span class="line">924</span><br><span class="line">925</span><br><span class="line">926</span><br><span class="line">927</span><br><span class="line">928</span><br><span class="line">929</span><br><span class="line">930</span><br><span class="line">931</span><br><span class="line">932</span><br><span class="line">933</span><br><span class="line">934</span><br><span class="line">935</span><br><span class="line">936</span><br><span class="line">937</span><br><span class="line">938</span><br><span class="line">939</span><br><span class="line">940</span><br><span class="line">941</span><br><span class="line">942</span><br><span class="line">943</span><br><span class="line">944</span><br><span class="line">945</span><br><span class="line">946</span><br><span class="line">947</span><br><span class="line">948</span><br><span class="line">949</span><br><span class="line">950</span><br><span class="line">951</span><br><span class="line">952</span><br><span class="line">953</span><br><span class="line">954</span><br><span class="line">955</span><br><span class="line">956</span><br><span class="line">957</span><br><span class="line">958</span><br><span class="line">959</span><br><span class="line">960</span><br><span class="line">961</span><br><span class="line">962</span><br><span class="line">963</span><br><span class="line">964</span><br><span class="line">965</span><br><span class="line">966</span><br><span class="line">967</span><br><span class="line">968</span><br><span class="line">969</span><br><span class="line">970</span><br><span class="line">971</span><br><span class="line">972</span><br><span class="line">973</span><br><span class="line">974</span><br><span class="line">975</span><br><span class="line">976</span><br><span class="line">977</span><br><span class="line">978</span><br><span class="line">979</span><br><span class="line">980</span><br><span class="line">981</span><br><span class="line">982</span><br><span class="line">983</span><br><span class="line">984</span><br><span class="line">985</span><br><span class="line">986</span><br><span class="line">987</span><br><span class="line">988</span><br><span class="line">989</span><br><span class="line">990</span><br><span class="line">991</span><br><span class="line">992</span><br><span class="line">993</span><br><span class="line">994</span><br><span class="line">995</span><br><span class="line">996</span><br><span class="line">997</span><br><span class="line">998</span><br><span class="line">999</span><br><span class="line">1000</span><br><span class="line">1001</span><br><span class="line">1002</span><br><span class="line">1003</span><br><span class="line">1004</span><br><span class="line">1005</span><br><span class="line">1006</span><br><span class="line">1007</span><br><span class="line">1008</span><br><span class="line">1009</span><br><span class="line">1010</span><br><span class="line">1011</span><br><span class="line">1012</span><br><span class="line">1013</span><br><span class="line">1014</span><br><span class="line">1015</span><br><span class="line">1016</span><br><span class="line">1017</span><br><span class="line">1018</span><br><span class="line">1019</span><br><span class="line">1020</span><br><span class="line">1021</span><br><span class="line">1022</span><br><span class="line">1023</span><br><span class="line">1024</span><br><span class="line">1025</span><br><span class="line">1026</span><br><span class="line">1027</span><br><span class="line">1028</span><br><span class="line">1029</span><br><span class="line">1030</span><br><span class="line">1031</span><br><span class="line">1032</span><br><span class="line">1033</span><br><span class="line">1034</span><br><span class="line">1035</span><br><span class="line">1036</span><br><span class="line">1037</span><br><span class="line">1038</span><br><span class="line">1039</span><br><span class="line">1040</span><br><span class="line">1041</span><br><span class="line">1042</span><br><span class="line">1043</span><br><span class="line">1044</span><br><span class="line">1045</span><br><span class="line">1046</span><br><span class="line">1047</span><br><span class="line">1048</span><br><span class="line">1049</span><br><span class="line">1050</span><br><span class="line">1051</span><br><span class="line">1052</span><br><span class="line">1053</span><br><span class="line">1054</span><br><span class="line">1055</span><br><span class="line">1056</span><br><span class="line">1057</span><br><span class="line">1058</span><br><span class="line">1059</span><br><span class="line">1060</span><br><span class="line">1061</span><br><span class="line">1062</span><br><span class="line">1063</span><br><span class="line">1064</span><br><span class="line">1065</span><br><span class="line">1066</span><br><span class="line">1067</span><br><span class="line">1068</span><br><span class="line">1069</span><br><span class="line">1070</span><br><span class="line">1071</span><br><span class="line">1072</span><br><span class="line">1073</span><br><span class="line">1074</span><br><span class="line">1075</span><br><span class="line">1076</span><br><span class="line">1077</span><br><span class="line">1078</span><br><span class="line">1079</span><br><span class="line">1080</span><br><span class="line">1081</span><br><span class="line">1082</span><br><span class="line">1083</span><br><span class="line">1084</span><br><span class="line">1085</span><br><span class="line">1086</span><br><span class="line">1087</span><br><span class="line">1088</span><br><span class="line">1089</span><br><span class="line">1090</span><br><span class="line">1091</span><br><span class="line">1092</span><br><span class="line">1093</span><br><span class="line">1094</span><br><span class="line">1095</span><br><span class="line">1096</span><br><span class="line">1097</span><br><span class="line">1098</span><br><span class="line">1099</span><br><span class="line">1100</span><br><span class="line">1101</span><br><span class="line">1102</span><br><span class="line">1103</span><br><span class="line">1104</span><br><span class="line">1105</span><br><span class="line">1106</span><br><span class="line">1107</span><br><span class="line">1108</span><br><span class="line">1109</span><br><span class="line">1110</span><br><span class="line">1111</span><br><span class="line">1112</span><br><span class="line">1113</span><br><span class="line">1114</span><br><span class="line">1115</span><br><span class="line">1116</span><br><span class="line">1117</span><br><span class="line">1118</span><br><span class="line">1119</span><br><span class="line">1120</span><br><span class="line">1121</span><br><span class="line">1122</span><br><span class="line">1123</span><br><span class="line">1124</span><br><span class="line">1125</span><br><span class="line">1126</span><br><span class="line">1127</span><br><span class="line">1128</span><br><span class="line">1129</span><br><span class="line">1130</span><br><span class="line">1131</span><br><span class="line">1132</span><br><span class="line">1133</span><br><span class="line">1134</span><br><span class="line">1135</span><br><span class="line">1136</span><br><span class="line">1137</span><br><span class="line">1138</span><br><span class="line">1139</span><br><span class="line">1140</span><br><span class="line">1141</span><br><span class="line">1142</span><br><span class="line">1143</span><br><span class="line">1144</span><br><span class="line">1145</span><br><span class="line">1146</span><br><span class="line">1147</span><br><span class="line">1148</span><br><span class="line">1149</span><br><span class="line">1150</span><br><span class="line">1151</span><br><span class="line">1152</span><br><span class="line">1153</span><br><span class="line">1154</span><br><span class="line">1155</span><br><span class="line">1156</span><br><span class="line">1157</span><br><span class="line">1158</span><br><span class="line">1159</span><br><span class="line">1160</span><br><span class="line">1161</span><br><span class="line">1162</span><br><span class="line">1163</span><br><span class="line">1164</span><br><span class="line">1165</span><br><span class="line">1166</span><br><span class="line">1167</span><br><span class="line">1168</span><br><span class="line">1169</span><br><span class="line">1170</span><br><span class="line">1171</span><br><span class="line">1172</span><br><span class="line">1173</span><br><span class="line">1174</span><br><span class="line">1175</span><br><span class="line">1176</span><br><span class="line">1177</span><br><span class="line">1178</span><br><span class="line">1179</span><br><span class="line">1180</span><br><span class="line">1181</span><br><span class="line">1182</span><br><span class="line">1183</span><br><span class="line">1184</span><br><span class="line">1185</span><br><span class="line">1186</span><br><span class="line">1187</span><br><span class="line">1188</span><br><span class="line">1189</span><br><span class="line">1190</span><br><span class="line">1191</span><br><span class="line">1192</span><br><span class="line">1193</span><br><span class="line">1194</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// ==UserScript==</span></span><br><span class="line"><span class="comment">// @name         网页端B站主页精简~ BiliCompact</span></span><br><span class="line"><span class="comment">// @namespace    http://tampermonkey.net/</span></span><br><span class="line"><span class="comment">// @version      2.5.1</span></span><br><span class="line"><span class="comment">// @license MIT</span></span><br><span class="line"><span class="comment">// @description  你是否厌倦了B站网页端极多视频？想要更简要的界面？这个插件将帮助你只显示指定数量的视频，支持多种页面、黑/白名单、配置持久化。非侵入式设计，不在B站页面注入任何UI元素。支持简中，繁中，英语。</span></span><br><span class="line"><span class="comment">// @author       TwilightRain</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/?*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/index/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/v/popular/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/v/*/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/dynamic*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/search*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/anime/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/guochuang/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/music/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/dance/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/game/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/technology/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/life/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/food/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/car/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/animal/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/kichiku/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/fashion/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/ent/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/cinephile/*</span></span><br><span class="line"><span class="comment">// @match        https://www.bilibili.com/popular/*</span></span><br><span class="line"><span class="comment">// @run-at       document-end</span></span><br><span class="line"><span class="comment">// @grant        GM_setValue</span></span><br><span class="line"><span class="comment">// @grant        GM_getValue</span></span><br><span class="line"><span class="comment">// @grant        GM_registerMenuCommand</span></span><br><span class="line"><span class="comment">// @grant        GM_addStyle</span></span><br><span class="line"><span class="comment">// @grant        GM_log</span></span><br><span class="line"><span class="comment">// @icon         https://www.bilibili.com/favicon.ico</span></span><br><span class="line"><span class="comment">// @downloadURL https://update.greasyfork.org/scripts/585777/%E7%BD%91%E9%A1%B5%E7%AB%AFB%E7%AB%99%E4%B8%BB%E9%A1%B5%E7%B2%BE%E7%AE%80~%20BiliCompact.user.js</span></span><br><span class="line"><span class="comment">// @updateURL https://update.greasyfork.org/scripts/585777/%E7%BD%91%E9%A1%B5%E7%AB%AFB%E7%AB%99%E4%B8%BB%E9%A1%B5%E7%B2%BE%E7%AE%80~%20BiliCompact.meta.js</span></span><br><span class="line"><span class="comment">// ==/UserScript==</span></span><br><span class="line"></span><br><span class="line">(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="string">&#x27;use strict&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 国际化 (i18n) ========================</span></span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">I18N</span> = &#123;</span><br><span class="line">        <span class="attr">zh_CN</span>: &#123;</span><br><span class="line">            <span class="title class_">LogPrefix</span>: <span class="string">&#x27;[B站精简]&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorData</span>: <span class="string">&#x27;通过data属性探测到选择器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFound</span>: <span class="string">&#x27;探测到选择器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFallback</span>: <span class="string">&#x27;通过链接回退探测到选择器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogNoCards</span>: <span class="string">&#x27;未找到视频卡片，跳过&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStillNoCards</span>: <span class="string">&#x27;仍未找到视频卡片&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogProcessed</span>: <span class="string">&#x27;已处理: 总视频 &#123;0&#125;, 显示 &#123;1&#125;, 隐藏 &#123;2&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogErrorLimit</span>: <span class="string">&#x27;limitVideos 出错:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogContainerFound</span>: <span class="string">&#x27;探测到容器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogConfigLoaded</span>: <span class="string">&#x27;配置加载完成:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatus</span>: <span class="string">&#x27;精简状态: &#123;0&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOn</span>: <span class="string">&#x27;已开启&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOff</span>: <span class="string">&#x27;已关闭&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogQuickSet</span>: <span class="string">&#x27;已设置最大数量:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogTimerRetry</span>: <span class="string">&#x27;定时器检测到可见视频过多，重新执行限制&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitDone</span>: <span class="string">&#x27;脚本初始化完成，当前配置:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitError</span>: <span class="string">&#x27;初始化失败:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogObserverStarted</span>: <span class="string">&#x27;MutationObserver 已启动，监听容器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogUrlChanged</span>: <span class="string">&#x27;URL变化:&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">MenuSettings</span>: <span class="string">&#x27;B站精简设置&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuRefresh</span>: <span class="string">&#x27;手动刷新精简&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuToggle</span>: <span class="string">&#x27;切换精简状态&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuQuickSet</span>: <span class="string">&#x27;快速设数量&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuCommentPurifier</span>: <span class="string">&#x27;切换评论净化&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PanelTitle</span>: <span class="string">&#x27;B站精简设置&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusLabel</span>: <span class="string">&#x27;当前状态&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusActive</span>: <span class="string">&#x27;精简中&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusPaused</span>: <span class="string">&#x27;已暂停&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelMaxVideos</span>: <span class="string">&#x27;最大显示数量&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeLive</span>: <span class="string">&#x27;排除直播&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeAd</span>: <span class="string">&#x27;排除广告&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeBangumi</span>: <span class="string">&#x27;排除番剧&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludePaid</span>: <span class="string">&#x27;排除付费课程&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepPromoted</span>: <span class="string">&#x27;保留推广位&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepUpids</span>: <span class="string">&#x27;保留UP主ID（逗号分隔）&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelDebug</span>: <span class="string">&#x27;调试模式&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelEnableCommentPurifier</span>: <span class="string">&#x27;启用评论净化（删除@提及，隐藏短评论）&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguage</span>: <span class="string">&#x27;界面语言 / Language&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguageAuto</span>: <span class="string">&#x27;自动 (Auto)&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnPause</span>: <span class="string">&#x27;暂停精简&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnResume</span>: <span class="string">&#x27;启用精简&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnReset</span>: <span class="string">&#x27;恢复默认&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnSave</span>: <span class="string">&#x27;保存并应用&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnClose</span>: <span class="string">&#x27;关闭&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PromptQuickSet</span>: <span class="string">&#x27;输入最大显示视频数量（1-100）：&#x27;</span>,</span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="attr">zh_TW</span>: &#123;</span><br><span class="line">            <span class="title class_">LogPrefix</span>: <span class="string">&#x27;[B站精簡]&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorData</span>: <span class="string">&#x27;透過data屬性探測到選擇器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFound</span>: <span class="string">&#x27;探測到選擇器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFallback</span>: <span class="string">&#x27;透過連結回退探測到選擇器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogNoCards</span>: <span class="string">&#x27;未找到影片卡片，跳過&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStillNoCards</span>: <span class="string">&#x27;仍未找到影片卡片&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogProcessed</span>: <span class="string">&#x27;已處理: 總影片 &#123;0&#125;, 顯示 &#123;1&#125;, 隱藏 &#123;2&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogErrorLimit</span>: <span class="string">&#x27;limitVideos 出錯:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogContainerFound</span>: <span class="string">&#x27;探測到容器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogConfigLoaded</span>: <span class="string">&#x27;設定載入完成:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatus</span>: <span class="string">&#x27;精簡狀態: &#123;0&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOn</span>: <span class="string">&#x27;已開啟&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOff</span>: <span class="string">&#x27;已關閉&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogQuickSet</span>: <span class="string">&#x27;已設定最大數量:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogTimerRetry</span>: <span class="string">&#x27;定時器偵測到可見影片過多，重新執行限制&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitDone</span>: <span class="string">&#x27;指令碼初始化完成（非侵入式），目前設定:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitError</span>: <span class="string">&#x27;初始化失敗:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogObserverStarted</span>: <span class="string">&#x27;MutationObserver 已啟動，監聽容器:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogUrlChanged</span>: <span class="string">&#x27;URL變化:&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">MenuSettings</span>: <span class="string">&#x27;B站精簡設定&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuRefresh</span>: <span class="string">&#x27;手動重新整理精簡&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuToggle</span>: <span class="string">&#x27;切換精簡狀態&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuQuickSet</span>: <span class="string">&#x27;快速設數量&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuCommentPurifier</span>: <span class="string">&#x27;切換評論淨化&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PanelTitle</span>: <span class="string">&#x27;B站精簡設定&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusLabel</span>: <span class="string">&#x27;目前狀態&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusActive</span>: <span class="string">&#x27;精簡中&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusPaused</span>: <span class="string">&#x27;已暫停&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelMaxVideos</span>: <span class="string">&#x27;最大顯示數量&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeLive</span>: <span class="string">&#x27;排除直播&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeAd</span>: <span class="string">&#x27;排除廣告&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeBangumi</span>: <span class="string">&#x27;排除番劇&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludePaid</span>: <span class="string">&#x27;排除付費課程&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepPromoted</span>: <span class="string">&#x27;保留推廣位&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepUpids</span>: <span class="string">&#x27;保留UP主ID（逗號分隔）&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelDebug</span>: <span class="string">&#x27;除錯模式&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelEnableCommentPurifier</span>: <span class="string">&#x27;啟用評論淨化（刪除@提及，隱藏短評論）&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguage</span>: <span class="string">&#x27;介面語言 / Language&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguageAuto</span>: <span class="string">&#x27;自動 (Auto)&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnPause</span>: <span class="string">&#x27;暫停精簡&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnResume</span>: <span class="string">&#x27;啟用精簡&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnReset</span>: <span class="string">&#x27;回復預設&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnSave</span>: <span class="string">&#x27;儲存並套用&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnClose</span>: <span class="string">&#x27;關閉&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PromptQuickSet</span>: <span class="string">&#x27;輸入最大顯示影片數量（1-100）：&#x27;</span>,</span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="attr">en_US</span>: &#123;</span><br><span class="line">            <span class="title class_">LogPrefix</span>: <span class="string">&#x27;[BiliCompact]&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorData</span>: <span class="string">&#x27;Selector detected via data attribute:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFound</span>: <span class="string">&#x27;Selector detected:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogSelectorFallback</span>: <span class="string">&#x27;Selector detected via link fallback:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogNoCards</span>: <span class="string">&#x27;No video cards found, skipping&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStillNoCards</span>: <span class="string">&#x27;Still no video cards found&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogProcessed</span>: <span class="string">&#x27;Processed: total &#123;0&#125;, shown &#123;1&#125;, hidden &#123;2&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogErrorLimit</span>: <span class="string">&#x27;limitVideos error:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogContainerFound</span>: <span class="string">&#x27;Container detected:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogConfigLoaded</span>: <span class="string">&#x27;Config loaded:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatus</span>: <span class="string">&#x27;Compact status: &#123;0&#125;&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOn</span>: <span class="string">&#x27;Enabled&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogStatusOff</span>: <span class="string">&#x27;Disabled&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogQuickSet</span>: <span class="string">&#x27;Max videos set to:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogTimerRetry</span>: <span class="string">&#x27;Timer detected too many visible videos, re-running limit&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitDone</span>: <span class="string">&#x27;BiliCompact initialized (non-invasive), config:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogInitError</span>: <span class="string">&#x27;Initialization failed:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogObserverStarted</span>: <span class="string">&#x27;MutationObserver started, watching container:&#x27;</span>,</span><br><span class="line">            <span class="title class_">LogUrlChanged</span>: <span class="string">&#x27;URL changed:&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">MenuSettings</span>: <span class="string">&#x27;BiliCompact Settings&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuRefresh</span>: <span class="string">&#x27;Refresh Compact&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuToggle</span>: <span class="string">&#x27;Toggle Compact&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuQuickSet</span>: <span class="string">&#x27;Quick Set Count&#x27;</span>,</span><br><span class="line">            <span class="title class_">MenuCommentPurifier</span>: <span class="string">&#x27;Toggle Comment Purifier&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PanelTitle</span>: <span class="string">&#x27;BiliCompact Settings&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusLabel</span>: <span class="string">&#x27;Status&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusActive</span>: <span class="string">&#x27;Active&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelStatusPaused</span>: <span class="string">&#x27;Paused&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelMaxVideos</span>: <span class="string">&#x27;Max videos&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeLive</span>: <span class="string">&#x27;Exclude live streams&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeAd</span>: <span class="string">&#x27;Exclude ads&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludeBangumi</span>: <span class="string">&#x27;Exclude bangumi&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelExcludePaid</span>: <span class="string">&#x27;Exclude paid courses&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepPromoted</span>: <span class="string">&#x27;Keep promoted items&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelKeepUpids</span>: <span class="string">&#x27;Whitelist UP IDs (comma-separated)&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelDebug</span>: <span class="string">&#x27;Debug mode&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelEnableCommentPurifier</span>: <span class="string">&#x27;Enable comment purifier (remove @mentions, hide short comments)&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguage</span>: <span class="string">&#x27;Language / 語言&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelLanguageAuto</span>: <span class="string">&#x27;Auto&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnPause</span>: <span class="string">&#x27;Pause&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnResume</span>: <span class="string">&#x27;Resume&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnReset</span>: <span class="string">&#x27;Reset Defaults&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnSave</span>: <span class="string">&#x27;Save &amp; Apply&#x27;</span>,</span><br><span class="line">            <span class="title class_">PanelBtnClose</span>: <span class="string">&#x27;Close&#x27;</span>,</span><br><span class="line"></span><br><span class="line">            <span class="title class_">PromptQuickSet</span>: <span class="string">&#x27;Enter max videos to show (1-100):&#x27;</span>,</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">CurrentLang</span> = <span class="string">&#x27;zh_CN&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ResolveLanguage</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">Language</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">Language</span> !== <span class="string">&#x27;auto&#x27;</span>) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="title class_">Config</span>.<span class="property">Language</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Nav</span> = (navigator.<span class="property">language</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">        <span class="keyword">if</span> (<span class="regexp">/^zh-(tw|hk|mo)$/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>) || <span class="regexp">/^zh-(hant)$/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>)) <span class="keyword">return</span> <span class="string">&#x27;zh_TW&#x27;</span>;</span><br><span class="line">        <span class="keyword">if</span> (<span class="regexp">/^zh/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>)) <span class="keyword">return</span> <span class="string">&#x27;zh_CN&#x27;</span>;</span><br><span class="line">        <span class="keyword">if</span> (<span class="regexp">/^en/i</span>.<span class="title function_">test</span>(<span class="title class_">Nav</span>)) <span class="keyword">return</span> <span class="string">&#x27;en_US&#x27;</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;zh_CN&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">T</span>(<span class="params">Key, ...Args</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Map</span> = <span class="variable constant_">I18N</span>[<span class="title class_">CurrentLang</span>] || <span class="variable constant_">I18N</span>[<span class="string">&#x27;zh_CN&#x27;</span>];</span><br><span class="line">        <span class="keyword">let</span> <span class="title class_">Str</span> = <span class="title class_">Map</span>[<span class="title class_">Key</span>];</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Str</span> === <span class="literal">undefined</span>) &#123;</span><br><span class="line">            <span class="title class_">Str</span> = <span class="variable constant_">I18N</span>[<span class="string">&#x27;zh_CN&#x27;</span>][<span class="title class_">Key</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Str</span> === <span class="literal">undefined</span>) <span class="keyword">return</span> <span class="title class_">Key</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> I = <span class="number">0</span>; I &lt; <span class="title class_">Args</span>.<span class="property">length</span>; I++) &#123;</span><br><span class="line">            <span class="title class_">Str</span> = <span class="title class_">Str</span>.<span class="title function_">replace</span>(<span class="string">&#x27;&#123;&#x27;</span> + I + <span class="string">&#x27;&#125;&#x27;</span>, <span class="title class_">Args</span>[I]);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">Str</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 配置 ========================</span></span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">DEFAULTS</span> = &#123;</span><br><span class="line">        <span class="title class_">MaxVideos</span>: <span class="number">10</span>,</span><br><span class="line">        <span class="title class_">ExcludeLive</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="title class_">ExcludeAd</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="title class_">ExcludeBangumi</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="title class_">ExcludePaid</span>: <span class="literal">true</span>,</span><br><span class="line">        <span class="title class_">KeepSpecialUPIDs</span>: [],</span><br><span class="line">        <span class="title class_">KeepPromoted</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="title class_">Language</span>: <span class="string">&#x27;auto&#x27;</span>,</span><br><span class="line">        <span class="title class_">Debug</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="title class_">EnableCommentPurifier</span>: <span class="literal">false</span>,</span><br><span class="line">        <span class="title class_">RemovedElements</span>: &#123;&#125;,</span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">Config</span> = &#123;&#125;;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">IsActive</span> = <span class="literal">true</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">EffectiveSelector</span> = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">VideoListContainer</span> = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">Observer</span> = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">DebounceTimer</span> = <span class="literal">null</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">PurifierStarted</span> = <span class="literal">false</span>;</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">PurifierObservers</span> = [];</span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">LastRun</span> = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">THROTTLE_INTERVAL</span> = <span class="number">200</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 工具函数 ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">Log</span>(<span class="params">...Args</span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">Debug</span>) <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogPrefix&#x27;</span>), ...<span class="title class_">Args</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ErrorLog</span>(<span class="params">...Args</span>) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogPrefix&#x27;</span>), ...<span class="title class_">Args</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">GetConfig</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Cfg</span> = &#123;&#125;;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> [<span class="title class_">Key</span>, <span class="title class_">Def</span>] <span class="keyword">of</span> <span class="title class_">Object</span>.<span class="title function_">entries</span>(<span class="variable constant_">DEFAULTS</span>)) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Val</span> = <span class="title function_">GM_getValue</span>(<span class="title class_">Key</span>, <span class="title class_">Def</span>);</span><br><span class="line">                <span class="title class_">Cfg</span>[<span class="title class_">Key</span>] = <span class="title class_">Val</span>;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (E) &#123;</span><br><span class="line">                <span class="title class_">Cfg</span>[<span class="title class_">Key</span>] = <span class="title class_">Def</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">Cfg</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">SaveConfig</span>(<span class="params">Cfg</span>) &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> [<span class="title class_">Key</span>, <span class="title class_">Val</span>] <span class="keyword">of</span> <span class="title class_">Object</span>.<span class="title function_">entries</span>(<span class="title class_">Cfg</span>)) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="title function_">GM_setValue</span>(<span class="title class_">Key</span>, <span class="title class_">Val</span>);</span><br><span class="line">            &#125; <span class="keyword">catch</span> (E) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 评论净化器 ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">purifierHasBlockerInstalled</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> comments = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-comments&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (!comments?.<span class="property">shadowRoot</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">const</span> threads = comments.<span class="property">shadowRoot</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;bili-comment-thread-renderer&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (threads.<span class="property">length</span> === <span class="number">0</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">return</span> <span class="title class_">Array</span>.<span class="title function_">from</span>(threads).<span class="title function_">some</span>(<span class="function"><span class="params">thread</span> =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">const</span> comment = thread.<span class="property">shadowRoot</span>?.<span class="title function_">getElementById</span>(<span class="string">&#x27;comment&#x27;</span>);</span><br><span class="line">                <span class="keyword">if</span> (!comment?.<span class="property">shadowRoot</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                <span class="keyword">const</span> userInfo = comment.<span class="property">shadowRoot</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-comment-user-info&#x27;</span>);</span><br><span class="line">                <span class="keyword">if</span> (!userInfo?.<span class="property">shadowRoot</span>) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                <span class="keyword">const</span> info = userInfo.<span class="property">shadowRoot</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;info&#x27;</span>);</span><br><span class="line">                <span class="keyword">return</span> !!info?.<span class="title function_">querySelector</span>(<span class="string">&#x27;button[gz_type]&#x27;</span>);</span><br><span class="line">            &#125;);</span><br><span class="line">        &#125; <span class="keyword">catch</span> &#123; <span class="keyword">return</span> <span class="literal">false</span>; &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">purifierGetContentsEl</span>(<span class="params">renderer</span>) &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> richText = renderer.<span class="property">shadowRoot</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-rich-text&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (richText &amp;&amp; richText.<span class="property">shadowRoot</span>) &#123;</span><br><span class="line">                <span class="keyword">return</span> richText.<span class="property">shadowRoot</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;contents&#x27;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">purifierFindRenderers</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> list = [];</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> comments = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-comments&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (comments &amp;&amp; comments.<span class="property">shadowRoot</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> threads = comments.<span class="property">shadowRoot</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;bili-comment-thread-renderer&#x27;</span>);</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> thread <span class="keyword">of</span> threads) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (thread.<span class="property">shadowRoot</span>) &#123;</span><br><span class="line">                        thread.<span class="property">shadowRoot</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;bili-comment-renderer&#x27;</span>).<span class="title function_">forEach</span>(<span class="function"><span class="params">r</span> =&gt;</span> list.<span class="title function_">push</span>(r));</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">        <span class="keyword">return</span> list;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">purifierProcessRenderer</span>(<span class="params">renderer</span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> doneKey = <span class="string">&#x27;bcPurified&#x27;</span>;</span><br><span class="line">        <span class="keyword">if</span> (renderer.<span class="property">dataset</span>[doneKey]) <span class="keyword">return</span>;</span><br><span class="line">        renderer.<span class="property">dataset</span>[doneKey] = <span class="string">&#x27;1&#x27;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> contents = <span class="title function_">purifierGetContentsEl</span>(renderer);</span><br><span class="line">        <span class="keyword">if</span> (!contents) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> mentions = contents.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;a[data-type=&quot;mention&quot;]&#x27;</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> m <span class="keyword">of</span> mentions) &#123;</span><br><span class="line">            m.<span class="title function_">remove</span>();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> remaining = contents.<span class="property">textContent</span>.<span class="title function_">replace</span>(<span class="regexp">/\s+/g</span>, <span class="string">&#x27;&#x27;</span>).<span class="title function_">trim</span>();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (remaining.<span class="property">length</span> &lt; <span class="number">5</span>) &#123;</span><br><span class="line">            renderer.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">const</span> threadRenderer = renderer.<span class="title function_">getRootNode</span>().<span class="property">host</span>;</span><br><span class="line">                <span class="keyword">if</span> (threadRenderer) threadRenderer.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">startCommentPurifier</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">PurifierStarted</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="title class_">PurifierStarted</span> = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">let</span> scanTimer = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">function</span> <span class="title function_">scheduleScan</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (scanTimer) <span class="built_in">clearTimeout</span>(scanTimer);</span><br><span class="line">            scanTimer = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                <span class="title function_">purifierFindRenderers</span>().<span class="title function_">forEach</span>(purifierProcessRenderer);</span><br><span class="line">                scanTimer = <span class="literal">null</span>;</span><br><span class="line">            &#125;, <span class="number">800</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> comments = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;bili-comments&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (comments?.<span class="property">shadowRoot</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> obs = <span class="keyword">new</span> <span class="title class_">MutationObserver</span>(<span class="function">() =&gt;</span> <span class="title function_">scheduleScan</span>());</span><br><span class="line">                obs.<span class="title function_">observe</span>(comments.<span class="property">shadowRoot</span>, &#123; <span class="attr">childList</span>: <span class="literal">true</span>, <span class="attr">subtree</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">                <span class="title class_">PurifierObservers</span>.<span class="title function_">push</span>(obs);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> obsBody = <span class="keyword">new</span> <span class="title class_">MutationObserver</span>(<span class="function">() =&gt;</span> <span class="title function_">scheduleScan</span>());</span><br><span class="line">        obsBody.<span class="title function_">observe</span>(<span class="variable language_">document</span>.<span class="property">body</span>, &#123; <span class="attr">childList</span>: <span class="literal">true</span>, <span class="attr">subtree</span>: <span class="literal">true</span> &#125;);</span><br><span class="line">        <span class="title class_">PurifierObservers</span>.<span class="title function_">push</span>(obsBody);</span><br><span class="line"></span><br><span class="line">        <span class="title function_">purifierFindRenderers</span>().<span class="title function_">forEach</span>(purifierProcessRenderer);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> hasBlocker = <span class="title function_">purifierHasBlockerInstalled</span>();</span><br><span class="line">        <span class="title class_">Log</span>(<span class="string">&#x27;评论净化器已启动&#x27;</span> + (hasBlocker ? <span class="string">&#x27;（检测到 BilibiliBlocker，兼容模式）&#x27;</span> : <span class="string">&#x27;&#x27;</span>));</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">stopCommentPurifier</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="title class_">PurifierStarted</span> = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> obs <span class="keyword">of</span> <span class="title class_">PurifierObservers</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123; obs.<span class="title function_">disconnect</span>(); &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="title class_">PurifierObservers</span> = [];</span><br><span class="line">        <span class="title class_">Log</span>(<span class="string">&#x27;评论净化器已停止&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">toggleCommentPurifier</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span> = !<span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span>;</span><br><span class="line">        <span class="title class_">SaveConfig</span>(&#123; <span class="title class_">EnableCommentPurifier</span>: <span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span> &#125;);</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">EnableCommentPurifier</span>) &#123;</span><br><span class="line">            <span class="title function_">startCommentPurifier</span>();</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="title function_">stopCommentPurifier</span>();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 元素去除预设 ========================</span></span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span> = [</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;carousel&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;首页轮播图&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [</span><br><span class="line">                <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; main.bili-feed4-layout:nth-child(3) &gt; div.feed2:last-child &gt; div.recommended-container_floor-aside &gt; div.container.is-version8:first-child &gt; div.recommended-swipe.grid-anchor:first-child &gt; div.recommended-swipe-core &gt; div.recommended-swipe-body:last-child &gt; div.carousel-area &gt; div.carousel&#x27;</span>,</span><br><span class="line">                <span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; main.bili-feed4-layout:nth-child(2) &gt; div.feed2:last-child &gt; div.recommended-container_floor-aside &gt; div.container.is-version8:first-child &gt; div.recommended-swipe:first-child&#x27;</span>,</span><br><span class="line">            ]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;right-channel&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;右侧频道导航&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [</span><br><span class="line">                <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__channel:nth-child(3) &gt; div.right-channel-container:last-child&#x27;</span>,</span><br><span class="line">            ]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;channel-icons&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;频道图标行&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [</span><br><span class="line">                <span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__channel:nth-child(3) &gt; div.channel-icons:first-child&#x27;</span>,</span><br><span class="line">            ]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;channel-bar&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;频道栏（整体）&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__channel:last-child&#x27;</span>]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;creation-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;创作中心入口&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap.left-loc-entry:nth-child(8) &gt; div&#x27;</span>]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;upload-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;投稿入口&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap.left-loc-entry:nth-child(9) &gt; div &gt; a.loc-entry.loc-moveclip&#x27;</span>]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;live-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;直播入口&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap:last-child&#x27;</span>]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;dynamic-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;动态入口&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap:nth-child(5)&#x27;</span>]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;vip-entry&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;大会员VIP&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#i_cecream &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.right-entry:last-child &gt; div.vip-wrap:nth-child(2)&#x27;</span>]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;adblock-tips&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;广告提示条&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#i_cecream &gt; div.adblock-tips:nth-child(2)&#x27;</span>]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;left-entries&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;左侧全部入口&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; div.bili-header.large-header:first-child &gt; div.bili-header__bar:first-child &gt; ul.left-entry:first-child&#x27;</span>]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;palette-btn&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;www.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;调色板浮窗&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#app &gt; div.bili-feed4:last-child &gt; div.palette-button-outer.palette-feed4:nth-child(4)&#x27;</span>]</span><br><span class="line">        &#125;,</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">id</span>: <span class="string">&#x27;space-notif&#x27;</span>, <span class="attr">host</span>: <span class="string">&#x27;space.bilibili.com&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;空间-消息通知&#x27;</span>,</span><br><span class="line">            <span class="attr">selectors</span>: [<span class="string">&#x27;#biliMainHeader &gt; div.bili-header &gt; div.bili-header__bar.mini-header:first-child &gt; ul.left-entry:first-child &gt; li.v-popover-wrap:last-child&#x27;</span>]</span><br><span class="line">        &#125;</span><br><span class="line">    ];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">ElementRemovalStates</span> = &#123;&#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">applyElementRemoval</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> enabled = <span class="title class_">Config</span>.<span class="property">RemovedElements</span> || &#123;&#125;;</span><br><span class="line">        <span class="keyword">const</span> host = location.<span class="property">hostname</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> id <span class="keyword">of</span> <span class="title class_">Object</span>.<span class="title function_">keys</span>(<span class="title class_">ElementRemovalStates</span>)) &#123;</span><br><span class="line">            <span class="keyword">if</span> (!enabled[id]) &#123;</span><br><span class="line">                <span class="title class_">ElementRemovalStates</span>[id].<span class="property">element</span>.<span class="property">style</span>.<span class="property">display</span> = <span class="title class_">ElementRemovalStates</span>[id].<span class="property">originalDisplay</span>;</span><br><span class="line">                <span class="keyword">delete</span> <span class="title class_">ElementRemovalStates</span>[id];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> preset <span class="keyword">of</span> <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (preset.<span class="property">host</span> !== host) <span class="keyword">continue</span>;</span><br><span class="line">            <span class="keyword">if</span> (!enabled[preset.<span class="property">id</span>]) <span class="keyword">continue</span>;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">ElementRemovalStates</span>[preset.<span class="property">id</span>]) <span class="keyword">continue</span>;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">const</span> sel <span class="keyword">of</span> preset.<span class="property">selectors</span>) &#123;</span><br><span class="line">                <span class="keyword">try</span> &#123;</span><br><span class="line">                    <span class="keyword">const</span> el = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(sel);</span><br><span class="line">                    <span class="keyword">if</span> (el) &#123;</span><br><span class="line">                        <span class="title class_">ElementRemovalStates</span>[preset.<span class="property">id</span>] = &#123;</span><br><span class="line">                            <span class="attr">element</span>: el,</span><br><span class="line">                            <span class="attr">originalDisplay</span>: el.<span class="property">style</span>.<span class="property">display</span> || <span class="string">&#x27;&#x27;</span></span><br><span class="line">                        &#125;;</span><br><span class="line">                        el.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125; <span class="keyword">catch</span> (_) &#123;&#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 选择器探测 ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">DetectSelector</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">EffectiveSelector</span>) <span class="keyword">return</span> <span class="title class_">EffectiveSelector</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">SpecificCandidates</span> = [</span><br><span class="line">            <span class="string">&#x27;.bili-video-card&#x27;</span>, <span class="string">&#x27;.feed-card&#x27;</span>, <span class="string">&#x27;.bili-feed-card&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;.floor-single-card&#x27;</span>, <span class="string">&#x27;.floor-card&#x27;</span>, <span class="string">&#x27;.video-item&#x27;</span>, <span class="string">&#x27;.feed-item&#x27;</span></span><br><span class="line">        ];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">BroadCandidates</span> = [</span><br><span class="line">            <span class="string">&#x27;[class*=&quot;video-card&quot;]&#x27;</span>, <span class="string">&#x27;[class*=&quot;bili-video&quot;]&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;[class*=&quot;feed-card&quot;]&#x27;</span>, <span class="string">&#x27;[class*=&quot;feed-item&quot;]&#x27;</span>, <span class="string">&#x27;[class*=&quot;floor-card&quot;]&#x27;</span></span><br><span class="line">        ];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">MatchedSelectors</span> = [];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">DataCandidates</span> = [<span class="string">&#x27;[data-video-id]&#x27;</span>, <span class="string">&#x27;[data-aid]&#x27;</span>];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">DataCandidates</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Els</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Sel</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Els</span>.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">El</span> <span class="keyword">of</span> <span class="title class_">Els</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Card</span> = <span class="title class_">El</span>.<span class="title function_">closest</span>(<span class="string">&#x27;.bili-video-card, .feed-card, .bili-feed-card, .video-item, .feed-item, .floor-single-card, .floor-card, [class*=&quot;video-card&quot;], [class*=&quot;feed-card&quot;], [class*=&quot;feed-item&quot;], [class*=&quot;floor-card&quot;]&#x27;</span>);</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">Card</span>) &#123;</span><br><span class="line">                        <span class="keyword">const</span> <span class="title class_">CardSel</span> = (<span class="title class_">Card</span>.<span class="property">tagName</span> === <span class="title class_">El</span>.<span class="property">tagName</span>) ? <span class="title class_">Sel</span> :</span><br><span class="line">                            <span class="title class_">Array</span>.<span class="title function_">from</span>(<span class="title class_">Card</span>.<span class="property">classList</span>).<span class="title function_">map</span>(<span class="function"><span class="params">C</span> =&gt;</span> <span class="string">&#x27;.&#x27;</span> + C).<span class="title function_">join</span>(<span class="string">&#x27;&#x27;</span>);</span><br><span class="line">                        <span class="keyword">if</span> (!<span class="title class_">MatchedSelectors</span>.<span class="title function_">includes</span>(<span class="title class_">CardSel</span>)) &#123;</span><br><span class="line">                            <span class="title class_">MatchedSelectors</span>.<span class="title function_">push</span>(<span class="title class_">CardSel</span>);</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">SpecificCandidates</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Els</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Sel</span>);</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Els</span>.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (!<span class="title class_">MatchedSelectors</span>.<span class="title function_">includes</span>(<span class="title class_">Sel</span>)) &#123;</span><br><span class="line">                        <span class="title class_">MatchedSelectors</span>.<span class="title function_">push</span>(<span class="title class_">Sel</span>);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (E) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">MatchedSelectors</span>.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">            <span class="title class_">EffectiveSelector</span> = <span class="title class_">MatchedSelectors</span>.<span class="title function_">join</span>(<span class="string">&#x27;, &#x27;</span>);</span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogSelectorFound&#x27;</span>), <span class="title class_">EffectiveSelector</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="title class_">EffectiveSelector</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">BroadCandidates</span>) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Els</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Sel</span>);</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Els</span>.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                    <span class="title class_">EffectiveSelector</span> = <span class="title class_">Sel</span>;</span><br><span class="line">                    <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogSelectorFound&#x27;</span>), <span class="title class_">EffectiveSelector</span>);</span><br><span class="line">                    <span class="keyword">return</span> <span class="title class_">EffectiveSelector</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (E) &#123;&#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">LinkSelectors</span> = [<span class="string">&#x27;a[href*=&quot;/video/&quot;]&#x27;</span>, <span class="string">&#x27;a[href*=&quot;/bangumi/&quot;]&#x27;</span>, <span class="string">&#x27;a[href*=&quot;live.bilibili.com&quot;]&#x27;</span>];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">LinkSel</span> <span class="keyword">of</span> <span class="title class_">LinkSelectors</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Links</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">LinkSel</span>);</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Link</span> <span class="keyword">of</span> <span class="title class_">Links</span>) &#123;</span><br><span class="line">                <span class="keyword">let</span> <span class="title class_">Parent</span> = <span class="title class_">Link</span>.<span class="property">parentElement</span>;</span><br><span class="line">                <span class="keyword">let</span> <span class="title class_">Depth</span> = <span class="number">0</span>;</span><br><span class="line">                <span class="keyword">while</span> (<span class="title class_">Parent</span> &amp;&amp; <span class="title class_">Depth</span> &lt; <span class="number">5</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Cls</span> = <span class="title class_">Parent</span>.<span class="property">className</span> || <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;card&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;item&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;feed&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;video&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;floor&#x27;</span>)) &#123;</span><br><span class="line">                        <span class="title class_">EffectiveSelector</span> = <span class="string">&#x27;.&#x27;</span> + <span class="title class_">Cls</span>.<span class="title function_">split</span>(<span class="string">&#x27; &#x27;</span>).<span class="title function_">join</span>(<span class="string">&#x27;.&#x27;</span>);</span><br><span class="line">                        <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogSelectorFallback&#x27;</span>), <span class="title class_">EffectiveSelector</span>);</span><br><span class="line">                        <span class="keyword">return</span> <span class="title class_">EffectiveSelector</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="title class_">Parent</span> = <span class="title class_">Parent</span>.<span class="property">parentElement</span>;</span><br><span class="line">                    <span class="title class_">Depth</span>++;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">DetectContainer</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">VideoListContainer</span>) <span class="keyword">return</span> <span class="title class_">VideoListContainer</span>;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Containers</span> = [</span><br><span class="line">            <span class="string">&#x27;.bili-feed4&#x27;</span>, <span class="string">&#x27;.bili-feed&#x27;</span>, <span class="string">&#x27;.feed2&#x27;</span>, <span class="string">&#x27;.feed-list&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;.video-list&#x27;</span>, <span class="string">&#x27;.bili-video-list&#x27;</span>, <span class="string">&#x27;.recommend-container&#x27;</span>,</span><br><span class="line">            <span class="string">&#x27;.recommended-container_floor-aside&#x27;</span></span><br><span class="line">        ];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">Containers</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">El</span> = <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="title class_">Sel</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">El</span>) &#123;</span><br><span class="line">                <span class="title class_">VideoListContainer</span> = <span class="title class_">El</span>;</span><br><span class="line">                <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogContainerFound&#x27;</span>), <span class="title class_">Sel</span>);</span><br><span class="line">                <span class="keyword">return</span> <span class="title class_">El</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="title class_">VideoListContainer</span> = <span class="variable language_">document</span>.<span class="property">body</span>;</span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">VideoListContainer</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 卡片显示/隐藏 ========================</span></span><br><span class="line">    <span class="keyword">const</span> <span class="variable constant_">WRAPPER_CLASSES</span> = [<span class="string">&#x27;bili-feed-card&#x27;</span>, <span class="string">&#x27;feed-card&#x27;</span>];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ApplyHideStyles</span>(<span class="params">El</span>) &#123;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">classList</span>.<span class="title function_">add</span>(<span class="string">&#x27;BiliLimitedHide&#x27;</span>);</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;none&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">visibility</span> = <span class="string">&#x27;hidden&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">height</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">margin</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">padding</span> = <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">overflow</span> = <span class="string">&#x27;hidden&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">flex</span> = <span class="string">&#x27;0 0 0&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">position</span> = <span class="string">&#x27;absolute&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ClearHideStyles</span>(<span class="params">El</span>) &#123;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">classList</span>.<span class="title function_">remove</span>(<span class="string">&#x27;BiliLimitedHide&#x27;</span>);</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">visibility</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">opacity</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">height</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">margin</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">padding</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">overflow</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">position</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">        <span class="title class_">El</span>.<span class="property">style</span>.<span class="property">flex</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">HideCardTree</span>(<span class="params">Card</span>) &#123;</span><br><span class="line">        <span class="title class_">ApplyHideStyles</span>(<span class="title class_">Card</span>);</span><br><span class="line">        <span class="keyword">let</span> <span class="title class_">Ancestor</span> = <span class="title class_">Card</span>.<span class="property">parentElement</span>;</span><br><span class="line">        <span class="keyword">while</span> (<span class="title class_">Ancestor</span> &amp;&amp; <span class="title class_">Ancestor</span> !== <span class="variable language_">document</span>.<span class="property">body</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Cls</span> = (<span class="title class_">Ancestor</span>.<span class="property">className</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">IsWrapper</span> = <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">let</span> W = <span class="number">0</span>; W &lt; <span class="variable constant_">WRAPPER_CLASSES</span>.<span class="property">length</span>; W++) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Cls</span>.<span class="title function_">indexOf</span>(<span class="variable constant_">WRAPPER_CLASSES</span>[W]) !== -<span class="number">1</span>) &#123;</span><br><span class="line">                    <span class="title class_">IsWrapper</span> = <span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">IsWrapper</span>) &#123;</span><br><span class="line">                <span class="title class_">ApplyHideStyles</span>(<span class="title class_">Ancestor</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="title class_">Ancestor</span> = <span class="title class_">Ancestor</span>.<span class="property">parentElement</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">ShowCardTree</span>(<span class="params">Card</span>) &#123;</span><br><span class="line">        <span class="title class_">ClearHideStyles</span>(<span class="title class_">Card</span>);</span><br><span class="line">        <span class="keyword">let</span> <span class="title class_">Ancestor</span> = <span class="title class_">Card</span>.<span class="property">parentElement</span>;</span><br><span class="line">        <span class="keyword">while</span> (<span class="title class_">Ancestor</span> &amp;&amp; <span class="title class_">Ancestor</span> !== <span class="variable language_">document</span>.<span class="property">body</span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Cls</span> = (<span class="title class_">Ancestor</span>.<span class="property">className</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">IsWrapper</span> = <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">let</span> W = <span class="number">0</span>; W &lt; <span class="variable constant_">WRAPPER_CLASSES</span>.<span class="property">length</span>; W++) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Cls</span>.<span class="title function_">indexOf</span>(<span class="variable constant_">WRAPPER_CLASSES</span>[W]) !== -<span class="number">1</span>) &#123;</span><br><span class="line">                    <span class="title class_">IsWrapper</span> = <span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">IsWrapper</span>) &#123;</span><br><span class="line">                <span class="title class_">ClearHideStyles</span>(<span class="title class_">Ancestor</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="title class_">Ancestor</span> = <span class="title class_">Ancestor</span>.<span class="property">parentElement</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 核心过滤逻辑 ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">LimitVideos</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="title class_">IsActive</span>) &#123;</span><br><span class="line">            <span class="title class_">RestoreAllVideos</span>();</span><br><span class="line">            <span class="keyword">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Selector</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">            <span class="keyword">if</span> (!<span class="title class_">Selector</span>) &#123;</span><br><span class="line">                <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogNoCards&#x27;</span>));</span><br><span class="line">                <span class="keyword">return</span>;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">Cards</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Selector</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Cards</span>.<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">LinkSelectors</span> = [<span class="string">&#x27;a[href*=&quot;/video/&quot;]&#x27;</span>, <span class="string">&#x27;a[href*=&quot;/bangumi/&quot;]&#x27;</span>, <span class="string">&#x27;a[href*=&quot;live.bilibili.com&quot;]&#x27;</span>];</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">ParentCards</span> = <span class="keyword">new</span> <span class="title class_">Set</span>();</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">LinkSel</span> <span class="keyword">of</span> <span class="title class_">LinkSelectors</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Links</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">LinkSel</span>);</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Link</span> <span class="keyword">of</span> <span class="title class_">Links</span>) &#123;</span><br><span class="line">                        <span class="keyword">let</span> <span class="title class_">Parent</span> = <span class="title class_">Link</span>.<span class="property">parentElement</span>;</span><br><span class="line">                        <span class="keyword">let</span> <span class="title class_">Depth</span> = <span class="number">0</span>;</span><br><span class="line">                        <span class="keyword">while</span> (<span class="title class_">Parent</span> &amp;&amp; <span class="title class_">Depth</span> &lt; <span class="number">5</span>) &#123;</span><br><span class="line">                            <span class="keyword">if</span> (<span class="title class_">Parent</span>.<span class="property">className</span> &amp;&amp; (<span class="title class_">Parent</span>.<span class="property">className</span>.<span class="title function_">includes</span>(<span class="string">&#x27;card&#x27;</span>) || <span class="title class_">Parent</span>.<span class="property">className</span>.<span class="title function_">includes</span>(<span class="string">&#x27;item&#x27;</span>) || <span class="title class_">Parent</span>.<span class="property">className</span>.<span class="title function_">includes</span>(<span class="string">&#x27;feed&#x27;</span>) || <span class="title class_">Parent</span>.<span class="property">className</span>.<span class="title function_">includes</span>(<span class="string">&#x27;floor&#x27;</span>))) &#123;</span><br><span class="line">                                <span class="title class_">ParentCards</span>.<span class="title function_">add</span>(<span class="title class_">Parent</span>);</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                            &#125;</span><br><span class="line">                            <span class="title class_">Parent</span> = <span class="title class_">Parent</span>.<span class="property">parentElement</span>;</span><br><span class="line">                            <span class="title class_">Depth</span>++;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="title class_">Cards</span> = <span class="title class_">Array</span>.<span class="title function_">from</span>(<span class="title class_">ParentCards</span>);</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Cards</span>.<span class="property">length</span> === <span class="number">0</span>) &#123;</span><br><span class="line">                    <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogStillNoCards&#x27;</span>));</span><br><span class="line">                    <span class="keyword">return</span>;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">VideoCards</span> = <span class="title class_">Array</span>.<span class="title function_">from</span>(<span class="title class_">Cards</span>);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">NestedRemoval</span> = <span class="keyword">new</span> <span class="title class_">Set</span>();</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">let</span> I = <span class="number">0</span>; I &lt; <span class="title class_">VideoCards</span>.<span class="property">length</span>; I++) &#123;</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">let</span> J = <span class="number">0</span>; J &lt; <span class="title class_">VideoCards</span>.<span class="property">length</span>; J++) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (I !== J &amp;&amp; <span class="title class_">VideoCards</span>[I].<span class="title function_">contains</span>(<span class="title class_">VideoCards</span>[J])) &#123;</span><br><span class="line">                        <span class="title class_">NestedRemoval</span>.<span class="title function_">add</span>(I);</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">NestedRemoval</span>.<span class="property">size</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="title class_">VideoCards</span> = <span class="title class_">VideoCards</span>.<span class="title function_">filter</span>(<span class="function">(<span class="params">_, Idx</span>) =&gt;</span> !<span class="title class_">NestedRemoval</span>.<span class="title function_">has</span>(<span class="title class_">Idx</span>));</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">function</span> <span class="title function_">CardLinksTo</span>(<span class="params">Card, Pattern</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Links</span> = <span class="title class_">Card</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;a[href]&#x27;</span>);</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Link</span> <span class="keyword">of</span> <span class="title class_">Links</span>) &#123;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">Link</span>.<span class="property">href</span>.<span class="title function_">indexOf</span>(<span class="title class_">Pattern</span>) !== -<span class="number">1</span>) <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">ExcludedCards</span> = [];</span><br><span class="line">            <span class="title class_">VideoCards</span> = <span class="title class_">VideoCards</span>.<span class="title function_">filter</span>(<span class="function"><span class="params">Card</span> =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Text</span> = (<span class="title class_">Card</span>.<span class="property">textContent</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Cls</span> = (<span class="title class_">Card</span>.<span class="property">className</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">FloorTitle</span> = <span class="title class_">Card</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;.floor-title&#x27;</span>);</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">FloorTitleText</span> = <span class="title class_">FloorTitle</span> ? (<span class="title class_">FloorTitle</span>.<span class="property">textContent</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>() : <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">let</span> <span class="title class_">ShouldExclude</span> = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">ExcludeLive</span> &amp;&amp; (</span><br><span class="line">                    <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;live&#x27;</span>) ||</span><br><span class="line">                    <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;直播&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;正在直播&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;直播中&#x27;</span>) ||</span><br><span class="line">                    <span class="title class_">FloorTitleText</span>.<span class="title function_">includes</span>(<span class="string">&#x27;直播&#x27;</span>) || <span class="title class_">FloorTitleText</span>.<span class="title function_">includes</span>(<span class="string">&#x27;赛事&#x27;</span>) ||</span><br><span class="line">                    <span class="title class_">CardLinksTo</span>(<span class="title class_">Card</span>, <span class="string">&#x27;live.bilibili.com&#x27;</span>)</span><br><span class="line">                )) &#123;</span><br><span class="line">                    <span class="title class_">ShouldExclude</span> = <span class="literal">true</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span> (!<span class="title class_">ShouldExclude</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">ExcludeAd</span> &amp;&amp; (<span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;ad&#x27;</span>) || <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;advert&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;广告&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;sponsor&#x27;</span>))) &#123;</span><br><span class="line">                    <span class="title class_">ShouldExclude</span> = <span class="literal">true</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span> (!<span class="title class_">ShouldExclude</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">ExcludeBangumi</span> &amp;&amp; (</span><br><span class="line">                    <span class="title class_">Cls</span>.<span class="title function_">includes</span>(<span class="string">&#x27;bangumi&#x27;</span>) ||</span><br><span class="line">                    <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;番剧&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;追番&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;国创&#x27;</span>) ||</span><br><span class="line">                    <span class="title class_">FloorTitleText</span>.<span class="title function_">includes</span>(<span class="string">&#x27;番剧&#x27;</span>) || <span class="title class_">FloorTitleText</span>.<span class="title function_">includes</span>(<span class="string">&#x27;国创&#x27;</span>) ||</span><br><span class="line">                    <span class="title class_">CardLinksTo</span>(<span class="title class_">Card</span>, <span class="string">&#x27;/bangumi/&#x27;</span>)</span><br><span class="line">                )) &#123;</span><br><span class="line">                    <span class="title class_">ShouldExclude</span> = <span class="literal">true</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span> (!<span class="title class_">ShouldExclude</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">ExcludePaid</span> &amp;&amp; (<span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;付费&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;课程&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;￥&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;¥&#x27;</span>))) &#123;</span><br><span class="line">                    <span class="title class_">ShouldExclude</span> = <span class="literal">true</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">ShouldExclude</span>) &#123;</span><br><span class="line">                    <span class="title class_">ExcludedCards</span>.<span class="title function_">push</span>(<span class="title class_">Card</span>);</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">            &#125;);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">KeepSpecialUPIDs</span> &amp;&amp; <span class="title class_">Config</span>.<span class="property">KeepSpecialUPIDs</span>.<span class="property">length</span> &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">KeepSet</span> = <span class="keyword">new</span> <span class="title class_">Set</span>(<span class="title class_">Config</span>.<span class="property">KeepSpecialUPIDs</span>.<span class="title function_">map</span>(<span class="function"><span class="params">Id</span> =&gt;</span> <span class="title class_">String</span>(<span class="title class_">Id</span>)));</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Kept</span> = [];</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Rest</span> = [];</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Card</span> <span class="keyword">of</span> <span class="title class_">VideoCards</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">UpLink</span> = <span class="title class_">Card</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;a[href*=&quot;/space/&quot;]&#x27;</span>);</span><br><span class="line">                    <span class="keyword">let</span> <span class="title class_">Upid</span> = <span class="literal">null</span>;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">UpLink</span>) &#123;</span><br><span class="line">                        <span class="keyword">const</span> <span class="title class_">Match</span> = <span class="title class_">UpLink</span>.<span class="property">href</span>.<span class="title function_">match</span>(<span class="regexp">/\/space\/(\d+)/</span>);</span><br><span class="line">                        <span class="keyword">if</span> (<span class="title class_">Match</span>) <span class="title class_">Upid</span> = <span class="title class_">Match</span>[<span class="number">1</span>];</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">Upid</span> &amp;&amp; <span class="title class_">KeepSet</span>.<span class="title function_">has</span>(<span class="title class_">Upid</span>)) &#123;</span><br><span class="line">                        <span class="title class_">Kept</span>.<span class="title function_">push</span>(<span class="title class_">Card</span>);</span><br><span class="line">                    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                        <span class="title class_">Rest</span>.<span class="title function_">push</span>(<span class="title class_">Card</span>);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="title class_">VideoCards</span> = <span class="title class_">Kept</span>.<span class="title function_">concat</span>(<span class="title class_">Rest</span>);</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">PromotedCards</span> = [];</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Config</span>.<span class="property">KeepPromoted</span>) &#123;</span><br><span class="line">                <span class="title class_">PromotedCards</span> = <span class="title class_">VideoCards</span>.<span class="title function_">filter</span>(<span class="function"><span class="params">Card</span> =&gt;</span> &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Text</span> = (<span class="title class_">Card</span>.<span class="property">textContent</span> || <span class="string">&#x27;&#x27;</span>).<span class="title function_">toLowerCase</span>();</span><br><span class="line">                    <span class="keyword">return</span> <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;推广&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;广告&#x27;</span>) || <span class="title class_">Text</span>.<span class="title function_">includes</span>(<span class="string">&#x27;sponsor&#x27;</span>);</span><br><span class="line">                &#125;);</span><br><span class="line">                <span class="title class_">VideoCards</span> = <span class="title class_">VideoCards</span>.<span class="title function_">filter</span>(<span class="function"><span class="params">Card</span> =&gt;</span> !<span class="title class_">PromotedCards</span>.<span class="title function_">includes</span>(<span class="title class_">Card</span>));</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">TopSelectors</span> = [<span class="string">&#x27;.bili-feed__banner&#x27;</span>, <span class="string">&#x27;.bili-feed__top&#x27;</span>, <span class="string">&#x27;.top-banner&#x27;</span>, <span class="string">&#x27;.recommend-banner&#x27;</span>];</span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">TopCards</span> = [];</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Sel</span> <span class="keyword">of</span> <span class="title class_">TopSelectors</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Tops</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Sel</span>);</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Top</span> <span class="keyword">of</span> <span class="title class_">Tops</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">InnerCards</span> = <span class="title class_">Top</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Selector</span>);</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Card</span> <span class="keyword">of</span> <span class="title class_">InnerCards</span>) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="title class_">VideoCards</span>.<span class="title function_">includes</span>(<span class="title class_">Card</span>)) &#123;</span><br><span class="line">                            <span class="title class_">TopCards</span>.<span class="title function_">push</span>(<span class="title class_">Card</span>);</span><br><span class="line">                            <span class="keyword">const</span> <span class="title class_">Idx</span> = <span class="title class_">VideoCards</span>.<span class="title function_">indexOf</span>(<span class="title class_">Card</span>);</span><br><span class="line">                            <span class="keyword">if</span> (<span class="title class_">Idx</span> !== -<span class="number">1</span>) <span class="title class_">VideoCards</span>.<span class="title function_">splice</span>(<span class="title class_">Idx</span>, <span class="number">1</span>);</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Max</span> = <span class="title class_">Math</span>.<span class="title function_">max</span>(<span class="number">1</span>, <span class="title class_">Number</span>(<span class="title class_">Config</span>.<span class="property">MaxVideos</span>) || <span class="number">10</span>);</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">ToShow</span> = <span class="title class_">VideoCards</span>.<span class="title function_">slice</span>(<span class="number">0</span>, <span class="title class_">Max</span>);</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">ToHide</span> = <span class="title class_">VideoCards</span>.<span class="title function_">slice</span>(<span class="title class_">Max</span>);</span><br><span class="line"></span><br><span class="line">            <span class="title class_">ToShow</span>.<span class="title function_">forEach</span>(<span class="function"><span class="params">Card</span> =&gt;</span> &#123; <span class="title class_">ShowCardTree</span>(<span class="title class_">Card</span>); &#125;);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">AllToHide</span> = <span class="title class_">ToHide</span>.<span class="title function_">concat</span>(<span class="title class_">ExcludedCards</span>);</span><br><span class="line">            <span class="title class_">AllToHide</span>.<span class="title function_">forEach</span>(<span class="function"><span class="params">Card</span> =&gt;</span> &#123; <span class="title class_">HideCardTree</span>(<span class="title class_">Card</span>); &#125;);</span><br><span class="line"></span><br><span class="line">            [...<span class="title class_">PromotedCards</span>, ...<span class="title class_">TopCards</span>].<span class="title function_">forEach</span>(<span class="function"><span class="params">Card</span> =&gt;</span> &#123; <span class="title class_">ShowCardTree</span>(<span class="title class_">Card</span>); &#125;);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Total</span> = <span class="title class_">VideoCards</span>.<span class="property">length</span> + <span class="title class_">ExcludedCards</span>.<span class="property">length</span> + <span class="title class_">PromotedCards</span>.<span class="property">length</span> + <span class="title class_">TopCards</span>.<span class="property">length</span>;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Shown</span> = <span class="title class_">ToShow</span>.<span class="property">length</span> + <span class="title class_">PromotedCards</span>.<span class="property">length</span> + <span class="title class_">TopCards</span>.<span class="property">length</span>;</span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogProcessed&#x27;</span>, <span class="title class_">Total</span>, <span class="title class_">Shown</span>, <span class="title class_">ToHide</span>.<span class="property">length</span> + <span class="title class_">ExcludedCards</span>.<span class="property">length</span>));</span><br><span class="line"></span><br><span class="line">        &#125; <span class="keyword">catch</span> (E) &#123;</span><br><span class="line">            <span class="title class_">ErrorLog</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogErrorLimit&#x27;</span>), E);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">RestoreAllVideos</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Selector</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">        <span class="keyword">if</span> (!<span class="title class_">Selector</span>) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Cards</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Selector</span>);</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Card</span> <span class="keyword">of</span> <span class="title class_">Cards</span>) &#123;</span><br><span class="line">            <span class="title class_">ShowCardTree</span>(<span class="title class_">Card</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== CSS ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">InjectStyles</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="title function_">GM_addStyle</span>(<span class="string">`</span></span><br><span class="line"><span class="string">            .BiliLimitedHide &#123;</span></span><br><span class="line"><span class="string">                display: none !important;</span></span><br><span class="line"><span class="string">                visibility: hidden !important;</span></span><br><span class="line"><span class="string">                opacity: 0 !important;</span></span><br><span class="line"><span class="string">                height: 0 !important;</span></span><br><span class="line"><span class="string">                margin: 0 !important;</span></span><br><span class="line"><span class="string">                padding: 0 !important;</span></span><br><span class="line"><span class="string">                overflow: hidden !important;</span></span><br><span class="line"><span class="string">                flex: 0 0 0 !important;</span></span><br><span class="line"><span class="string">                position: absolute !important;</span></span><br><span class="line"><span class="string">                pointer-events: none !important;</span></span><br><span class="line"><span class="string">            &#125;</span></span><br><span class="line"><span class="string">        `</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 配置面板 ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">InjectPanelStyles</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;BiliCompactPanelStyles&#x27;</span>)) <span class="keyword">return</span>;</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">StyleEl</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;style&#x27;</span>);</span><br><span class="line">        <span class="title class_">StyleEl</span>.<span class="property">id</span> = <span class="string">&#x27;BiliCompactPanelStyles&#x27;</span>;</span><br><span class="line">        <span class="title class_">StyleEl</span>.<span class="property">textContent</span> = <span class="string">`</span></span><br><span class="line"><span class="string">            .BiliCompactOverlay &#123;</span></span><br><span class="line"><span class="string">                position: fixed; top: 0; left: 0; width: 100%; height: 100%;</span></span><br><span class="line"><span class="string">                background: rgba(0,0,0,0.4); z-index: 2147483646;</span></span><br><span class="line"><span class="string">                display: flex; align-items: center; justify-content: center;</span></span><br><span class="line"><span class="string">                font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, &quot;Helvetica Neue&quot;, Arial, sans-serif;</span></span><br><span class="line"><span class="string">                font-size: 14px;</span></span><br><span class="line"><span class="string">            &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel &#123;</span></span><br><span class="line"><span class="string">                background: #1e1e1e; color: #eee; padding: 24px 30px; border-radius: 16px;</span></span><br><span class="line"><span class="string">                box-shadow: 0 8px 40px rgba(0,0,0,0.6); min-width: 340px; max-width: 420px;</span></span><br><span class="line"><span class="string">                border: 1px solid #333; backdrop-filter: blur(8px);</span></span><br><span class="line"><span class="string">                display: flex; flex-direction: column; gap: 12px; position: relative;</span></span><br><span class="line"><span class="string">                max-height: 85vh; overflow-y: auto;</span></span><br><span class="line"><span class="string">            &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel h3 &#123; margin: 0 0 4px 0; font-weight: 500; color: #fff; font-size: 16px; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel label &#123; display: flex; justify-content: space-between; align-items: center; font-size: 14px; color: #ccc; gap: 8px; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel input[type=&quot;number&quot;],</span></span><br><span class="line"><span class="string">            .BiliCompactPanel input[type=&quot;text&quot;] &#123; background: #2a2a2a; border: 1px solid #444; color: #fff; padding: 4px 10px; border-radius: 6px; width: 80px; font-size: 14px; font-family: inherit; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel input[type=&quot;text&quot;] &#123; width: 140px; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel select &#123; background: #2a2a2a; border: 1px solid #444; color: #fff; padding: 4px 8px; border-radius: 6px; font-size: 14px; font-family: inherit; cursor: pointer; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel input[type=&quot;checkbox&quot;] &#123; accent-color: #fb7299; width: 18px; height: 18px; cursor: pointer; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .BtnRow &#123; display: flex; gap: 10px; justify-content: flex-end; margin-top: 6px; flex-wrap: wrap; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel button &#123; background: #fb7299; border: none; color: #fff; padding: 6px 18px; border-radius: 20px; cursor: pointer; font-size: 14px; font-family: inherit; transition: background 0.2s; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel button.Secondary &#123; background: #444; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel button:hover &#123; background: #ff85a8; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel button.Secondary:hover &#123; background: #555; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .Hint &#123; font-size: 12px; color: #888; margin-top: -4px; line-height: 1.4; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .StatusRow &#123; display: flex; align-items: center; justify-content: space-between; font-size: 14px; color: #ccc; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .StatusBadge &#123; background: #fb7299; color: #fff; border-radius: 12px; padding: 2px 12px; font-size: 12px; font-weight: bold; &#125;</span></span><br><span class="line"><span class="string">            .BiliCompactPanel .StatusBadge.Off &#123; background: #666; &#125;</span></span><br><span class="line"><span class="string">        `</span>;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">head</span>.<span class="title function_">appendChild</span>(<span class="title class_">StyleEl</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">let</span> <span class="title class_">PanelDestroyFn</span> = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">OpenConfigPanel</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">PanelDestroyFn</span>) &#123; <span class="title class_">PanelDestroyFn</span>(); <span class="title class_">PanelDestroyFn</span> = <span class="literal">null</span>; &#125;</span><br><span class="line"></span><br><span class="line">        <span class="title class_">InjectPanelStyles</span>();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Overlay</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;div&#x27;</span>);</span><br><span class="line">        <span class="title class_">Overlay</span>.<span class="property">className</span> = <span class="string">&#x27;BiliCompactOverlay&#x27;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Panel</span> = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;div&#x27;</span>);</span><br><span class="line">        <span class="title class_">Panel</span>.<span class="property">className</span> = <span class="string">&#x27;BiliCompactPanel&#x27;</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">LangOptions</span> = [</span><br><span class="line">            &#123; <span class="title class_">Value</span>: <span class="string">&#x27;auto&#x27;</span>,  <span class="title class_">Label</span>: <span class="title function_">T</span>(<span class="string">&#x27;PanelLanguageAuto&#x27;</span>) &#125;,</span><br><span class="line">            &#123; <span class="title class_">Value</span>: <span class="string">&#x27;zh_CN&#x27;</span>, <span class="title class_">Label</span>: <span class="string">&#x27;简体中文&#x27;</span> &#125;,</span><br><span class="line">            &#123; <span class="title class_">Value</span>: <span class="string">&#x27;zh_TW&#x27;</span>, <span class="title class_">Label</span>: <span class="string">&#x27;繁體中文&#x27;</span> &#125;,</span><br><span class="line">            &#123; <span class="title class_">Value</span>: <span class="string">&#x27;en_US&#x27;</span>, <span class="title class_">Label</span>: <span class="string">&#x27;English&#x27;</span> &#125;,</span><br><span class="line">        ];</span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">LangSelectHTML</span> = <span class="title class_">LangOptions</span>.<span class="title function_">map</span>(<span class="function"><span class="params">Opt</span> =&gt;</span></span><br><span class="line">            <span class="string">`&lt;option value=&quot;<span class="subst">$&#123;Opt.Value&#125;</span>&quot; <span class="subst">$&#123;Config.Language === Opt.Value ? <span class="string">&#x27;selected&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;<span class="subst">$&#123;Opt.Label&#125;</span>&lt;/option&gt;`</span></span><br><span class="line">        ).<span class="title function_">join</span>(<span class="string">&#x27;&#x27;</span>);</span><br><span class="line"></span><br><span class="line">        <span class="title class_">Panel</span>.<span class="property">innerHTML</span> = <span class="string">`</span></span><br><span class="line"><span class="string">            &lt;h3&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelTitle&#x27;</span>)&#125;</span>&lt;/h3&gt;</span></span><br><span class="line"><span class="string">            &lt;div class=&quot;StatusRow&quot;&gt;</span></span><br><span class="line"><span class="string">                &lt;span&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelStatusLabel&#x27;</span>)&#125;</span>&lt;/span&gt;</span></span><br><span class="line"><span class="string">                &lt;span class=&quot;StatusBadge <span class="subst">$&#123;IsActive ? <span class="string">&#x27;&#x27;</span> : <span class="string">&#x27;Off&#x27;</span>&#125;</span>&quot; id=&quot;CfgStatusBadge&quot;&gt;<span class="subst">$&#123;IsActive ? T(<span class="string">&#x27;PanelStatusActive&#x27;</span>) : T(<span class="string">&#x27;PanelStatusPaused&#x27;</span>)&#125;</span>&lt;/span&gt;</span></span><br><span class="line"><span class="string">            &lt;/div&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelMaxVideos&#x27;</span>)&#125;</span> &lt;input type=&quot;number&quot; id=&quot;CfgMax&quot; value=&quot;<span class="subst">$&#123;Config.MaxVideos&#125;</span>&quot; min=&quot;1&quot; max=&quot;100&quot;&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelExcludeLive&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgExcludeLive&quot; <span class="subst">$&#123;Config.ExcludeLive ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelExcludeAd&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgExcludeAd&quot; <span class="subst">$&#123;Config.ExcludeAd ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelExcludeBangumi&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgExcludeBangumi&quot; <span class="subst">$&#123;Config.ExcludeBangumi ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelExcludePaid&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgExcludePaid&quot; <span class="subst">$&#123;Config.ExcludePaid ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelKeepPromoted&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgKeepPromoted&quot; <span class="subst">$&#123;Config.KeepPromoted ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelDebug&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgDebug&quot; <span class="subst">$&#123;Config.Debug ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelEnableCommentPurifier&#x27;</span>)&#125;</span> &lt;input type=&quot;checkbox&quot; id=&quot;CfgEnablePurifier&quot; <span class="subst">$&#123;Config.EnableCommentPurifier ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelLanguage&#x27;</span>)&#125;</span> &lt;select id=&quot;CfgLanguage&quot;&gt;<span class="subst">$&#123;LangSelectHTML&#125;</span>&lt;/select&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;label&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelKeepUpids&#x27;</span>)&#125;</span> &lt;input type=&quot;text&quot; id=&quot;CfgKeepUids&quot; value=&quot;<span class="subst">$&#123;(Config.KeepSpecialUPIDs || []).join(<span class="string">&#x27;,&#x27;</span>)&#125;</span>&quot;&gt;&lt;/label&gt;</span></span><br><span class="line"><span class="string">            &lt;hr style=&quot;margin:8px 0;border:none;border-top:1px solid #333&quot;&gt;</span></span><br><span class="line"><span class="string">            &lt;h4 style=&quot;margin:4px 0 8px;font-size:13px;color:#fb7299&quot;&gt;去除元素&lt;/h4&gt;</span></span><br><span class="line"><span class="string">            <span class="subst">$&#123;ELEMENT_REMOVAL_PRESETS.map(<span class="keyword">function</span>(P) &#123;</span></span></span><br><span class="line"><span class="subst"><span class="string">                <span class="keyword">return</span> <span class="string">&#x27;&lt;label&gt;&lt;span style=&quot;flex:1&quot;&gt;&#x27;</span> + P.name + <span class="string">&#x27;&lt;/span&gt; &lt;input type=&quot;checkbox&quot; id=&quot;CfgRm_&#x27;</span> + P.id + <span class="string">&#x27;&quot; &#x27;</span> + ((Config.RemovedElements || &#123;&#125;)[P.id] ? <span class="string">&#x27;checked&#x27;</span> : <span class="string">&#x27;&#x27;</span>) + <span class="string">&#x27;&gt;&lt;/label&gt;&#x27;</span>;</span></span></span><br><span class="line"><span class="subst"><span class="string">            &#125;).join(<span class="string">&#x27;&#x27;</span>)&#125;</span></span></span><br><span class="line"><span class="string">            &lt;div class=&quot;BtnRow&quot;&gt;</span></span><br><span class="line"><span class="string">                &lt;button class=&quot;Secondary&quot; id=&quot;CfgToggle&quot;&gt;<span class="subst">$&#123;IsActive ? T(<span class="string">&#x27;PanelBtnPause&#x27;</span>) : T(<span class="string">&#x27;PanelBtnResume&#x27;</span>)&#125;</span>&lt;/button&gt;</span></span><br><span class="line"><span class="string">                &lt;button class=&quot;Secondary&quot; id=&quot;CfgReset&quot;&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelBtnReset&#x27;</span>)&#125;</span>&lt;/button&gt;</span></span><br><span class="line"><span class="string">                &lt;button id=&quot;CfgSave&quot;&gt;<span class="subst">$&#123;T(<span class="string">&#x27;PanelBtnSave&#x27;</span>)&#125;</span>&lt;/button&gt;</span></span><br><span class="line"><span class="string">            &lt;/div&gt;</span></span><br><span class="line"><span class="string">        `</span>;</span><br><span class="line"></span><br><span class="line">        <span class="title class_">Overlay</span>.<span class="title function_">appendChild</span>(<span class="title class_">Panel</span>);</span><br><span class="line">        <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>(<span class="title class_">Overlay</span>);</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgSave&#x27;</span>).<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Max</span> = <span class="built_in">parseInt</span>(<span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgMax&#x27;</span>).<span class="property">value</span>) || <span class="number">10</span>;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">NewLang</span> = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgLanguage&#x27;</span>).<span class="property">value</span>;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">LangChanged</span> = <span class="title class_">NewLang</span> !== <span class="title class_">Config</span>.<span class="property">Language</span>;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">NewConfig</span> = &#123;</span><br><span class="line">                <span class="title class_">MaxVideos</span>: <span class="title class_">Max</span>,</span><br><span class="line">                <span class="title class_">ExcludeLive</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeLive&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">ExcludeAd</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeAd&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">ExcludeBangumi</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeBangumi&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">ExcludePaid</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludePaid&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">KeepPromoted</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgKeepPromoted&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">Language</span>: <span class="title class_">NewLang</span>,</span><br><span class="line">                <span class="title class_">KeepSpecialUPIDs</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgKeepUids&#x27;</span>).<span class="property">value</span>.<span class="title function_">split</span>(<span class="string">&#x27;,&#x27;</span>).<span class="title function_">map</span>(<span class="function"><span class="params">S</span> =&gt;</span> S.<span class="title function_">trim</span>()).<span class="title function_">filter</span>(<span class="title class_">Boolean</span>).<span class="title function_">map</span>(<span class="title class_">Number</span>),</span><br><span class="line">                <span class="title class_">Debug</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgDebug&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">EnableCommentPurifier</span>: <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgEnablePurifier&#x27;</span>).<span class="property">checked</span>,</span><br><span class="line">                <span class="title class_">RemovedElements</span>: (<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">                    <span class="keyword">var</span> obj = &#123;&#125;;</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">var</span> I = <span class="number">0</span>; I &lt; <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>.<span class="property">length</span>; I++) &#123;</span><br><span class="line">                        <span class="keyword">var</span> cb = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgRm_&#x27;</span> + <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>[I].<span class="property">id</span>);</span><br><span class="line">                        <span class="keyword">if</span> (cb) obj[<span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>[I].<span class="property">id</span>] = cb.<span class="property">checked</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">return</span> obj;</span><br><span class="line">                &#125;)()</span><br><span class="line">            &#125;;</span><br><span class="line">            <span class="title class_">Object</span>.<span class="title function_">assign</span>(<span class="title class_">Config</span>, <span class="title class_">NewConfig</span>);</span><br><span class="line">            <span class="title class_">SaveConfig</span>(<span class="title class_">Config</span>);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">LangChanged</span>) &#123; <span class="title class_">CurrentLang</span> = <span class="title class_">ResolveLanguage</span>(); &#125;</span><br><span class="line"></span><br><span class="line">            <span class="title class_">DestroyPanel</span>();</span><br><span class="line">            <span class="title class_">LimitVideos</span>();</span><br><span class="line">            <span class="title function_">applyElementRemoval</span>();</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">NewConfig</span>.<span class="property">EnableCommentPurifier</span>) &#123; <span class="title function_">startCommentPurifier</span>(); &#125;</span><br><span class="line">            <span class="keyword">else</span> &#123; <span class="title function_">stopCommentPurifier</span>(); &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">LangChanged</span>) &#123; <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> <span class="title class_">OpenConfigPanel</span>(), <span class="number">100</span>); &#125;</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgReset&#x27;</span>).<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="title class_">Object</span>.<span class="title function_">assign</span>(<span class="title class_">Config</span>, <span class="variable constant_">DEFAULTS</span>);</span><br><span class="line">            <span class="title class_">SaveConfig</span>(<span class="title class_">Config</span>);</span><br><span class="line">            <span class="title class_">CurrentLang</span> = <span class="title class_">ResolveLanguage</span>();</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgMax&#x27;</span>).<span class="property">value</span> = <span class="title class_">Config</span>.<span class="property">MaxVideos</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeLive&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">ExcludeLive</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeAd&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">ExcludeAd</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludeBangumi&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">ExcludeBangumi</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgExcludePaid&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">ExcludePaid</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgKeepPromoted&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">KeepPromoted</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgDebug&#x27;</span>).<span class="property">checked</span> = <span class="title class_">Config</span>.<span class="property">Debug</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&quot;CfgEnablePurifier&quot;</span>).<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgKeepUids&#x27;</span>).<span class="property">value</span> = <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">var</span> I = <span class="number">0</span>; I &lt; <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>.<span class="property">length</span>; I++) &#123;</span><br><span class="line">                <span class="keyword">var</span> cb = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgRm_&#x27;</span> + <span class="variable constant_">ELEMENT_REMOVAL_PRESETS</span>[I].<span class="property">id</span>);</span><br><span class="line">                <span class="keyword">if</span> (cb) cb.<span class="property">checked</span> = <span class="literal">false</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="title function_">stopCommentPurifier</span>();</span><br><span class="line">            <span class="title class_">LimitVideos</span>();</span><br><span class="line">            <span class="title function_">applyElementRemoval</span>();</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgToggle&#x27;</span>).<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="title class_">IsActive</span> = !<span class="title class_">IsActive</span>;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">IsActive</span>) &#123; <span class="title class_">LimitVideos</span>(); &#125;</span><br><span class="line">            <span class="keyword">else</span> &#123; <span class="title class_">RestoreAllVideos</span>(); &#125;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Badge</span> = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;CfgStatusBadge&#x27;</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Badge</span>) &#123;</span><br><span class="line">                <span class="title class_">Badge</span>.<span class="property">textContent</span> = <span class="title class_">IsActive</span> ? <span class="title function_">T</span>(<span class="string">&#x27;PanelStatusActive&#x27;</span>) : <span class="title function_">T</span>(<span class="string">&#x27;PanelStatusPaused&#x27;</span>);</span><br><span class="line">                <span class="title class_">Badge</span>.<span class="property">className</span> = <span class="string">&#x27;StatusBadge&#x27;</span> + (<span class="title class_">IsActive</span> ? <span class="string">&#x27;&#x27;</span> : <span class="string">&#x27; Off&#x27;</span>);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="variable language_">this</span>.<span class="property">textContent</span> = <span class="title class_">IsActive</span> ? <span class="title function_">T</span>(<span class="string">&#x27;PanelBtnPause&#x27;</span>) : <span class="title function_">T</span>(<span class="string">&#x27;PanelBtnResume&#x27;</span>);</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="title class_">Overlay</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, <span class="keyword">function</span>(<span class="params">E</span>) &#123;</span><br><span class="line">            <span class="keyword">if</span> (E.<span class="property">target</span> === <span class="title class_">Overlay</span>) &#123; <span class="title class_">DestroyPanel</span>(); &#125;</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">function</span> <span class="title function_">OnKeyDown</span>(<span class="params">E</span>) &#123; <span class="keyword">if</span> (E.<span class="property">key</span> === <span class="string">&#x27;Escape&#x27;</span>) &#123; <span class="title class_">DestroyPanel</span>(); &#125; &#125;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;keydown&#x27;</span>, <span class="title class_">OnKeyDown</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">function</span> <span class="title function_">DestroyPanel</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="variable language_">document</span>.<span class="title function_">removeEventListener</span>(<span class="string">&#x27;keydown&#x27;</span>, <span class="title class_">OnKeyDown</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Overlay</span>.<span class="property">parentNode</span>) &#123; <span class="title class_">Overlay</span>.<span class="property">parentNode</span>.<span class="title function_">removeChild</span>(<span class="title class_">Overlay</span>); &#125;</span><br><span class="line">            <span class="title class_">PanelDestroyFn</span> = <span class="literal">null</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="title class_">PanelDestroyFn</span> = <span class="title class_">DestroyPanel</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== MutationObserver ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">InitObserver</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="title class_">Observer</span>) &#123; <span class="title class_">Observer</span>.<span class="title function_">disconnect</span>(); <span class="title class_">Observer</span> = <span class="literal">null</span>; &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">const</span> <span class="title class_">Container</span> = <span class="title class_">DetectContainer</span>();</span><br><span class="line">        <span class="keyword">if</span> (!<span class="title class_">Container</span>) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line">        <span class="title class_">Observer</span> = <span class="keyword">new</span> <span class="title class_">MutationObserver</span>(<span class="keyword">function</span>(<span class="params">Mutations</span>) &#123;</span><br><span class="line">            <span class="keyword">let</span> <span class="title class_">ShouldProcess</span> = <span class="literal">false</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Mutation</span> <span class="keyword">of</span> <span class="title class_">Mutations</span>) &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Mutation</span>.<span class="property">type</span> === <span class="string">&#x27;childList&#x27;</span> &amp;&amp; (<span class="title class_">Mutation</span>.<span class="property">addedNodes</span>.<span class="property">length</span> &gt; <span class="number">0</span> || <span class="title class_">Mutation</span>.<span class="property">removedNodes</span>.<span class="property">length</span> &gt; <span class="number">0</span>)) &#123;</span><br><span class="line">                    <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Node</span> <span class="keyword">of</span> <span class="title class_">Mutation</span>.<span class="property">addedNodes</span>) &#123;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="title class_">Node</span>.<span class="property">nodeType</span> === <span class="number">1</span>) &#123;</span><br><span class="line">                            <span class="keyword">const</span> <span class="title class_">Sel</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">                            <span class="keyword">if</span> (<span class="title class_">Sel</span> &amp;&amp; (<span class="title class_">Node</span>.<span class="title function_">matches</span>(<span class="title class_">Sel</span>) || <span class="title class_">Node</span>.<span class="title function_">querySelector</span>(<span class="title class_">Sel</span>))) &#123;</span><br><span class="line">                                <span class="title class_">ShouldProcess</span> = <span class="literal">true</span>;</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                    <span class="keyword">if</span> (!<span class="title class_">ShouldProcess</span>) &#123;</span><br><span class="line">                        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Node</span> <span class="keyword">of</span> <span class="title class_">Mutation</span>.<span class="property">removedNodes</span>) &#123;</span><br><span class="line">                            <span class="keyword">if</span> (<span class="title class_">Node</span>.<span class="property">nodeType</span> === <span class="number">1</span>) &#123;</span><br><span class="line">                                <span class="keyword">const</span> <span class="title class_">Sel</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">                                <span class="keyword">if</span> (<span class="title class_">Sel</span> &amp;&amp; (<span class="title class_">Node</span>.<span class="title function_">matches</span>(<span class="title class_">Sel</span>) || <span class="title class_">Node</span>.<span class="title function_">querySelector</span>(<span class="title class_">Sel</span>))) &#123;</span><br><span class="line">                                    <span class="title class_">ShouldProcess</span> = <span class="literal">true</span>;</span><br><span class="line">                                    <span class="keyword">break</span>;</span><br><span class="line">                                &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">ShouldProcess</span>) <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">ShouldProcess</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> <span class="title class_">Now</span> = <span class="title class_">Date</span>.<span class="title function_">now</span>();</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">Now</span> - <span class="title class_">LastRun</span> &lt; <span class="variable constant_">THROTTLE_INTERVAL</span>) &#123;</span><br><span class="line">                    <span class="built_in">clearTimeout</span>(<span class="title class_">DebounceTimer</span>);</span><br><span class="line">                    <span class="title class_">DebounceTimer</span> = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123; <span class="title class_">LastRun</span> = <span class="title class_">Date</span>.<span class="title function_">now</span>(); <span class="title class_">LimitVideos</span>(); &#125;, <span class="number">300</span>);</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                    <span class="title class_">LastRun</span> = <span class="title class_">Now</span>;</span><br><span class="line">                    <span class="title class_">LimitVideos</span>();</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line"></span><br><span class="line">        <span class="title class_">Observer</span>.<span class="title function_">observe</span>(<span class="title class_">Container</span>, &#123; <span class="attr">childList</span>: <span class="literal">true</span>, <span class="attr">subtree</span>: <span class="literal">true</span>, <span class="attr">attributes</span>: <span class="literal">false</span> &#125;);</span><br><span class="line">        <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogObserverStarted&#x27;</span>), <span class="title class_">Container</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 路由变化监听 ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">WatchUrlChange</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">let</span> <span class="title class_">LastUrl</span> = location.<span class="property">href</span>;</span><br><span class="line">        <span class="built_in">setInterval</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">if</span> (location.<span class="property">href</span> !== <span class="title class_">LastUrl</span>) &#123;</span><br><span class="line">                <span class="title class_">LastUrl</span> = location.<span class="property">href</span>;</span><br><span class="line">                <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogUrlChanged&#x27;</span>), <span class="title class_">LastUrl</span>);</span><br><span class="line">                <span class="title class_">EffectiveSelector</span> = <span class="literal">null</span>;</span><br><span class="line">                <span class="title class_">VideoListContainer</span> = <span class="literal">null</span>;</span><br><span class="line">                <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                    <span class="title class_">DetectSelector</span>();</span><br><span class="line">                    <span class="title class_">DetectContainer</span>();</span><br><span class="line">                    <span class="title class_">LimitVideos</span>();</span><br><span class="line">                    <span class="title function_">applyElementRemoval</span>();</span><br><span class="line">                &#125;, <span class="number">500</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;, <span class="number">1000</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 菜单命令 ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">RegisterMenu</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuSettings&#x27;</span>), <span class="keyword">function</span>(<span class="params"></span>) &#123; <span class="title class_">OpenConfigPanel</span>(); &#125;);</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuRefresh&#x27;</span>), <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="title class_">EffectiveSelector</span> = <span class="literal">null</span>;</span><br><span class="line">            <span class="title class_">VideoListContainer</span> = <span class="literal">null</span>;</span><br><span class="line">            <span class="title class_">LimitVideos</span>();</span><br><span class="line">        &#125;);</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuToggle&#x27;</span>), <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="title class_">IsActive</span> = !<span class="title class_">IsActive</span>;</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">IsActive</span>) &#123; <span class="title class_">LimitVideos</span>(); &#125;</span><br><span class="line">            <span class="keyword">else</span> &#123; <span class="title class_">RestoreAllVideos</span>(); &#125;</span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogStatus&#x27;</span>), <span class="title class_">IsActive</span> ? <span class="title function_">T</span>(<span class="string">&#x27;LogStatusOn&#x27;</span>) : <span class="title function_">T</span>(<span class="string">&#x27;LogStatusOff&#x27;</span>));</span><br><span class="line">        &#125;);</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuCommentPurifier&#x27;</span>), <span class="keyword">function</span>(<span class="params"></span>) &#123; <span class="title function_">toggleCommentPurifier</span>(); &#125;);</span><br><span class="line">        <span class="title function_">GM_registerMenuCommand</span>(<span class="title function_">T</span>(<span class="string">&#x27;MenuQuickSet&#x27;</span>), <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">            <span class="keyword">const</span> <span class="title class_">Num</span> = <span class="title function_">prompt</span>(<span class="title function_">T</span>(<span class="string">&#x27;PromptQuickSet&#x27;</span>), <span class="title class_">Config</span>.<span class="property">MaxVideos</span>);</span><br><span class="line">            <span class="keyword">if</span> (<span class="title class_">Num</span> !== <span class="literal">null</span>) &#123;</span><br><span class="line">                <span class="keyword">const</span> N = <span class="built_in">parseInt</span>(<span class="title class_">Num</span>);</span><br><span class="line">                <span class="keyword">if</span> (N &gt;= <span class="number">1</span> &amp;&amp; N &lt;= <span class="number">100</span>) &#123;</span><br><span class="line">                    <span class="title class_">Config</span>.<span class="property">MaxVideos</span> = N;</span><br><span class="line">                    <span class="title class_">SaveConfig</span>(&#123; <span class="title class_">MaxVideos</span>: N &#125;);</span><br><span class="line">                    <span class="keyword">if</span> (!<span class="title class_">IsActive</span>) &#123; <span class="title class_">IsActive</span> = <span class="literal">true</span>; &#125;</span><br><span class="line">                    <span class="title class_">LimitVideos</span>();</span><br><span class="line">                    <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogQuickSet&#x27;</span>), N);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// ======================== 初始化 ========================</span></span><br><span class="line">    <span class="keyword">function</span> <span class="title function_">Init</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">try</span> &#123;</span><br><span class="line">            <span class="title class_">Config</span> = <span class="title class_">GetConfig</span>();</span><br><span class="line">            <span class="title class_">CurrentLang</span> = <span class="title class_">ResolveLanguage</span>();</span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogConfigLoaded&#x27;</span>), <span class="title class_">Config</span>);</span><br><span class="line">            <span class="title class_">InjectStyles</span>();</span><br><span class="line">            <span class="title class_">RegisterMenu</span>();</span><br><span class="line">            <span class="title function_">startCommentPurifier</span>();</span><br><span class="line">            <span class="title class_">InitObserver</span>();</span><br><span class="line">            <span class="title class_">WatchUrlChange</span>();</span><br><span class="line">            <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                <span class="title class_">DetectSelector</span>();</span><br><span class="line">                <span class="title class_">DetectContainer</span>();</span><br><span class="line">                <span class="title class_">LimitVideos</span>();</span><br><span class="line">                <span class="title function_">applyElementRemoval</span>();</span><br><span class="line">            &#125;, <span class="number">500</span>);</span><br><span class="line"></span><br><span class="line">            <span class="built_in">setInterval</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">                <span class="keyword">if</span> (<span class="title class_">IsActive</span>) &#123;</span><br><span class="line">                    <span class="keyword">const</span> <span class="title class_">Selector</span> = <span class="title class_">DetectSelector</span>();</span><br><span class="line">                    <span class="keyword">if</span> (<span class="title class_">Selector</span>) &#123;</span><br><span class="line">                        <span class="keyword">const</span> <span class="title class_">Cards</span> = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="title class_">Selector</span>);</span><br><span class="line">                        <span class="keyword">let</span> <span class="title class_">VisibleCount</span> = <span class="number">0</span>;</span><br><span class="line">                        <span class="keyword">for</span> (<span class="keyword">const</span> <span class="title class_">Card</span> <span class="keyword">of</span> <span class="title class_">Cards</span>) &#123;</span><br><span class="line">                            <span class="keyword">if</span> (!(<span class="title class_">Card</span>.<span class="property">style</span>.<span class="property">display</span> === <span class="string">&#x27;none&#x27;</span> || <span class="title class_">Card</span>.<span class="property">classList</span>.<span class="title function_">contains</span>(<span class="string">&#x27;BiliLimitedHide&#x27;</span>))) &#123;</span><br><span class="line">                                <span class="title class_">VisibleCount</span>++;</span><br><span class="line">                            &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                        <span class="keyword">if</span> (<span class="title class_">VisibleCount</span> &gt; <span class="title class_">Config</span>.<span class="property">MaxVideos</span>) &#123;</span><br><span class="line">                            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogTimerRetry&#x27;</span>));</span><br><span class="line">                            <span class="title class_">LimitVideos</span>();</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">                <span class="title function_">applyElementRemoval</span>();</span><br><span class="line">            &#125;, <span class="number">5000</span>);</span><br><span class="line"></span><br><span class="line">            <span class="title class_">Log</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogInitDone&#x27;</span>), <span class="title class_">Config</span>);</span><br><span class="line">        &#125; <span class="keyword">catch</span> (E) &#123;</span><br><span class="line">            <span class="title class_">ErrorLog</span>(<span class="title function_">T</span>(<span class="string">&#x27;LogInitError&#x27;</span>), E);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="property">readyState</span> === <span class="string">&#x27;loading&#x27;</span>) &#123;</span><br><span class="line">        <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;DOMContentLoaded&#x27;</span>, <span class="title class_">Init</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        <span class="title class_">Init</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;)();</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://twilightraindev-github-io.pages.dev/2026/07/21/bilicompact-source/</id>
    <link href="https://twilightraindev-github-io.pages.dev/2026/07/21/bilicompact-source/"/>
    <published>2026-07-21T07:20:00.000Z</published>
    <summary>
      <![CDATA[<blockquote>
<p>以下为 BiliCompact 用户脚本的完整源码，MIT 协议，可自由使用、修改、分发。<br>安装方法：复制到 Tampermonkey &#x2F; Violentmonkey 新建脚本中保存即可。</p>
</blockquote>]]>
    </summary>
    <title>BiliCompact 完整源码（MIT 协议，可自由复制使用）</title>
    <updated>2026-07-24T13:36:26.198Z</updated>
  </entry>
  <entry>
    <author>
      <name>TwilightRain</name>
    </author>
    <category term="技术笔记" scheme="https://twilightraindev-github-io.pages.dev/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    <category term="Hexo" scheme="https://twilightraindev-github-io.pages.dev/tags/Hexo/"/>
    <category term="Cloudflare" scheme="https://twilightraindev-github-io.pages.dev/tags/Cloudflare/"/>
    <category term="博客部署" scheme="https://twilightraindev-github-io.pages.dev/tags/%E5%8D%9A%E5%AE%A2%E9%83%A8%E7%BD%B2/"/>
    <category term="运维" scheme="https://twilightraindev-github-io.pages.dev/tags/%E8%BF%90%E7%BB%B4/"/>
    <content>
      <![CDATA[<h2 id="缘起"><a href="#缘起" class="headerlink" title="缘起"></a>缘起</h2><p>事情是这样的。</p><p>我的 Hexo 博客之前一直部署在 GitHub Pages 上，但我发现它在国内的访问体验很不稳定——时而能打开，时而转圈圈，时而直接超时。这是因为 <code>github.io</code> 域名在国内的 CDN 节点访问不畅，加上可能存在的 DNS 污染，导致博客对国内读者不太友好。</p><p>于是我开始寻找解决方案。最直接的办法是使用 Cloudflare Pages 来托管博客，利用它的全球 CDN 加速，让国内访问更稳定。</p><hr><h2 id="第一步：在-Cloudflare-Pages-创建项目"><a href="#第一步：在-Cloudflare-Pages-创建项目" class="headerlink" title="第一步：在 Cloudflare Pages 创建项目"></a>第一步：在 Cloudflare Pages 创建项目</h2><p>操作本身不复杂：</p><ol><li>登录 Cloudflare Dashboard → <strong>Workers &amp; Pages</strong></li><li>点击 <strong>Create application</strong> → 选择 <strong>Pages</strong> 选项卡</li><li>点击 <strong>Connect to Git</strong>，授权 Cloudflare 访问你的 GitHub</li><li>选择你的博客仓库，填入构建设置：</li></ol><table><thead><tr><th>配置项</th><th>填写值</th></tr></thead><tbody><tr><td>Production branch</td><td>main</td></tr><tr><td>Framework preset</td><td>None（列表中没有 Hexo）</td></tr><tr><td>Build command</td><td><code>npm run build</code></td></tr><tr><td>Build directory</td><td>public</td></tr></tbody></table><ol><li>点击 <strong>Save and Deploy</strong></li></ol><p>一切都看起来很简单……直到我看到了红色的报错。</p><span id="more"></span><hr><h2 id="第二步：踩坑——package-json-找不到了？"><a href="#第二步：踩坑——package-json-找不到了？" class="headerlink" title="第二步：踩坑——package.json 找不到了？"></a>第二步：踩坑——<code>package.json</code> 找不到了？</h2><p>Cloudflare Pages 的构建日志赫然写着：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">npm error code ENOENT</span><br><span class="line">npm error path /opt/buildhome/repo/package.json</span><br><span class="line">npm error enoent Could not read package.json</span><br></pre></td></tr></table></figure><p>嗯？我的仓库里明明有 <code>package.json</code> 啊。</p><p>回头一看 GitHub 仓库，我明白了——</p><h3 id="根因：推送错了内容"><a href="#根因：推送错了内容" class="headerlink" title="根因：推送错了内容"></a>根因：推送错了内容</h3><p>我的 GitHub 仓库里只有这些文件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">index.html</span><br><span class="line">2026/07/13/hello-world/</span><br><span class="line">archives/</span><br><span class="line">css/</span><br><span class="line">fancybox/</span><br><span class="line">js/</span><br></pre></td></tr></table></figure><p>全是 <code>hexo generate</code> 生成的<strong>静态文件</strong>，没有 <code>package.json</code>，没有 <code>_config.yml</code>，没有 <code>source/</code> 文件夹。</p><p>换句话说，我之前一直用 <code>hexo deploy</code> 把编译后的 <code>public/</code> 目录推到了仓库里。这在 GitHub Pages 的流程下是正常的——它只需要静态文件。但 <strong>Cloudflare Pages 需要的是源代码</strong>，因为它要在服务端执行 <code>npm install</code> 和 <code>npm run build</code>。</p><h3 id="修复：推送正确的源代码"><a href="#修复：推送正确的源代码" class="headerlink" title="修复：推送正确的源代码"></a>修复：推送正确的源代码</h3><p>解决方案很简单：把 Hexo 的源代码推上去。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在博客根目录执行</span></span><br><span class="line">git init</span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;推送 Hexo 源码到 Cloudflare Pages&quot;</span></span><br><span class="line">git remote add origin https://github.com/你的用户名/你的仓库名.git</span><br><span class="line">git push -u origin main --force</span><br></pre></td></tr></table></figure><p>注意 <code>.gitignore</code> 要确保忽略了 <code>node_modules/</code> 和 <code>public/</code>：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">node_modules/</span><br><span class="line">public/</span><br><span class="line">db.json</span><br><span class="line">.deploy*/</span><br></pre></td></tr></table></figure><p>这样推送上去的就是干净的源代码，Cloudflare 拉取后会自动安装依赖并构建。</p><hr><h2 id="第三步：又踩一坑——分支名称"><a href="#第三步：又踩一坑——分支名称" class="headerlink" title="第三步：又踩一坑——分支名称"></a>第三步：又踩一坑——分支名称</h2><p>推送成功后，我兴冲冲地点了 <strong>Retry deployment</strong>，结果……还是同样的错误。</p><p>再次查看构建日志，发现 Cloudflare 拉取的依然是旧 commit：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"> * branch 8eb197c... -&gt; FETCH_HEAD</span><br><span class="line">HEAD is now at 8eb197c Site updated: 2026-07-13 18:25:29</span><br></pre></td></tr></table></figure><p>奇怪，明明推送成功了，为什么还拉取旧代码？</p><p>原因在于 <strong>Cloudflare Pages 配置的 Production branch 还是 <code>master</code></strong>，而我的仓库默认分支已经改成了 <code>main</code>（且 <code>master</code> 已经不存在了）。Cloudflare 找不到 <code>master</code> 分支，就用了一个缓存中的旧提交。</p><p>解决方案：在 Cloudflare Pages 项目设置中，把 <strong>Production branch</strong> 从 <code>master</code> 改为 <code>main</code>，然后再次重试部署。</p><p>这次终于成功了！🎉</p><hr><h2 id="最终效果"><a href="#最终效果" class="headerlink" title="最终效果"></a>最终效果</h2><p>博客成功部署到了 <code>twilightraindev-github-io.pages.dev</code>，构建和部署都自动完成。以后更新博客只需要：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">hexo new post <span class="string">&quot;我的新文章&quot;</span></span><br><span class="line"><span class="comment"># 写文章...</span></span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;新文章&quot;</span></span><br><span class="line">git push</span><br></pre></td></tr></table></figure><p>Cloudflare Pages 会自动检测到 push 事件，拉取代码、安装依赖、构建、部署，整个流程全自动。</p><hr><h2 id="总结几个要点"><a href="#总结几个要点" class="headerlink" title="总结几个要点"></a>总结几个要点</h2><ol><li><strong>GitHub Pages 推静态文件，Cloudflare Pages 推源代码</strong>——这两种部署方式对仓库内容的要求完全不同，搞清楚区别才能避免踩坑。</li><li><strong>Production branch 要匹配</strong>——Cloudflare Pages 配置的部署分支必须和 GitHub 仓库的默认分支一致。</li><li><strong>Cloudflare Pages 的构建命令记得用 <code>npm run build</code></strong>，而不是 <code>hexo generate</code>。确保 <code>package.json</code> 的 <code>scripts</code> 中有 <code>&quot;build&quot;: &quot;hexo generate&quot;</code>。</li></ol><p>希望这篇文章能帮到同样想迁移到 Cloudflare Pages 的朋友。如果你也遇到了类似的报错，对照上面的步骤检查一下，大概率能解决问题。</p>]]>
    </content>
    <id>https://twilightraindev-github-io.pages.dev/2026/07/21/hexo-to-cloudflare-pages/</id>
    <link href="https://twilightraindev-github-io.pages.dev/2026/07/21/hexo-to-cloudflare-pages/"/>
    <published>2026-07-21T06:45:00.000Z</published>
    <summary>
      <![CDATA[<h2 id="缘起"><a href="#缘起" class="headerlink" title="缘起"></a>缘起</h2><p>事情是这样的。</p>
<p>我的 Hexo 博客之前一直部署在 GitHub Pages 上，但我发现它在国内的访问体验很不稳定——时而能打开，时而转圈圈，时而直接超时。这是因为 <code>github.io</code> 域名在国内的 CDN 节点访问不畅，加上可能存在的 DNS 污染，导致博客对国内读者不太友好。</p>
<p>于是我开始寻找解决方案。最直接的办法是使用 Cloudflare Pages 来托管博客，利用它的全球 CDN 加速，让国内访问更稳定。</p>
<hr>
<h2 id="第一步：在-Cloudflare-Pages-创建项目"><a href="#第一步：在-Cloudflare-Pages-创建项目" class="headerlink" title="第一步：在 Cloudflare Pages 创建项目"></a>第一步：在 Cloudflare Pages 创建项目</h2><p>操作本身不复杂：</p>
<ol>
<li>登录 Cloudflare Dashboard → <strong>Workers &amp; Pages</strong></li>
<li>点击 <strong>Create application</strong> → 选择 <strong>Pages</strong> 选项卡</li>
<li>点击 <strong>Connect to Git</strong>，授权 Cloudflare 访问你的 GitHub</li>
<li>选择你的博客仓库，填入构建设置：</li>
</ol>
<table>
<thead>
<tr>
<th>配置项</th>
<th>填写值</th>
</tr>
</thead>
<tbody><tr>
<td>Production branch</td>
<td>main</td>
</tr>
<tr>
<td>Framework preset</td>
<td>None（列表中没有 Hexo）</td>
</tr>
<tr>
<td>Build command</td>
<td><code>npm run build</code></td>
</tr>
<tr>
<td>Build directory</td>
<td>public</td>
</tr>
</tbody></table>
<ol>
<li>点击 <strong>Save and Deploy</strong></li>
</ol>
<p>一切都看起来很简单……直到我看到了红色的报错。</p>]]>
    </summary>
    <title>从 GitHub Pages 迁移到 Cloudflare Pages：Hexo 博客部署全记录</title>
    <updated>2026-07-24T13:36:26.198Z</updated>
  </entry>
  <entry>
    <author>
      <name>TwilightRain</name>
    </author>
    <category term="技术笔记" scheme="https://twilightraindev-github-io.pages.dev/categories/%E6%8A%80%E6%9C%AF%E7%AC%94%E8%AE%B0/"/>
    <category term="Hexo" scheme="https://twilightraindev-github-io.pages.dev/tags/Hexo/"/>
    <category term="博客" scheme="https://twilightraindev-github-io.pages.dev/tags/%E5%8D%9A%E5%AE%A2/"/>
    <content>
      <![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><span id="more"></span><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">&quot;My New Post&quot;</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]>
    </content>
    <id>https://twilightraindev-github-io.pages.dev/2026/07/13/hello-world/</id>
    <link href="https://twilightraindev-github-io.pages.dev/2026/07/13/hello-world/"/>
    <published>2026-07-13T09:44:00.000Z</published>
    <summary>
      <![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>]]>
    </summary>
    <title>Hello World</title>
    <updated>2026-07-24T13:36:26.198Z</updated>
  </entry>
</feed>
