Sv443 10 mesi fa
parent
commit
5f7a1c2a4a
1 ha cambiato i file con 143 aggiunte e 89 eliminazioni
  1. 143 89
      dist/BetterYTM.user.js

+ 143 - 89
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/7b2ba25/assets/images/logo/logo_dev_48.png
+// @icon              https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/images/logo/logo_dev_48.png
 // @match             https://music.youtube.com/*
 // @match             https://www.youtube.com/*
 // @run-at            document-start
@@ -35,48 +35,49 @@
 // @grant             GM.openInTab
 // @grant             unsafeWindow
 // @noframes
-// @resource          css-bundle              https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/dist/BetterYTM.css
-// @resource          css-above_queue_btns    https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/style/aboveQueueBtns.css
-// @resource          css-anchor_improvements https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/style/anchorImprovements.css
-// @resource          css-fix_hdr             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/style/fixHDR.css
-// @resource          css-fix_spacing         https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/style/fixSpacing.css
-// @resource          css-vol_slider_size     https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/style/volSliderSize.css
-// @resource          doc-changelog           https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/changelog.md
-// @resource          icon-advanced_mode      https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/plus_circle_small.svg
-// @resource          icon-arrow_down         https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/arrow_down.svg
-// @resource          icon-auto_like_enabled  https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/auto_like_enabled.svg
-// @resource          icon-auto_like          https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/auto_like.svg
-// @resource          icon-clear_list         https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/clear_list.svg
-// @resource          icon-delete             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/delete.svg
-// @resource          icon-edit               https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/edit.svg
-// @resource          icon-error              https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/error.svg
-// @resource          icon-experimental       https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/beaker_small.svg
-// @resource          icon-globe_small        https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/globe_small.svg
-// @resource          icon-globe              https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/globe.svg
-// @resource          icon-help               https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/help.svg
-// @resource          icon-image_filled       https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/image_filled.svg
-// @resource          icon-image              https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/image.svg
-// @resource          icon-link               https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/link.svg
-// @resource          icon-lyrics             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/lyrics.svg
-// @resource          icon-reload             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/refresh.svg
-// @resource          icon-skip_to            https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/skip_to.svg
-// @resource          icon-spinner            https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/icons/spinner.svg
-// @resource          img-close               https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/images/close.png
-// @resource          img-discord             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/images/external/discord.png
-// @resource          img-github              https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/images/external/github.png
-// @resource          img-greasyfork          https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/images/external/greasyfork.png
-// @resource          img-logo_dev            https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/images/logo/logo_dev_48.png
-// @resource          img-logo                https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/images/logo/logo_48.png
-// @resource          img-openuserjs          https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/images/external/openuserjs.png
-// @resource          trans-de_DE             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/translations/de_DE.json
-// @resource          trans-en_US             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/translations/en_US.json
-// @resource          trans-en_UK             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/translations/en_UK.json
-// @resource          trans-es_ES             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/translations/es_ES.json
-// @resource          trans-fr_FR             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/translations/fr_FR.json
-// @resource          trans-hi_IN             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/translations/hi_IN.json
-// @resource          trans-ja_JA             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/translations/ja_JA.json
-// @resource          trans-pt_BR             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/translations/pt_BR.json
-// @resource          trans-zh_CN             https://raw.githubusercontent.com/Sv443/BetterYTM/7b2ba25/assets/translations/zh_CN.json
+// @resource          css-bundle              https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/dist/BetterYTM.css
+// @resource          css-above_queue_btns    https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/style/aboveQueueBtns.css
+// @resource          css-anchor_improvements https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/style/anchorImprovements.css
+// @resource          css-fix_hdr             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/style/fixHDR.css
+// @resource          css-fix_spacing         https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/style/fixSpacing.css
+// @resource          css-show_votes          https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/style/showVotes.css
+// @resource          css-vol_slider_size     https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/style/volSliderSize.css
+// @resource          doc-changelog           https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/changelog.md
+// @resource          icon-advanced_mode      https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/plus_circle_small.svg
+// @resource          icon-arrow_down         https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/arrow_down.svg
+// @resource          icon-auto_like_enabled  https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/auto_like_enabled.svg
+// @resource          icon-auto_like          https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/auto_like.svg
+// @resource          icon-clear_list         https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/clear_list.svg
+// @resource          icon-delete             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/delete.svg
+// @resource          icon-edit               https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/edit.svg
+// @resource          icon-error              https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/error.svg
+// @resource          icon-experimental       https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/beaker_small.svg
+// @resource          icon-globe_small        https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/globe_small.svg
+// @resource          icon-globe              https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/globe.svg
+// @resource          icon-help               https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/help.svg
+// @resource          icon-image_filled       https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/image_filled.svg
+// @resource          icon-image              https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/image.svg
+// @resource          icon-link               https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/link.svg
+// @resource          icon-lyrics             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/lyrics.svg
+// @resource          icon-reload             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/refresh.svg
+// @resource          icon-skip_to            https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/skip_to.svg
+// @resource          icon-spinner            https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/icons/spinner.svg
+// @resource          img-close               https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/images/close.png
+// @resource          img-discord             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/images/external/discord.png
+// @resource          img-github              https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/images/external/github.png
+// @resource          img-greasyfork          https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/images/external/greasyfork.png
+// @resource          img-logo_dev            https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/images/logo/logo_dev_48.png
+// @resource          img-logo                https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/images/logo/logo_48.png
+// @resource          img-openuserjs          https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/images/external/openuserjs.png
+// @resource          trans-de_DE             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/translations/de_DE.json
+// @resource          trans-en_US             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/translations/en_US.json
+// @resource          trans-en_UK             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/translations/en_UK.json
+// @resource          trans-es_ES             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/translations/es_ES.json
+// @resource          trans-fr_FR             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/translations/fr_FR.json
+// @resource          trans-hi_IN             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/translations/hi_IN.json
+// @resource          trans-ja_JA             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/translations/ja_JA.json
+// @resource          trans-pt_BR             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/translations/pt_BR.json
+// @resource          trans-zh_CN             https://raw.githubusercontent.com/Sv443/BetterYTM/98a125d3/assets/translations/zh_CN.json
 // @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
