From a4eb37db189b23248da06a10b11c3ce0f6f1fa07 Mon Sep 17 00:00:00 2001 From: Official Noob <31563761+OfficialNoob@users.noreply.github.com> Date: Tue, 30 Jul 2019 19:41:06 +0100 Subject: [PATCH 01/17] Added ErrorParser --- popup.js | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/popup.js b/popup.js index 2e75f971..1e3fcaca 100644 --- a/popup.js +++ b/popup.js @@ -27,6 +27,9 @@ SB.sponsorTimesViewsDisplayEndWord = document.getElementById("sponsorTimesViewsD // discordButtons SB.discordButtonContainer = document.getElementById("discordButtonContainer"); SB.hideDiscordButton = document.getElementById("hideDiscordButton"); +// submitTimesInfoMessage +SB.submitTimesInfoMessageContainer = document.getElementById("submitTimesInfoMessage"); +SB.submitTimesInfoMessage = document.getElementById("submitTimesInfoMessage"); //setup click listeners SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); @@ -584,10 +587,25 @@ function clearTimes() { resetStartTimeChosen(); } +var EN_US = new Map(); + +EN_US.set(400, 'Server said this request was invalid"') + .set(429, 'You have submitted too many sponsor times for this one video, are you sure there are this many?') + .set(409, 'This has already been submitted before') + .set(502, 'It seems the server is down. Contact the dev to inform them.') + .set('Unknown', 'here was an error submitting your sponsor times, please try again later.'); + +function ErrorParser (Lang, statusCode) { + if(Lang.has(statusCode)) return Lang.get(statusCode); + Unknown = Lang.get('Unknown'); + Unknown += Error code " + statusCode; + return Lang.get('Unknown'); +} + function submitTimes() { //make info message say loading - document.getElementById("submitTimesInfoMessage").innerText = "Loading..."; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + SB.submitTimesInfoMessage.innerText = "Loading..."; + SB.submitTimesInfoMessageContainer.style.display = "unset"; if (sponsorTimes.length > 0) { chrome.runtime.sendMessage({ @@ -597,24 +615,11 @@ function submitTimes() { if (response != undefined) { if (response.statusCode == 200) { //hide loading message - document.getElementById("submitTimesInfoMessageContainer").style.display = "none"; - + SB.submitTimesInfoMessageContainer.style.display = "none"; clearTimes(); - } else if(response.statusCode == 400) { - document.getElementById("submitTimesInfoMessage").innerText = "Server said this request was invalid"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 429) { - document.getElementById("submitTimesInfoMessage").innerText = "You have submitted too many sponsor times for this one video, are you sure there are this many?"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 409) { - document.getElementById("submitTimesInfoMessage").innerText = "This has already been submitted before"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 502) { - document.getElementById("submitTimesInfoMessage").innerText = "It seems the server is down. Contact the dev to inform them. Error code " + response.statusCode; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; } else { - document.getElementById("submitTimesInfoMessage").innerText = "There was an error submitting your sponsor times, please try again later. Error code " + response.statusCode; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + ErrorParser(EN_US, response.statusCode); + SB.submitTimesInfoMessageContainer.style.display = "unset"; } } }); From 0d8c18a38af16443cfe8475272af86144d17e13a Mon Sep 17 00:00:00 2001 From: Official Noob <31563761+OfficialNoob@users.noreply.github.com> Date: Tue, 30 Jul 2019 19:44:45 +0100 Subject: [PATCH 02/17] Update popup.js --- popup.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/popup.js b/popup.js index 1e3fcaca..824ffbde 100644 --- a/popup.js +++ b/popup.js @@ -593,13 +593,11 @@ EN_US.set(400, 'Server said this request was invalid"') .set(429, 'You have submitted too many sponsor times for this one video, are you sure there are this many?') .set(409, 'This has already been submitted before') .set(502, 'It seems the server is down. Contact the dev to inform them.') - .set('Unknown', 'here was an error submitting your sponsor times, please try again later.'); + .set('Unknown', 'there was an error submitting your sponsor times, please try again later.'); function ErrorParser (Lang, statusCode) { if(Lang.has(statusCode)) return Lang.get(statusCode); - Unknown = Lang.get('Unknown'); - Unknown += Error code " + statusCode; - return Lang.get('Unknown'); + return Lang.get('Unknown').concat(" Error code: ") + statusCode; } function submitTimes() { From 69dee25ea8d95aeacf338c5f4a80604f3a219f13 Mon Sep 17 00:00:00 2001 From: Official Noob <31563761+OfficialNoob@users.noreply.github.com> Date: Tue, 30 Jul 2019 20:43:45 +0100 Subject: [PATCH 03/17] "Improvements" to the Ref system --- popup.js | 75 ++++++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 35 deletions(-) diff --git a/popup.js b/popup.js index 71aa4e87..43a646df 100644 --- a/popup.js +++ b/popup.js @@ -1,32 +1,39 @@ -// References var SB = {}; -SB.sponsorStart = document.getElementById("sponsorStart"); -SB.clearTimes = document.getElementById("clearTimes"); -SB.submitTimes = document.getElementById("submitTimes"); -SB.showNoticeAgain = document.getElementById("showNoticeAgain"); -SB.hideVideoPlayerControls = document.getElementById("hideVideoPlayerControls"); -SB.showVideoPlayerControls = document.getElementById("showVideoPlayerControls"); -SB.hideInfoButtonPlayerControls = document.getElementById("hideInfoButtonPlayerControls"); -SB.showInfoButtonPlayerControls = document.getElementById("showInfoButtonPlayerControls"); -SB.hideDeleteButtonPlayerControls = document.getElementById("hideDeleteButtonPlayerControls"); -SB.showDeleteButtonPlayerControls = document.getElementById("showDeleteButtonPlayerControls"); -SB.disableSponsorViewTracking = document.getElementById("disableSponsorViewTracking"); -SB.enableSponsorViewTracking = document.getElementById("enableSponsorViewTracking"); -SB.optionsButton = document.getElementById("optionsButton"); -SB.reportAnIssue = document.getElementById("reportAnIssue"); +["sponsorStart", +"clearTimes", +"submitTimes", +"showNoticeAgain", +"hideVideoPlayerControls", +"showVideoPlayerControls", +"hideInfoButtonPlayerControls", +"showInfoButtonPlayerControls", +"hideDeleteButtonPlayerControls", +"showDeleteButtonPlayerControls", +"disableSponsorViewTracking", +"enableSponsorViewTracking", +"optionsButton", +"reportAnIssue", // sponsorTimesContributions -SB.sponsorTimesContributionsContainer = document.getElementById("sponsorTimesContributionsContainer"); -SB.sponsorTimesContributionsDisplay = document.getElementById("sponsorTimesContributionsDisplay"); -SB.sponsorTimesContributionsDisplayEndWord = document.getElementById("sponsorTimesContributionsDisplayEndWord"); +"sponsorTimesContributionsContainer", +"sponsorTimesContributionsDisplay", +"sponsorTimesContributionsDisplayEndWord", // sponsorTimesViewsDisplay -SB.sponsorTimesViewsContainer = document.getElementById("sponsorTimesViewsDisplayContainer"); -SB.sponsorTimesViewsDisplay = document.getElementById("sponsorTimesViewsDisplayDisplay"); -SB.sponsorTimesViewsDisplayEndWord = document.getElementById("sponsorTimesViewsDisplayDisplayEndWord"); +"sponsorTimesViewsContainer", +"sponsorTimesViewsDisplay", +"sponsorTimesViewsDisplayEndWord", // discordButtons -SB.discordButtonContainer = document.getElementById("discordButtonContainer"); -SB.hideDiscordButton = document.getElementById("hideDiscordButton"); +"discordButtonContainer", +"hideDiscordButton", +// More + "submissionSection", + "mainControls", + "loadingIndicator", + "videoFound", + "sponsorMessageTimes", + "downloadedSponsorMessageTimes", +].forEach(id => SB[id] = document.getElementById(id)); //setup click listeners SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); @@ -186,7 +193,7 @@ function loadTabData(tabs) { displaySponsorTimes(); //show submission section - document.getElementById("submissionSection").style.display = "unset"; + submissionSection.style.display = "unset"; showSubmitTimesIfNecessary(); } @@ -214,15 +221,15 @@ function infoFound(request) { isYouTubeTab = true; //remove loading text - document.getElementById("mainControls").style.display = "unset" - document.getElementById("loadingIndicator").innerHTML = ""; + SB.mainControls.style.display = "unset" + SB.loadingIndicator.innerHTML = ""; if (request.found) { - document.getElementById("videoFound").innerHTML = "This video's sponsors are in the database!" + SB.videoFound.innerHTML = "This video's sponsors are in the database!" displayDownloadedSponsorTimes(request); } else { - document.getElementById("videoFound").innerHTML = "No sponsors found" + SB.videoFound.innerHTML = "No sponsors found" } } } @@ -266,30 +273,28 @@ function startSponsorCallback(response) { displaySponsorTimes(); //show submission section - document.getElementById("submissionSection").style.display = "unset"; + SB.submissionSection.style.display = "unset"; showSubmitTimesIfNecessary(); } //display the video times from the array function displaySponsorTimes() { - //set it to the message - let sponsorMessageTimes = document.getElementById("sponsorMessageTimes"); //remove all children - while (sponsorMessageTimes.firstChild) { - sponsorMessageTimes.removeChild(sponsorMessageTimes.firstChild); + while (SB.sponsorMessageTimes.firstChild) { + SB.sponsorMessageTimes.removeChild(SB.sponsorMessageTimes.firstChild); } //add sponsor times - sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); + SB.sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); } //display the video times from the array at the top, in a different section function displayDownloadedSponsorTimes(request) { if (request.sponsorTimes != undefined) { //set it to the message - document.getElementById("downloadedSponsorMessageTimes").innerHTML = getSponsorTimesMessage(request.sponsorTimes); + SB.downloadedSponsorMessageTimes.innerHTML = getSponsorTimesMessage(request.sponsorTimes); //add them as buttons to the issue reporting container let container = document.getElementById("issueReporterTimeButtons"); From d51e8044f4832a6f612ccdfcb5a4a0bbd46dd501 Mon Sep 17 00:00:00 2001 From: Official Noob <31563761+OfficialNoob@users.noreply.github.com> Date: Tue, 30 Jul 2019 20:46:02 +0100 Subject: [PATCH 04/17] Update popup.js --- popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/popup.js b/popup.js index 43a646df..4d8997d0 100644 --- a/popup.js +++ b/popup.js @@ -193,7 +193,7 @@ function loadTabData(tabs) { displaySponsorTimes(); //show submission section - submissionSection.style.display = "unset"; + SB.submissionSection.style.display = "unset"; showSubmitTimesIfNecessary(); } From e1dc5fbdf59646760d9dfae7d76cc351b4e97437 Mon Sep 17 00:00:00 2001 From: Official Noob <31563761+OfficialNoob@users.noreply.github.com> Date: Wed, 31 Jul 2019 12:53:25 +0100 Subject: [PATCH 05/17] t => T --- popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/popup.js b/popup.js index 824ffbde..1329595b 100644 --- a/popup.js +++ b/popup.js @@ -593,7 +593,7 @@ EN_US.set(400, 'Server said this request was invalid"') .set(429, 'You have submitted too many sponsor times for this one video, are you sure there are this many?') .set(409, 'This has already been submitted before') .set(502, 'It seems the server is down. Contact the dev to inform them.') - .set('Unknown', 'there was an error submitting your sponsor times, please try again later.'); + .set('Unknown', 'There was an error submitting your sponsor times, please try again later.'); function ErrorParser (Lang, statusCode) { if(Lang.has(statusCode)) return Lang.get(statusCode); From 1341d5e11dd6c3da61eb15dbd7217637ebc07b87 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 31 Jul 2019 22:57:50 -0400 Subject: [PATCH 06/17] Fixed grammer --- help/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/help/index.html b/help/index.html index 28a2be0b..61e4e6ad 100644 --- a/help/index.html +++ b/help/index.html @@ -115,7 +115,7 @@

Some icons made by Gregor Cresnar from www.flaticon.com and are licensed by CC 3.0 BY

-

Some icons made by Freepik from www.flaticon.com is licensed by CC 3.0 BY

+

Some icons made by Freepik from www.flaticon.com and are licensed by CC 3.0 BY

From 25801b6fcddd7f705ce508d25cafda1fe13b0c1b Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 31 Jul 2019 23:09:33 -0400 Subject: [PATCH 07/17] Merged into master --- popup.js | 1811 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 925 insertions(+), 886 deletions(-) diff --git a/popup.js b/popup.js index 4d8997d0..4ee821c5 100644 --- a/popup.js +++ b/popup.js @@ -1,932 +1,971 @@ -var SB = {}; +//make this a function to allow this to run on the content page +function runThePopup() { -["sponsorStart", -"clearTimes", -"submitTimes", -"showNoticeAgain", -"hideVideoPlayerControls", -"showVideoPlayerControls", -"hideInfoButtonPlayerControls", -"showInfoButtonPlayerControls", -"hideDeleteButtonPlayerControls", -"showDeleteButtonPlayerControls", -"disableSponsorViewTracking", -"enableSponsorViewTracking", -"optionsButton", -"reportAnIssue", -// sponsorTimesContributions -"sponsorTimesContributionsContainer", -"sponsorTimesContributionsDisplay", -"sponsorTimesContributionsDisplayEndWord", -// sponsorTimesViewsDisplay -"sponsorTimesViewsContainer", -"sponsorTimesViewsDisplay", -"sponsorTimesViewsDisplayEndWord", -// discordButtons -"discordButtonContainer", -"hideDiscordButton", -// More - "submissionSection", - "mainControls", - "loadingIndicator", - "videoFound", - "sponsorMessageTimes", - "downloadedSponsorMessageTimes", -].forEach(id => SB[id] = document.getElementById(id)); + //is it in the popup or content script + var inPopup = true; + if (chrome.tabs == undefined) { + //this is on the content script, use direct communication + chrome.tabs = {}; + chrome.tabs.sendMessage = function(id, request, callback) { + messageListener(request, null, callback); + } + + //add a dummy query method + chrome.tabs.query = function(config, callback) { + callback([{ + url: document.URL, + id: -1 + }]); + } + + inPopup = false; + } + + var SB = {}; -//setup click listeners -SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); -SB.clearTimes.addEventListener("click", clearTimes); -SB.submitTimes.addEventListener("click", submitTimes); -SB.showNoticeAgain.addEventListener("click", showNoticeAgain); -SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls); -SB.showVideoPlayerControls.addEventListener("click", showVideoPlayerControls); -SB.hideInfoButtonPlayerControls.addEventListener("click", hideInfoButtonPlayerControls); -SB.showInfoButtonPlayerControls.addEventListener("click", showInfoButtonPlayerControls); -SB.hideDeleteButtonPlayerControls.addEventListener("click", hideDeleteButtonPlayerControls); -SB.showDeleteButtonPlayerControls.addEventListener("click", showDeleteButtonPlayerControls); -SB.disableSponsorViewTracking.addEventListener("click", disableSponsorViewTracking); -SB.enableSponsorViewTracking.addEventListener("click", enableSponsorViewTracking); -SB.optionsButton.addEventListener("click", openOptions); -SB.reportAnIssue.addEventListener("click", reportAnIssue); -SB.hideDiscordButton.addEventListener("click", hideDiscordButton); + ["sponsorStart", + "clearTimes", + "submitTimes", + "showNoticeAgain", + "hideVideoPlayerControls", + "showVideoPlayerControls", + "hideInfoButtonPlayerControls", + "showInfoButtonPlayerControls", + "hideDeleteButtonPlayerControls", + "showDeleteButtonPlayerControls", + "disableSponsorViewTracking", + "enableSponsorViewTracking", + "optionsButton", + "reportAnIssue", + // sponsorTimesContributions + "sponsorTimesContributionsContainer", + "sponsorTimesContributionsDisplay", + "sponsorTimesContributionsDisplayEndWord", + // sponsorTimesViewsDisplay + "sponsorTimesViewsContainer", + "sponsorTimesViewsDisplay", + "sponsorTimesViewsDisplayEndWord", + // discordButtons + "discordButtonContainer", + "hideDiscordButton", + // More + "submissionSection", + "mainControls", + "loadingIndicator", + "videoFound", + "sponsorMessageTimes", + "downloadedSponsorMessageTimes", + ].forEach(id => SB[id] = document.getElementById(id)); - -//if true, the button now selects the end time -var startTimeChosen = false; - -//the start and end time pairs (2d) -var sponsorTimes = []; - -//current video ID of this tab -var currentVideoID = null; - -//is this a YouTube tab? -var isYouTubeTab = false; - -//see if discord link can be shown -chrome.storage.sync.get(["hideDiscordLink"], function(result) { - let hideDiscordLink = result.hideDiscordLink; - if (hideDiscordLink == undefined || !hideDiscordLink) { - chrome.storage.sync.get(["hideDiscordLaunches"], function(result) { - let hideDiscordLaunches = result.hideDiscordLaunches; - //only if less than 5 launches - if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) { - SB.discordButtonContainer.style.display = null; - - if (hideDiscordLaunches == undefined) { - hideDiscordButton = 1; + //setup click listeners + SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); + SB.clearTimes.addEventListener("click", clearTimes); + SB.submitTimes.addEventListener("click", submitTimes); + SB.showNoticeAgain.addEventListener("click", showNoticeAgain); + SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls); + SB.showVideoPlayerControls.addEventListener("click", showVideoPlayerControls); + SB.hideInfoButtonPlayerControls.addEventListener("click", hideInfoButtonPlayerControls); + SB.showInfoButtonPlayerControls.addEventListener("click", showInfoButtonPlayerControls); + SB.hideDeleteButtonPlayerControls.addEventListener("click", hideDeleteButtonPlayerControls); + SB.showDeleteButtonPlayerControls.addEventListener("click", showDeleteButtonPlayerControls); + SB.disableSponsorViewTracking.addEventListener("click", disableSponsorViewTracking); + SB.enableSponsorViewTracking.addEventListener("click", enableSponsorViewTracking); + SB.optionsButton.addEventListener("click", openOptions); + SB.reportAnIssue.addEventListener("click", reportAnIssue); + SB.hideDiscordButton.addEventListener("click", hideDiscordButton); + + + //if true, the button now selects the end time + let startTimeChosen = false; + + //the start and end time pairs (2d) + let sponsorTimes = []; + + //current video ID of this tab + let currentVideoID = null; + + //is this a YouTube tab? + let isYouTubeTab = false; + + //see if discord link can be shown + chrome.storage.sync.get(["hideDiscordLink"], function(result) { + let hideDiscordLink = result.hideDiscordLink; + if (hideDiscordLink == undefined || !hideDiscordLink) { + chrome.storage.sync.get(["hideDiscordLaunches"], function(result) { + let hideDiscordLaunches = result.hideDiscordLaunches; + //only if less than 5 launches + if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) { + SB.discordButtonContainer.style.display = null; + + if (hideDiscordLaunches == undefined) { + hideDiscordButton = 1; + } + + chrome.storage.sync.set({"hideDiscordLaunches": hideDiscordButton + 1}); } - - chrome.storage.sync.set({"hideDiscordLaunches": hideDiscordButton + 1}); + }); + } + }); + + //if the don't show notice again letiable is true, an option to + // disable should be available + chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { + let dontShowNoticeAgain = result.dontShowNoticeAgain; + if (dontShowNoticeAgain != undefined && dontShowNoticeAgain) { + SB.showNoticeAgain.style.display = "unset"; + } + }); + + //show proper video player controls options + chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) { + let hideVideoPlayerControls = result.hideVideoPlayerControls; + if (hideVideoPlayerControls != undefined && hideVideoPlayerControls) { + SB.hideVideoPlayerControls.style.display = "none"; + SB.showVideoPlayerControls.style.display = "unset"; + } + }); + chrome.storage.sync.get(["hideInfoButtonPlayerControls"], function(result) { + let hideInfoButtonPlayerControls = result.hideInfoButtonPlayerControls; + if (hideInfoButtonPlayerControls != undefined && hideInfoButtonPlayerControls) { + SB.hideInfoButtonPlayerControls.style.display = "none"; + SB.showInfoButtonPlayerControls.style.display = "unset"; + } + }); + chrome.storage.sync.get(["hideDeleteButtonPlayerControls"], function(result) { + let hideDeleteButtonPlayerControls = result.hideDeleteButtonPlayerControls; + if (hideDeleteButtonPlayerControls != undefined && hideDeleteButtonPlayerControls) { + SB.hideDeleteButtonPlayerControls.style.display = "none"; + SB.showDeleteButtonPlayerControls.style.display = "unset"; + } + }); + + //show proper tracking option + chrome.storage.sync.get(["trackViewCount"], function(result) { + let trackViewCount = result.trackViewCount; + if (trackViewCount != undefined && !trackViewCount) { + SB.disableSponsorViewTracking.style.display = "none"; + SB.enableSponsorViewTracking.style.display = "unset"; + } + }); + + //get the amount of times this user has contributed and display it to thank them + chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { + if (result.sponsorTimesContributed != undefined) { + if (result.sponsorTimesContributed > 1) { + SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsors." + } else { + SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsor." + } + SB.sponsorTimesContributionsDisplay.innerText = result.sponsorTimesContributed; + SB.sponsorTimesContributionsContainer.style.display = "unset"; + + //get the userID + chrome.storage.sync.get(["userID"], function(result) { + let userID = result.userID; + if (userID != undefined) { + //there are probably some views on these submissions then + //get the amount of views from the sponsors submitted + sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) { + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { + let viewCount = JSON.parse(xmlhttp.responseText).viewCount; + if (viewCount != 0) { + if (viewCount > 1) { + SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segments." + } else { + SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." + } + SB.sponsorTimesViewsDisplay.innerText = viewCount; + SB.sponsorTimesViewsContainer.style.display = "unset"; + } + } + }); + } + }); + } + }); + + + chrome.tabs.query({ + active: true, + currentWindow: true + }, loadTabData); + + + function loadTabData(tabs) { + //set current videoID + currentVideoID = getYouTubeVideoID(tabs[0].url); + + if (!currentVideoID) { + //this isn't a YouTube video then + displayNoVideo(); + return; + } + + //load video times for this video + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.get([sponsorTimeKey], function(result) { + let sponsorTimesStorage = result[sponsorTimeKey]; + if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) { + if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) { + startTimeChosen = true; + SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + } + + sponsorTimes = sponsorTimesStorage; + + displaySponsorTimes(); + + //show submission section + SB.submissionSection.style.display = "unset"; + + showSubmitTimesIfNecessary(); } }); + + //check if this video's sponsors are known + chrome.tabs.sendMessage( + tabs[0].id, + {message: 'isInfoFound'}, + infoFound + ); } -}); + + function infoFound(request) { + if(chrome.runtime.lastError) { + //This page doesn't have the injected content script, or at least not yet + displayNoVideo(); + return; + } + + //if request is undefined, then the page currently being browsed is not YouTube + if (request != undefined) { + //this must be a YouTube video + //set letiable + isYouTubeTab = true; + + //remove loading text + SB.mainControls.style.display = "unset" + SB.loadingIndicator.innerHTML = ""; -//if the don't show notice again variable is true, an option to -// disable should be available -chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { - let dontShowNoticeAgain = result.dontShowNoticeAgain; - if (dontShowNoticeAgain != undefined && dontShowNoticeAgain) { - SB.showNoticeAgain.style.display = "unset"; + if (request.found) { + SB.videoFound.innerHTML = "This video's sponsors are in the database!" + + displayDownloadedSponsorTimes(request); + } else { + SB.videoFound.innerHTML = "No sponsors found" + } + } } -}); + + function setVideoID(request) { + //if request is undefined, then the page currently being browsed is not YouTube + if (request != undefined) { + videoID = request.videoID; + } + } + + function sendSponsorStartMessage() { + //the content script will get the message if a YouTube page is open + chrome.tabs.query({ + active: true, + currentWindow: true + }, tabs => { + chrome.tabs.sendMessage( + tabs[0].id, + {from: 'popup', message: 'sponsorStart'}, + startSponsorCallback + ); + }); + } + + function startSponsorCallback(response) { + let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0); + + if (sponsorTimes[sponsorTimesIndex] == undefined) { + sponsorTimes[sponsorTimesIndex] = []; + } + + sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; + + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + updateStartTimeChosen(); + + //display video times on screen + displaySponsorTimes(); + + //show submission section + SB.submissionSection.style.display = "unset"; + + showSubmitTimesIfNecessary(); + } + + //display the video times from the array + function displaySponsorTimes() { + //remove all children + while (SB.sponsorMessageTimes.firstChild) { + SB.sponsorMessageTimes.removeChild(SB.sponsorMessageTimes.firstChild); + } -//show proper video player controls options -chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) { - let hideVideoPlayerControls = result.hideVideoPlayerControls; - if (hideVideoPlayerControls != undefined && hideVideoPlayerControls) { + //add sponsor times + SB.sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); + } + + //display the video times from the array at the top, in a different section + function displayDownloadedSponsorTimes(request) { + if (request.sponsorTimes != undefined) { + //set it to the message + SB.downloadedSponsorMessageTimes.innerText = getSponsorTimesMessage(request.sponsorTimes); + + //add them as buttons to the issue reporting container + let container = document.getElementById("issueReporterTimeButtons"); + for (let i = 0; i < request.sponsorTimes.length; i++) { + let sponsorTimeButton = document.createElement("button"); + sponsorTimeButton.className = "warningButton popupElement"; + sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]); + + let votingButtons = document.createElement("div"); + + let UUID = request.UUIDs[i]; + + //thumbs up and down buttons + let voteButtonsContainer = document.createElement("div"); + voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID; + voteButtonsContainer.setAttribute("align", "center"); + voteButtonsContainer.style.display = "none" + + let upvoteButton = document.createElement("img"); + upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; + upvoteButton.className = "voteButton popupElement"; + upvoteButton.src = chrome.extension.getURL("icons/upvote.png"); + upvoteButton.addEventListener("click", () => vote(1, UUID)); + + let downvoteButton = document.createElement("img"); + downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID; + downvoteButton.className = "voteButton popupElement"; + downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); + downvoteButton.addEventListener("click", () => vote(0, UUID)); + + //add thumbs up and down buttons to the container + voteButtonsContainer.appendChild(document.createElement("br")); + voteButtonsContainer.appendChild(document.createElement("br")); + voteButtonsContainer.appendChild(upvoteButton); + voteButtonsContainer.appendChild(downvoteButton); + + //add click listener to open up vote panel + sponsorTimeButton.addEventListener("click", function() { + voteButtonsContainer.style.display = "unset"; + }); + + container.appendChild(sponsorTimeButton); + container.appendChild(voteButtonsContainer); + + //if it is not the last iteration + if (i != request.sponsorTimes.length - 1) { + container.appendChild(document.createElement("br")); + container.appendChild(document.createElement("br")); + } + } + } + } + + //get the message that visually displays the video times + function getSponsorTimesMessage(sponsorTimes) { + let sponsorTimesMessage = ""; + + for (let i = 0; i < sponsorTimes.length; i++) { + for (let s = 0; s < sponsorTimes[i].length; s++) { + let timeMessage = getFormattedTime(sponsorTimes[i][s]); + //if this is an end time + if (s == 1) { + timeMessage = " to " + timeMessage; + } else if (i > 0) { + //add commas if necessary + timeMessage = ", " + timeMessage; + } + + sponsorTimesMessage += timeMessage; + } + } + + return sponsorTimesMessage; + } + + //get the message that visually displays the video times + //this version is a div that contains each with delete buttons + function getSponsorTimesMessageDiv(sponsorTimes) { + // let sponsorTimesMessage = ""; + let sponsorTimesContainer = document.createElement("div"); + sponsorTimesContainer.id = "sponsorTimesContainer"; + + for (let i = 0; i < sponsorTimes.length; i++) { + let currentSponsorTimeContainer = document.createElement("div"); + currentSponsorTimeContainer.id = "sponsorTimeContainer" + i; + currentSponsorTimeContainer.className = "sponsorTime popupElement"; + let currentSponsorTimeMessage = ""; + + let deleteButton = document.createElement("span"); + deleteButton.id = "sponsorTimeDeleteButton" + i; + deleteButton.innerText = "Delete"; + deleteButton.className = "mediumLink popupElement"; + let index = i; + deleteButton.addEventListener("click", () => deleteSponsorTime(index)); + + let spacer = document.createElement("span"); + spacer.innerText = " "; + + let editButton = document.createElement("span"); + editButton.id = "sponsorTimeEditButton" + i; + editButton.innerText = "Edit"; + editButton.className = "mediumLink popupElement"; + editButton.addEventListener("click", () => editSponsorTime(index)); + + for (let s = 0; s < sponsorTimes[i].length; s++) { + let timeMessage = getFormattedTime(sponsorTimes[i][s]); + //if this is an end time + if (s == 1) { + timeMessage = " to " + timeMessage; + } else if (i > 0) { + //add commas if necessary + timeMessage = timeMessage; + } + + currentSponsorTimeMessage += timeMessage; + } + + currentSponsorTimeContainer.innerText = currentSponsorTimeMessage; + currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index)); + + sponsorTimesContainer.appendChild(currentSponsorTimeContainer); + sponsorTimesContainer.appendChild(deleteButton); + + //only if it is a complete sponsor time + if (sponsorTimes[i].length > 1) { + sponsorTimesContainer.appendChild(editButton); + } + } + + return sponsorTimesContainer; + } + + function editSponsorTime(index) { + if (document.getElementById("startTimeMinutes" + index) != null) { + //already open + return; + } + + //hide submit button + document.getElementById("submitTimesContainer").style.display = "none"; + + let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); + + //get sponsor time minutes and seconds boxes + let startTimeMinutes = document.createElement("input"); + startTimeMinutes.id = "startTimeMinutes" + index; + startTimeMinutes.className = "sponsorTime popupElement"; + startTimeMinutes.type = "text"; + startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]); + startTimeMinutes.style.width = "45px"; + + let startTimeSeconds = document.createElement("input"); + startTimeSeconds.id = "startTimeSeconds" + index; + startTimeSeconds.className = "sponsorTime popupElement"; + startTimeSeconds.type = "text"; + startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); + startTimeSeconds.style.width = "60px"; + + let endTimeMinutes = document.createElement("input"); + endTimeMinutes.id = "endTimeMinutes" + index; + endTimeMinutes.className = "sponsorTime popupElement"; + endTimeMinutes.type = "text"; + endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]); + endTimeMinutes.style.width = "45px"; + + let endTimeSeconds = document.createElement("input"); + endTimeSeconds.id = "endTimeSeconds" + index; + endTimeSeconds.className = "sponsorTime popupElement"; + endTimeSeconds.type = "text"; + endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); + endTimeSeconds.style.width = "60px"; + + let colonText = document.createElement("span"); + colonText.innerText = ":"; + + let toText = document.createElement("span"); + toText.innerText = " to "; + + //remove all children to replace + while (sponsorTimeContainer.firstChild) { + sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild); + } + + sponsorTimeContainer.appendChild(startTimeMinutes); + sponsorTimeContainer.appendChild(colonText); + sponsorTimeContainer.appendChild(startTimeSeconds); + sponsorTimeContainer.appendChild(toText); + sponsorTimeContainer.appendChild(endTimeMinutes); + sponsorTimeContainer.appendChild(colonText); + sponsorTimeContainer.appendChild(endTimeSeconds); + + //add save button and remove edit button + let saveButton = document.createElement("span"); + saveButton.id = "sponsorTimeSaveButton" + index; + saveButton.innerText = "Save"; + saveButton.className = "mediumLink popupElement"; + saveButton.addEventListener("click", () => saveSponsorTimeEdit(index)); + + let editButton = document.getElementById("sponsorTimeEditButton" + index); + let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); + + sponsorTimesContainer.replaceChild(saveButton, editButton); + } + + function saveSponsorTimeEdit(index) { + let startTimeMinutes = document.getElementById("startTimeMinutes" + index); + let startTimeSeconds = document.getElementById("startTimeSeconds" + index); + + let endTimeMinutes = document.getElementById("endTimeMinutes" + index); + let endTimeSeconds = document.getElementById("endTimeSeconds" + index); + + sponsorTimes[index][0] = parseInt(startTimeMinutes.value) * 60 + parseFloat(startTimeSeconds.value); + sponsorTimes[index][1] = parseInt(endTimeMinutes.value) * 60 + parseFloat(endTimeSeconds.value); + + //save this + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + displaySponsorTimes(); + + showSubmitTimesIfNecessary(); + } + + //deletes the sponsor time submitted at an index + function deleteSponsorTime(index) { + //if it is not a complete sponsor time + if (sponsorTimes[index].length < 2) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + + resetStartTimeChosen(); + } + + sponsorTimes.splice(index, 1); + + //save this + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + //update display + displaySponsorTimes(); + + //if they are all removed + if (sponsorTimes.length == 0) { + //update chrome tab + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + + //hide submission section + document.getElementById("submissionSection").style.display = "none"; + } + } + + function clearTimes() { + //send new sponsor time state to tab + if (sponsorTimes.length > 0) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + } + + //reset sponsorTimes + sponsorTimes = []; + + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + displaySponsorTimes(); + + //hide submission section + document.getElementById("submissionSection").style.display = "none"; + + resetStartTimeChosen(); + } + + function submitTimes() { + //make info message say loading + document.getElementById("submitTimesInfoMessage").innerText = "Loading..."; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + + if (sponsorTimes.length > 0) { + chrome.runtime.sendMessage({ + message: "submitTimes", + videoID: currentVideoID + }, function(response) { + if (response != undefined) { + if (response.statusCode == 200) { + //hide loading message + document.getElementById("submitTimesInfoMessageContainer").style.display = "none"; + + clearTimes(); + } else if(response.statusCode == 400) { + document.getElementById("submitTimesInfoMessage").innerText = "Server said this request was invalid"; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else if(response.statusCode == 429) { + document.getElementById("submitTimesInfoMessage").innerText = "You have submitted too many sponsor times for this one video, are you sure there are this many?"; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else if(response.statusCode == 409) { + document.getElementById("submitTimesInfoMessage").innerText = "This has already been submitted before"; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else if(response.statusCode == 502) { + document.getElementById("submitTimesInfoMessage").innerText = "It seems the server is down. Contact the dev to inform them. Error code " + response.statusCode; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } else { + document.getElementById("submitTimesInfoMessage").innerText = "There was an error submitting your sponsor times, please try again later. Error code " + response.statusCode; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + } + } + }); + } + } + + function showNoticeAgain() { + chrome.storage.sync.set({"dontShowNoticeAgain": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "showNoticeAgain" + }); + }); + + SB.showNoticeAgain.style.display = "none"; + } + + function hideVideoPlayerControls() { + chrome.storage.sync.set({"hideVideoPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerControlsVisibility", + value: true + }); + }); + SB.hideVideoPlayerControls.style.display = "none"; SB.showVideoPlayerControls.style.display = "unset"; } -}); -chrome.storage.sync.get(["hideInfoButtonPlayerControls"], function(result) { - let hideInfoButtonPlayerControls = result.hideInfoButtonPlayerControls; - if (hideInfoButtonPlayerControls != undefined && hideInfoButtonPlayerControls) { + + function showVideoPlayerControls() { + chrome.storage.sync.set({"hideVideoPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerControlsVisibility", + value: false + }); + }); + + SB.hideVideoPlayerControls.style.display = "unset"; + SB.showVideoPlayerControls.style.display = "none"; + } + + function hideInfoButtonPlayerControls() { + chrome.storage.sync.set({"hideInfoButtonPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeInfoButtonPlayerControlsVisibility", + value: true + }); + }); + SB.hideInfoButtonPlayerControls.style.display = "none"; SB.showInfoButtonPlayerControls.style.display = "unset"; } -}); -chrome.storage.sync.get(["hideDeleteButtonPlayerControls"], function(result) { - let hideDeleteButtonPlayerControls = result.hideDeleteButtonPlayerControls; - if (hideDeleteButtonPlayerControls != undefined && hideDeleteButtonPlayerControls) { + + function showInfoButtonPlayerControls() { + chrome.storage.sync.set({"hideInfoButtonPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerCochangeInfoButtonPlayerControlsVisibilityntrolsVisibility", + value: false + }); + }); + + SB.hideInfoButtonPlayerControls.style.display = "unset"; + SB.showInfoButtonPlayerControls.style.display = "none"; + } + + function hideDeleteButtonPlayerControls() { + chrome.storage.sync.set({"hideDeleteButtonPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeDeleteButtonPlayerControlsVisibility", + value: true + }); + }); + SB.hideDeleteButtonPlayerControls.style.display = "none"; SB.showDeleteButtonPlayerControls.style.display = "unset"; } -}); - -//show proper tracking option -chrome.storage.sync.get(["trackViewCount"], function(result) { - let trackViewCount = result.trackViewCount; - if (trackViewCount != undefined && !trackViewCount) { + + function showDeleteButtonPlayerControls() { + chrome.storage.sync.set({"hideDeleteButtonPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerCochangeDeleteButtonPlayerControlsVisibilityntrolsVisibility", + value: false + }); + }); + + SB.hideDeleteButtonPlayerControls.style.display = "unset"; + SB.showDeleteButtonPlayerControls.style.display = "none"; + } + + function disableSponsorViewTracking() { + chrome.storage.sync.set({"trackViewCount": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "trackViewCount", + value: false + }); + }); + SB.disableSponsorViewTracking.style.display = "none"; SB.enableSponsorViewTracking.style.display = "unset"; } -}); - -//get the amount of times this user has contributed and display it to thank them -chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { - if (result.sponsorTimesContributed != undefined) { - if (result.sponsorTimesContributed > 1) { - SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsors." - } else { - SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsor." - } - SB.sponsorTimesContributionsDisplay.innerText = result.sponsorTimesContributed; - SB.sponsorTimesContributionsContainer.style.display = "unset"; - - //get the userID - chrome.storage.sync.get(["userID"], function(result) { - let userID = result.userID; - if (userID != undefined) { - //there are probably some views on these submissions then - //get the amount of views from the sponsors submitted - sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) { - if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { - let viewCount = JSON.parse(xmlhttp.responseText).viewCount; - if (viewCount != 0) { - if (viewCount > 1) { - SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segments." - } else { - SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." - } - SB.sponsorTimesViewsDisplay.innerText = viewCount; - SB.sponsorTimesViewsContainer.style.display = "unset"; - } - } - }); - } - }); - } -}); - - -chrome.tabs.query({ - active: true, - currentWindow: true -}, loadTabData); - -function loadTabData(tabs) { - //set current videoID - currentVideoID = getYouTubeVideoID(tabs[0].url); - - if (!currentVideoID) { - //this isn't a YouTube video then - displayNoVideo(); - return; - } - - //load video times for this video - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.get([sponsorTimeKey], function(result) { - let sponsorTimesStorage = result[sponsorTimeKey]; - if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) { - if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) { - startTimeChosen = true; - SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; - } - - sponsorTimes = sponsorTimesStorage; - - displaySponsorTimes(); - - //show submission section - SB.submissionSection.style.display = "unset"; - - showSubmitTimesIfNecessary(); - } - }); - - //check if this video's sponsors are known - chrome.tabs.sendMessage( - tabs[0].id, - {message: 'isInfoFound'}, - infoFound - ); -} - -function infoFound(request) { - if(chrome.runtime.lastError) { - //This page doesn't have the injected content script, or at least not yet - displayNoVideo(); - return; - } - - //if request is undefined, then the page currently being browsed is not YouTube - if (request != undefined) { - //this must be a YouTube video - //set variable - isYouTubeTab = true; - - //remove loading text - SB.mainControls.style.display = "unset" - SB.loadingIndicator.innerHTML = ""; - - if (request.found) { - SB.videoFound.innerHTML = "This video's sponsors are in the database!" - - displayDownloadedSponsorTimes(request); - } else { - SB.videoFound.innerHTML = "No sponsors found" - } - } -} - -function setVideoID(request) { - //if request is undefined, then the page currently being browsed is not YouTube - if (request != undefined) { - videoID = request.videoID; - } -} - -function sendSponsorStartMessage() { - //the content script will get the message if a YouTube page is open - chrome.tabs.query({ - active: true, - currentWindow: true - }, tabs => { - chrome.tabs.sendMessage( - tabs[0].id, - {from: 'popup', message: 'sponsorStart'}, - startSponsorCallback - ); - }); -} - -function startSponsorCallback(response) { - let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0); - - if (sponsorTimes[sponsorTimesIndex] == undefined) { - sponsorTimes[sponsorTimesIndex] = []; - } - - sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; - - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - updateStartTimeChosen(); - - //display video times on screen - displaySponsorTimes(); - - //show submission section - SB.submissionSection.style.display = "unset"; - - showSubmitTimesIfNecessary(); -} - -//display the video times from the array -function displaySponsorTimes() { - - //remove all children - while (SB.sponsorMessageTimes.firstChild) { - SB.sponsorMessageTimes.removeChild(SB.sponsorMessageTimes.firstChild); - } - - //add sponsor times - SB.sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); -} - -//display the video times from the array at the top, in a different section -function displayDownloadedSponsorTimes(request) { - if (request.sponsorTimes != undefined) { - //set it to the message - SB.downloadedSponsorMessageTimes.innerHTML = getSponsorTimesMessage(request.sponsorTimes); - - //add them as buttons to the issue reporting container - let container = document.getElementById("issueReporterTimeButtons"); - for (let i = 0; i < request.sponsorTimes.length; i++) { - let sponsorTimeButton = document.createElement("button"); - sponsorTimeButton.className = "warningButton"; - sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]); - - let votingButtons = document.createElement("div"); - - let UUID = request.UUIDs[i]; - - //thumbs up and down buttons - let voteButtonsContainer = document.createElement("div"); - voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID; - voteButtonsContainer.setAttribute("align", "center"); - voteButtonsContainer.style.display = "none" - - let upvoteButton = document.createElement("img"); - upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; - upvoteButton.className = "voteButton"; - upvoteButton.src = chrome.extension.getURL("icons/upvote.png"); - upvoteButton.addEventListener("click", () => vote(1, UUID)); - - let downvoteButton = document.createElement("img"); - downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID; - downvoteButton.className = "voteButton"; - downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); - downvoteButton.addEventListener("click", () => vote(0, UUID)); - - //add thumbs up and down buttons to the container - voteButtonsContainer.appendChild(document.createElement("br")); - voteButtonsContainer.appendChild(document.createElement("br")); - voteButtonsContainer.appendChild(upvoteButton); - voteButtonsContainer.appendChild(downvoteButton); - - //add click listener to open up vote panel - sponsorTimeButton.addEventListener("click", function() { - voteButtonsContainer.style.display = "unset"; - }); - - container.appendChild(sponsorTimeButton); - container.appendChild(voteButtonsContainer); - - //if it is not the last iteration - if (i != request.sponsorTimes.length - 1) { - container.appendChild(document.createElement("br")); - container.appendChild(document.createElement("br")); - } - } - } -} - -//get the message that visually displays the video times -function getSponsorTimesMessage(sponsorTimes) { - let sponsorTimesMessage = ""; - - for (let i = 0; i < sponsorTimes.length; i++) { - for (let s = 0; s < sponsorTimes[i].length; s++) { - let timeMessage = getFormattedTime(sponsorTimes[i][s]); - //if this is an end time - if (s == 1) { - timeMessage = " to " + timeMessage; - } else if (i > 0) { - //add commas if necessary - timeMessage = ", " + timeMessage; - } - - sponsorTimesMessage += timeMessage; - } - } - - return sponsorTimesMessage; -} - -//get the message that visually displays the video times -//this version is a div that contains each with delete buttons -function getSponsorTimesMessageDiv(sponsorTimes) { - // let sponsorTimesMessage = ""; - let sponsorTimesContainer = document.createElement("div"); - sponsorTimesContainer.id = "sponsorTimesContainer"; - - for (let i = 0; i < sponsorTimes.length; i++) { - let currentSponsorTimeContainer = document.createElement("div"); - currentSponsorTimeContainer.id = "sponsorTimeContainer" + i; - currentSponsorTimeContainer.className = "sponsorTime"; - let currentSponsorTimeMessage = ""; - - let deleteButton = document.createElement("span"); - deleteButton.id = "sponsorTimeDeleteButton" + i; - deleteButton.innerText = "Delete"; - deleteButton.className = "mediumLink"; - let index = i; - deleteButton.addEventListener("click", () => deleteSponsorTime(index)); - - let spacer = document.createElement("span"); - spacer.innerText = " "; - - let editButton = document.createElement("span"); - editButton.id = "sponsorTimeEditButton" + i; - editButton.innerText = "Edit"; - editButton.className = "mediumLink"; - editButton.addEventListener("click", () => editSponsorTime(index)); - - for (let s = 0; s < sponsorTimes[i].length; s++) { - let timeMessage = getFormattedTime(sponsorTimes[i][s]); - //if this is an end time - if (s == 1) { - timeMessage = " to " + timeMessage; - } else if (i > 0) { - //add commas if necessary - timeMessage = timeMessage; - } - - currentSponsorTimeMessage += timeMessage; - } - - currentSponsorTimeContainer.innerText = currentSponsorTimeMessage; - currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index)); - - sponsorTimesContainer.appendChild(currentSponsorTimeContainer); - sponsorTimesContainer.appendChild(deleteButton); - - //only if it is a complete sponsor time - if (sponsorTimes[i].length > 1) { - sponsorTimesContainer.appendChild(editButton); - } - } - - return sponsorTimesContainer; -} - -function editSponsorTime(index) { - if (document.getElementById("startTimeMinutes" + index) != null) { - //already open - return; - } - - let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); - - //get sponsor time minutes and seconds boxes - let startTimeMinutes = document.createElement("input"); - startTimeMinutes.id = "startTimeMinutes" + index; - startTimeMinutes.className = "sponsorTime"; - startTimeMinutes.type = "text"; - startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]); - startTimeMinutes.style.width = "45"; - let startTimeSeconds = document.createElement("input"); - startTimeSeconds.id = "startTimeSeconds" + index; - startTimeSeconds.className = "sponsorTime"; - startTimeSeconds.type = "text"; - startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); - startTimeSeconds.style.width = "60"; - - let endTimeMinutes = document.createElement("input"); - endTimeMinutes.id = "endTimeMinutes" + index; - endTimeMinutes.className = "sponsorTime"; - endTimeMinutes.type = "text"; - endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]); - endTimeMinutes.style.width = "45"; + function enableSponsorViewTracking() { + chrome.storage.sync.set({"trackViewCount": true}); - let endTimeSeconds = document.createElement("input"); - endTimeSeconds.id = "endTimeSeconds" + index; - endTimeSeconds.className = "sponsorTime"; - endTimeSeconds.type = "text"; - endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); - endTimeSeconds.style.width = "60"; - - let colonText = document.createElement("span"); - colonText.innerText = ":"; - - let toText = document.createElement("span"); - toText.innerText = " to "; - - //remove all children to replace - while (sponsorTimeContainer.firstChild) { - sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild); - } - - sponsorTimeContainer.appendChild(startTimeMinutes); - sponsorTimeContainer.appendChild(colonText); - sponsorTimeContainer.appendChild(startTimeSeconds); - sponsorTimeContainer.appendChild(toText); - sponsorTimeContainer.appendChild(endTimeMinutes); - sponsorTimeContainer.appendChild(colonText); - sponsorTimeContainer.appendChild(endTimeSeconds); - - //add save button and remove edit button - let saveButton = document.createElement("span"); - saveButton.id = "sponsorTimeSaveButton" + index; - saveButton.innerText = "Save"; - saveButton.className = "mediumLink"; - saveButton.addEventListener("click", () => saveSponsorTimeEdit(index)); - - let editButton = document.getElementById("sponsorTimeEditButton" + index); - let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); - - sponsorTimesContainer.removeChild(editButton); - sponsorTimesContainer.appendChild(saveButton); -} - -function saveSponsorTimeEdit(index) { - let startTimeMinutes = document.getElementById("startTimeMinutes" + index); - let startTimeSeconds = document.getElementById("startTimeSeconds" + index); - - let endTimeMinutes = document.getElementById("endTimeMinutes" + index); - let endTimeSeconds = document.getElementById("endTimeSeconds" + index); - - sponsorTimes[index][0] = parseInt(startTimeMinutes.value) * 60 + parseFloat(startTimeSeconds.value); - sponsorTimes[index][1] = parseInt(endTimeMinutes.value) * 60 + parseFloat(endTimeSeconds.value); - - //save this - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - displaySponsorTimes(); -} - -//deletes the sponsor time submitted at an index -function deleteSponsorTime(index) { - //if it is not a complete sponsor time - if (sponsorTimes[index].length < 2) { chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false + message: "trackViewCount", + value: true }); }); - - resetStartTimeChosen(); + + SB.enableSponsorViewTracking.style.display = "none"; + SB.disableSponsorViewTracking.style.display = "unset"; } - - sponsorTimes.splice(index, 1); - - //save this - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - //update display - displaySponsorTimes(); - - //if they are all removed - if (sponsorTimes.length == 0) { - //update chrome tab - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false - }); - }); - - //hide submission section - document.getElementById("submissionSection").style.display = "none"; + + function updateStartTimeChosen() { + //update startTimeChosen letiable + if (!startTimeChosen) { + startTimeChosen = true; + SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + } else { + resetStartTimeChosen(); + } } -} - -function clearTimes() { - //send new sponsor time state to tab - if (sponsorTimes.length > 0) { - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false - }); - }); + + //set it to false + function resetStartTimeChosen() { + startTimeChosen = false; + SB.sponsorStart.innerHTML = "Sponsorship Starts Now"; } - - //reset sponsorTimes - sponsorTimes = []; - - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - displaySponsorTimes(); - - //hide submission section - document.getElementById("submissionSection").style.display = "none"; - - resetStartTimeChosen(); -} - -function submitTimes() { - //make info message say loading - document.getElementById("submitTimesInfoMessage").innerText = "Loading..."; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - - if (sponsorTimes.length > 0) { + + //hides and shows the submit times button when needed + function showSubmitTimesIfNecessary() { + //check if an end time has been specified for the latest sponsor time + if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) { + //show submit times button + document.getElementById("submitTimesContainer").style.display = "unset"; + } else { + //hide submit times button + document.getElementById("submitTimesContainer").style.display = "none"; + } + } + + //make the options div visisble + function openOptions() { + document.getElementById("optionsButtonContainer").style.display = "none"; + document.getElementById("options").style.display = "unset"; + } + + //this is not a YouTube video page + function displayNoVideo() { + document.getElementById("loadingIndicator").innerHTML = "This probably isn't a YouTube tab, or you clicked too early. " + + "If you know this is a YouTube tab, close this popup and open it again."; + } + + function reportAnIssue() { + document.getElementById("issueReporterContainer").style.display = "unset"; + SB.reportAnIssue.style.display = "none"; + } + + function addVoteMessage(message, UUID) { + let container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID); + //remove all children + while (container.firstChild) { + container.removeChild(container.firstChild); + } + + let thanksForVotingText = document.createElement("h2"); + thanksForVotingText.innerText = message; + //there are already breaks there + thanksForVotingText.style.marginBottom = "0px"; + + container.appendChild(thanksForVotingText); + } + + function vote(type, UUID) { + //add loading info + addVoteMessage("Loading...", UUID) + + //send the vote message to the tab chrome.runtime.sendMessage({ - message: "submitTimes", - videoID: currentVideoID + message: "submitVote", + type: type, + UUID: UUID }, function(response) { if (response != undefined) { - if (response.statusCode == 200) { - //hide loading message - document.getElementById("submitTimesInfoMessageContainer").style.display = "none"; + //see if it was a success or failure + if (response.successType == 1) { + //success + addVoteMessage("Thanks for voting!", UUID) + } else if (response.successType == 0) { + //failure: duplicate vote + addVoteMessage("You have already voted this way before.", UUID) + } else if (response.successType == -1) { + if (response.statusCode == 502) { + addVoteMessage("It seems the sever is down. Contact the dev immediately.", UUID) + } else { + //failure: unknown error + addVoteMessage("A connection error has occured. Error code: " + response.statusCode, UUID) + } + } + } + }); + } - clearTimes(); - } else if(response.statusCode == 400) { - document.getElementById("submitTimesInfoMessage").innerText = "Server said this request was invalid"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 429) { - document.getElementById("submitTimesInfoMessage").innerText = "You have submitted too many sponsor times for this one video, are you sure there are this many?"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 409) { - document.getElementById("submitTimesInfoMessage").innerText = "This has already been submitted before"; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else if(response.statusCode == 502) { - document.getElementById("submitTimesInfoMessage").innerText = "It seems the server is down. Contact the dev to inform them. Error code " + response.statusCode; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } else { - document.getElementById("submitTimesInfoMessage").innerText = "There was an error submitting your sponsor times, please try again later. Error code " + response.statusCode; - document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; - } - } - }); + function hideDiscordButton() { + chrome.storage.sync.set({"hideDiscordLink": false}); + + SB.discordButtonContainer.style.display = "none"; } -} - -function showNoticeAgain() { - chrome.storage.sync.set({"dontShowNoticeAgain": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "showNoticeAgain" - }); - }); - - SB.showNoticeAgain.style.display = "none"; -} - -function hideVideoPlayerControls() { - chrome.storage.sync.set({"hideVideoPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerControlsVisibility", - value: true - }); - }); - - SB.hideVideoPlayerControls.style.display = "none"; - SB.showVideoPlayerControls.style.display = "unset"; -} - -function showVideoPlayerControls() { - chrome.storage.sync.set({"hideVideoPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerControlsVisibility", - value: false - }); - }); - - SB.hideVideoPlayerControls.style.display = "unset"; - SB.showVideoPlayerControls.style.display = "none"; -} - -function hideInfoButtonPlayerControls() { - chrome.storage.sync.set({"hideInfoButtonPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeInfoButtonPlayerControlsVisibility", - value: true - }); - }); - - SB.hideInfoButtonPlayerControls.style.display = "none"; - SB.showInfoButtonPlayerControls.style.display = "unset"; -} - -function showInfoButtonPlayerControls() { - chrome.storage.sync.set({"hideInfoButtonPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerCochangeInfoButtonPlayerControlsVisibilityntrolsVisibility", - value: false - }); - }); - - SB.hideInfoButtonPlayerControls.style.display = "unset"; - SB.showInfoButtonPlayerControls.style.display = "none"; -} - -function hideDeleteButtonPlayerControls() { - chrome.storage.sync.set({"hideDeleteButtonPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeDeleteButtonPlayerControlsVisibility", - value: true - }); - }); - - SB.hideDeleteButtonPlayerControls.style.display = "none"; - SB.showDeleteButtonPlayerControls.style.display = "unset"; -} - -function showDeleteButtonPlayerControls() { - chrome.storage.sync.set({"hideDeleteButtonPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerCochangeDeleteButtonPlayerControlsVisibilityntrolsVisibility", - value: false - }); - }); - - SB.hideDeleteButtonPlayerControls.style.display = "unset"; - SB.showDeleteButtonPlayerControls.style.display = "none"; -} - -function disableSponsorViewTracking() { - chrome.storage.sync.set({"trackViewCount": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "trackViewCount", - value: false - }); - }); - - SB.disableSponsorViewTracking.style.display = "none"; - SB.enableSponsorViewTracking.style.display = "unset"; -} - -function enableSponsorViewTracking() { - chrome.storage.sync.set({"trackViewCount": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "trackViewCount", - value: true - }); - }); - - SB.enableSponsorViewTracking.style.display = "none"; - SB.disableSponsorViewTracking.style.display = "unset"; -} - -function updateStartTimeChosen() { - //update startTimeChosen variable - if (!startTimeChosen) { - startTimeChosen = true; - SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; - } else { - resetStartTimeChosen(); - } -} - -//set it to false -function resetStartTimeChosen() { - startTimeChosen = false; - SB.sponsorStart.innerHTML = "Sponsorship Starts Now"; -} - -//hides and shows the submit times button when needed -function showSubmitTimesIfNecessary() { - //check if an end time has been specified for the latest sponsor time - if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) { - //show submit times button - document.getElementById("submitTimesContainer").style.display = "unset"; - } else { - //hide submit times button - document.getElementById("submitTimesContainer").style.display = "none"; - } -} - -//make the options div visisble -function openOptions() { - document.getElementById("optionsButtonContainer").style.display = "none"; - document.getElementById("options").style.display = "unset"; -} - -//this is not a YouTube video page -function displayNoVideo() { - document.getElementById("loadingIndicator").innerHTML = "This probably isn't a YouTube tab, or you clicked too early. " + - "If you know this is a YouTube tab, close this popup and open it again."; -} - -function reportAnIssue() { - document.getElementById("issueReporterContainer").style.display = "unset"; - SB.reportAnIssue.style.display = "none"; -} - -function addVoteMessage(message, UUID) { - let container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID); - //remove all children - while (container.firstChild) { - container.removeChild(container.firstChild); - } - - let thanksForVotingText = document.createElement("h2"); - thanksForVotingText.innerText = message; - //there are already breaks there - thanksForVotingText.style.marginBottom = "0px"; - - container.appendChild(thanksForVotingText); -} - -function vote(type, UUID) { - //add loading info - addVoteMessage("Loading...", UUID) - - //send the vote message to the tab - chrome.runtime.sendMessage({ - message: "submitVote", - type: type, - UUID: UUID - }, function(response) { - if (response != undefined) { - //see if it was a success or failure - if (response.successType == 1) { - //success - addVoteMessage("Thanks for voting!", UUID) - } else if (response.successType == 0) { - //failure: duplicate vote - addVoteMessage("You have already voted this way before.", UUID) - } else if (response.successType == -1) { - if (response.statusCode == 502) { - addVoteMessage("It seems the sever is down. Contact the dev immediately.", UUID) - } else { - //failure: unknown error - addVoteMessage("A connection error has occured. Error code: " + response.statusCode, UUID) - } - } + + //converts time in seconds to minutes:seconds + function getFormattedTime(seconds) { + let minutes = Math.floor(seconds / 60); + let secondsDisplay = Math.round(seconds - minutes * 60); + if (secondsDisplay < 10) { + //add a zero + secondsDisplay = "0" + secondsDisplay; } - }); -} - -function hideDiscordButton() { - chrome.storage.sync.set({"hideDiscordLink": false}); - - SB.discordButtonContainer.style.display = "none"; -} - -//converts time in seconds to minutes:seconds -function getFormattedTime(seconds) { - let minutes = Math.floor(seconds / 60); - let secondsDisplay = Math.round(seconds - minutes * 60); - if (secondsDisplay < 10) { - //add a zero - secondsDisplay = "0" + secondsDisplay; - } - - let formatted = minutes+ ":" + secondsDisplay; - - return formatted; -} - -//converts time in seconds to minutes -function getTimeInMinutes(seconds) { - let minutes = Math.floor(seconds / 60); - - return minutes; -} - -//converts time in seconds to seconds past the last minute -function getTimeInFormattedSeconds(seconds) { - let secondsFormatted = (seconds % 60).toFixed(3); - - if (secondsFormatted < 10) { - secondsFormatted = "0" + secondsFormatted; - } - - return secondsFormatted; -} - -function sendRequestToServer(type, address, callback) { - let xmlhttp = new XMLHttpRequest(); - - xmlhttp.open(type, serverAddress + address, true); - - if (callback != undefined) { - xmlhttp.onreadystatechange = function () { - callback(xmlhttp, false); - }; - xmlhttp.onerror = function(ev) { - callback(xmlhttp, true); - }; + let formatted = minutes+ ":" + secondsDisplay; + + return formatted; } - - //submit this request - xmlhttp.send(); + + //converts time in seconds to minutes + function getTimeInMinutes(seconds) { + let minutes = Math.floor(seconds / 60); + + return minutes; + } + + //converts time in seconds to seconds past the last minute + function getTimeInFormattedSeconds(seconds) { + let secondsFormatted = (seconds % 60).toFixed(3); + + if (secondsFormatted < 10) { + secondsFormatted = "0" + secondsFormatted; + } + + return secondsFormatted; + } + + function sendRequestToServer(type, address, callback) { + let xmlhttp = new XMLHttpRequest(); + + xmlhttp.open(type, serverAddress + address, true); + + if (callback != undefined) { + xmlhttp.onreadystatechange = function () { + callback(xmlhttp, false); + }; + + xmlhttp.onerror = function(ev) { + callback(xmlhttp, true); + }; + } + + //submit this request + xmlhttp.send(); + } + + function getYouTubeVideoID(url) { // Returns with video id else returns false + var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; + var match = url.match(regExp); + var id = new URL(url).searchParams.get("v"); + return (match && match[7].length == 11) ? id : false; + } + +//end of function } -function getYouTubeVideoID(url) { // Returns with video id else returns false - var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; - var match = url.match(regExp); - var id = new URL(url).searchParams.get("v"); - return (match && match[7].length == 11) ? id : false; +if (chrome.tabs != undefined) { + //add the width restriction (because Firefox) + document.getElementById("sponorBlockStyleSheet").sheet.insertRule('.popupBody { width: 300 }', 0); + + //this means it is actually opened in the popup + runThePopup(); } + From 3a0a267e12a617ace2ff1fc6aa6db43718dbb288 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 31 Jul 2019 23:17:40 -0400 Subject: [PATCH 08/17] Reimplements error system --- popup.js | 1811 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 930 insertions(+), 881 deletions(-) diff --git a/popup.js b/popup.js index 1329595b..58b66aa5 100644 --- a/popup.js +++ b/popup.js @@ -1,929 +1,978 @@ -// References -var SB = {}; +//make this a function to allow this to run on the content page +function runThePopup() { -SB.sponsorStart = document.getElementById("sponsorStart"); -SB.clearTimes = document.getElementById("clearTimes"); -SB.submitTimes = document.getElementById("submitTimes"); -SB.showNoticeAgain = document.getElementById("showNoticeAgain"); -SB.hideVideoPlayerControls = document.getElementById("hideVideoPlayerControls"); -SB.showVideoPlayerControls = document.getElementById("showVideoPlayerControls"); -SB.hideInfoButtonPlayerControls = document.getElementById("hideInfoButtonPlayerControls"); -SB.showInfoButtonPlayerControls = document.getElementById("showInfoButtonPlayerControls"); -SB.hideDeleteButtonPlayerControls = document.getElementById("hideDeleteButtonPlayerControls"); -SB.showDeleteButtonPlayerControls = document.getElementById("showDeleteButtonPlayerControls"); -SB.disableSponsorViewTracking = document.getElementById("disableSponsorViewTracking"); -SB.enableSponsorViewTracking = document.getElementById("enableSponsorViewTracking"); -SB.optionsButton = document.getElementById("optionsButton"); -SB.reportAnIssue = document.getElementById("reportAnIssue"); -// sponsorTimesContributions -SB.sponsorTimesContributionsContainer = document.getElementById("sponsorTimesContributionsContainer"); -SB.sponsorTimesContributionsDisplay = document.getElementById("sponsorTimesContributionsDisplay"); -SB.sponsorTimesContributionsDisplayEndWord = document.getElementById("sponsorTimesContributionsDisplayEndWord"); -// sponsorTimesViewsDisplay -SB.sponsorTimesViewsContainer = document.getElementById("sponsorTimesViewsDisplayContainer"); -SB.sponsorTimesViewsDisplay = document.getElementById("sponsorTimesViewsDisplayDisplay"); -SB.sponsorTimesViewsDisplayEndWord = document.getElementById("sponsorTimesViewsDisplayDisplayEndWord"); -// discordButtons -SB.discordButtonContainer = document.getElementById("discordButtonContainer"); -SB.hideDiscordButton = document.getElementById("hideDiscordButton"); -// submitTimesInfoMessage -SB.submitTimesInfoMessageContainer = document.getElementById("submitTimesInfoMessage"); -SB.submitTimesInfoMessage = document.getElementById("submitTimesInfoMessage"); + //is it in the popup or content script + var inPopup = true; + if (chrome.tabs == undefined) { + //this is on the content script, use direct communication + chrome.tabs = {}; + chrome.tabs.sendMessage = function(id, request, callback) { + messageListener(request, null, callback); + } + + //add a dummy query method + chrome.tabs.query = function(config, callback) { + callback([{ + url: document.URL, + id: -1 + }]); + } + + inPopup = false; + } + + var SB = {}; -//setup click listeners -SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); -SB.clearTimes.addEventListener("click", clearTimes); -SB.submitTimes.addEventListener("click", submitTimes); -SB.showNoticeAgain.addEventListener("click", showNoticeAgain); -SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls); -SB.showVideoPlayerControls.addEventListener("click", showVideoPlayerControls); -SB.hideInfoButtonPlayerControls.addEventListener("click", hideInfoButtonPlayerControls); -SB.showInfoButtonPlayerControls.addEventListener("click", showInfoButtonPlayerControls); -SB.hideDeleteButtonPlayerControls.addEventListener("click", hideDeleteButtonPlayerControls); -SB.showDeleteButtonPlayerControls.addEventListener("click", showDeleteButtonPlayerControls); -SB.disableSponsorViewTracking.addEventListener("click", disableSponsorViewTracking); -SB.enableSponsorViewTracking.addEventListener("click", enableSponsorViewTracking); -SB.optionsButton.addEventListener("click", openOptions); -SB.reportAnIssue.addEventListener("click", reportAnIssue); -SB.hideDiscordButton.addEventListener("click", hideDiscordButton); + ["sponsorStart", + "clearTimes", + "submitTimes", + "showNoticeAgain", + "hideVideoPlayerControls", + "showVideoPlayerControls", + "hideInfoButtonPlayerControls", + "showInfoButtonPlayerControls", + "hideDeleteButtonPlayerControls", + "showDeleteButtonPlayerControls", + "disableSponsorViewTracking", + "enableSponsorViewTracking", + "optionsButton", + "reportAnIssue", + // sponsorTimesContributions + "sponsorTimesContributionsContainer", + "sponsorTimesContributionsDisplay", + "sponsorTimesContributionsDisplayEndWord", + // sponsorTimesViewsDisplay + "sponsorTimesViewsContainer", + "sponsorTimesViewsDisplay", + "sponsorTimesViewsDisplayEndWord", + // discordButtons + "discordButtonContainer", + "hideDiscordButton", + // submitTimesInfoMessage + "submitTimesInfoMessageContainer", + "submitTimesInfoMessage" + // More + "submissionSection", + "mainControls", + "loadingIndicator", + "videoFound", + "sponsorMessageTimes", + "downloadedSponsorMessageTimes", + ].forEach(id => SB[id] = document.getElementById(id)); + //setup click listeners + SB.sponsorStart.addEventListener("click", sendSponsorStartMessage); + SB.clearTimes.addEventListener("click", clearTimes); + SB.submitTimes.addEventListener("click", submitTimes); + SB.showNoticeAgain.addEventListener("click", showNoticeAgain); + SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls); + SB.showVideoPlayerControls.addEventListener("click", showVideoPlayerControls); + SB.hideInfoButtonPlayerControls.addEventListener("click", hideInfoButtonPlayerControls); + SB.showInfoButtonPlayerControls.addEventListener("click", showInfoButtonPlayerControls); + SB.hideDeleteButtonPlayerControls.addEventListener("click", hideDeleteButtonPlayerControls); + SB.showDeleteButtonPlayerControls.addEventListener("click", showDeleteButtonPlayerControls); + SB.disableSponsorViewTracking.addEventListener("click", disableSponsorViewTracking); + SB.enableSponsorViewTracking.addEventListener("click", enableSponsorViewTracking); + SB.optionsButton.addEventListener("click", openOptions); + SB.reportAnIssue.addEventListener("click", reportAnIssue); + SB.hideDiscordButton.addEventListener("click", hideDiscordButton); + + //setup error message languages + var EN_US = new Map(); -//if true, the button now selects the end time -var startTimeChosen = false; + EN_US.set(400, 'Server said this request was invalid"') + .set(429, 'You have submitted too many sponsor times for this one video, are you sure there are this many?') + .set(409, 'This has already been submitted before') + .set(502, 'It seems the server is down. Contact the dev to inform them.') + .set('Unknown', 'There was an error submitting your sponsor times, please try again later.'); -//the start and end time pairs (2d) -var sponsorTimes = []; - -//current video ID of this tab -var currentVideoID = null; - -//is this a YouTube tab? -var isYouTubeTab = false; - -//see if discord link can be shown -chrome.storage.sync.get(["hideDiscordLink"], function(result) { - let hideDiscordLink = result.hideDiscordLink; - if (hideDiscordLink == undefined || !hideDiscordLink) { - chrome.storage.sync.get(["hideDiscordLaunches"], function(result) { - let hideDiscordLaunches = result.hideDiscordLaunches; - //only if less than 5 launches - if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) { - SB.discordButtonContainer.style.display = null; - - if (hideDiscordLaunches == undefined) { - hideDiscordButton = 1; + //if true, the button now selects the end time + let startTimeChosen = false; + + //the start and end time pairs (2d) + let sponsorTimes = []; + + //current video ID of this tab + let currentVideoID = null; + + //is this a YouTube tab? + let isYouTubeTab = false; + + //see if discord link can be shown + chrome.storage.sync.get(["hideDiscordLink"], function(result) { + let hideDiscordLink = result.hideDiscordLink; + if (hideDiscordLink == undefined || !hideDiscordLink) { + chrome.storage.sync.get(["hideDiscordLaunches"], function(result) { + let hideDiscordLaunches = result.hideDiscordLaunches; + //only if less than 5 launches + if (hideDiscordLaunches == undefined || hideDiscordLaunches < 10) { + SB.discordButtonContainer.style.display = null; + + if (hideDiscordLaunches == undefined) { + hideDiscordButton = 1; + } + + chrome.storage.sync.set({"hideDiscordLaunches": hideDiscordButton + 1}); } - - chrome.storage.sync.set({"hideDiscordLaunches": hideDiscordButton + 1}); + }); + } + }); + + //if the don't show notice again letiable is true, an option to + // disable should be available + chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { + let dontShowNoticeAgain = result.dontShowNoticeAgain; + if (dontShowNoticeAgain != undefined && dontShowNoticeAgain) { + SB.showNoticeAgain.style.display = "unset"; + } + }); + + //show proper video player controls options + chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) { + let hideVideoPlayerControls = result.hideVideoPlayerControls; + if (hideVideoPlayerControls != undefined && hideVideoPlayerControls) { + SB.hideVideoPlayerControls.style.display = "none"; + SB.showVideoPlayerControls.style.display = "unset"; + } + }); + chrome.storage.sync.get(["hideInfoButtonPlayerControls"], function(result) { + let hideInfoButtonPlayerControls = result.hideInfoButtonPlayerControls; + if (hideInfoButtonPlayerControls != undefined && hideInfoButtonPlayerControls) { + SB.hideInfoButtonPlayerControls.style.display = "none"; + SB.showInfoButtonPlayerControls.style.display = "unset"; + } + }); + chrome.storage.sync.get(["hideDeleteButtonPlayerControls"], function(result) { + let hideDeleteButtonPlayerControls = result.hideDeleteButtonPlayerControls; + if (hideDeleteButtonPlayerControls != undefined && hideDeleteButtonPlayerControls) { + SB.hideDeleteButtonPlayerControls.style.display = "none"; + SB.showDeleteButtonPlayerControls.style.display = "unset"; + } + }); + + //show proper tracking option + chrome.storage.sync.get(["trackViewCount"], function(result) { + let trackViewCount = result.trackViewCount; + if (trackViewCount != undefined && !trackViewCount) { + SB.disableSponsorViewTracking.style.display = "none"; + SB.enableSponsorViewTracking.style.display = "unset"; + } + }); + + //get the amount of times this user has contributed and display it to thank them + chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { + if (result.sponsorTimesContributed != undefined) { + if (result.sponsorTimesContributed > 1) { + SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsors." + } else { + SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsor." + } + SB.sponsorTimesContributionsDisplay.innerText = result.sponsorTimesContributed; + SB.sponsorTimesContributionsContainer.style.display = "unset"; + + //get the userID + chrome.storage.sync.get(["userID"], function(result) { + let userID = result.userID; + if (userID != undefined) { + //there are probably some views on these submissions then + //get the amount of views from the sponsors submitted + sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) { + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { + let viewCount = JSON.parse(xmlhttp.responseText).viewCount; + if (viewCount != 0) { + if (viewCount > 1) { + SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segments." + } else { + SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." + } + SB.sponsorTimesViewsDisplay.innerText = viewCount; + SB.sponsorTimesViewsContainer.style.display = "unset"; + } + } + }); + } + }); + } + }); + + + chrome.tabs.query({ + active: true, + currentWindow: true + }, loadTabData); + + + function loadTabData(tabs) { + //set current videoID + currentVideoID = getYouTubeVideoID(tabs[0].url); + + if (!currentVideoID) { + //this isn't a YouTube video then + displayNoVideo(); + return; + } + + //load video times for this video + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.get([sponsorTimeKey], function(result) { + let sponsorTimesStorage = result[sponsorTimeKey]; + if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) { + if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) { + startTimeChosen = true; + SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + } + + sponsorTimes = sponsorTimesStorage; + + displaySponsorTimes(); + + //show submission section + SB.submissionSection.style.display = "unset"; + + showSubmitTimesIfNecessary(); } }); + + //check if this video's sponsors are known + chrome.tabs.sendMessage( + tabs[0].id, + {message: 'isInfoFound'}, + infoFound + ); } -}); + + function infoFound(request) { + if(chrome.runtime.lastError) { + //This page doesn't have the injected content script, or at least not yet + displayNoVideo(); + return; + } + + //if request is undefined, then the page currently being browsed is not YouTube + if (request != undefined) { + //this must be a YouTube video + //set letiable + isYouTubeTab = true; + + //remove loading text + SB.mainControls.style.display = "unset" + SB.loadingIndicator.innerHTML = ""; -//if the don't show notice again variable is true, an option to -// disable should be available -chrome.storage.sync.get(["dontShowNoticeAgain"], function(result) { - let dontShowNoticeAgain = result.dontShowNoticeAgain; - if (dontShowNoticeAgain != undefined && dontShowNoticeAgain) { - SB.showNoticeAgain.style.display = "unset"; + if (request.found) { + SB.videoFound.innerHTML = "This video's sponsors are in the database!" + + displayDownloadedSponsorTimes(request); + } else { + SB.videoFound.innerHTML = "No sponsors found" + } + } } -}); + + function setVideoID(request) { + //if request is undefined, then the page currently being browsed is not YouTube + if (request != undefined) { + videoID = request.videoID; + } + } + + function sendSponsorStartMessage() { + //the content script will get the message if a YouTube page is open + chrome.tabs.query({ + active: true, + currentWindow: true + }, tabs => { + chrome.tabs.sendMessage( + tabs[0].id, + {from: 'popup', message: 'sponsorStart'}, + startSponsorCallback + ); + }); + } + + function startSponsorCallback(response) { + let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0); + + if (sponsorTimes[sponsorTimesIndex] == undefined) { + sponsorTimes[sponsorTimesIndex] = []; + } + + sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; + + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + updateStartTimeChosen(); + + //display video times on screen + displaySponsorTimes(); + + //show submission section + SB.submissionSection.style.display = "unset"; + + showSubmitTimesIfNecessary(); + } + + //display the video times from the array + function displaySponsorTimes() { + //remove all children + while (SB.sponsorMessageTimes.firstChild) { + SB.sponsorMessageTimes.removeChild(SB.sponsorMessageTimes.firstChild); + } -//show proper video player controls options -chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) { - let hideVideoPlayerControls = result.hideVideoPlayerControls; - if (hideVideoPlayerControls != undefined && hideVideoPlayerControls) { + //add sponsor times + SB.sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); + } + + //display the video times from the array at the top, in a different section + function displayDownloadedSponsorTimes(request) { + if (request.sponsorTimes != undefined) { + //set it to the message + SB.downloadedSponsorMessageTimes.innerText = getSponsorTimesMessage(request.sponsorTimes); + + //add them as buttons to the issue reporting container + let container = document.getElementById("issueReporterTimeButtons"); + for (let i = 0; i < request.sponsorTimes.length; i++) { + let sponsorTimeButton = document.createElement("button"); + sponsorTimeButton.className = "warningButton popupElement"; + sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]); + + let votingButtons = document.createElement("div"); + + let UUID = request.UUIDs[i]; + + //thumbs up and down buttons + let voteButtonsContainer = document.createElement("div"); + voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID; + voteButtonsContainer.setAttribute("align", "center"); + voteButtonsContainer.style.display = "none" + + let upvoteButton = document.createElement("img"); + upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; + upvoteButton.className = "voteButton popupElement"; + upvoteButton.src = chrome.extension.getURL("icons/upvote.png"); + upvoteButton.addEventListener("click", () => vote(1, UUID)); + + let downvoteButton = document.createElement("img"); + downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID; + downvoteButton.className = "voteButton popupElement"; + downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); + downvoteButton.addEventListener("click", () => vote(0, UUID)); + + //add thumbs up and down buttons to the container + voteButtonsContainer.appendChild(document.createElement("br")); + voteButtonsContainer.appendChild(document.createElement("br")); + voteButtonsContainer.appendChild(upvoteButton); + voteButtonsContainer.appendChild(downvoteButton); + + //add click listener to open up vote panel + sponsorTimeButton.addEventListener("click", function() { + voteButtonsContainer.style.display = "unset"; + }); + + container.appendChild(sponsorTimeButton); + container.appendChild(voteButtonsContainer); + + //if it is not the last iteration + if (i != request.sponsorTimes.length - 1) { + container.appendChild(document.createElement("br")); + container.appendChild(document.createElement("br")); + } + } + } + } + + //get the message that visually displays the video times + function getSponsorTimesMessage(sponsorTimes) { + let sponsorTimesMessage = ""; + + for (let i = 0; i < sponsorTimes.length; i++) { + for (let s = 0; s < sponsorTimes[i].length; s++) { + let timeMessage = getFormattedTime(sponsorTimes[i][s]); + //if this is an end time + if (s == 1) { + timeMessage = " to " + timeMessage; + } else if (i > 0) { + //add commas if necessary + timeMessage = ", " + timeMessage; + } + + sponsorTimesMessage += timeMessage; + } + } + + return sponsorTimesMessage; + } + + //get the message that visually displays the video times + //this version is a div that contains each with delete buttons + function getSponsorTimesMessageDiv(sponsorTimes) { + // let sponsorTimesMessage = ""; + let sponsorTimesContainer = document.createElement("div"); + sponsorTimesContainer.id = "sponsorTimesContainer"; + + for (let i = 0; i < sponsorTimes.length; i++) { + let currentSponsorTimeContainer = document.createElement("div"); + currentSponsorTimeContainer.id = "sponsorTimeContainer" + i; + currentSponsorTimeContainer.className = "sponsorTime popupElement"; + let currentSponsorTimeMessage = ""; + + let deleteButton = document.createElement("span"); + deleteButton.id = "sponsorTimeDeleteButton" + i; + deleteButton.innerText = "Delete"; + deleteButton.className = "mediumLink popupElement"; + let index = i; + deleteButton.addEventListener("click", () => deleteSponsorTime(index)); + + let spacer = document.createElement("span"); + spacer.innerText = " "; + + let editButton = document.createElement("span"); + editButton.id = "sponsorTimeEditButton" + i; + editButton.innerText = "Edit"; + editButton.className = "mediumLink popupElement"; + editButton.addEventListener("click", () => editSponsorTime(index)); + + for (let s = 0; s < sponsorTimes[i].length; s++) { + let timeMessage = getFormattedTime(sponsorTimes[i][s]); + //if this is an end time + if (s == 1) { + timeMessage = " to " + timeMessage; + } else if (i > 0) { + //add commas if necessary + timeMessage = timeMessage; + } + + currentSponsorTimeMessage += timeMessage; + } + + currentSponsorTimeContainer.innerText = currentSponsorTimeMessage; + currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index)); + + sponsorTimesContainer.appendChild(currentSponsorTimeContainer); + sponsorTimesContainer.appendChild(deleteButton); + + //only if it is a complete sponsor time + if (sponsorTimes[i].length > 1) { + sponsorTimesContainer.appendChild(editButton); + } + } + + return sponsorTimesContainer; + } + + function editSponsorTime(index) { + if (document.getElementById("startTimeMinutes" + index) != null) { + //already open + return; + } + + //hide submit button + document.getElementById("submitTimesContainer").style.display = "none"; + + let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); + + //get sponsor time minutes and seconds boxes + let startTimeMinutes = document.createElement("input"); + startTimeMinutes.id = "startTimeMinutes" + index; + startTimeMinutes.className = "sponsorTime popupElement"; + startTimeMinutes.type = "text"; + startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]); + startTimeMinutes.style.width = "45px"; + + let startTimeSeconds = document.createElement("input"); + startTimeSeconds.id = "startTimeSeconds" + index; + startTimeSeconds.className = "sponsorTime popupElement"; + startTimeSeconds.type = "text"; + startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); + startTimeSeconds.style.width = "60px"; + + let endTimeMinutes = document.createElement("input"); + endTimeMinutes.id = "endTimeMinutes" + index; + endTimeMinutes.className = "sponsorTime popupElement"; + endTimeMinutes.type = "text"; + endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]); + endTimeMinutes.style.width = "45px"; + + let endTimeSeconds = document.createElement("input"); + endTimeSeconds.id = "endTimeSeconds" + index; + endTimeSeconds.className = "sponsorTime popupElement"; + endTimeSeconds.type = "text"; + endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); + endTimeSeconds.style.width = "60px"; + + let colonText = document.createElement("span"); + colonText.innerText = ":"; + + let toText = document.createElement("span"); + toText.innerText = " to "; + + //remove all children to replace + while (sponsorTimeContainer.firstChild) { + sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild); + } + + sponsorTimeContainer.appendChild(startTimeMinutes); + sponsorTimeContainer.appendChild(colonText); + sponsorTimeContainer.appendChild(startTimeSeconds); + sponsorTimeContainer.appendChild(toText); + sponsorTimeContainer.appendChild(endTimeMinutes); + sponsorTimeContainer.appendChild(colonText); + sponsorTimeContainer.appendChild(endTimeSeconds); + + //add save button and remove edit button + let saveButton = document.createElement("span"); + saveButton.id = "sponsorTimeSaveButton" + index; + saveButton.innerText = "Save"; + saveButton.className = "mediumLink popupElement"; + saveButton.addEventListener("click", () => saveSponsorTimeEdit(index)); + + let editButton = document.getElementById("sponsorTimeEditButton" + index); + let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); + + sponsorTimesContainer.replaceChild(saveButton, editButton); + } + + function saveSponsorTimeEdit(index) { + let startTimeMinutes = document.getElementById("startTimeMinutes" + index); + let startTimeSeconds = document.getElementById("startTimeSeconds" + index); + + let endTimeMinutes = document.getElementById("endTimeMinutes" + index); + let endTimeSeconds = document.getElementById("endTimeSeconds" + index); + + sponsorTimes[index][0] = parseInt(startTimeMinutes.value) * 60 + parseFloat(startTimeSeconds.value); + sponsorTimes[index][1] = parseInt(endTimeMinutes.value) * 60 + parseFloat(endTimeSeconds.value); + + //save this + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + displaySponsorTimes(); + + showSubmitTimesIfNecessary(); + } + + //deletes the sponsor time submitted at an index + function deleteSponsorTime(index) { + //if it is not a complete sponsor time + if (sponsorTimes[index].length < 2) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + + resetStartTimeChosen(); + } + + sponsorTimes.splice(index, 1); + + //save this + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + //update display + displaySponsorTimes(); + + //if they are all removed + if (sponsorTimes.length == 0) { + //update chrome tab + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + + //hide submission section + document.getElementById("submissionSection").style.display = "none"; + } + } + + function clearTimes() { + //send new sponsor time state to tab + if (sponsorTimes.length > 0) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeStartSponsorButton", + showStartSponsor: true, + uploadButtonVisible: false + }); + }); + } + + //reset sponsorTimes + sponsorTimes = []; + + let sponsorTimeKey = "sponsorTimes" + currentVideoID; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + + displaySponsorTimes(); + + //hide submission section + document.getElementById("submissionSection").style.display = "none"; + + resetStartTimeChosen(); + } + + function getErrorMessage(lang, statusCode) { + if(lang.has(statusCode)) return lang.get(statusCode); + return lang.get('Unknown').concat(" Error code: ") + statusCode; + } + + function submitTimes() { + //make info message say loading + SB.submitTimesInfoMessage.innerText = "Loading..."; + SB.submitTimesInfoMessageContainer.style.display = "unset"; + + if (sponsorTimes.length > 0) { + chrome.runtime.sendMessage({ + message: "submitTimes", + videoID: currentVideoID + }, function(response) { + if (response != undefined) { + if (response.statusCode == 200) { + //hide loading message + SB.submitTimesInfoMessageContainer.style.display = "none"; + + clearTimes(); + } else { + let errorMessage = getErrorMessage(EN_US, response.statusCode); + + document.getElementById("submitTimesInfoMessage").innerText = errorMessage; + document.getElementById("submitTimesInfoMessageContainer").style.display = "unset"; + + SB.submitTimesInfoMessageContainer.style.display = "unset"; + } + } + }); + } + } + + function showNoticeAgain() { + chrome.storage.sync.set({"dontShowNoticeAgain": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "showNoticeAgain" + }); + }); + + SB.showNoticeAgain.style.display = "none"; + } + + function hideVideoPlayerControls() { + chrome.storage.sync.set({"hideVideoPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerControlsVisibility", + value: true + }); + }); + SB.hideVideoPlayerControls.style.display = "none"; SB.showVideoPlayerControls.style.display = "unset"; } -}); -chrome.storage.sync.get(["hideInfoButtonPlayerControls"], function(result) { - let hideInfoButtonPlayerControls = result.hideInfoButtonPlayerControls; - if (hideInfoButtonPlayerControls != undefined && hideInfoButtonPlayerControls) { + + function showVideoPlayerControls() { + chrome.storage.sync.set({"hideVideoPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerControlsVisibility", + value: false + }); + }); + + SB.hideVideoPlayerControls.style.display = "unset"; + SB.showVideoPlayerControls.style.display = "none"; + } + + function hideInfoButtonPlayerControls() { + chrome.storage.sync.set({"hideInfoButtonPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeInfoButtonPlayerControlsVisibility", + value: true + }); + }); + SB.hideInfoButtonPlayerControls.style.display = "none"; SB.showInfoButtonPlayerControls.style.display = "unset"; } -}); -chrome.storage.sync.get(["hideDeleteButtonPlayerControls"], function(result) { - let hideDeleteButtonPlayerControls = result.hideDeleteButtonPlayerControls; - if (hideDeleteButtonPlayerControls != undefined && hideDeleteButtonPlayerControls) { + + function showInfoButtonPlayerControls() { + chrome.storage.sync.set({"hideInfoButtonPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerCochangeInfoButtonPlayerControlsVisibilityntrolsVisibility", + value: false + }); + }); + + SB.hideInfoButtonPlayerControls.style.display = "unset"; + SB.showInfoButtonPlayerControls.style.display = "none"; + } + + function hideDeleteButtonPlayerControls() { + chrome.storage.sync.set({"hideDeleteButtonPlayerControls": true}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeDeleteButtonPlayerControlsVisibility", + value: true + }); + }); + SB.hideDeleteButtonPlayerControls.style.display = "none"; SB.showDeleteButtonPlayerControls.style.display = "unset"; } -}); - -//show proper tracking option -chrome.storage.sync.get(["trackViewCount"], function(result) { - let trackViewCount = result.trackViewCount; - if (trackViewCount != undefined && !trackViewCount) { + + function showDeleteButtonPlayerControls() { + chrome.storage.sync.set({"hideDeleteButtonPlayerControls": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "changeVideoPlayerCochangeDeleteButtonPlayerControlsVisibilityntrolsVisibility", + value: false + }); + }); + + SB.hideDeleteButtonPlayerControls.style.display = "unset"; + SB.showDeleteButtonPlayerControls.style.display = "none"; + } + + function disableSponsorViewTracking() { + chrome.storage.sync.set({"trackViewCount": false}); + + chrome.tabs.query({ + active: true, + currentWindow: true + }, function(tabs) { + chrome.tabs.sendMessage(tabs[0].id, { + message: "trackViewCount", + value: false + }); + }); + SB.disableSponsorViewTracking.style.display = "none"; SB.enableSponsorViewTracking.style.display = "unset"; } -}); - -//get the amount of times this user has contributed and display it to thank them -chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { - if (result.sponsorTimesContributed != undefined) { - if (result.sponsorTimesContributed > 1) { - SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsors." - } else { - SB.sponsorTimesContributionsDisplayEndWord.innerText = "sponsor." - } - SB.sponsorTimesContributionsDisplay.innerText = result.sponsorTimesContributed; - SB.sponsorTimesContributionsContainer.style.display = "unset"; - - //get the userID - chrome.storage.sync.get(["userID"], function(result) { - let userID = result.userID; - if (userID != undefined) { - //there are probably some views on these submissions then - //get the amount of views from the sponsors submitted - sendRequestToServer("GET", "/api/getViewsForUser?userID=" + userID, function(xmlhttp) { - if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { - let viewCount = JSON.parse(xmlhttp.responseText).viewCount; - if (viewCount != 0) { - if (viewCount > 1) { - SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segments." - } else { - SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." - } - SB.sponsorTimesViewsDisplay.innerText = viewCount; - SB.sponsorTimesViewsContainer.style.display = "unset"; - } - } - }); - } - }); - } -}); - - -chrome.tabs.query({ - active: true, - currentWindow: true -}, loadTabData); - -function loadTabData(tabs) { - //set current videoID - currentVideoID = getYouTubeVideoID(tabs[0].url); - - if (!currentVideoID) { - //this isn't a YouTube video then - displayNoVideo(); - return; - } - - //load video times for this video - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.get([sponsorTimeKey], function(result) { - let sponsorTimesStorage = result[sponsorTimeKey]; - if (sponsorTimesStorage != undefined && sponsorTimesStorage.length > 0) { - if (sponsorTimesStorage[sponsorTimesStorage.length - 1] != undefined && sponsorTimesStorage[sponsorTimesStorage.length - 1].length < 2) { - startTimeChosen = true; - SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; - } - - sponsorTimes = sponsorTimesStorage; - - displaySponsorTimes(); - - //show submission section - document.getElementById("submissionSection").style.display = "unset"; - - showSubmitTimesIfNecessary(); - } - }); - - //check if this video's sponsors are known - chrome.tabs.sendMessage( - tabs[0].id, - {message: 'isInfoFound'}, - infoFound - ); -} - -function infoFound(request) { - if(chrome.runtime.lastError) { - //This page doesn't have the injected content script, or at least not yet - displayNoVideo(); - return; - } - - //if request is undefined, then the page currently being browsed is not YouTube - if (request != undefined) { - //this must be a YouTube video - //set variable - isYouTubeTab = true; - - //remove loading text - document.getElementById("mainControls").style.display = "unset" - document.getElementById("loadingIndicator").innerHTML = ""; - - if (request.found) { - document.getElementById("videoFound").innerHTML = "This video's sponsors are in the database!" - - displayDownloadedSponsorTimes(request); - } else { - document.getElementById("videoFound").innerHTML = "No sponsors found" - } - } -} - -function setVideoID(request) { - //if request is undefined, then the page currently being browsed is not YouTube - if (request != undefined) { - videoID = request.videoID; - } -} - -function sendSponsorStartMessage() { - //the content script will get the message if a YouTube page is open - chrome.tabs.query({ - active: true, - currentWindow: true - }, tabs => { - chrome.tabs.sendMessage( - tabs[0].id, - {from: 'popup', message: 'sponsorStart'}, - startSponsorCallback - ); - }); -} - -function startSponsorCallback(response) { - let sponsorTimesIndex = sponsorTimes.length - (startTimeChosen ? 1 : 0); - - if (sponsorTimes[sponsorTimesIndex] == undefined) { - sponsorTimes[sponsorTimesIndex] = []; - } - - sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; - - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - updateStartTimeChosen(); - - //display video times on screen - displaySponsorTimes(); - - //show submission section - document.getElementById("submissionSection").style.display = "unset"; - - showSubmitTimesIfNecessary(); -} - -//display the video times from the array -function displaySponsorTimes() { - //set it to the message - let sponsorMessageTimes = document.getElementById("sponsorMessageTimes"); - - //remove all children - while (sponsorMessageTimes.firstChild) { - sponsorMessageTimes.removeChild(sponsorMessageTimes.firstChild); - } - - //add sponsor times - sponsorMessageTimes.appendChild(getSponsorTimesMessageDiv(sponsorTimes)); -} - -//display the video times from the array at the top, in a different section -function displayDownloadedSponsorTimes(request) { - if (request.sponsorTimes != undefined) { - //set it to the message - document.getElementById("downloadedSponsorMessageTimes").innerHTML = getSponsorTimesMessage(request.sponsorTimes); - - //add them as buttons to the issue reporting container - let container = document.getElementById("issueReporterTimeButtons"); - for (let i = 0; i < request.sponsorTimes.length; i++) { - let sponsorTimeButton = document.createElement("button"); - sponsorTimeButton.className = "warningButton"; - sponsorTimeButton.innerText = getFormattedTime(request.sponsorTimes[i][0]) + " to " + getFormattedTime(request.sponsorTimes[i][1]); - - let votingButtons = document.createElement("div"); - - let UUID = request.UUIDs[i]; - - //thumbs up and down buttons - let voteButtonsContainer = document.createElement("div"); - voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID; - voteButtonsContainer.setAttribute("align", "center"); - voteButtonsContainer.style.display = "none" - - let upvoteButton = document.createElement("img"); - upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; - upvoteButton.className = "voteButton"; - upvoteButton.src = chrome.extension.getURL("icons/upvote.png"); - upvoteButton.addEventListener("click", () => vote(1, UUID)); - - let downvoteButton = document.createElement("img"); - downvoteButton.id = "sponsorTimesDownvoteButtonsContainer" + UUID; - downvoteButton.className = "voteButton"; - downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); - downvoteButton.addEventListener("click", () => vote(0, UUID)); - - //add thumbs up and down buttons to the container - voteButtonsContainer.appendChild(document.createElement("br")); - voteButtonsContainer.appendChild(document.createElement("br")); - voteButtonsContainer.appendChild(upvoteButton); - voteButtonsContainer.appendChild(downvoteButton); - - //add click listener to open up vote panel - sponsorTimeButton.addEventListener("click", function() { - voteButtonsContainer.style.display = "unset"; - }); - - container.appendChild(sponsorTimeButton); - container.appendChild(voteButtonsContainer); - - //if it is not the last iteration - if (i != request.sponsorTimes.length - 1) { - container.appendChild(document.createElement("br")); - container.appendChild(document.createElement("br")); - } - } - } -} - -//get the message that visually displays the video times -function getSponsorTimesMessage(sponsorTimes) { - let sponsorTimesMessage = ""; - - for (let i = 0; i < sponsorTimes.length; i++) { - for (let s = 0; s < sponsorTimes[i].length; s++) { - let timeMessage = getFormattedTime(sponsorTimes[i][s]); - //if this is an end time - if (s == 1) { - timeMessage = " to " + timeMessage; - } else if (i > 0) { - //add commas if necessary - timeMessage = ", " + timeMessage; - } - - sponsorTimesMessage += timeMessage; - } - } - - return sponsorTimesMessage; -} - -//get the message that visually displays the video times -//this version is a div that contains each with delete buttons -function getSponsorTimesMessageDiv(sponsorTimes) { - // let sponsorTimesMessage = ""; - let sponsorTimesContainer = document.createElement("div"); - sponsorTimesContainer.id = "sponsorTimesContainer"; - - for (let i = 0; i < sponsorTimes.length; i++) { - let currentSponsorTimeContainer = document.createElement("div"); - currentSponsorTimeContainer.id = "sponsorTimeContainer" + i; - currentSponsorTimeContainer.className = "sponsorTime"; - let currentSponsorTimeMessage = ""; - - let deleteButton = document.createElement("span"); - deleteButton.id = "sponsorTimeDeleteButton" + i; - deleteButton.innerText = "Delete"; - deleteButton.className = "mediumLink"; - let index = i; - deleteButton.addEventListener("click", () => deleteSponsorTime(index)); - - let spacer = document.createElement("span"); - spacer.innerText = " "; - - let editButton = document.createElement("span"); - editButton.id = "sponsorTimeEditButton" + i; - editButton.innerText = "Edit"; - editButton.className = "mediumLink"; - editButton.addEventListener("click", () => editSponsorTime(index)); - - for (let s = 0; s < sponsorTimes[i].length; s++) { - let timeMessage = getFormattedTime(sponsorTimes[i][s]); - //if this is an end time - if (s == 1) { - timeMessage = " to " + timeMessage; - } else if (i > 0) { - //add commas if necessary - timeMessage = timeMessage; - } - - currentSponsorTimeMessage += timeMessage; - } - - currentSponsorTimeContainer.innerText = currentSponsorTimeMessage; - currentSponsorTimeContainer.addEventListener("click", () => editSponsorTime(index)); - - sponsorTimesContainer.appendChild(currentSponsorTimeContainer); - sponsorTimesContainer.appendChild(deleteButton); - - //only if it is a complete sponsor time - if (sponsorTimes[i].length > 1) { - sponsorTimesContainer.appendChild(editButton); - } - } - - return sponsorTimesContainer; -} - -function editSponsorTime(index) { - if (document.getElementById("startTimeMinutes" + index) != null) { - //already open - return; - } - - let sponsorTimeContainer = document.getElementById("sponsorTimeContainer" + index); - - //get sponsor time minutes and seconds boxes - let startTimeMinutes = document.createElement("input"); - startTimeMinutes.id = "startTimeMinutes" + index; - startTimeMinutes.className = "sponsorTime"; - startTimeMinutes.type = "text"; - startTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][0]); - startTimeMinutes.style.width = "45"; - let startTimeSeconds = document.createElement("input"); - startTimeSeconds.id = "startTimeSeconds" + index; - startTimeSeconds.className = "sponsorTime"; - startTimeSeconds.type = "text"; - startTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][0]); - startTimeSeconds.style.width = "60"; - - let endTimeMinutes = document.createElement("input"); - endTimeMinutes.id = "endTimeMinutes" + index; - endTimeMinutes.className = "sponsorTime"; - endTimeMinutes.type = "text"; - endTimeMinutes.value = getTimeInMinutes(sponsorTimes[index][1]); - endTimeMinutes.style.width = "45"; + function enableSponsorViewTracking() { + chrome.storage.sync.set({"trackViewCount": true}); - let endTimeSeconds = document.createElement("input"); - endTimeSeconds.id = "endTimeSeconds" + index; - endTimeSeconds.className = "sponsorTime"; - endTimeSeconds.type = "text"; - endTimeSeconds.value = getTimeInFormattedSeconds(sponsorTimes[index][1]); - endTimeSeconds.style.width = "60"; - - let colonText = document.createElement("span"); - colonText.innerText = ":"; - - let toText = document.createElement("span"); - toText.innerText = " to "; - - //remove all children to replace - while (sponsorTimeContainer.firstChild) { - sponsorTimeContainer.removeChild(sponsorTimeContainer.firstChild); - } - - sponsorTimeContainer.appendChild(startTimeMinutes); - sponsorTimeContainer.appendChild(colonText); - sponsorTimeContainer.appendChild(startTimeSeconds); - sponsorTimeContainer.appendChild(toText); - sponsorTimeContainer.appendChild(endTimeMinutes); - sponsorTimeContainer.appendChild(colonText); - sponsorTimeContainer.appendChild(endTimeSeconds); - - //add save button and remove edit button - let saveButton = document.createElement("span"); - saveButton.id = "sponsorTimeSaveButton" + index; - saveButton.innerText = "Save"; - saveButton.className = "mediumLink"; - saveButton.addEventListener("click", () => saveSponsorTimeEdit(index)); - - let editButton = document.getElementById("sponsorTimeEditButton" + index); - let sponsorTimesContainer = document.getElementById("sponsorTimesContainer"); - - sponsorTimesContainer.removeChild(editButton); - sponsorTimesContainer.appendChild(saveButton); -} - -function saveSponsorTimeEdit(index) { - let startTimeMinutes = document.getElementById("startTimeMinutes" + index); - let startTimeSeconds = document.getElementById("startTimeSeconds" + index); - - let endTimeMinutes = document.getElementById("endTimeMinutes" + index); - let endTimeSeconds = document.getElementById("endTimeSeconds" + index); - - sponsorTimes[index][0] = parseInt(startTimeMinutes.value) * 60 + parseFloat(startTimeSeconds.value); - sponsorTimes[index][1] = parseInt(endTimeMinutes.value) * 60 + parseFloat(endTimeSeconds.value); - - //save this - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - displaySponsorTimes(); -} - -//deletes the sponsor time submitted at an index -function deleteSponsorTime(index) { - //if it is not a complete sponsor time - if (sponsorTimes[index].length < 2) { chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false + message: "trackViewCount", + value: true }); }); - - resetStartTimeChosen(); + + SB.enableSponsorViewTracking.style.display = "none"; + SB.disableSponsorViewTracking.style.display = "unset"; } - - sponsorTimes.splice(index, 1); - - //save this - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - //update display - displaySponsorTimes(); - - //if they are all removed - if (sponsorTimes.length == 0) { - //update chrome tab - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false - }); - }); - - //hide submission section - document.getElementById("submissionSection").style.display = "none"; + + function updateStartTimeChosen() { + //update startTimeChosen letiable + if (!startTimeChosen) { + startTimeChosen = true; + SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; + } else { + resetStartTimeChosen(); + } } -} - -function clearTimes() { - //send new sponsor time state to tab - if (sponsorTimes.length > 0) { - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeStartSponsorButton", - showStartSponsor: true, - uploadButtonVisible: false - }); - }); + + //set it to false + function resetStartTimeChosen() { + startTimeChosen = false; + SB.sponsorStart.innerHTML = "Sponsorship Starts Now"; } - - //reset sponsorTimes - sponsorTimes = []; - - let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); - - displaySponsorTimes(); - - //hide submission section - document.getElementById("submissionSection").style.display = "none"; - - resetStartTimeChosen(); -} - -var EN_US = new Map(); - -EN_US.set(400, 'Server said this request was invalid"') - .set(429, 'You have submitted too many sponsor times for this one video, are you sure there are this many?') - .set(409, 'This has already been submitted before') - .set(502, 'It seems the server is down. Contact the dev to inform them.') - .set('Unknown', 'There was an error submitting your sponsor times, please try again later.'); - -function ErrorParser (Lang, statusCode) { - if(Lang.has(statusCode)) return Lang.get(statusCode); - return Lang.get('Unknown').concat(" Error code: ") + statusCode; -} - -function submitTimes() { - //make info message say loading - SB.submitTimesInfoMessage.innerText = "Loading..."; - SB.submitTimesInfoMessageContainer.style.display = "unset"; - - if (sponsorTimes.length > 0) { + + //hides and shows the submit times button when needed + function showSubmitTimesIfNecessary() { + //check if an end time has been specified for the latest sponsor time + if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) { + //show submit times button + document.getElementById("submitTimesContainer").style.display = "unset"; + } else { + //hide submit times button + document.getElementById("submitTimesContainer").style.display = "none"; + } + } + + //make the options div visisble + function openOptions() { + document.getElementById("optionsButtonContainer").style.display = "none"; + document.getElementById("options").style.display = "unset"; + } + + //this is not a YouTube video page + function displayNoVideo() { + document.getElementById("loadingIndicator").innerHTML = "This probably isn't a YouTube tab, or you clicked too early. " + + "If you know this is a YouTube tab, close this popup and open it again."; + } + + function reportAnIssue() { + document.getElementById("issueReporterContainer").style.display = "unset"; + SB.reportAnIssue.style.display = "none"; + } + + function addVoteMessage(message, UUID) { + let container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID); + //remove all children + while (container.firstChild) { + container.removeChild(container.firstChild); + } + + let thanksForVotingText = document.createElement("h2"); + thanksForVotingText.innerText = message; + //there are already breaks there + thanksForVotingText.style.marginBottom = "0px"; + + container.appendChild(thanksForVotingText); + } + + function vote(type, UUID) { + //add loading info + addVoteMessage("Loading...", UUID) + + //send the vote message to the tab chrome.runtime.sendMessage({ - message: "submitTimes", - videoID: currentVideoID + message: "submitVote", + type: type, + UUID: UUID }, function(response) { if (response != undefined) { - if (response.statusCode == 200) { - //hide loading message - SB.submitTimesInfoMessageContainer.style.display = "none"; - clearTimes(); - } else { - ErrorParser(EN_US, response.statusCode); - SB.submitTimesInfoMessageContainer.style.display = "unset"; + //see if it was a success or failure + if (response.successType == 1) { + //success + addVoteMessage("Thanks for voting!", UUID) + } else if (response.successType == 0) { + //failure: duplicate vote + addVoteMessage("You have already voted this way before.", UUID) + } else if (response.successType == -1) { + if (response.statusCode == 502) { + addVoteMessage("It seems the sever is down. Contact the dev immediately.", UUID) + } else { + //failure: unknown error + addVoteMessage("A connection error has occured. Error code: " + response.statusCode, UUID) + } } } }); } -} - -function showNoticeAgain() { - chrome.storage.sync.set({"dontShowNoticeAgain": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "showNoticeAgain" - }); - }); - - SB.showNoticeAgain.style.display = "none"; -} - -function hideVideoPlayerControls() { - chrome.storage.sync.set({"hideVideoPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerControlsVisibility", - value: true - }); - }); - - SB.hideVideoPlayerControls.style.display = "none"; - SB.showVideoPlayerControls.style.display = "unset"; -} - -function showVideoPlayerControls() { - chrome.storage.sync.set({"hideVideoPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerControlsVisibility", - value: false - }); - }); - - SB.hideVideoPlayerControls.style.display = "unset"; - SB.showVideoPlayerControls.style.display = "none"; -} - -function hideInfoButtonPlayerControls() { - chrome.storage.sync.set({"hideInfoButtonPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeInfoButtonPlayerControlsVisibility", - value: true - }); - }); - - SB.hideInfoButtonPlayerControls.style.display = "none"; - SB.showInfoButtonPlayerControls.style.display = "unset"; -} - -function showInfoButtonPlayerControls() { - chrome.storage.sync.set({"hideInfoButtonPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerCochangeInfoButtonPlayerControlsVisibilityntrolsVisibility", - value: false - }); - }); - - SB.hideInfoButtonPlayerControls.style.display = "unset"; - SB.showInfoButtonPlayerControls.style.display = "none"; -} - -function hideDeleteButtonPlayerControls() { - chrome.storage.sync.set({"hideDeleteButtonPlayerControls": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeDeleteButtonPlayerControlsVisibility", - value: true - }); - }); - - SB.hideDeleteButtonPlayerControls.style.display = "none"; - SB.showDeleteButtonPlayerControls.style.display = "unset"; -} - -function showDeleteButtonPlayerControls() { - chrome.storage.sync.set({"hideDeleteButtonPlayerControls": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "changeVideoPlayerCochangeDeleteButtonPlayerControlsVisibilityntrolsVisibility", - value: false - }); - }); - - SB.hideDeleteButtonPlayerControls.style.display = "unset"; - SB.showDeleteButtonPlayerControls.style.display = "none"; -} - -function disableSponsorViewTracking() { - chrome.storage.sync.set({"trackViewCount": false}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "trackViewCount", - value: false - }); - }); - - SB.disableSponsorViewTracking.style.display = "none"; - SB.enableSponsorViewTracking.style.display = "unset"; -} - -function enableSponsorViewTracking() { - chrome.storage.sync.set({"trackViewCount": true}); - - chrome.tabs.query({ - active: true, - currentWindow: true - }, function(tabs) { - chrome.tabs.sendMessage(tabs[0].id, { - message: "trackViewCount", - value: true - }); - }); - - SB.enableSponsorViewTracking.style.display = "none"; - SB.disableSponsorViewTracking.style.display = "unset"; -} - -function updateStartTimeChosen() { - //update startTimeChosen variable - if (!startTimeChosen) { - startTimeChosen = true; - SB.sponsorStart.innerHTML = "Sponsorship Ends Now"; - } else { - resetStartTimeChosen(); - } -} - -//set it to false -function resetStartTimeChosen() { - startTimeChosen = false; - SB.sponsorStart.innerHTML = "Sponsorship Starts Now"; -} - -//hides and shows the submit times button when needed -function showSubmitTimesIfNecessary() { - //check if an end time has been specified for the latest sponsor time - if (sponsorTimes.length > 0 && sponsorTimes[sponsorTimes.length - 1].length > 1) { - //show submit times button - document.getElementById("submitTimesContainer").style.display = "unset"; - } else { - //hide submit times button - document.getElementById("submitTimesContainer").style.display = "none"; - } -} - -//make the options div visisble -function openOptions() { - document.getElementById("optionsButtonContainer").style.display = "none"; - document.getElementById("options").style.display = "unset"; -} - -//this is not a YouTube video page -function displayNoVideo() { - document.getElementById("loadingIndicator").innerHTML = "This probably isn't a YouTube tab, or you clicked too early. " + - "If you know this is a YouTube tab, close this popup and open it again."; -} - -function reportAnIssue() { - document.getElementById("issueReporterContainer").style.display = "unset"; - SB.reportAnIssue.style.display = "none"; -} - -function addVoteMessage(message, UUID) { - let container = document.getElementById("sponsorTimesVoteButtonsContainer" + UUID); - //remove all children - while (container.firstChild) { - container.removeChild(container.firstChild); - } - - let thanksForVotingText = document.createElement("h2"); - thanksForVotingText.innerText = message; - //there are already breaks there - thanksForVotingText.style.marginBottom = "0px"; - - container.appendChild(thanksForVotingText); -} - -function vote(type, UUID) { - //add loading info - addVoteMessage("Loading...", UUID) - - //send the vote message to the tab - chrome.runtime.sendMessage({ - message: "submitVote", - type: type, - UUID: UUID - }, function(response) { - if (response != undefined) { - //see if it was a success or failure - if (response.successType == 1) { - //success - addVoteMessage("Thanks for voting!", UUID) - } else if (response.successType == 0) { - //failure: duplicate vote - addVoteMessage("You have already voted this way before.", UUID) - } else if (response.successType == -1) { - if (response.statusCode == 502) { - addVoteMessage("It seems the sever is down. Contact the dev immediately.", UUID) - } else { - //failure: unknown error - addVoteMessage("A connection error has occured. Error code: " + response.statusCode, UUID) - } - } - } - }); -} - -function hideDiscordButton() { - chrome.storage.sync.set({"hideDiscordLink": false}); - - SB.discordButtonContainer.style.display = "none"; -} - -//converts time in seconds to minutes:seconds -function getFormattedTime(seconds) { - let minutes = Math.floor(seconds / 60); - let secondsDisplay = Math.round(seconds - minutes * 60); - if (secondsDisplay < 10) { - //add a zero - secondsDisplay = "0" + secondsDisplay; - } - - let formatted = minutes+ ":" + secondsDisplay; - - return formatted; -} - -//converts time in seconds to minutes -function getTimeInMinutes(seconds) { - let minutes = Math.floor(seconds / 60); - - return minutes; -} - -//converts time in seconds to seconds past the last minute -function getTimeInFormattedSeconds(seconds) { - let secondsFormatted = (seconds % 60).toFixed(3); - - if (secondsFormatted < 10) { - secondsFormatted = "0" + secondsFormatted; - } - - return secondsFormatted; -} - -function sendRequestToServer(type, address, callback) { - let xmlhttp = new XMLHttpRequest(); - - xmlhttp.open(type, serverAddress + address, true); - - if (callback != undefined) { - xmlhttp.onreadystatechange = function () { - callback(xmlhttp, false); - }; - xmlhttp.onerror = function(ev) { - callback(xmlhttp, true); - }; + function hideDiscordButton() { + chrome.storage.sync.set({"hideDiscordLink": false}); + + SB.discordButtonContainer.style.display = "none"; } - - //submit this request - xmlhttp.send(); + + //converts time in seconds to minutes:seconds + function getFormattedTime(seconds) { + let minutes = Math.floor(seconds / 60); + let secondsDisplay = Math.round(seconds - minutes * 60); + if (secondsDisplay < 10) { + //add a zero + secondsDisplay = "0" + secondsDisplay; + } + + let formatted = minutes+ ":" + secondsDisplay; + + return formatted; + } + + //converts time in seconds to minutes + function getTimeInMinutes(seconds) { + let minutes = Math.floor(seconds / 60); + + return minutes; + } + + //converts time in seconds to seconds past the last minute + function getTimeInFormattedSeconds(seconds) { + let secondsFormatted = (seconds % 60).toFixed(3); + + if (secondsFormatted < 10) { + secondsFormatted = "0" + secondsFormatted; + } + + return secondsFormatted; + } + + function sendRequestToServer(type, address, callback) { + let xmlhttp = new XMLHttpRequest(); + + xmlhttp.open(type, serverAddress + address, true); + + if (callback != undefined) { + xmlhttp.onreadystatechange = function () { + callback(xmlhttp, false); + }; + + xmlhttp.onerror = function(ev) { + callback(xmlhttp, true); + }; + } + + //submit this request + xmlhttp.send(); + } + + function getYouTubeVideoID(url) { // Returns with video id else returns false + var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; + var match = url.match(regExp); + var id = new URL(url).searchParams.get("v"); + return (match && match[7].length == 11) ? id : false; + } + +//end of function } -function getYouTubeVideoID(url) { // Return video id or false - var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; - var match = url.match(regExp); - return (match && match[7].length == 11) ? match[7] : false; -} +if (chrome.tabs != undefined) { + //add the width restriction (because Firefox) + document.getElementById("sponorBlockStyleSheet").sheet.insertRule('.popupBody { width: 300 }', 0); + + //this means it is actually opened in the popup + runThePopup(); +} \ No newline at end of file From a5ec7b246653716fc9d482bbd0d8e5f84e110243 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 31 Jul 2019 23:21:30 -0400 Subject: [PATCH 09/17] Fixed missing comma --- popup.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/popup.js b/popup.js index 58b66aa5..b86ea987 100644 --- a/popup.js +++ b/popup.js @@ -51,7 +51,7 @@ function runThePopup() { "hideDiscordButton", // submitTimesInfoMessage "submitTimesInfoMessageContainer", - "submitTimesInfoMessage" + "submitTimesInfoMessage", // More "submissionSection", "mainControls", From 35c3b5b97f7b3742c962dbfa8bdb194e48f6238c Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Wed, 31 Jul 2019 23:47:04 -0400 Subject: [PATCH 10/17] Made it only count a contribution if it was uploaded successfully. --- background.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/background.js b/background.js index 96e5a309..cbc268b9 100644 --- a/background.js +++ b/background.js @@ -147,6 +147,20 @@ function submitTimes(videoID, callback) { callback({ statusCode: xmlhttp.status }); + + if (xmlhttp.status == 200) { + //add these to the storage log + chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { + let currentContributionAmount = 0; + if (result.sponsorTimesContributed != undefined) { + //current contribution amount is known + currentContributionAmount = result.sponsorTimesContributed; + } + + //save the amount contributed + chrome.storage.sync.set({"sponsorTimesContributed": currentContributionAmount + sponsorTimes.length}); + }); + } } else if (error) { callback({ statusCode: -1 @@ -155,18 +169,6 @@ function submitTimes(videoID, callback) { }); }); } - - //add these to the storage log - chrome.storage.sync.get(["sponsorTimesContributed"], function(result) { - let currentContributionAmount = 0; - if (result.sponsorTimesContributed != undefined) { - //current contribution amount is known - currentContributionAmount = result.sponsorTimesContributed; - } - - //save the amount contributed - chrome.storage.sync.set({"sponsorTimesContributed": currentContributionAmount + sponsorTimes.length}); - }); } }); } From ca8404147d33229b66f71d662231bdbe9f365212 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 1 Aug 2019 15:19:58 -0400 Subject: [PATCH 11/17] Made clicking upload hide the clear button --- content.js | 3 +-- popup.js | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content.js b/content.js index c66e6937..00e47c84 100644 --- a/content.js +++ b/content.js @@ -850,8 +850,7 @@ function sendSubmitMessage(){ submitButton.style.animation = "rotate 1s"; //when the animation is over, hide the button submitButton.addEventListener("animationend", function() { - submitButton.style.animation = "unset"; - submitButton.style.display = "none"; + changeStartSponsorButton(true, false); }); //clear the sponsor times diff --git a/popup.js b/popup.js index b86ea987..4b1c397f 100644 --- a/popup.js +++ b/popup.js @@ -186,6 +186,7 @@ function runThePopup() { } else { SB.sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." } + SB.sponsorTimesViewsDisplay.innerText = viewCount; SB.sponsorTimesViewsContainer.style.display = "unset"; } From 932702cca1966be23af1b789313167ad350fee07 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 1 Aug 2019 20:01:33 -0400 Subject: [PATCH 12/17] Added preview before uploading submissions. --- content.js | 198 +++++++++++++++++++++++++++++++++++++---------------- popup.js | 52 ++++++++++++-- 2 files changed, 187 insertions(+), 63 deletions(-) diff --git a/content.js b/content.js index 00e47c84..49205c2a 100644 --- a/content.js +++ b/content.js @@ -34,6 +34,13 @@ var hideVideoPlayerControls = false; var hideInfoButtonPlayerControls = false; var hideDeleteButtonPlayerControls = false; +//the downloaded sponsor times +var sponsorTimes = []; +var UUIDs = []; + +//the sponsor times being prepared to be submitted +var sponsorTimesSubmitting = []; + //becomes true when isInfoFound is called //this is used to close the popup on YouTube when the other popup opens var popupInitialised = false; @@ -73,6 +80,10 @@ function messageListener(request, sender, sendResponse) { sponsorMessageStarted(sendResponse); } + if (request.message == "sponsorDataChanged") { + updateSponsorTimesSubmitting(); + } + if (request.message == "isInfoFound") { //send the sponsor times along with if it's found sendResponse({ @@ -160,6 +171,9 @@ function videoIDChange(id) { sponsorDataFound = false; sponsorsLookup(id); + //reset sponsor times submitting + sponsorTimesSubmitting = []; + //see if the onvideo control image needs to be changed chrome.runtime.sendMessage({ message: "getSponsorTimes", @@ -174,6 +188,11 @@ function videoIDChange(id) { } else { changeStartSponsorButton(true, false); } + + //see if this data should be saved in the sponsorTimesSubmitting variable + if (sponsorTimes != undefined && sponsorTimes.length > 0) { + sponsorTimesSubmitting = sponsorTimes; + } } }); @@ -203,82 +222,121 @@ function videoIDChange(id) { } function sponsorsLookup(id) { - v = document.querySelector('video') // Youtube video player - - //check database for sponsor times - sendRequestToServer('GET', "/api/getVideoSponsorTimes?videoID=" + id, function(xmlhttp) { - if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { - sponsorDataFound = true; + v = document.querySelector('video') // Youtube video player + + //check database for sponsor times + sendRequestToServer('GET', "/api/getVideoSponsorTimes?videoID=" + id, function(xmlhttp) { + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { + sponsorDataFound = true; - sponsorTimes = JSON.parse(xmlhttp.responseText).sponsorTimes; - UUIDs = JSON.parse(xmlhttp.responseText).UUIDs; + sponsorTimes = JSON.parse(xmlhttp.responseText).sponsorTimes; + UUIDs = JSON.parse(xmlhttp.responseText).UUIDs; + } else if (xmlhttp.readyState == 4) { + sponsorDataFound = false; - // If the sponsor data exists, add the event to run on the videos "ontimeupdate" - v.ontimeupdate = function () { - sponsorCheck(sponsorTimes); - }; - } else if (xmlhttp.readyState == 4) { - sponsorDataFound = false; + //check if this video was uploaded recently + //use the invidious api to get the time published + sendRequestToCustomServer('GET', "https://invidio.us/api/v1/videos/" + id, function(xmlhttp, error) { + if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { + let unixTimePublished = JSON.parse(xmlhttp.responseText).published; - //check if this video was uploaded recently - //use the invidious api to get the time published - sendRequestToCustomServer('GET', "https://invidio.us/api/v1/videos/" + id, function(xmlhttp, error) { - if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { - let unixTimePublished = JSON.parse(xmlhttp.responseText).published; - - //if less than 3 days old - if ((Date.now() / 1000) - unixTimePublished < 259200) { - setTimeout(() => sponsorsLookup(id), 10000); - } + //if less than 3 days old + if ((Date.now() / 1000) - unixTimePublished < 259200) { + setTimeout(() => sponsorsLookup(id), 10000); } - }); - } - }); + } + }); + } + }); + + //add the event to run on the videos "ontimeupdate" + v.ontimeupdate = function () { + sponsorCheck(); + }; } -function sponsorCheck(sponsorTimes) { // Video skipping - //see if any sponsor start time was just passed - for (let i = 0; i < sponsorTimes.length; i++) { - //this means part of the video was just skipped - if (Math.abs(v.currentTime - lastTime) > 1 && lastTime != -1) { - //make lastTime as if the video was playing normally - lastTime = v.currentTime - 0.0001; +//video skipping +function sponsorCheck() { + let skipHappened = false; + + if (sponsorTimes != null) { + //see if any sponsor start time was just passed + for (let i = 0; i < sponsorTimes.length; i++) { + //if something was skipped + if (checkSponsorTime(sponsorTimes, i), true) { + skipHappened = true; + break; + } } + } - let currentTime = Date.now(); - - //If the sponsor time is in between these times, skip it - //Checks if the last time skipped to is not too close to now, to make sure not to get too many - // sponsor times in a row (from one troll) - //the last term makes 0 second start times possible - if ((Math.abs(v.currentTime - sponsorTimes[i][0]) < 0.3 && sponsorTimes[i][0] >= lastTime && sponsorTimes[i][0] <= v.currentTime - && (lastUnixTimeSkipped == -1 || currentTime - lastUnixTimeSkipped > 500)) || (lastTime == -1 && sponsorTimes[i][0] == 0)) { - //skip it - v.currentTime = sponsorTimes[i][1]; - - lastSponsorTimeSkipped = sponsorTimes[i][0]; - - let currentUUID = UUIDs[i]; - lastSponsorTimeSkippedUUID = currentUUID; - - //send out the message saying that a sponsor message was skipped - openSkipNotice(currentUUID); - - setTimeout(() => closeSkipNotice(currentUUID), 7000); - - //send telemetry that a this sponsor was skipped happened - if (trackViewCount) { - sendRequestToServer("GET", "/api/viewedVideoSponsorTime?UUID=" + currentUUID); + if (!skipHappened) { + //check for the "preview" sponsors (currently edited by this user) + for (let i = 0; i < sponsorTimesSubmitting.length; i++) { + //must be a finished sponsor and be valid + if (sponsorTimesSubmitting[i].length > 1 && sponsorTimesSubmitting[i][1] > sponsorTimesSubmitting[i][0]) { + checkSponsorTime(sponsorTimesSubmitting, i, false); } } } //don't keep track until they are loaded in - if (sponsorTimes.length > 0) { + if (sponsorTimes != null || sponsorTimesSubmitting.length > 0) { lastTime = v.currentTime; } } +function checkSponsorTime(sponsorTimes, index, openNotice) { + //this means part of the video was just skipped + if (Math.abs(v.currentTime - lastTime) > 1 && lastTime != -1) { + //make lastTime as if the video was playing normally + lastTime = v.currentTime - 0.0001; + } + + if (checkIfTimeToSkip(v.currentTime, sponsorTimes[index][0])) { + //skip it + skipToTime(v, index, sponsorTimes, openNotice); + + //something was skipped + return true; + } + + return false; +} + +function checkIfTimeToSkip(currentVideoTime, startTime) { + let currentTime = Date.now(); + + //If the sponsor time is in between these times, skip it + //Checks if the last time skipped to is not too close to now, to make sure not to get too many + // sponsor times in a row (from one troll) + //the last term makes 0 second start times possible + return (Math.abs(currentVideoTime - startTime) < 0.3 && startTime >= lastTime && startTime <= currentVideoTime && + (lastUnixTimeSkipped == -1 || currentTime - lastUnixTimeSkipped > 500)) || (lastTime == -1 && startTime == 0); +} + +//skip fromt he start time to the end time for a certain index sponsor time +function skipToTime(v, index, sponsorTimes, openNotice) { + v.currentTime = sponsorTimes[index][1]; + + lastSponsorTimeSkipped = sponsorTimes[index][0]; + + let currentUUID = UUIDs[index]; + lastSponsorTimeSkippedUUID = currentUUID; + + if (openNotice) { + //send out the message saying that a sponsor message was skipped + openSkipNotice(currentUUID); + + setTimeout(() => closeSkipNotice(currentUUID), 7000); + + //send telemetry that a this sponsor was skipped happened + if (trackViewCount) { + sendRequestToServer("GET", "/api/viewedVideoSponsorTime?UUID=" + currentUUID); + } + } +} + function goBackToPreviousTime(UUID) { if (sponsorTimes != null) { //add a tiny bit of time to make sure it is not skipped again @@ -347,6 +405,25 @@ function startSponsorClicked() { message: "addSponsorTime", time: v.currentTime, videoID: getYouTubeVideoID(document.URL) + }, function(response) { + //see if the sponsorTimesSubmitting needs to be updated + updateSponsorTimesSubmitting(); + }); +} + +function updateSponsorTimesSubmitting() { + chrome.runtime.sendMessage({ + message: "getSponsorTimes", + videoID: getYouTubeVideoID(document.URL) + }, function(response) { + if (response != undefined) { + let sponsorTimes = response.sponsorTimes; + + //see if this data should be saved in the sponsorTimesSubmitting variable + if (sponsorTimes != undefined) { + sponsorTimesSubmitting = sponsorTimes; + } + } }); } @@ -544,6 +621,9 @@ function clearSponsorTimes() { let sponsorTimeKey = "sponsorTimes" + currentVideoID; chrome.storage.sync.set({[sponsorTimeKey]: []}); + //clear sponsor times submitting + sponsorTimesSubmitting = []; + //set buttons to be correct changeStartSponsorButton(true, false); } diff --git a/popup.js b/popup.js index 4b1c397f..f9182448 100644 --- a/popup.js +++ b/popup.js @@ -301,7 +301,21 @@ function runThePopup() { sponsorTimes[sponsorTimesIndex][startTimeChosen ? 1 : 0] = response.time; let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + let localStartTimeChosen = startTimeChosen; + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}, function() { + //send a message to the client script + if (localStartTimeChosen) { + chrome.tabs.query({ + active: true, + currentWindow: true + }, tabs => { + chrome.tabs.sendMessage( + tabs[0].id, + {message: "sponsorDataChanged"} + ); + }); + } + }); updateStartTimeChosen(); @@ -546,7 +560,17 @@ function runThePopup() { //save this let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}, function() { + chrome.tabs.query({ + active: true, + currentWindow: true + }, tabs => { + chrome.tabs.sendMessage( + tabs[0].id, + {message: "sponsorDataChanged"} + ); + }); + }); displaySponsorTimes(); @@ -575,7 +599,17 @@ function runThePopup() { //save this let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}, function() { + chrome.tabs.query({ + active: true, + currentWindow: true + }, tabs => { + chrome.tabs.sendMessage( + tabs[0].id, + {message: "sponsorDataChanged"} + ); + }); + }); //update display displaySponsorTimes(); @@ -618,7 +652,17 @@ function runThePopup() { sponsorTimes = []; let sponsorTimeKey = "sponsorTimes" + currentVideoID; - chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}); + chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes}, function() { + chrome.tabs.query({ + active: true, + currentWindow: true + }, tabs => { + chrome.tabs.sendMessage( + tabs[0].id, + {message: "sponsorDataChanged"} + ); + }); + }); displaySponsorTimes(); From 92cb8fb65c8a44be6b4f9f33817b3bff09055138 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 1 Aug 2019 20:02:42 -0400 Subject: [PATCH 13/17] Updated version number --- manifest.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.json b/manifest.json index 60a434a7..eb30677e 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "SponsorBlock for YouTube - Skip Sponsorships", "short_name": "SponsorBlock", - "version": "1.0.23", + "version": "1.0.24", "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { From a83969e3ebdfed85909b0336882fc39534f29384 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 1 Aug 2019 20:21:45 -0400 Subject: [PATCH 14/17] Fixed notice never displaying --- content.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content.js b/content.js index 49205c2a..dc1e5d80 100644 --- a/content.js +++ b/content.js @@ -263,7 +263,7 @@ function sponsorCheck() { //see if any sponsor start time was just passed for (let i = 0; i < sponsorTimes.length; i++) { //if something was skipped - if (checkSponsorTime(sponsorTimes, i), true) { + if (checkSponsorTime(sponsorTimes, i, true)) { skipHappened = true; break; } From d738eac42def8911c7045b2d918926f1181d99d8 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 1 Aug 2019 20:32:04 -0400 Subject: [PATCH 15/17] Moved notice to a better location and shrunk it. --- content.css | 9 +++++---- content.js | 8 ++------ manifest.json | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/content.css b/content.css index 933eb40f..1d118fcf 100644 --- a/content.css +++ b/content.css @@ -45,18 +45,19 @@ min-width: 400px; background-color: rgba(255, 217, 217, 0.8); position: absolute; - z-index: 1; border: 3px solid rgba(0, 0, 0, 0.8); - margin-top: -50px; + right: 0; + bottom: 90px; + zoom: 85%; animation: fadeIn 0.5s; } /* if two are very close to eachother */ .secondSkipNotice { - margin-left: 500px; + bottom: 280px; - transition: margin-left 0.2s; + transition: bottom 0.2s; } .sponsorSkipMessage { diff --git a/content.js b/content.js index dc1e5d80..3dd4eb67 100644 --- a/content.js +++ b/content.js @@ -674,7 +674,7 @@ function openSkipNotice(UUID){ noticeElement.id = "sponsorSkipNotice" + UUID; noticeElement.classList.add("sponsorSkipObject"); noticeElement.classList.add("sponsorSkipNotice"); - noticeElement.style.zIndex = 5 + amountOfPreviousNotices; + noticeElement.style.zIndex = 50 + amountOfPreviousNotices; let logoElement = document.createElement("img"); logoElement.id = "sponsorSkipLogo" + UUID; @@ -744,11 +744,7 @@ function openSkipNotice(UUID){ noticeElement.appendChild(voteButtonsContainer); noticeElement.appendChild(buttonContainer); - let referenceNode = document.getElementById("info"); - if (referenceNode == null) { - //old YouTube - referenceNode = document.getElementById("watch-header"); - } + let referenceNode = document.getElementById("movie_player"); referenceNode.prepend(noticeElement); } diff --git a/manifest.json b/manifest.json index eb30677e..31f155db 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "name": "SponsorBlock for YouTube - Skip Sponsorships", "short_name": "SponsorBlock", - "version": "1.0.24", + "version": "1.0.25", "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { From efe512b5610b5ef5f3763b644110d30cad51ac66 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 1 Aug 2019 20:38:36 -0400 Subject: [PATCH 16/17] Removed unnecessary check for if the info tab is loaded --- content.js | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/content.js b/content.js index 3dd4eb67..4fc79920 100644 --- a/content.js +++ b/content.js @@ -637,29 +637,6 @@ function openSkipNotice(UUID){ return; } - //check if page is loaded yet (for 0 second sponsors, the page might not be loaded yet) - //it looks for the view count div and sees if it is full yet - //querySelectorAll is being used like findElementById for multiple objects, because for - //some reason YouTube has put more than one object with one ID. - let viewCountNode = document.querySelectorAll("#count"); - //check to see if the length is over zero, otherwise it's a different YouTube theme probably - if (viewCountNode.length > 0) { - //check if any of these have text - let viewCountVisible = false; - for (let i = 0; i < viewCountNode.length; i++) { - if (viewCountNode[i].innerText != null) { - viewCountVisible = true; - break; - } - } - if (!viewCountVisible) { - //this is the new YouTube layout and it is still loading - //wait a bit for opening the notice - setTimeout(() => openSkipNotice(UUID), 200); - return; - } - } - let amountOfPreviousNotices = document.getElementsByClassName("sponsorSkipNotice").length; if (amountOfPreviousNotices > 0) { From 3d1be7158d1c6ba0403b505bf1d401821060a0f3 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 1 Aug 2019 20:55:47 -0400 Subject: [PATCH 17/17] Added support for embedded videos. Resolved https://github.com/ajayyy/SponsorBlock/issues/12 --- content.js | 19 +++++++++++++++++++ manifest.json | 3 ++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/content.js b/content.js index 4fc79920..3d74fb1e 100644 --- a/content.js +++ b/content.js @@ -722,6 +722,20 @@ function openSkipNotice(UUID){ noticeElement.appendChild(buttonContainer); let referenceNode = document.getElementById("movie_player"); + if (referenceNode == null) { + //for embeds + let player = document.getElementById("player"); + referenceNode = player.firstChild; + let index = 1; + + //find the child that is the video player (sometimes it is not the first) + while (!referenceNode.classList.contains("html5-video-player") || !referenceNode.classList.contains("ytp-embed")) { + referenceNode = player.children[index]; + + index++; + } + } + referenceNode.prepend(noticeElement); } @@ -1009,5 +1023,10 @@ function getYouTubeVideoID(url) { // Returns with video id else returns false var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; var match = url.match(regExp); var id = new URL(url).searchParams.get("v"); + if (url.includes("/embed/")) { + //it is an embed, don't search for v + id = match[7]; + } + return (match && match[7].length == 11) ? id : false; } diff --git a/manifest.json b/manifest.json index 31f155db..721e24bf 100644 --- a/manifest.json +++ b/manifest.json @@ -1,13 +1,14 @@ { "name": "SponsorBlock for YouTube - Skip Sponsorships", "short_name": "SponsorBlock", - "version": "1.0.25", + "version": "1.0.26", "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { "matches": [ "https://*.youtube.com/*" ], + "all_frames": true, "js": [ "config.js", "content.js",