Browse Source

feat: yt support for like/dislike hotkeys

Sv443 2 days ago
parent
commit
8a0f452aac
2 changed files with 27 additions and 13 deletions
  1. 21 10
      src/features/hotkeys.ts
  2. 6 3
      src/features/input.ts

+ 21 - 10
src/features/hotkeys.ts

@@ -102,15 +102,26 @@ async function initLikeDislikeHotkeys() {
     if(inputIgnoreTagNames.includes(document.activeElement?.tagName ?? ""))
       return;
 
-    if(keyPressed(e, getFeature("likeHotkey"))) {
-      const likeRendererEl = document.querySelector<HTMLElement>(".middle-controls-buttons ytmusic-like-button-renderer");
-      const likeBtnEl = likeRendererEl?.querySelector<HTMLButtonElement>("#button-shape-like button");
-      likeBtnEl?.click();
-    }
-    else if(keyPressed(e, getFeature("dislikeHotkey"))) {
-      const dislikeRendererEl = document.querySelector<HTMLElement>(".middle-controls-buttons ytmusic-like-button-renderer");
-      const dislikeBtnEl = dislikeRendererEl?.querySelector<HTMLButtonElement>("#button-shape-dislike button");
-      dislikeBtnEl?.click();
-    }
+    const [likeBtn, dislikeBtn] = (() => {
+      switch(getDomain()) {
+      case "ytm": {
+        const likeRendererEl = document.querySelector<HTMLElement>(".middle-controls-buttons ytmusic-like-button-renderer");
+        const likeBtnEl = likeRendererEl?.querySelector<HTMLButtonElement>("#button-shape-like button");
+        const dislikeRendererEl = document.querySelector<HTMLElement>(".middle-controls-buttons ytmusic-like-button-renderer");
+        const dislikeBtnEl = dislikeRendererEl?.querySelector<HTMLButtonElement>("#button-shape-dislike button");
+        return [likeBtnEl ?? undefined, dislikeBtnEl ?? undefined];
+      }
+      case "yt": {
+        const likeBtnEl = document.querySelector<HTMLButtonElement>("ytd-watch-metadata segmented-like-dislike-button-view-model like-button-view-model button");
+        const dislikeBtnEl = document.querySelector<HTMLButtonElement>("ytd-watch-metadata segmented-like-dislike-button-view-model dislike-button-view-model button");
+        return [likeBtnEl ?? undefined, dislikeBtnEl ?? undefined];
+      }
+      }
+    })();
+
+    if(keyPressed(e, getFeature("likeHotkey")))
+      likeBtn?.click();
+    else if(keyPressed(e, getFeature("dislikeHotkey")))
+      dislikeBtn?.click();
   });
 }

+ 6 - 3
src/features/input.ts

@@ -27,7 +27,7 @@ export async function initArrowKeySkip() {
     if(!getFeature("arrowKeySupport"))
       return;
 
-    if(["ArrowUp", "ArrowDown"].includes(evt.code))
+    if(["ArrowUp", "ArrowDown"].includes(evt.code) && getDomain() === "ytm")
       return handleVolumeKeyPress(evt);
 
     if(!["ArrowLeft", "ArrowRight"].includes(evt.code))
@@ -64,8 +64,11 @@ function handleVolumeKeyPress(evt: KeyboardEvent) {
   evt.preventDefault();
   evt.stopImmediatePropagation();
 
-  if(!sliderEl || !getVideoElement())
-    return warn("Couldn't find video or volume slider element, so the keypress is ignored");
+  if(!getVideoElement())
+    return warn("Couldn't find video element, so the keypress is ignored");
+
+  if(!sliderEl)
+    return warn("Couldn't find volume slider element, so the keypress is ignored");
 
   const step = Number(sliderEl.step);
   const newVol = clamp(