@@ -187,7 +188,7 @@ var PluginIntent;
 })(PluginIntent || (PluginIntent = {}));const modeRaw = "development";
 const branchRaw = "develop";
 const hostRaw = "github";
-const buildNumberRaw = "7b2ba25";
+const buildNumberRaw = "98a125d3";
 /** 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 */
@@ -2703,15 +2704,15 @@ function closeCfgMenu(evt, enableScroll = true) {
         (_a = document.querySelector(getDomain() === "ytm" ? "ytmusic-app" : "ytd-app")) === null || _a === void 0 ? void 0 : _a.removeAttribute("inert");
     }
     const menuBg = document.querySelector("#bytm-cfg-menu-bg");
+    clearTimeout(hiddenCopiedTxtTimeout);
+    openDialogs.splice(openDialogs.indexOf("cfg-menu"), 1);
+    setCurrentDialogId((_b = openDialogs === null || openDialogs === void 0 ? void 0 : openDialogs[0]) !== null && _b !== void 0 ? _b : null);
     siteEvents.emit("cfgMenuClosed");
     if (!menuBg)
-        return;
-    (_b = menuBg.querySelectorAll(".bytm-ftconf-adv-copy-hint")) === null || _b === void 0 ? void 0 : _b.forEach((el) => el.style.display = "none");
-    clearTimeout(hiddenCopiedTxtTimeout);
+        return warn("Couldn't close config menu because background element couldn't be found. The config menu is considered closed but might still be open. In this case please reload the page. If the issue persists, please create an issue on GitHub.");
+    (_c = menuBg.querySelectorAll(".bytm-ftconf-adv-copy-hint")) === null || _c === void 0 ? void 0 : _c.forEach((el) => el.style.display = "none");
     menuBg.style.visibility = "hidden";
     menuBg.style.display = "none";
-    openDialogs.splice(openDialogs.indexOf("cfg-menu"), 1);
-    setCurrentDialogId((_c = openDialogs === null || openDialogs === void 0 ? void 0 : openDialogs[0]) !== null && _c !== void 0 ? _c : null);
 }
 /** Opens the config menu if it is closed */
 function openCfgMenu() {
@@ -3066,7 +3067,7 @@ function doVersionCheck() {
         }
         return noUpdateFound();
     });
-}//#region cfg menu buttons
+}//#region cfg menu btns
 let logoExchanged = false, improveLogoCalled = false;
 /** Adds a watermark beneath the logo */
 function addWatermark() {
@@ -3202,7 +3203,7 @@ function addConfigMenuOptionYT(container) {
             return error("Couldn't add config menu option to YT titlebar - couldn't find container element");
     });
 }
-//#region rem upgrade tab
+//#region upgrade tab
 /** Removes the "Upgrade" / YT Music Premium tab from the sidebar */
 function removeUpgradeTab() {
     return __awaiter(this, void 0, void 0, function* () {
@@ -3221,7 +3222,7 @@ function removeUpgradeTab() {
         });
     });
 }
