ryd.content-script.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import {
  2. getButtons,
  3. getLikeButton,
  4. getDislikeButton,
  5. checkForSignInButton,
  6. } from "./src/buttons";
  7. import {
  8. isMobile,
  9. isVideoDisliked,
  10. isVideoLiked,
  11. getState,
  12. setState,
  13. setLikes,
  14. setDislikes,
  15. getLikeCountFromButton,
  16. LIKED_STATE,
  17. DISLIKED_STATE,
  18. NEUTRAL_STATE,
  19. } from "./src/state";
  20. import { numberFormat, getBrowser, getVideoId, isVideoLoaded, cLog } from "./src/utils";
  21. import { createRateBar } from "./src/bar";
  22. let storedData = {
  23. likes: 0,
  24. dislikes: 0,
  25. previousState: NEUTRAL_STATE,
  26. };
  27. function sendVote(vote) {
  28. getBrowser().runtime.sendMessage({
  29. message: "send_vote",
  30. vote: vote,
  31. videoId: getVideoId(window.location.href),
  32. });
  33. }
  34. function likeClicked() {
  35. if (checkForSignInButton() === false) {
  36. if (storedData.previousState === DISLIKED_STATE) {
  37. sendVote(1);
  38. storedData.dislikes--;
  39. storedData.likes++;
  40. createRateBar(storedData.likes, storedData.dislikes);
  41. setDislikes(numberFormat(storedData.dislikes));
  42. storedData.previousState = LIKED_STATE;
  43. } else if (storedData.previousState === NEUTRAL_STATE) {
  44. sendVote(1);
  45. storedData.likes++;
  46. createRateBar(storedData.likes, storedData.dislikes);
  47. storedData.previousState = LIKED_STATE;
  48. } else if ((storedData.previousState = LIKED_STATE)) {
  49. sendVote(0);
  50. storedData.likes--;
  51. createRateBar(storedData.likes, storedData.dislikes);
  52. storedData.previousState = NEUTRAL_STATE;
  53. }
  54. }
  55. }
  56. function dislikeClicked() {
  57. if (checkForSignInButton() == false) {
  58. if (storedData.previousState === NEUTRAL_STATE) {
  59. sendVote(-1);
  60. storedData.dislikes++;
  61. setDislikes(numberFormat(storedData.dislikes));
  62. createRateBar(storedData.likes, storedData.dislikes);
  63. storedData.previousState = DISLIKED_STATE;
  64. } else if (storedData.previousState === DISLIKED_STATE) {
  65. sendVote(0);
  66. storedData.dislikes--;
  67. setDislikes(numberFormat(storedData.dislikes));
  68. createRateBar(storedData.likes, storedData.dislikes);
  69. storedData.previousState = NEUTRAL_STATE;
  70. } else if (storedData.previousState === LIKED_STATE) {
  71. sendVote(-1);
  72. storedData.likes--;
  73. storedData.dislikes++;
  74. setDislikes(numberFormat(storedData.dislikes));
  75. createRateBar(storedData.likes, storedData.dislikes);
  76. storedData.previousState = DISLIKED_STATE;
  77. }
  78. }
  79. }
  80. function setInitialState() {
  81. setState(storedData);
  82. setTimeout(() => {
  83. sendVideoIds();
  84. }, 1500);
  85. }
  86. let jsInitChecktimer = null;
  87. function setEventListeners(evt) {
  88. function checkForJS_Finish() {
  89. if (getButtons()?.offsetParent && isVideoLoaded()) {
  90. clearInterval(jsInitChecktimer);
  91. jsInitChecktimer = null;
  92. const buttons = getButtons();
  93. if (!window.returnDislikeButtonlistenersSet) {
  94. buttons.children[0].addEventListener("click", likeClicked);
  95. buttons.children[1].addEventListener("click", dislikeClicked);
  96. window.returnDislikeButtonlistenersSet = true;
  97. }
  98. setInitialState();
  99. }
  100. }
  101. if (window.location.href.indexOf("watch?") >= 0) {
  102. jsInitChecktimer = setInterval(checkForJS_Finish, 111);
  103. }
  104. }
  105. function sendVideoIds() {
  106. let links = Array.from(
  107. document.getElementsByClassName(
  108. "yt-simple-endpoint ytd-compact-video-renderer"
  109. )
  110. ).concat(
  111. Array.from(
  112. document.getElementsByClassName("yt-simple-endpoint ytd-thumbnail")
  113. )
  114. );
  115. // Also try mobile
  116. if (links.length < 1)
  117. links = Array.from(
  118. document.querySelectorAll(
  119. ".large-media-item-metadata > a, a.large-media-item-thumbnail-container"
  120. )
  121. );
  122. const ids = links
  123. .filter((x) => x.href && x.href.indexOf("/watch?v=") > 0)
  124. .map((x) => getVideoId(x.href));
  125. getBrowser().runtime.sendMessage({
  126. message: "send_links",
  127. videoIds: ids,
  128. });
  129. }
  130. setEventListeners();
  131. document.addEventListener("yt-navigate-finish", function (event) {
  132. if (jsInitChecktimer !== null) clearInterval(jsInitChecktimer);
  133. window.returnDislikeButtonlistenersSet = false;
  134. setEventListeners();
  135. });
  136. setTimeout(() => sendVideoIds(), 2500);