소스 검색

fix: potential race condition

Sven 1 년 전
부모
커밋
4aae78b54a
1개의 변경된 파일22개의 추가작업 그리고 24개의 파일을 삭제
  1. 22 24
      src/features/behavior.ts

+ 22 - 24
src/features/behavior.ts

@@ -1,5 +1,5 @@
 import { clamp, pauseFor } from "@sv443-network/userutils";
-import { error, getDomain, getVideoTime, info, log, onSelectorOld, videoSelector } from "../utils";
+import { domLoaded, error, getDomain, getVideoTime, info, log, onSelectorOld, videoSelector, waitVideoElementReady } from "../utils";
 import { LogLevel } from "../types";
 import { getFeatures } from "src/config";
 
@@ -97,7 +97,10 @@ interface RemSongObj {
 
 let remSongsCache: RemSongObj[] = [];
 
-/** Remembers the time of the last played song and resumes playback from that time */
+/**
+ * Remembers the time of the last played song and resumes playback from that time  
+ * CALLED BEFORE DOM IS READY!
+ */
 export async function initRememberSongTime() {
   if(getFeatures().rememberSongTimeSites !== "all" && getFeatures().rememberSongTimeSites !== getDomain())
     return;
@@ -113,8 +116,16 @@ export async function initRememberSongTime() {
   if(location.pathname.startsWith("/watch"))
     await restoreSongTime();
 
-  remSongUpdateEntry();
-  setInterval(remSongUpdateEntry, 1000);
+  if(!domLoaded) {
+    document.addEventListener("DOMContentLoaded", () => {
+      remSongUpdateEntry();
+      setInterval(remSongUpdateEntry, 1000);
+    });
+  }
+  else {
+    remSongUpdateEntry();
+    setInterval(remSongUpdateEntry, 1000);
+  }
 }
 
 /** Tries to restore the time of the currently playing song */
@@ -132,26 +143,13 @@ async function restoreSongTime() {
         return;
       }
       else {
-        onSelectorOld<HTMLVideoElement>(videoSelector, {
-          listener: async (vidElem) => {
-            if(vidElem) {
-              const applyTime = async () => {
-                if(isNaN(entry.songTime))
-                  return;
-                const vidRestoreTime = entry.songTime - (getFeatures().rememberSongTimeReduction ?? 0);
-                vidElem.currentTime = clamp(Math.max(vidRestoreTime, 0), 0, vidElem.duration);
-                await delRemSongData(entry.watchID);
-                info(`Restored song time to ${Math.floor(vidRestoreTime / 60)}m, ${(vidRestoreTime % 60).toFixed(1)}s`, LogLevel.Info);
-              };
-
-              // jump to video time just after YT has finished doing their own shenanigans
-              if(vidElem.readyState === 4)
-                applyTime();
-              else
-                vidElem.addEventListener("canplay", applyTime, { once: true });
-            }
-          },
-        });
+        if(isNaN(entry.songTime))
+          return;
+        const vidElem = await waitVideoElementReady();
+        const vidRestoreTime = entry.songTime - (getFeatures().rememberSongTimeReduction ?? 0);
+        vidElem.currentTime = clamp(Math.max(vidRestoreTime, 0), 0, vidElem.duration);
+        await delRemSongData(entry.watchID);
+        info(`Restored song time to ${Math.floor(vidRestoreTime / 60)}m, ${(vidRestoreTime % 60).toFixed(1)}s`, LogLevel.Info);
       }
     }
   }