瀏覽代碼

chore: build

Sv443 11 月之前
父節點
當前提交
277bb16cc2
共有 1 個文件被更改,包括 207 次插入105 次删除
  1. 207 105
      dist/BetterYTM.user.js

+ 207 - 105
dist/BetterYTM.user.js

@@ -17,7 +17,7 @@
 // @license           AGPL-3.0-only
 // @author            Sv443
 // @copyright         Sv443 (https://github.com/Sv443)
-// @icon              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/logo/logo_48.png?b=27ec038
+// @icon              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/logo/logo_48.png?b=21ecb9d
 // @match             https://music.youtube.com/*
 // @match             https://www.youtube.com/*
 // @run-at            document-start
@@ -35,39 +35,40 @@
 // @grant             GM.openInTab
 // @grant             unsafeWindow
 // @noframes
-// @resource          css-anchor_improvements https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/style/anchorImprovements.css?b=27ec038
-// @resource          css-fix_spacing         https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/style/fixSpacing.css?b=27ec038
-// @resource          css-fix_hdr             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/style/fixHDR.css?b=27ec038
-// @resource          doc-changelog           https://raw.githubusercontent.com/Sv443/BetterYTM/develop/changelog.md?b=27ec038
-// @resource          icon-advanced_mode      https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/plus_circle_small.svg?b=27ec038
-// @resource          icon-arrow_down         https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/arrow_down.svg?b=27ec038
-// @resource          icon-delete             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/delete.svg?b=27ec038
-// @resource          icon-error              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/error.svg?b=27ec038
-// @resource          icon-experimental       https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/beaker_small.svg?b=27ec038
-// @resource          icon-globe              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/globe.svg?b=27ec038
-// @resource          icon-help               https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/help.svg?b=27ec038
-// @resource          icon-image_filled       https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/image_filled.svg?b=27ec038
-// @resource          icon-image              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/image.svg?b=27ec038
-// @resource          icon-link               https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/link.svg?b=27ec038
-// @resource          icon-lyrics             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/lyrics.svg?b=27ec038
-// @resource          icon-reload             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/refresh.svg?b=27ec038
-// @resource          icon-skip_to            https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/skip_to.svg?b=27ec038
-// @resource          icon-spinner            https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/spinner.svg?b=27ec038
-// @resource          img-logo                https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/logo/logo_48.png?b=27ec038
-// @resource          img-close               https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/close.png?b=27ec038
-// @resource          img-discord             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/discord.png?b=27ec038
-// @resource          img-github              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/github.png?b=27ec038
-// @resource          img-greasyfork          https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/greasyfork.png?b=27ec038
-// @resource          img-openuserjs          https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/openuserjs.png?b=27ec038
-// @resource          trans-de_DE             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/de_DE.json?b=27ec038
-// @resource          trans-en_US             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/en_US.json?b=27ec038
-// @resource          trans-en_UK             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/en_UK.json?b=27ec038
-// @resource          trans-es_ES             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/es_ES.json?b=27ec038
-// @resource          trans-fr_FR             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/fr_FR.json?b=27ec038
-// @resource          trans-hi_IN             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/hi_IN.json?b=27ec038
-// @resource          trans-ja_JA             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/ja_JA.json?b=27ec038
-// @resource          trans-pt_BR             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/pt_BR.json?b=27ec038
-// @resource          trans-zh_CN             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/zh_CN.json?b=27ec038
+// @resource          css-anchor_improvements https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/style/anchorImprovements.css?b=21ecb9d
+// @resource          css-fix_spacing         https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/style/fixSpacing.css?b=21ecb9d
+// @resource          css-fix_hdr             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/style/fixHDR.css?b=21ecb9d
+// @resource          doc-changelog           https://raw.githubusercontent.com/Sv443/BetterYTM/develop/changelog.md?b=21ecb9d
+// @resource          icon-advanced_mode      https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/plus_circle_small.svg?b=21ecb9d
+// @resource          icon-arrow_down         https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/arrow_down.svg?b=21ecb9d
+// @resource          icon-clear_list         https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/clear_list.svg?b=21ecb9d
+// @resource          icon-delete             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/delete.svg?b=21ecb9d
+// @resource          icon-error              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/error.svg?b=21ecb9d
+// @resource          icon-experimental       https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/beaker_small.svg?b=21ecb9d
+// @resource          icon-globe              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/globe.svg?b=21ecb9d
+// @resource          icon-help               https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/help.svg?b=21ecb9d
+// @resource          icon-image_filled       https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/image_filled.svg?b=21ecb9d
+// @resource          icon-image              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/image.svg?b=21ecb9d
+// @resource          icon-link               https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/link.svg?b=21ecb9d
+// @resource          icon-lyrics             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/lyrics.svg?b=21ecb9d
+// @resource          icon-reload             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/refresh.svg?b=21ecb9d
+// @resource          icon-skip_to            https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/skip_to.svg?b=21ecb9d
+// @resource          icon-spinner            https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/icons/spinner.svg?b=21ecb9d
+// @resource          img-logo                https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/logo/logo_48.png?b=21ecb9d
+// @resource          img-close               https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/close.png?b=21ecb9d
+// @resource          img-discord             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/discord.png?b=21ecb9d
+// @resource          img-github              https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/github.png?b=21ecb9d
+// @resource          img-greasyfork          https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/greasyfork.png?b=21ecb9d
+// @resource          img-openuserjs          https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/images/external/openuserjs.png?b=21ecb9d
+// @resource          trans-de_DE             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/de_DE.json?b=21ecb9d
+// @resource          trans-en_US             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/en_US.json?b=21ecb9d
+// @resource          trans-en_UK             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/en_UK.json?b=21ecb9d
+// @resource          trans-es_ES             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/es_ES.json?b=21ecb9d
+// @resource          trans-fr_FR             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/fr_FR.json?b=21ecb9d
+// @resource          trans-hi_IN             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/hi_IN.json?b=21ecb9d
+// @resource          trans-ja_JA             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/ja_JA.json?b=21ecb9d
+// @resource          trans-pt_BR             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/pt_BR.json?b=21ecb9d
+// @resource          trans-zh_CN             https://raw.githubusercontent.com/Sv443/BetterYTM/develop/assets/translations/zh_CN.json?b=21ecb9d
 // @require           https://cdn.jsdelivr.net/npm/@sv443-network/[email protected]/dist/index.global.js
 // @require           https://cdn.jsdelivr.net/npm/[email protected]/dist/fuse.basic.js
 // @require           https://cdn.jsdelivr.net/npm/[email protected]/lib/marked.umd.js