-//#region anchor improvements
+//#region anchor impr.
 /** Adds anchors around elements and tweaks existing ones so songs are easier to open in a new tab */
 function addAnchorImprovements() {
     return __awaiter(this, void 0, void 0, function* () {
@@ -3333,7 +3334,7 @@ function improveSidebarAnchors(sidebarItems) {
         UserUtils.addParent(item, anchorElem);
     });
 }
-//#region rem tracking param
+//#region share tracking
 /** Removes the ?si tracking parameter from share URLs */
 function initRemShareTrackParam() {
     return __awaiter(this, void 0, void 0, function* () {
@@ -3379,7 +3380,7 @@ function fixSpacing() {
             error("Couldn't fix spacing");
     });
 }
-//#region above queue btns
+//#region ab.queue btns
 function initAboveQueueBtns() {
     return __awaiter(this, void 0, void 0, function* () {
         const { scrollToActiveSongBtn, clearQueueBtn } = getFeatures();
@@ -3389,14 +3390,14 @@ function initAboveQueueBtns() {
                 id: "scroll-to-active",
                 resourceName: "icon-skip_to",
                 titleKey: "scroll_to_playing",
-                interaction() {
+                interaction(evt) {
                     return __awaiter(this, void 0, void 0, function* () {
                         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",
+                            behavior: evt.shiftKey ? "instant" : "smooth",
+                            block: evt.ctrlKey ? "end" : "center",
                             inline: "center",
                         });
                     });
@@ -3407,16 +3408,16 @@ function initAboveQueueBtns() {
                 id: "clear-queue",
                 resourceName: "icon-clear_list",
                 titleKey: "clear_list",
-                interaction() {
+                interaction(evt) {
                     return __awaiter(this, void 0, void 0, function* () {
                         try {
                             // TODO: better confirmation dialog?
-                            if (!confirm(t("clear_list_confirm")))
-                                return;
-                            const url = new URL(location.href);
-                            url.searchParams.delete("list");
-                            url.searchParams.set("time_continue", String(yield getVideoTime(0)));
-                            location.assign(url);
+                            if (evt.shiftKey || confirm(t("clear_list_confirm"))) {
+                                const url = new URL(location.href);
+                                url.searchParams.delete("list");
+                                url.searchParams.set("time_continue", String(yield getVideoTime(0)));
+                                location.assign(url);
+                            }
                         }
                         catch (err) {
                             error("Couldn't clear queue due to an error:", err);
@@ -3466,7 +3467,7 @@ function initAboveQueueBtns() {
         });
     });
 }
-//#region thumbnail overlay
+//#region thumb.overlay
 /** To be changed when the toggle button is pressed - used to invert the state of "showOverlay" */
 let invertOverlay = false;
 function initThumbnailOverlay() {
@@ -3618,7 +3619,7 @@ function initThumbnailOverlay() {
         });
     });
 }
-//#region hide cursor on idle
+//#region idle hide cursor
 function initHideCursorOnIdle() {
     return __awaiter(this, void 0, void 0, function* () {
         addSelectorListener("mainPanel", "ytmusic-player#player", {
@@ -3686,11 +3687,12 @@ function fixHdrIssues() {
             log("Fixed HDR issues");
     });
 }
-//#region show likes&dislikes
+//#region show dis-/likes
 /** Shows the amount of likes and dislikes on the current song */
 function initShowVotes() {
     return __awaiter(this, void 0, void 0, function* () {
-        addSelectorListener("playerBar", ".middle-controls-buttons ytmusic-like-button-renderer", {
+        const voteContSelector = ".middle-controls-buttons ytmusic-like-button-renderer";
+        addSelectorListener("playerBar", voteContSelector, {
             listener(voteCont) {
                 return __awaiter(this, void 0, void 0, function* () {
                     try {
@@ -3698,7 +3700,7 @@ function initShowVotes() {
                         if (!watchId)
                             return error("Couldn't get watch ID while initializing showVotes");
                         const voteObj = yield fetchVideoVotes(watchId);
-                        if (!voteObj)
+                        if (!voteObj || !("likes" in voteObj) || !("dislikes" in voteObj) || !("rating" in voteObj))
                             return error("Couldn't fetch votes from ReturnYouTubeDislikes API");
                         getFeature("showVotes") && addVoteNumbers(voteCont, voteObj);
                         getFeature("showVoteRatio") && addVoteRatio(voteCont, voteObj);
@@ -3710,12 +3712,55 @@ function initShowVotes() {
             },
         });
         siteEvents.on("watchIdChanged", (watchId) => __awaiter(this, void 0, void 0, function* () {
+            const voteObj = yield fetchVideoVotes(watchId);
+            if (!voteObj || !("likes" in voteObj) || !("dislikes" in voteObj) || !("rating" in voteObj))
+                return error("Couldn't fetch votes from ReturnYouTubeDislikes API");
+            const labelLikes = document.querySelector("ytmusic-like-button-renderer .bytm-vote-label.likes");
+            const labelDislikes = document.querySelector("ytmusic-like-button-renderer .bytm-vote-label.dislikes");
+            if (!labelLikes || !labelDislikes)
+                return error("Couldn't find vote label elements while updating like and dislike counts");
+            labelLikes.textContent = voteObj.likes.toLocaleString(undefined, getVoteNumberFormat());
+            labelDislikes.textContent = voteObj.dislikes.toLocaleString(undefined, getVoteNumberFormat());
         }));
     });
 }
 function addVoteNumbers(voteCont, voteObj) {
+    const likeBtn = voteCont.querySelector("#button-shape-like");
+    const dislikeBtn = voteCont.querySelector("#button-shape-dislike");
+    if (!likeBtn || !dislikeBtn)
+        return error("Couldn't find like or dislike button while adding vote numbers");
+    const createLabel = (amount, type) => {
+        const label = document.createElement("span");
+        label.classList.add("bytm-vote-label", "bytm-no-select", type);
+        label.textContent = amount.toLocaleString(undefined, getVoteNumberFormat());
+        label.title = label.ariaLabel = t(`vote_label_${type}`, amount);
+        label.addEventListener("click", (e) => {
+            var _a;
+            e.preventDefault();
+            e.stopPropagation();
+            (_a = (type === "likes" ? likeBtn : dislikeBtn).querySelector("button")) === null || _a === void 0 ? void 0 : _a.click();
+        });
+        return label;
+    };
+    addStyleFromResource("css-show_votes").catch((e) => error("Couldn't add CSS for show votes feature due to an error:", e));
+    const likeLblEl = createLabel(voteObj.likes, "likes");
+    likeBtn.insertAdjacentElement("afterend", likeLblEl);
+    const dislikeLblEl = createLabel(voteObj.dislikes, "dislikes");
+    dislikeBtn.insertAdjacentElement("afterend", dislikeLblEl);
+}
+function getVoteNumberFormat() {
+    return getFeature("showVotesFormat") === "short"
+        ? {
+            notation: "compact",
+            compactDisplay: "short",
+        }
+        : {
+            style: "decimal",
+            maximumFractionDigits: 0,
+        };
 }
 function addVoteRatio(voteCont, voteObj) {
+    console.log("># TODO: addVoteRatio", voteCont, voteObj);
 }//#region beforeunload popup
 let beforeUnloadEnabled = true;
 /** Disables the popup before leaving the site */
@@ -3891,7 +3936,7 @@ function disableDarkReader() {
     metaElem.classList.add("bytm-disable-darkreader");
     document.head.appendChild(metaElem);
     info("Disabled Dark Reader");
-}const inputIgnoreTagNames = ["INPUT", "TEXTAREA", "SELECT", "BUTTON", "A"];
+}const inputIgnoreTagNames = ["INPUT", "TEXTAREA", "SELECT", "BUTTON", "A", "TP-YT-PAPER-SLIDER"];
 //#region arrow key skip
 function initArrowKeySkip() {
     return __awaiter(this, void 0, void 0, function* () {
@@ -3978,24 +4023,20 @@ function switchSite(newDomain) {
     });
 }
 //#region num keys skip
-const numKeysIgnoreTagNames = [...inputIgnoreTagNames, "TP-YT-PAPER-TAB"];
-const numKeysIgnoreIds = ["song-media-window"];
+const numKeysIgnoreTagNames = [...inputIgnoreTagNames];
 /** Adds the ability to skip to a certain time in the video by pressing a number key (0-9) */
 function initNumKeysSkip() {
     return __awaiter(this, void 0, void 0, function* () {
         document.addEventListener("keydown", (e) => {
-            var _a, _b, _c, _d;
+            var _a, _b;
             if (!getFeature("numKeysSkipToTime"))
                 return;
             if (!e.key.trim().match(/^[0-9]$/))
                 return;
-            if (isCfgMenuOpen)
-                return;
             // discard the event when an unexpected element is currently active or in focus, like when editing a playlist or when the search bar is focused
-            const ignoreElement = numKeysIgnoreIds.includes((_b = (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : "") // video element or player bar active
-                || numKeysIgnoreTagNames.includes((_d = (_c = document.activeElement) === null || _c === void 0 ? void 0 : _c.tagName) !== null && _d !== void 0 ? _d : ""); // other element active
+            const ignoreElement = numKeysIgnoreTagNames.includes((_b = (_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.tagName) !== null && _b !== void 0 ? _b : "");
             if ((document.activeElement !== document.body && ignoreElement) || ignoreElement)
-                return info("Captured valid key to skip video to, but ignored it since an unexpected element is active:", document.activeElement);
+                return info("Captured valid key to skip video to, but ignored it since this element is currently active:", document.activeElement);
             const vidElem = document.querySelector(getVideoSelector());
             if (!vidElem)
                 return warn("Could not find video element, so the keypress is ignored");
@@ -4008,7 +4049,7 @@ function initNumKeysSkip() {
         log("Added number key press listener");
     });
 }
-//#region auto-like channels
+//#region auto-like vids
 let canCompress$1 = false;
 /** DataStore instance for all auto-liked channels */
 const autoLikeStore = new UserUtils.DataStore({
@@ -5158,12 +5199,23 @@ const featInfo = {
         default: true,
         textAdornment: adornments.reloadRequired,
     },
+    showVotesFormat: {
+        type: "select",
+        category: "layout",
+        options: () => [
+            { value: "full", label: t("votes_format_full") },
+            { value: "short", label: t("votes_format_short") },
+        ],
+        default: "short",
+        reloadRequired: false,
+        enable: noop,
+    },
     showVoteRatio: {
         type: "select",
         category: "layout",
         options: () => [
             { value: "disabled", label: t("vote_ratio_disabled") },
-            { value: "redGreen", label: t("vote_ratio_red_green") },
+            { value: "greenRed", label: t("vote_ratio_green_red") },
             { value: "blueGray", label: t("vote_ratio_blue_gray") },
         ],
         default: "disabled",
@@ -5652,8 +5704,8 @@ const migrations = {
     6: (oldData) => useNewDefaultIfUnchanged(useDefaultConfig(oldData, [
         "autoLikeChannels", "autoLikeChannelToggleBtn",
         "autoLikeTimeout", "autoLikeShowToast",
-        "autoLikeOpenMgmtDialog",
-        "showVotes", "showVoteRatio",
+        "autoLikeOpenMgmtDialog", "showVotes",
+        "showVotesFormat", "showVoteRatio",
         "toastDuration", "initTimeout",
         // forgot to add this to the migration when adding the feature so now will have to do:
         "volumeSliderLabel",
@@ -5706,8 +5758,10 @@ function initConfig() {
         const oldFmtVer = Number(yield GM.getValue(`_uucfgver-${cfgDataStore.id}`, NaN));
         let data = yield cfgDataStore.loadData();
         // since the config changes so much in development keys need to be fixed in this special way
-        if (mode === "development")
-            data = fixMissingCfgKeys(data);
+        if (mode === "development") {
+            yield cfgDataStore.setData(fixMissingCfgKeys(data));
+            data = cfgDataStore.getData();
+        }
         log(`Initialized feature config DataStore (formatVersion = ${cfgDataStore.formatVersion})`);
         if (isNaN(oldFmtVer))
             info("  !- Config data was initialized with default values");
@@ -5730,15 +5784,15 @@ function initConfig() {
  * Returns a copy of the originally passed object if nothing needs to be fixed.
  */
 function fixMissingCfgKeys(cfg) {
-    cfg = Object.assign({}, cfg);
+    const newCfg = Object.assign({}, cfg);
     const passedKeys = Object.keys(cfg);
     const defaultKeys = Object.keys(defaultData);
     const missingKeys = defaultKeys.filter(k => !passedKeys.includes(k));
     if (missingKeys.length > 0) {
         for (const key of missingKeys)
-            cfg[key] = defaultData[key];
+            newCfg[key] = defaultData[key];
     }
-    return cfg;
+    return newCfg;
 }
 /** Returns the current feature config from the in-memory cache as a copy */
 function getFeatures() {
@@ -6670,10 +6724,10 @@ function fetchCss(key) {
 function fetchVideoVotes(watchId) {
     return __awaiter(this, void 0, void 0, function* () {
         try {
-            return (yield sendRequest({
+            return JSON.parse((yield sendRequest({
                 method: "GET",
                 url: `https://returnyoutubedislikeapi.com/votes?videoId=${watchId}`,
-            })).response;
+            })).response);
         }
         catch (err) {
             error("Couldn't fetch video votes due to an error:", err);