utils.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import { extConfig } from "./state";
  2. function roundDown(num) {
  3. if (num < 1000) return num;
  4. const int = Math.floor(Math.log10(num) - 2);
  5. const decimal = int + (int % 3 ? 1 : 0);
  6. const value = Math.floor(num / 10 ** decimal);
  7. return value * 10 ** decimal;
  8. }
  9. function numberFormat(numberState) {
  10. let userLocales;
  11. try {
  12. userLocales = new URL(
  13. Array.from(document.querySelectorAll("head > link[rel='search']"))
  14. ?.find((n) => n?.getAttribute("href")?.includes("?locale="))
  15. ?.getAttribute("href")
  16. )?.searchParams?.get("locale");
  17. } catch {}
  18. let numberDisplay;
  19. if (extConfig.numberDisplayRoundDown === false) {
  20. numberDisplay = numberState;
  21. } else {
  22. numberDisplay = roundDown(numberState);
  23. }
  24. return getNumberFormatter(extConfig.numberDisplayFormat).format(
  25. numberDisplay
  26. );
  27. }
  28. function getNumberFormatter(optionSelect) {
  29. let formatterNotation;
  30. let formatterCompactDisplay;
  31. switch (optionSelect) {
  32. case "compactLong":
  33. formatterNotation = "compact";
  34. formatterCompactDisplay = "long";
  35. break;
  36. case "standard":
  37. formatterNotation = "standard";
  38. formatterCompactDisplay = "short";
  39. break;
  40. case "compactShort":
  41. default:
  42. formatterNotation = "compact";
  43. formatterCompactDisplay = "short";
  44. }
  45. const formatter = Intl.NumberFormat(
  46. document.documentElement.lang || userLocales || navigator.language,
  47. {
  48. notation: formatterNotation,
  49. compactDisplay: formatterCompactDisplay,
  50. }
  51. );
  52. return formatter;
  53. }
  54. function getBrowser() {
  55. if (typeof chrome !== "undefined" && typeof chrome.runtime !== "undefined") {
  56. return chrome;
  57. } else if (
  58. typeof browser !== "undefined" &&
  59. typeof browser.runtime !== "undefined"
  60. ) {
  61. return browser;
  62. } else {
  63. console.log("browser is not supported");
  64. return false;
  65. }
  66. }
  67. function getVideoId(url) {
  68. const urlObject = new URL(url);
  69. const pathname = urlObject.pathname;
  70. if (pathname.startsWith("/clip")) {
  71. return document.querySelector("meta[itemprop='videoId']").content;
  72. } else {
  73. if (pathname.startsWith("/shorts")) {
  74. return pathname.substr(8);
  75. }
  76. return urlObject.searchParams.get("v");
  77. }
  78. }
  79. function isInViewport(element) {
  80. const rect = element.getBoundingClientRect();
  81. const height = innerHeight || document.documentElement.clientHeight;
  82. const width = innerWidth || document.documentElement.clientWidth;
  83. return (
  84. rect.top >= 0 &&
  85. rect.left >= 0 &&
  86. rect.bottom <= height &&
  87. rect.right <= width
  88. );
  89. }
  90. function isVideoLoaded() {
  91. const videoId = getVideoId(window.location.href);
  92. return (
  93. document.querySelector(`ytd-watch-flexy[video-id='${videoId}']`) !== null ||
  94. // mobile: no video-id attribute
  95. document.querySelector('#player[loading="false"]:not([hidden])') !== null
  96. );
  97. }
  98. function cLog(message, writer) {
  99. message = `[return youtube dislike]: ${message}`;
  100. if (writer) {
  101. writer(message);
  102. } else {
  103. console.log(message);
  104. }
  105. }
  106. function getColorFromTheme(voteIsLike) {
  107. let colorString;
  108. switch (extConfig.colorTheme) {
  109. case "accessible":
  110. if (voteIsLike === true) {
  111. colorString = "dodgerblue";
  112. } else {
  113. colorString = "gold";
  114. }
  115. break;
  116. case "neon":
  117. if (voteIsLike === true) {
  118. colorString = "aqua";
  119. } else {
  120. colorString = "magenta";
  121. }
  122. break;
  123. case "classic":
  124. default:
  125. if (voteIsLike === true) {
  126. colorString = "lime";
  127. } else {
  128. colorString = "red";
  129. }
  130. }
  131. return colorString;
  132. }
  133. export {
  134. numberFormat,
  135. getBrowser,
  136. getVideoId,
  137. isInViewport,
  138. isVideoLoaded,
  139. cLog,
  140. getColorFromTheme,
  141. };