diff --git a/package-lock.json b/package-lock.json index 5cd00a3d..7e806d7e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10494,6 +10494,11 @@ "traverse": "0.4.x" } }, + "js-sha256": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", + "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", diff --git a/package.json b/package.json index b2b0ddbf..4a6b0783 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "babel-loader": "^8.0.6", "babel-preset-env": "^1.7.0", "concurrently": "^5.1.0", + "js-sha256": "^0.9.0", "react": "^16.12.0", "react-dom": "^16.12.0" }, diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json index 28929a20..6cb67739 100644 --- a/public/_locales/en/messages.json +++ b/public/_locales/en/messages.json @@ -202,6 +202,18 @@ "whatViewTracking": { "message": "This feature tracks which segments you have skipped to let users know how much their submission has helped others and used as a metric along with upvotes to ensure that spam doesn't get into the database. The extension sends a message to the server each time you skip a segment. Hopefully most people don't change this setting so that the view numbers are accurate. :)" }, + "enableQueryByHashPrefix": { + "message": "Query By Hash Prefix" + }, + "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 5a5e6caa..04620a9e 100644 --- a/public/options/options.html +++ b/public/options/options.html @@ -302,6 +302,40 @@
__MSG_whatViewTracking__
+
+
+ +
+ + +
+
+ +
__MSG_whatQueryByHashPrefix__
+
+ +
+
+ +
+ + +
+
+ +
__MSG_whatRefetchWhenNotFound__
+
+

diff --git a/src/config.ts b/src/config.ts index 3914a202..54f1201c 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,6 +34,8 @@ interface SBConfig { audioNotificationOnSkip, checkForUnlistedVideos: boolean, testingServer: boolean, + hashPrefix: boolean, + refetchWhenNotFound: boolean, // What categories should be skipped categorySelections: CategorySelection[], @@ -166,6 +167,8 @@ var Config: SBObject = { audioNotificationOnSkip: false, checkForUnlistedVideos: false, testingServer: false, + hashPrefix: false, + refetchWhenNotFound: true, categorySelections: [{ name: "sponsor", diff --git a/src/content.ts b/src/content.ts index f88955c1..91cb4f37 100644 --- a/src/content.ts +++ b/src/content.ts @@ -618,12 +618,36 @@ function sponsorsLookup(id: string) { categories.push(categorySelection.name); } - utils.asyncRequestToServer('GET', "/api/skipSegments", { - videoID: id, - categories - }).then(async (response: FetchResponse) => { + // Check for hashPrefix setting + let getRequest; + if (Config.config.hashPrefix) { + getRequest = utils.asyncRequestToServer('GET', "/api/skipSegments/" + utils.getHash(id, 1).substr(0,4), { + categories + }); + } else { + getRequest = utils.asyncRequestToServer('GET', "/api/skipSegments", { + videoID: id, + categories + }); + } + getRequest.then(async (response: FetchResponse) => { if (response?.ok) { - let recievedSegments: SponsorTime[] = JSON.parse(response.responseText); + let result = JSON.parse(response.responseText); + if (Config.config.hashPrefix) { + 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 + retryFetch(id); + return; + } + } + + let recievedSegments: SponsorTime[] = result; if (!recievedSegments.length) { console.error("[SponsorBlock] Server returned malformed response: " + JSON.stringify(recievedSegments)); return; @@ -667,32 +691,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 * diff --git a/src/utils.ts b/src/utils.ts index 43cdc68e..d95da7dc 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,5 +1,6 @@ import Config from "./config"; import { CategorySelection, SponsorTime, FetchResponse } from "./types"; +import { sha256 } from 'js-sha256'; import * as CompileConfig from "../config.json"; @@ -378,6 +379,20 @@ class Utils { isFirefox(): boolean { return typeof(browser) !== "undefined"; } + + getHash(value: string, times=5000): string { + if (times <= 0) return ""; + + for (let i = 0; i < times; i++) { + let hash = sha256.create(); + hash.update(value); + hash.hex(); + value = hash.toString(); + } + + return value; + } + } export default Utils; \ No newline at end of file