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
*