@@ -195,7 +196,7 @@ var PluginIntent;
 })(PluginIntent || (PluginIntent = {}));const modeRaw = "development";
 const branchRaw = "develop";
 const hostRaw = "github";
-const buildNumberRaw = "27ec038";
+const buildNumberRaw = "21ecb9d";
 /** The mode in which the script was built (production or development) */
 const mode = (modeRaw.match(/^#{{.+}}$/) ? "production" : modeRaw);
 /** The branch to use in various URLs that point to the GitHub repo */
@@ -822,6 +823,7 @@ const allSiteEvents = [
     "autoplayQueueChanged",
     "songTitleChanged",
     "watchIdChanged",
+    "fullscreenToggled",
 ];
 /** EventEmitter instance that is used to detect changes to the site */
 const siteEvents = createNanoEvents();
@@ -1829,24 +1831,24 @@ function addCfgMenu() {
         //#region footer
         const footerCont = document.createElement("div");
         footerCont.className = "bytm-menu-footer-cont";
-        const footerElemCont = document.createElement("div");
-        const footerElem = document.createElement("div");
-        footerElem.classList.add("bytm-menu-footer", "hidden");
-        footerElem.setAttribute("aria-hidden", "true");
-        footerElem.textContent = t("reload_hint");
-        footerElem.role = "alert";
-        const reloadElem = document.createElement("button");
-        reloadElem.classList.add("bytm-btn");
-        reloadElem.style.marginLeft = "10px";
-        reloadElem.textContent = t("reload_now");
-        reloadElem.ariaLabel = reloadElem.title = t("reload_tooltip");
-        reloadElem.addEventListener("click", () => {
+        const reloadFooterCont = document.createElement("div");
+        const reloadFooterEl = document.createElement("div");
+        reloadFooterEl.classList.add("bytm-menu-footer", "hidden");
+        reloadFooterEl.setAttribute("aria-hidden", "true");
+        reloadFooterEl.textContent = t("reload_hint");
+        reloadFooterEl.role = "alert";
+        const reloadTxtEl = document.createElement("button");
+        reloadTxtEl.classList.add("bytm-btn");
+        reloadTxtEl.style.marginLeft = "10px";
+        reloadTxtEl.textContent = t("reload_now");
+        reloadTxtEl.ariaLabel = reloadTxtEl.title = t("reload_tooltip");
+        reloadTxtEl.addEventListener("click", () => {
             closeCfgMenu();
             disableBeforeUnload();
             location.reload();
         });
-        footerElem.appendChild(reloadElem);
-        footerElemCont.appendChild(footerElem);
+        reloadFooterEl.appendChild(reloadTxtEl);
+        reloadFooterCont.appendChild(reloadFooterEl);
         const resetElem = document.createElement("button");
         resetElem.classList.add("bytm-btn");
         resetElem.ariaLabel = resetElem.title = t("reset_tooltip");
@@ -1886,7 +1888,7 @@ function addCfgMenu() {
         buttonsCont.appendChild(exportElem);
         buttonsCont.appendChild(importElem);
         buttonsCont.appendChild(resetElem);
-        footerCont.appendChild(footerElemCont);
+        footerCont.appendChild(reloadFooterCont);
         footerCont.appendChild(buttonsCont);
         //#region feature list
         const featuresCont = document.createElement("div");
@@ -1906,12 +1908,12 @@ function addCfgMenu() {
             // @ts-ignore
             (_g = (_f = featInfo[key]) === null || _f === void 0 ? void 0 : _f.change) === null || _g === void 0 ? void 0 : _g.call(_f, key, initialVal, newVal);
             if (requiresReload) {
-                footerElem.classList.remove("hidden");
-                footerElem.setAttribute("aria-hidden", "false");
+                reloadFooterEl.classList.remove("hidden");
+                reloadFooterEl.setAttribute("aria-hidden", "false");
             }
             else if (!requiresReload) {
-                footerElem.classList.add("hidden");
-                footerElem.setAttribute("aria-hidden", "true");
+                reloadFooterEl.classList.add("hidden");
+                reloadFooterEl.setAttribute("aria-hidden", "true");
             }
             if (initLocale !== featConf.locale) {
                 yield initTranslations(featConf.locale);
@@ -1926,6 +1928,7 @@ function addCfgMenu() {
             }
             else if (getLocale() !== featConf.locale)
                 setLocale(featConf.locale);
+            siteEvents.emit("configOptionChanged", key, initialVal, newVal);
         });
         /** Call whenever the feature config is changed */
         const confChanged = UserUtils.debounce(onCfgChange, 200, "falling");
@@ -3168,47 +3171,103 @@ function fixSpacing() {
         }
     });
 }
-//#region scroll to active
-/** Adds a button to the queue to scroll to the active song */
-function addScrollToActiveBtn() {
+//#region above queue btns
+function addAboveQueueBtns() {
     return __awaiter(this, void 0, void 0, function* () {
-        addSelectorListener("sidePanel", "#tabsContent tp-yt-paper-tab:nth-of-type(1)", {
-            listener: (tabElem) => __awaiter(this, void 0, void 0, function* () {
-                const containerElem = document.createElement("div");
-                containerElem.id = "bytm-scroll-to-active-btn-cont";
-                const linkElem = document.createElement("div");
-                linkElem.id = "bytm-scroll-to-active-btn";
-                linkElem.tabIndex = 0;
-                linkElem.classList.add("ytmusic-player-bar", "bytm-generic-btn");
-                linkElem.ariaLabel = linkElem.title = t("scroll_to_playing");
-                linkElem.role = "button";
-                const imgElem = document.createElement("img");
-                imgElem.classList.add("bytm-generic-btn-img");
-                imgElem.src = yield getResourceUrl("icon-skip_to");
-                const scrollToActiveInteraction = () => {
-                    const activeItem = document.querySelector("#side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"loading\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"playing\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"paused\"]");
-                    if (!activeItem)
-                        return;
-                    activeItem.scrollIntoView({
-                        behavior: "smooth",
-                        block: "center",
-                        inline: "center",
-                    });
-                };
-                siteEvents.on("fullscreenToggled", (isFullscreen) => {
-                    if (isFullscreen)
-                        containerElem.classList.add("hidden");
-                    else
-                        containerElem.classList.remove("hidden");
+        const { scrollToActiveSongBtn, clearQueueBtn } = getFeatures();
+        if (!scrollToActiveSongBtn && !clearQueueBtn)
+            return;
+        addSelectorListener("sidePanel", "ytmusic-tab-renderer ytmusic-queue-header-renderer #buttons", {
+            listener(rightBtnsEl) {
+                return __awaiter(this, void 0, void 0, function* () {
+                    const aboveQueueBtnCont = document.createElement("div");
+                    aboveQueueBtnCont.id = "bytm-above-queue-btn-cont";
+                    UserUtils.addParent(rightBtnsEl, aboveQueueBtnCont);
+                    if (scrollToActiveSongBtn)
+                        yield addScrollToActiveBtn(rightBtnsEl);
+                    if (clearQueueBtn)
+                        yield addClearQueueBtn(rightBtnsEl);
                 });
-                onInteraction(linkElem, scrollToActiveInteraction, { capture: true });
-                linkElem.appendChild(imgElem);
-                containerElem.appendChild(linkElem);
-                tabElem.appendChild(containerElem);
-            }),
+            },
         });
     });
 }
+/** Adds a button above the queue to scroll to the active song */
+function addScrollToActiveBtn(rightBtnsEl) {
+    return __awaiter(this, void 0, void 0, function* () {
+        const containerElem = document.createElement("div");
+        containerElem.id = "bytm-scroll-to-active-btn-cont";
+        const linkElem = document.createElement("div");
+        linkElem.id = "bytm-scroll-to-active-btn";
+        linkElem.tabIndex = 0;
+        linkElem.classList.add("ytmusic-player-bar", "bytm-generic-btn");
+        linkElem.ariaLabel = linkElem.title = t("scroll_to_playing");
+        linkElem.role = "button";
+        const imgElem = document.createElement("img");
+        imgElem.classList.add("bytm-generic-btn-img");
+        imgElem.src = yield getResourceUrl("icon-skip_to");
+        const scrollToActiveInteraction = () => {
+            const activeItem = document.querySelector("#side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"loading\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"playing\"], #side-panel .ytmusic-player-queue ytmusic-player-queue-item[play-button-state=\"paused\"]");
+            if (!activeItem)
+                return;
+            activeItem.scrollIntoView({
+                behavior: "smooth",
+                block: "center",
+                inline: "center",
+            });
+        };
+        siteEvents.on("fullscreenToggled", (isFullscreen) => {
+            if (isFullscreen)
+                containerElem.classList.add("hidden");
+            else
+                containerElem.classList.remove("hidden");
+        });
+        onInteraction(linkElem, scrollToActiveInteraction, { capture: true });
+        linkElem.appendChild(imgElem);
+        containerElem.appendChild(linkElem);
+        insertBefore(rightBtnsEl, containerElem);
+    });
+}
+/** Adds a button above the queue to clear it */
+function addClearQueueBtn(rightBtnsEl) {
+    return __awaiter(this, void 0, void 0, function* () {
+        const containerElem = document.createElement("div");
+        containerElem.id = "bytm-clear-queue-btn-cont";
+        const linkElem = document.createElement("div");
+        linkElem.id = "bytm-clear-queue-btn";
+        linkElem.tabIndex = 0;
+        linkElem.classList.add("ytmusic-player-bar", "bytm-generic-btn");
+        linkElem.ariaLabel = linkElem.title = t("clear_queue");
+        linkElem.role = "button";
+        const imgElem = document.createElement("img");
+        imgElem.classList.add("bytm-generic-btn-img");
+        imgElem.src = yield getResourceUrl("icon-clear_list");
+        siteEvents.on("fullscreenToggled", (isFullscreen) => {
+            if (isFullscreen)
+                containerElem.classList.add("hidden");
+            else
+                containerElem.classList.remove("hidden");
+        });
+        onInteraction(linkElem, () => {
+            try {
+                // TODO: better confirmation dialog?
+                if (!confirm(t("clear_queue_confirm")))
+                    return;
+                const url = new URL(location.href);
+                url.searchParams.delete("list");
+                location.href = String(url);
+            }
+            catch (err) {
+                error("Couldn't clear queue due to an error:", err);
+            }
+        }, {
+            capture: true,
+        });
+        linkElem.appendChild(imgElem);
+        containerElem.appendChild(linkElem);
+        insertBefore(rightBtnsEl, containerElem);
+    });
+}
 //#region thumbnail overlay
 /** To be changed when the toggle button is pressed - used to invert the state of "showOverlay" */
 let invertOverlay = false;
@@ -3573,15 +3632,12 @@ function delRemSongData(watchID) {
     });
 }
 //#region disable darkreader
-/** Disables Dark Reader if it is enabled */
+/** Disables Dark Reader if it is present */
 function disableDarkReader() {
-    if (document.querySelector(".darkreader")) {
-        const metaElem = document.createElement("meta");
-        metaElem.name = "darkreader-lock";
-        metaElem.classList.add("bytm-disable-darkreader");
-        document.head.appendChild(metaElem);
-        info("Sent hint to Dark Reader to disable itself");
-    }
+    const metaElem = document.createElement("meta");
+    metaElem.name = "darkreader-lock";
+    metaElem.classList.add("bytm-disable-darkreader");
+    document.head.appendChild(metaElem);
 }const inputIgnoreTagNames = ["INPUT", "TEXTAREA", "SELECT", "BUTTON", "A"];
 //#region arrow key skip
 function initArrowKeySkip() {
@@ -4334,6 +4390,12 @@ const featInfo = {
         default: true,
         textAdornment: adornments.reloadRequired,
     },
+    clearQueueBtn: {
+        type: "toggle",
+        category: "layout",
+        default: true,
+        textAdornment: adornments.reloadRequired,
+    },
     removeUpgradeTab: {
         type: "toggle",
         category: "layout",
@@ -4783,7 +4845,7 @@ const migrations = {
         "thumbnailOverlayBehavior", "thumbnailOverlayToggleBtnShown",
         "thumbnailOverlayShowIndicator", "thumbnailOverlayIndicatorOpacity",
         "thumbnailOverlayImageFit", "removeShareTrackingParamSites",
-        "fixHdrIssues",
+        "fixHdrIssues", "clearQueueBtn",
     ], oldData))),
     // TODO: once advanced filtering is fully implemented, clear cache on migration to fv6
     // 5 -> 6 (v1.3)
@@ -5284,6 +5346,15 @@ function currentMediaType() {
     if (!songImgElem)
         throw new Error("Couldn't find the song image element. Use this function only after `await waitVideoElementReady()`!");
     return UserUtils.getUnsafeWindow().getComputedStyle(songImgElem).display !== "none" ? "song" : "video";
+}
+/**
+ * Inserts {@linkcode beforeElement} as a sibling just before the provided {@linkcode afterElement}
+ * @returns Returns the {@linkcode beforeElement}
+ */
+function insertBefore(afterElement, beforeElement) {
+    var _a;
+    (_a = afterElement.parentNode) === null || _a === void 0 ? void 0 : _a.insertBefore(beforeElement, afterElement);
+    return beforeElement;
 }let curLogLevel = LogLevel.Info;
 /** Common prefix to be able to tell logged messages apart and filter them in devtools */
 const consPrefix = `[${scriptInfo.name}]`;
@@ -5641,7 +5712,7 @@ function onDomLoad() {
                 if (features.fixSpacing)
                     ftInit.push(fixSpacing());
                 if (features.scrollToActiveSongBtn)
-                    ftInit.push(addScrollToActiveBtn());
+                    ftInit.push(addAboveQueueBtns());
                 if (features.removeUpgradeTab)
                     ftInit.push(removeUpgradeTab());
                 ftInit.push(initThumbnailOverlay());
@@ -6822,20 +6893,44 @@ hr {
   margin-top: 30px;
 }
 
+.bytm-markdown-container ul li {
+  padding-left: 0px;
+}
+
+.bytm-markdown-container ul li::marker {
+  content: none;
+}
+
 .bytm-markdown-container ul li::before {
   content: "• ";
   font-weight: bolder;
 }
 
+.bytm-markdown-container ul li > ul li {
+  padding-left: 16px;
+}
+
+.bytm-markdown-container ul li > ul li::marker {
+  content: none;
+}
+
 .bytm-markdown-container ul li > ul li::before {
   white-space: pre-wrap;
-  content: "    • ";
+  content: "• ";
   font-weight: bolder;
 }
 
+.bytm-markdown-container ul li > ul li > ul li {
+  padding-left: 16px;
+}
+
+.bytm-markdown-container ul li > ul li > ul li::marker {
+  content: none;
+}
+
 .bytm-markdown-container ul li > ul li > ul li::before {
   white-space: pre-wrap;
-  content: "        • ";
+  content: "• ";
   font-weight: bolder;
 }
 
@@ -7127,6 +7222,16 @@ yt-multi-page-menu-section-renderer.ytd-multi-page-menu-renderer {
   text-decoration: underline;
 }
 
+/* #region above queue btns */
+
+#bytm-above-queue-btn-cont {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-items: center;
+  height: 100%;
+}
+
 /* #region scroll to active */
 
 #bytm-scroll-to-active-btn-cont {
@@ -7134,9 +7239,6 @@ yt-multi-page-menu-section-renderer.ytd-multi-page-menu-renderer {
   flex-direction: column;
   justify-content: center;
   align-items: center;
-  position: absolute;
-  right: 5px;
-  top: 0;
   height: 100%;
 }