diff --git a/extension/content/inject.js b/extension/content/inject.js index 8aa9379..ff71620 100644 --- a/extension/content/inject.js +++ b/extension/content/inject.js @@ -733,6 +733,13 @@ function getRememberedSpeed(video) { var videoSpeed = tc.settings.speeds[sourceKey]; if (isValidSpeed(videoSpeed)) return videoSpeed; } + + // No per-source entry yet — fall back to the most recently used speed. + // This ensures e.g. YouTube Shorts carry the user's chosen speed to the + // next Short even when that exact source URL hasn't been visited before. + if (isValidSpeed(tc.settings.lastSpeed)) { + return tc.settings.lastSpeed; + } return null; } diff --git a/extension/manifest.json b/extension/manifest.json index 23960b8..976f5b2 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -1,7 +1,7 @@ { "name": "Speeder", "short_name": "Speeder", - "version": "6.0.0", + "version": "6.0.1", "manifest_version": 2, "description": "Speed up, slow down, advance and rewind HTML5 audio/video with shortcuts (New and improved version of \"Video Speed Controller\")", "homepage_url": "https://github.com/SoPat712/speeder", diff --git a/tests/speed-persistence.regression.test.js b/tests/speed-persistence.regression.test.js index ee3bb1a..05d569e 100644 --- a/tests/speed-persistence.regression.test.js +++ b/tests/speed-persistence.regression.test.js @@ -72,7 +72,7 @@ describe("durable playback-speed intent", () => { expect(window.tc.settings.rememberSpeed).toBe(true); }); - it("does not seed a brand-new Short from unrelated global lastSpeed", async () => { + it("seeds a brand-new Short from lastSpeed when remember is active", async () => { bootInject( { lastSpeed: 1.8 }, "https://www.youtube.com/shorts/new-source" @@ -80,6 +80,33 @@ describe("durable playback-speed intent", () => { const video = await createVideo(); expect(window.tc.settings.rememberSpeed).toBe(true); + expect(window.getRememberedSpeed(video)).toBe(1.8); + expect(video.playbackRate).toBe(1.8); + }); + + it("prefers per-source speed over lastSpeed fallback", async () => { + bootInject( + { lastSpeed: 2.0, rememberSpeed: true }, + "https://example.org/watch", + { + rememberedSpeeds: { + "https://example.org/a.mp4": { speed: 1.4, updatedAt: 100 } + } + } + ); + const video = await createVideo(); + + expect(window.getRememberedSpeed(video)).toBe(1.4); + expect(video.playbackRate).toBe(1.4); + }); + + it("does not fall back to lastSpeed when remember is off", async () => { + bootInject( + { lastSpeed: 1.8, rememberSpeed: false }, + "https://example.org/watch" + ); + const video = await createVideo(); + expect(window.getRememberedSpeed(video)).toBeNull(); expect(video.playbackRate).toBe(1); });