From 21220bf2d390669850cfe8a3b7e08c9c4a1e24f5 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Mon, 22 Jul 2019 21:11:37 -0400 Subject: [PATCH 1/9] Added support for Firefox. --- content.css | 6 +++++- content.js | 9 ++++----- manifest.json | 9 ++++++++- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/content.css b/content.css index 6126768a..c4e8e7bf 100644 --- a/content.css +++ b/content.css @@ -1,4 +1,4 @@ -.playerButton { +.playerButtonImage { height: 60%; top: 0; bottom: 0; @@ -6,6 +6,10 @@ margin: auto; } +.playerButton { + vertical-align: top; +} + .sponsorSkipObject { font-family: 'Source Sans Pro', sans-serif; } diff --git a/content.js b/content.js index 1fdccecc..7b5f32dd 100644 --- a/content.js +++ b/content.js @@ -117,7 +117,6 @@ function videoIDChange(id) { function sponsorsLookup(id) { v = document.querySelector('video') // Youtube video player - let xmlhttp = new XMLHttpRequest(); //check database for sponsor times sendRequestToServer('GET', "/api/getVideoSponsorTimes?videoID=" + id, function(xmlhttp) { @@ -193,13 +192,13 @@ function addPlayerControlsButton() { let startSponsorButton = document.createElement("button"); startSponsorButton.id = "startSponsorButton"; - startSponsorButton.className = "ytp-button"; + startSponsorButton.className = "ytp-button playerButton"; startSponsorButton.setAttribute("title", "Sponsor Starts Now"); startSponsorButton.addEventListener("click", startSponsorClicked); let startSponsorImage = document.createElement("img"); startSponsorImage.id = "startSponsorImage"; - startSponsorImage.className = "playerButton"; + startSponsorImage.className = "playerButtonImage"; startSponsorImage.src = chrome.extension.getURL("icons/PlayerStartIconSponsorBlocker256px.png"); //add the image to the button @@ -269,7 +268,7 @@ function addSubmitButton() { //make a submit button let submitButton = document.createElement("button"); submitButton.id = "submitButton"; - submitButton.className = "ytp-button"; + submitButton.className = "ytp-button playerButton"; submitButton.setAttribute("title", "Submit Sponsor Times"); submitButton.addEventListener("click", submitSponsorTimes); //hide it at the start @@ -277,7 +276,7 @@ function addSubmitButton() { let submitImage = document.createElement("img"); submitImage.id = "submitButtonImage"; - submitImage.className = "playerButton"; + submitImage.className = "playerButtonImage"; submitImage.src = chrome.extension.getURL("icons/PlayerUploadIconSponsorBlocker256px.png"); //add the image to the button diff --git a/manifest.json b/manifest.json index f0a4ba7b..16797449 100644 --- a/manifest.json +++ b/manifest.json @@ -30,7 +30,8 @@ "permissions": [ "tabs", "storage", - "notifications" + "notifications", + "https://sponsor.ajay.app/*" ], "browser_action": { "default_title": "SponsorBlock", @@ -49,5 +50,11 @@ "128": "icons/LogoSponsorBlocker128px.png", "256": "icons/LogoSponsorBlocker256px.png" }, + "browser_specific_settings": { + "gecko": { + "id": "sponsorBlocker@ajay.app", + "strict_min_version": "42.0" + } + }, "manifest_version": 2 } From 6d32b88490ca761c338124da6c3c6e3b77566368 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Mon, 22 Jul 2019 21:13:33 -0400 Subject: [PATCH 2/9] Updated gitignore for file rename --- .gitignore | 2 +- config.js | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 config.js diff --git a/.gitignore b/.gitignore index a98ca8ff..0af10d9b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -content-config.js +config.js ignored \ No newline at end of file diff --git a/config.js b/config.js deleted file mode 100644 index 005793a7..00000000 --- a/config.js +++ /dev/null @@ -1,3 +0,0 @@ -//this file is loaded along iwth content.js -//this file sets the server to connect to, and is gitignored -var serverAddress = "http://localhost"; \ No newline at end of file From 22df50e3fe000926bcde40b384b0cde1725ae3c0 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Mon, 22 Jul 2019 21:21:00 -0400 Subject: [PATCH 3/9] Made a separate manifest file for Firefox --- firefox_manifest.json | 60 +++++++++++++++++++++++++++++++++++++++++++ manifest.json | 6 ----- 2 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 firefox_manifest.json diff --git a/firefox_manifest.json b/firefox_manifest.json new file mode 100644 index 00000000..16797449 --- /dev/null +++ b/firefox_manifest.json @@ -0,0 +1,60 @@ +{ + "name": "YTSponsorSkip", + "version": "1.0", + "description": "Skip youtube video sponsors.", + "content_scripts": [ + { + "matches": [ + "https://*.youtube.com/*" + ], + "js": [ + "config.js", + "content.js" + ], + "css": [ + "content.css", + "./libs/Source+Sans+Pro.css" + ] + } + ], + "web_accessible_resources": [ + "icons/LogoSponsorBlocker256px.png", + "icons/IconSponsorBlocker256px.png", + "icons/PlayerStartIconSponsorBlocker256px.png", + "icons/PlayerStopIconSponsorBlocker256px.png", + "icons/PlayerUploadIconSponsorBlocker256px.png", + "icons/PlayerUploadFailedIconSponsorBlocker256px.png", + "icons/upvote.png", + "icons/downvote.png" + ], + "permissions": [ + "tabs", + "storage", + "notifications", + "https://sponsor.ajay.app/*" + ], + "browser_action": { + "default_title": "SponsorBlock", + "default_popup": "popup.html" + }, + "background": { + "scripts":[ + "config.js", + "background.js" + ] + }, + "icons": { + "16": "icons/IconSponsorBlocker16px.png", + "32": "icons/IconSponsorBlocker32px.png", + "64": "icons/LogoSponsorBlocker64px.png", + "128": "icons/LogoSponsorBlocker128px.png", + "256": "icons/LogoSponsorBlocker256px.png" + }, + "browser_specific_settings": { + "gecko": { + "id": "sponsorBlocker@ajay.app", + "strict_min_version": "42.0" + } + }, + "manifest_version": 2 +} diff --git a/manifest.json b/manifest.json index 16797449..ee5dcc2b 100644 --- a/manifest.json +++ b/manifest.json @@ -50,11 +50,5 @@ "128": "icons/LogoSponsorBlocker128px.png", "256": "icons/LogoSponsorBlocker256px.png" }, - "browser_specific_settings": { - "gecko": { - "id": "sponsorBlocker@ajay.app", - "strict_min_version": "42.0" - } - }, "manifest_version": 2 } From c580a7dc7ce45559c5d6966835a49f3cb38b44b6 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 23 Jul 2019 17:44:29 -0400 Subject: [PATCH 4/9] Updated icons to be square and fixed titling --- firefox_manifest.json | 5 +++-- icons/LogoSponsorBlocker128px.png | Bin 8357 -> 9282 bytes icons/LogoSponsorBlocker256px.png | Bin 10002 -> 11165 bytes icons/LogoSponsorBlocker64px.png | Bin 4085 -> 4403 bytes manifest.json | 5 +++-- 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/firefox_manifest.json b/firefox_manifest.json index 16797449..4a4c608d 100644 --- a/firefox_manifest.json +++ b/firefox_manifest.json @@ -1,5 +1,6 @@ { - "name": "YTSponsorSkip", + "name": "SponsorBlock - YouTube Sponsorship Blocker", + "short_name": "SponsorBlock", "version": "1.0", "description": "Skip youtube video sponsors.", "content_scripts": [ @@ -53,7 +54,7 @@ "browser_specific_settings": { "gecko": { "id": "sponsorBlocker@ajay.app", - "strict_min_version": "42.0" + "strict_min_version": "57.0" } }, "manifest_version": 2 diff --git a/icons/LogoSponsorBlocker128px.png b/icons/LogoSponsorBlocker128px.png index dbf305de175a9aed56cd1a35234e30c295ca416c..d299a29476d200cf0ffa15d93a3845f44de9a5c5 100644 GIT binary patch literal 9282 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𝔙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 literal 8357 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 L)lsQdvI+Y?r*0l! diff --git a/icons/LogoSponsorBlocker64px.png b/icons/LogoSponsorBlocker64px.png index 933f635c620e60dd558e2510769dc89cf350e85d..87e2479139c1d98618ad93f69090751f9ed3b6db 100644 GIT binary patch delta 4385 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 S?-ybK0000 Date: Tue, 23 Jul 2019 18:32:05 -0400 Subject: [PATCH 5/9] Made it display how many views your submissions have received. --- popup.html | 25 ++++++++++++++++++++++-- popup.js | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/popup.html b/popup.html index b180d788..99f7b099 100644 --- a/popup.html +++ b/popup.html @@ -41,8 +41,26 @@

Record the times of a sponsorship

-

+ + +

@@ -103,5 +121,8 @@ + + + \ No newline at end of file diff --git a/popup.js b/popup.js index 36f6e2d2..47f2d156 100644 --- a/popup.js +++ b/popup.js @@ -41,17 +41,49 @@ chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) { //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) { + let sponsorTimesContributionsContainer = document.getElementById("sponsorTimesContributionsContainer"); let sponsorTimesContributionsDisplay = document.getElementById("sponsorTimesContributionsDisplay"); + let sponsorTimesContributionsDisplayEndWord = document.getElementById("sponsorTimesContributionsDisplayEndWord"); if (result.sponsorTimesContributed > 1) { - sponsorTimesContributionsDisplay.innerText = "So far, you've submitted " + result.sponsorTimesContributed + " sponsor times."; + sponsorTimesContributionsDisplayEndWord.innerText = "sponsors." } else { - sponsorTimesContributionsDisplay.innerText = "So far, you've submitted " + result.sponsorTimesContributed + " sponsor time."; + sponsorTimesContributionsDisplayEndWord.innerText = "sponsor." } - sponsorTimesContributionsDisplay.style.display = "unset"; + sponsorTimesContributionsDisplay.innerText = result.sponsorTimesContributed; + 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) { + let sponsorTimesViewsContainer = document.getElementById("sponsorTimesViewsContainer"); + let sponsorTimesViewsDisplay = document.getElementById("sponsorTimesViewsDisplay"); + let sponsorTimesViewsDisplayEndWord = document.getElementById("sponsorTimesViewsDisplayEndWord"); + + if (viewCount > 1) { + sponsorTimesViewsDisplayEndWord.innerText = "sponsor segments." + } else { + sponsorTimesViewsDisplayEndWord.innerText = "sponsor segment." + } + sponsorTimesViewsDisplay.innerText = viewCount; + sponsorTimesViewsContainer.style.display = "unset"; + } + } + }); + } + }); } }); + chrome.tabs.query({ active: true, currentWindow: true @@ -466,6 +498,25 @@ function getFormattedTime(seconds) { return formatted; } +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) { // Return video id or false var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; var match = url.match(regExp); From c91c08a17f1292ce26c20bbccc64dc2731010701 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 23 Jul 2019 18:42:44 -0400 Subject: [PATCH 6/9] Made it send a request to the server to sponsor skip views. --- content.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/content.js b/content.js index 7b5f32dd..2b51f7f9 100644 --- a/content.js +++ b/content.js @@ -168,6 +168,9 @@ function sponsorCheck(sponsorTimes) { // Video skipping openSkipNotice(); setTimeout(() => closeSkipNotice(currentUUID), 7000); + + //send telemetry that a this sponsor was skipped happened + sendRequestToServer("GET", "/api/viewedVideoSponsorTime?UUID=" + currentUUID); } lastTime = v.currentTime; From 9913e99a6acfb4fcc83edd708235fda904b2fc0e Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 23 Jul 2019 19:33:12 -0400 Subject: [PATCH 7/9] Fixed curly bracket that for some reason was in the wrong place. --- content.js | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/content.js b/content.js index 2b51f7f9..35febc3a 100644 --- a/content.js +++ b/content.js @@ -150,31 +150,30 @@ function sponsorsLookup(id) { } function sponsorCheck(sponsorTimes) { // Video skipping - //see if any sponsor start time was just passed - for (let i = 0; i < sponsorTimes.length; i++) { - //the sponsor time is in between these times, skip it - //if the time difference is more than 1 second, than the there was probably a skip in time, - // and it's not due to playback - if (Math.abs(v.currentTime - lastTime) < 1 && sponsorTimes[i][0] >= lastTime && sponsorTimes[i][0] <= v.currentTime) { - //skip it - v.currentTime = sponsorTimes[i][1]; + //see if any sponsor start time was just passed + for (let i = 0; i < sponsorTimes.length; i++) { + //the sponsor time is in between these times, skip it + //if the time difference is more than 1 second, than the there was probably a skip in time, + // and it's not due to playback + if (Math.abs(v.currentTime - lastTime) < 1 && sponsorTimes[i][0] >= lastTime && sponsorTimes[i][0] <= v.currentTime) { + //skip it + v.currentTime = sponsorTimes[i][1]; - lastSponsorTimeSkipped = sponsorTimes[i][0]; - - let currentUUID = UUIDs[i]; - lastSponsorTimeSkippedUUID = currentUUID; + lastSponsorTimeSkipped = sponsorTimes[i][0]; + + let currentUUID = UUIDs[i]; + lastSponsorTimeSkippedUUID = currentUUID; - //send out the message saying that a sponsor message was skipped - openSkipNotice(); + //send out the message saying that a sponsor message was skipped + openSkipNotice(); - setTimeout(() => closeSkipNotice(currentUUID), 7000); + setTimeout(() => closeSkipNotice(currentUUID), 7000); - //send telemetry that a this sponsor was skipped happened - sendRequestToServer("GET", "/api/viewedVideoSponsorTime?UUID=" + currentUUID); - } - - lastTime = v.currentTime; + //send telemetry that a this sponsor was skipped happened + sendRequestToServer("GET", "/api/viewedVideoSponsorTime?UUID=" + currentUUID); } + } + lastTime = v.currentTime; } function goBackToPreviousTime(UUID) { From b7764fc6340a235d6fef15a0b6cd91bd156232b9 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 23 Jul 2019 19:37:33 -0400 Subject: [PATCH 8/9] Added feature to prevent tons of sponsors reported next to each other from annoying the user. --- content.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/content.js b/content.js index 35febc3a..970ab199 100644 --- a/content.js +++ b/content.js @@ -21,6 +21,9 @@ var v; //the last time looked at (used to see if this time is in the interval) var lastTime; +//the last time skipped to +var lastTimeSkippedTo = -1; + //the last time in the video a sponsor was skipped //used for the go back button var lastSponsorTimeSkipped = null; @@ -155,9 +158,13 @@ function sponsorCheck(sponsorTimes) { // Video skipping //the sponsor time is in between these times, skip it //if the time difference is more than 1 second, than the there was probably a skip in time, // and it's not due to playback - if (Math.abs(v.currentTime - lastTime) < 1 && sponsorTimes[i][0] >= lastTime && sponsorTimes[i][0] <= v.currentTime) { + //also check 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) + if (Math.abs(v.currentTime - lastTime) < 1 && sponsorTimes[i][0] >= lastTime && sponsorTimes[i][0] <= v.currentTime && + (lastTimeSkippedTo == -1 || Math.abs(v.currentTime - lastTimeSkippedTo) > 1)) { //skip it v.currentTime = sponsorTimes[i][1]; + lastTimeSkippedTo = sponsorTimes[i][1]; lastSponsorTimeSkipped = sponsorTimes[i][0]; From e8ff6171eb6f38e4d852ad73b015301ccbb9a769 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Tue, 23 Jul 2019 19:58:30 -0400 Subject: [PATCH 9/9] Updated version number --- firefox_manifest.json | 4 ++-- manifest.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/firefox_manifest.json b/firefox_manifest.json index 4a4c608d..642c4a3e 100644 --- a/firefox_manifest.json +++ b/firefox_manifest.json @@ -1,8 +1,8 @@ { "name": "SponsorBlock - YouTube Sponsorship Blocker", "short_name": "SponsorBlock", - "version": "1.0", - "description": "Skip youtube video sponsors.", + "version": "1.0.1", + "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { "matches": [ diff --git a/manifest.json b/manifest.json index 836ffb28..25c1104f 100644 --- a/manifest.json +++ b/manifest.json @@ -1,8 +1,8 @@ { "name": "SponsorBlock - YouTube Sponsorship Blocker", "short_name": "SponsorBlock", - "version": "1.0", - "description": "Skip YouTube video sponsors.", + "version": "1.0.1", + "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", "content_scripts": [ { "matches": [