浏览代码

checks for youtube locale and uses navigator.language as fallback

DARKDRAGON532 3 年之前
父节点
当前提交
4ba6ef9f9e

+ 48 - 30
Extensions/UserScript/Return Youtube Dislike.user.js

@@ -26,10 +26,10 @@ const LIKED_STATE = "LIKED_STATE";
 const DISLIKED_STATE = "DISLIKED_STATE";
 const NEUTRAL_STATE = "NEUTRAL_STATE";
 
-var isMobile = (location.hostname == "m.youtube.com");
+var isMobile = location.hostname == "m.youtube.com";
 var mobileDislikes = 0;
-function cLog(text, subtext = '') {
-  subtext = subtext.trim() === '' ? '' : `(${subtext})`;
+function cLog(text, subtext = "") {
+  subtext = subtext.trim() === "" ? "" : `(${subtext})`;
   console.log(`[Return YouTube Dislikes] ${text} ${subtext}`);
 }
 
@@ -56,14 +56,20 @@ function getDislikeButton() {
 
 function isVideoLiked() {
   if (isMobile) {
-    return getLikeButton().querySelector("button").getAttribute("aria-label") == "true";
+    return (
+      getLikeButton().querySelector("button").getAttribute("aria-label") ==
+      "true"
+    );
   }
   return getLikeButton().classList.contains("style-default-active");
 }
 
 function isVideoDisliked() {
   if (isMobile) {
-    return getDislikeButton().querySelector("button").getAttribute("aria-label") == "true";
+    return (
+      getDislikeButton().querySelector("button").getAttribute("aria-label") ==
+      "true"
+    );
   }
   return getDislikeButton().classList.contains("style-default-active");
 }
@@ -94,7 +100,8 @@ function getState() {
 
 function setLikes(likesCount) {
   if (isMobile) {
-    getButtons().children[0].querySelector(".button-renderer-text").innerText = likesCount;
+    getButtons().children[0].querySelector(".button-renderer-text").innerText =
+      likesCount;
     return;
   }
   getButtons().children[0].querySelector("#text").innerText = likesCount;
@@ -108,14 +115,14 @@ function setDislikes(dislikesCount) {
   getButtons().children[1].querySelector("#text").innerText = dislikesCount;
 }
 
-(typeof GM_addStyle != 'undefined'
- ? GM_addStyle
- : styles => {
-  var styleNode = document.createElement("style")
-  styleNode.type = "text/css";
-  styleNode.innerText = styles;
-  document.head.appendChild(styleNode);
-})(`
+(typeof GM_addStyle != "undefined"
+  ? GM_addStyle
+  : (styles) => {
+      var styleNode = document.createElement("style");
+      styleNode.type = "text/css";
+      styleNode.innerText = styles;
+      document.head.appendChild(styleNode);
+    })(`
     #return-youtube-dislike-bar-container {
       background: var(--yt-spec-icon-disabled);
       border-radius: 2px;
@@ -201,7 +208,8 @@ function setState() {
       method: "GET",
       url: `https://youtube.com/watch?v=${getVideoId()}`,
       headers: {
-        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.3674"
+        "User-Agent":
+          "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.3674",
       },
       onload: (response) => {
         let result = getDislikesFromYoutubeResponse(response.responseText);
@@ -215,10 +223,9 @@ function setState() {
             statsSet = true;
           }
         }
-      }
+      },
     });
-  }
-  else {
+  } else {
     fetch(`https://youtube.com/watch?v=${getVideoId()}`).then((response) => {
       response.text().then((text) => {
         let result = getDislikesFromYoutubeResponse(text);
@@ -267,7 +274,7 @@ function setInitialState() {
 function getVideoId() {
   const urlObject = new URL(window.location.href);
   const pathname = urlObject.pathname;
-  if (pathname.startsWith('/clips')) {
+  if (pathname.startsWith("/clips")) {
     return document.querySelector("meta[itemprop='videoId']").content;
   } else {
     return urlObject.searchParams.get("v");
@@ -294,13 +301,20 @@ function roundDown(num) {
 }
 
 function numberFormat(numberState) {
-  const userLocales = document.documentElement.lang;
-
-  const formatter = Intl.NumberFormat(userLocales, {
-    notation: "compact",
-    minimumFractionDigits: 1,
-    maximumFractionDigits: 1,
-  });
+  const userLocales = new URL(
+    Array.from(document.querySelectorAll("head > link[rel='search']"))
+      ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
+      ?.getAttribute("href")
+  )?.searchParams?.get("locale");
+
+  const formatter = Intl.NumberFormat(
+    userLocales || document.documentElement.lang,
+    {
+      notation: "compact",
+      minimumFractionDigits: 1,
+      maximumFractionDigits: 1,
+    }
+  );
 
   return formatter.format(roundDown(numberState)).replace(/\.0|,0/, "");
 }
@@ -338,7 +352,7 @@ function getDislikesFromYoutubeResponse(htmlResponse) {
 
 function setEventListeners(evt) {
   function checkForJS_Finish(check) {
-    console.log()
+    console.log();
     if (getButtons()?.offsetParent && isVideoLoaded()) {
       clearInterval(jsInitChecktimer);
       const buttons = getButtons();
@@ -353,7 +367,10 @@ function setEventListeners(evt) {
     }
   }
 
-  if (window.location.href.indexOf("watch?") >= 0 || (isMobile && evt?.indexOf("watch?") >= 0)) {
+  if (
+    window.location.href.indexOf("watch?") >= 0 ||
+    (isMobile && evt?.indexOf("watch?") >= 0)
+  ) {
     cLog("Setting up...");
     var jsInitChecktimer = setInterval(checkForJS_Finish, 111);
   }
@@ -370,8 +387,9 @@ if (isMobile) {
     window.returnDislikeButtonlistenersSet = false;
     setEventListeners(args[2]);
     return originalPush.apply(history, args);
-  }
+  };
   setInterval(() => {
-    getDislikeButton().querySelector(".button-renderer-text").innerText = mobileDislikes;
+    getDislikeButton().querySelector(".button-renderer-text").innerText =
+      mobileDislikes;
   }, 1000);
 }

+ 13 - 14
Extensions/chrome/return-youtube-dislike.script.js

@@ -5,7 +5,7 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
 (function (extensionId) {
   let storedData = {
     dislikes: 0,
-    previousState: NEUTRAL_STATE
+    previousState: NEUTRAL_STATE,
   };
 
   function cLog(message, writer) {
@@ -18,9 +18,8 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
   }
 
   function getButtons() {
-
     //---   If Menu Element Is Displayed:   ---//
-    if (document.getElementById('menu-container')?.offsetParent === null) {
+    if (document.getElementById("menu-container")?.offsetParent === null) {
       return document.querySelector(
         "ytd-menu-renderer.ytd-watch-metadata > div"
       );
@@ -74,8 +73,6 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
     getButtons().children[1].querySelector("#text").innerText = dislikesCount;
   }
 
-
-
   function setState() {
     let statsSet = false;
     chrome.runtime.sendMessage(
@@ -125,7 +122,7 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
   }
 
   function likeClicked() {
-    console.log(storedData.previousState)
+    console.log(storedData.previousState);
     if (storedData.previousState == DISLIKED_STATE) {
       storedData.dislikes--;
       setDislikes(numberFormat(storedData.dislikes));
@@ -159,7 +156,7 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
   function getVideoId(url) {
     const urlObject = new URL(url);
     const pathname = urlObject.pathname;
-    if (pathname.startsWith('/clips')) {
+    if (pathname.startsWith("/clips")) {
       return document.querySelector("meta[itemprop='videoId']").content;
     } else {
       return urlObject.searchParams.get("v");
@@ -178,14 +175,18 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
     const int = Math.floor(Math.log10(num) - 2);
     const decimal = int + (int % 3 ? 1 : 0);
     const value = Math.floor(num / 10 ** decimal);
-    return value * (10 ** decimal);
+    return value * 10 ** decimal;
   }
 
   function numberFormat(numberState) {
-    const userLocales = navigator.language;
-
-    const formatter = Intl.NumberFormat(userLocales, {
-      notation: 'compact'
+    const userLocales = new URL(
+      Array.from(document.querySelectorAll("head > link[rel='search']"))
+        ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
+        ?.getAttribute("href")
+    )?.searchParams?.get("locale");
+
+    const formatter = Intl.NumberFormat(userLocales || navigator.language, {
+      notation: "compact",
     });
 
     return formatter.format(roundDown(numberState));
@@ -288,7 +289,5 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
     setEventListeners();
   });
 
-
-
   setTimeout(() => sendVideoIds(), 2500);
 })(document.currentScript.getAttribute("extension-id"));

+ 11 - 8
Extensions/firefox/return-youtube-dislike.script.js

@@ -5,7 +5,7 @@ const NEUTRAL_STATE = "NEUTRAL_STATE";
 if (!storedData) {
   var storedData = {
     dislikes: 0,
-    previousState: NEUTRAL_STATE
+    previousState: NEUTRAL_STATE,
   };
 }
 
@@ -121,10 +121,10 @@ function setState() {
 }
 
 function likeClicked() {
-  if (storedData.previousState === 'disliked') {
+  if (storedData.previousState === "disliked") {
     storedData.dislikes--;
     setDislikes(numberFormat(storedData.dislikes));
-    storedData.previousState = 'liked';
+    storedData.previousState = "liked";
   }
 }
 
@@ -151,7 +151,7 @@ function setInitialState() {
 function getVideoId(url) {
   const urlObject = new URL(url);
   const pathname = urlObject.pathname;
-  if (pathname.startsWith('/clips')) {
+  if (pathname.startsWith("/clips")) {
     return document.querySelector("meta[itemprop='videoId']").content;
   } else {
     return urlObject.searchParams.get("v");
@@ -174,10 +174,13 @@ function roundDown(num) {
 }
 
 function numberFormat(numberState) {
-  const userLocales = navigator.language;
-
-  const formatter = Intl.NumberFormat(userLocales, {
-    notation: "compact"
+  const userLocales = new URL(
+    Array.from(document.querySelectorAll("head > link[rel='search']"))
+      ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
+      ?.getAttribute("href")
+  )?.searchParams?.get("locale");
+  const formatter = Intl.NumberFormat(userLocales || navigator.language, {
+    notation: "compact",
   });
 
   return formatter.format(roundDown(numberState));