diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json index 842e5d83..19a999b1 100644 --- a/public/_locales/en/messages.json +++ b/public/_locales/en/messages.json @@ -208,6 +208,12 @@ "whatQueryByHashPrefix": { "message": "Instead of requesting segments from the server using the videoID, the first 4 characters of the hash of the videoID are sent. This server will send back data for all videos with similar hashes." }, + "enableRefetchWhenNotFound": { + "message": "Refetch Segments On New Videos" + }, + "whatRefetchWhenNotFound": { + "message": "If the video is new, and there are no segments found, it will keep refetching every few minutes while you watch." + }, "showNotice": { "message": "Show Notice Again" }, diff --git a/public/options/options.html b/public/options/options.html index 92ac686d..04620a9e 100644 --- a/public/options/options.html +++ b/public/options/options.html @@ -319,6 +319,23 @@
__MSG_whatQueryByHashPrefix__
+
+
+ +
+ + +
+
+ +
__MSG_whatRefetchWhenNotFound__
+
+

diff --git a/src/config.ts b/src/config.ts index 9d830116..264fbe0d 100644 --- a/src/config.ts +++ b/src/config.ts @@ -6,7 +6,6 @@ const utils = new Utils(); interface SBConfig { userID: string, - // sponsorTimes: SBMap, segmentTimes: SBMap, defaultCategory: string, whitelistedChannels: string[], @@ -35,7 +34,8 @@ interface SBConfig { audioNotificationOnSkip, checkForUnlistedVideos: boolean, testingServer: boolean, - hashPrefix: boolean + hashPrefix: boolean, + refetchWhenNotFound: boolean, // What categories should be skipped categorySelections: CategorySelection[], @@ -168,6 +168,7 @@ var Config: SBObject = { checkForUnlistedVideos: false, testingServer: false, hashPrefix: false, + refetchWhenNotFound: true, categorySelections: [{ name: "sponsor", diff --git a/src/content.ts b/src/content.ts index 7661edc1..8787a2b7 100644 --- a/src/content.ts +++ b/src/content.ts @@ -632,20 +632,23 @@ function sponsorsLookup(id: string) { } getRequest.then(async (response: FetchResponse) => { if (response?.ok) { - let getResult = JSON.parse(response.responseText); + let result = JSON.parse(response.responseText); if (Config.config.hashPrefix) { - getResult = getResult.filter((video) => video.videoID === id); - if (getResult.length > 0) { - getResult = getResult[0].segments; - if (getResult.length === 0) { // return if no segments found + result = result.filter((video) => video.videoID === id); + if (result.length > 0) { + result = result[0].segments; + if (result.length === 0) { // return if no segments found + retryFetch(id); return; } } else { // return if no video found + console.log("refetching") + retryFetch(id); return; } } - let recievedSegments: SponsorTime[] = getResult; + let recievedSegments: SponsorTime[] = result; if (!recievedSegments.length) { console.error("[SponsorBlock] Server returned malformed response: " + JSON.stringify(recievedSegments)); return; @@ -689,32 +692,38 @@ function sponsorsLookup(id: string) { sponsorLookupRetries = 0; } else if (response?.status === 404) { - sponsorDataFound = false; - - //check if this video was uploaded recently - utils.wait(() => !!videoInfo).then(() => { - let dateUploaded = videoInfo?.microformat?.playerMicroformatRenderer?.uploadDate; - - //if less than 3 days old - if (Date.now() - new Date(dateUploaded).getTime() < 259200000) { - //TODO lower when server becomes better - setTimeout(() => sponsorsLookup(id), 180000); - } - }); - - sponsorLookupRetries = 0; + retryFetch(id); } else if (sponsorLookupRetries < 90 && !recheckStarted) { recheckStarted = true; //TODO lower when server becomes better (back to 1 second) //some error occurred, try again in a second - setTimeout(() => sponsorsLookup(id), 10000); + setTimeout(() => sponsorsLookup(id), 10000 + Math.random() * 30000); sponsorLookupRetries++; } }); } +function retryFetch(id: string): void { + if (!Config.config.refetchWhenNotFound) return; + + sponsorDataFound = false; + + //check if this video was uploaded recently + utils.wait(() => !!videoInfo).then(() => { + let dateUploaded = videoInfo?.microformat?.playerMicroformatRenderer?.uploadDate; + + //if less than 3 days old + if (Date.now() - new Date(dateUploaded).getTime() < 259200000) { + //TODO lower when server becomes better + setTimeout(() => sponsorsLookup(id), 120000); + } + }); + + sponsorLookupRetries = 0; +} + /** * Only should be used when it is okay to skip a sponsor when in the middle of it *