script.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. function getButtons() {
  2. return document
  3. .getElementById("menu-container")
  4. ?.querySelector("#top-level-buttons-computed");
  5. }
  6. function getLikeButton() {
  7. return getButtons().children[0];
  8. }
  9. function getDislikeButton() {
  10. return getButtons().children[1];
  11. }
  12. function isVideoLiked() {
  13. return getLikeButton().classList.contains("style-default-active");
  14. }
  15. function isVideoDisliked() {
  16. return getDislikeButton().classList.contains("style-default-active");
  17. }
  18. function isVideoNotLiked() {
  19. return getLikeButton().classList.contains("style-text");
  20. }
  21. function isVideoNotDisliked() {
  22. return getDislikeButton().classList.contains("style-text");
  23. }
  24. function getState() {
  25. if (isVideoLiked()) {
  26. return "liked";
  27. }
  28. if (isVideoDisliked()) {
  29. return "disliked";
  30. }
  31. return "neutral";
  32. }
  33. function setLikes(likesCount) {
  34. getButtons().children[0].querySelector("#text").innerText = likesCount;
  35. }
  36. function setDislikes(dislikesCount) {
  37. getButtons().children[1].querySelector("#text").innerText = dislikesCount;
  38. }
  39. function setState() {
  40. browser.runtime.sendMessage(
  41. {
  42. message: "set_state",
  43. videoId: getVideoId(window.location.href),
  44. state: getState(),
  45. },
  46. function (response) {
  47. if (response != undefined) {
  48. const formattedDislike = numberFormat(response.dislikes);
  49. // setLikes(response.likes);
  50. console.log(response);
  51. setDislikes(formattedDislike);
  52. createRateBar(response.likes, response.dislikes);
  53. } else {
  54. }
  55. }
  56. );
  57. }
  58. function likeClicked() {
  59. // console.log("like" + getState());
  60. // setState();
  61. }
  62. function dislikeClicked() {
  63. // console.log("dislike" + getState());
  64. // setState();
  65. }
  66. function setInitalState() {
  67. setState();
  68. // setTimeout(() => sendVideoIds(), 1500);
  69. }
  70. function getVideoId(url) {
  71. const urlObject = new URL(url);
  72. const videoId = urlObject.searchParams.get("v");
  73. return videoId;
  74. }
  75. function isVideoLoaded() {
  76. const videoId = getVideoId(window.location.href);
  77. return (
  78. document.querySelector(`ytd-watch-flexy[video-id='${videoId}']`) !== null
  79. );
  80. }
  81. function numberFormat(numberState) {
  82. const userLocales = navigator.language;
  83. const formatter = Intl.NumberFormat(userLocales, { notation: "compact" });
  84. return formatter.format(numberState);
  85. }
  86. function setEventListeners(evt) {
  87. function checkForJS_Finish() {
  88. if (getButtons()?.offsetParent && isVideoLoaded()) {
  89. clearInterval(jsInitChecktimer);
  90. const buttons = getButtons();
  91. if (!window.returnDislikeButtonlistenersSet) {
  92. buttons.children[0].addEventListener("click", likeClicked);
  93. buttons.children[1].addEventListener("click", dislikeClicked);
  94. let lastKnownScrollPosition = 0;
  95. let ticking = false;
  96. // document.addEventListener('scroll', function(e) {
  97. // lastKnownScrollPosition = window.scrollY;
  98. //
  99. // if (!ticking) {
  100. // window.requestAnimationFrame(function() {
  101. // // sendVideoIds();
  102. // ticking = false;
  103. // });
  104. //
  105. // ticking = true;
  106. // }
  107. // });
  108. window.returnDislikeButtonlistenersSet = true;
  109. }
  110. setInitalState();
  111. }
  112. }
  113. if (window.location.href.indexOf("watch?") >= 0) {
  114. var jsInitChecktimer = setInterval(checkForJS_Finish, 111);
  115. }
  116. }
  117. function createRateBar(likes, dislikes) {
  118. var rateBar = document.getElementById(
  119. "return-youtube-dislike-bar-container"
  120. );
  121. const widthPx =
  122. getButtons().children[0].clientWidth +
  123. getButtons().children[1].clientWidth;
  124. const widthPercent =
  125. likes + dislikes > 0 ? (likes / (likes + dislikes)) * 100 : 50;
  126. if (!rateBar) {
  127. document.getElementById("menu-container").insertAdjacentHTML(
  128. "beforeend",
  129. `<div id="return-youtube-dislike-bar-container"
  130. style="width: ${widthPx}px;
  131. height: 3px; margin-left: 6px;">
  132. <div id="return-youtube-dislike-bar" style="width: ${widthPercent}%; height: 100%" ></div>
  133. </div>`
  134. );
  135. } else {
  136. document.getElementById(
  137. "return-youtube-dislike-bar-container"
  138. ).style.width = widthPx + "px";
  139. document.getElementById("return-youtube-dislike-bar").style.width =
  140. widthPercent + "%";
  141. }
  142. }
  143. // function sendVideoIds() {
  144. // const ids = Array.from(
  145. // document.getElementsByClassName(
  146. // "yt-simple-endpoint ytd-compact-video-renderer"
  147. // )
  148. // )
  149. // .concat(
  150. // Array.from(
  151. // document.getElementsByClassName("yt-simple-endpoint ytd-thumbnail")
  152. // )
  153. // )
  154. // .filter((x) => x.href && x.href.indexOf("/watch?v=") > 0)
  155. // .map((x) => getVideoId(x.href));
  156. // browser.runtime.sendMessage({
  157. // message: "send_links",
  158. // videoIds: ids,
  159. // });
  160. // }
  161. setEventListeners();
  162. // document.addEventListener("yt-navigate-finish", function (event) {
  163. // if (jsInitChecktimer !== null) clearInterval(jsInitChecktimer);
  164. // window.returnDislikeButtonlistenersSet = false;
  165. // setEventListeners();
  166. // });
  167. // window.onscrollend = () => {
  168. // sendVideoIds();
  169. // };
  170. //
  171. // setTimeout(() => sendVideoIds(), 1500);
  172. //window.addEventListener("hashchange", setEventListeners, false);