diff --git a/public/_locales/en/messages.json b/public/_locales/en/messages.json index 12625d80..db260eb0 100644 --- a/public/_locales/en/messages.json +++ b/public/_locales/en/messages.json @@ -419,5 +419,14 @@ }, "areYouSureReset": { "message": "Are you sure you would like to reset this?" + }, + "confirmPrivacy": { + "message": "The video has been detected as unlisted. Click cancel if you do not want to check for sponsors." + }, + "unlistedCheck": { + "message": "Ignore Unlisted Videos" + }, + "whatUnlistedCheck": { + "message": "This setting will significantly slow down SponsorBlock. Sponsor lookups require sending the video ID to the server. If you are concerned about unlisted video IDs being sent over the internet, enable this option." } } diff --git a/public/options/options.html b/public/options/options.html index 52530d36..72916c3a 100644 --- a/public/options/options.html +++ b/public/options/options.html @@ -261,6 +261,23 @@
__MSG_whatViewTracking__
+ +
+
+ +
+ + +
+
+ +
__MSG_whatUnlistedCheck__
+


diff --git a/src/config.ts b/src/config.ts index cbb8d40f..7ad653cd 100644 --- a/src/config.ts +++ b/src/config.ts @@ -24,7 +24,8 @@ interface SBConfig { autoUpvote: boolean, supportInvidious: boolean, serverAddress: string, - minDuration: number + minDuration: number, + checkForUnlistedVideos: boolean } interface SBObject { @@ -119,7 +120,8 @@ var Config: SBObject = { autoUpvote: true, supportInvidious: false, serverAddress: CompileConfig.serverAddress, - minDuration: 0 + minDuration: 0, + checkForUnlistedVideos: false }, localConfig: null, config: null diff --git a/src/content.ts b/src/content.ts index 4ca4f1e5..dba13c35 100644 --- a/src/content.ts +++ b/src/content.ts @@ -230,7 +230,7 @@ function resetValues() { sponsorDataFound = false; } -function videoIDChange(id) { +async function videoIDChange(id) { //if the id has not changed return if (sponsorVideoID === id) return; @@ -242,6 +242,19 @@ function videoIDChange(id) { //id is not valid if (!id) return; + // Wait for options to be ready + await utils.wait(() => Config.config !== null, 5000, 1); + + // If enabled, it will check if this video is private or unlisted and double check with the user if the sponsors should be looked up + if (Config.config.checkForUnlistedVideos) { + await utils.wait(isPrivacyInfoAvailable); + + if (isUnlisted()) { + let shouldContinue = confirm(chrome.i18n.getMessage("confirmPrivacy")); + if(!shouldContinue) return; + } + } + // TODO: Use a better method here than using type any // This is done to be able to do channelIDPromise.isFulfilled and channelIDPromise.isRejected let channelIDPromise: any = utils.wait(getChannelID); @@ -1121,6 +1134,32 @@ function getSponsorTimesMessage(sponsorTimes) { return sponsorTimesMessage; } +// Privacy utils +function isPrivacyInfoAvailable(): boolean { + if(document.location.pathname.startsWith("/embed/")) return true; + return document.getElementsByClassName("style-scope ytd-badge-supported-renderer").length >= 2; +} + +/** + * What privacy level is this YouTube video? + */ +function getPrivacy(): string { + if(document.location.pathname.startsWith("/embed/")) return "Public"; + + let privacyElement = document.getElementsByClassName("style-scope ytd-badge-supported-renderer")[2]; + return privacyElement.innerText; +} + +/** + * Is this an unlisted YouTube video. + * Assumes that the the privacy info is available. + */ +function isUnlisted(): boolean { + let privacyElement = document.getElementsByClassName("style-scope ytd-badge-supported-renderer")[2]; + + return privacyElement.innerText.toLocaleLowerCase() === "unlisted"; +} + /** * Adds the CSS to the page if needed. Required on optional sites with Chrome. */