Compare commits

...

18 Commits

Author SHA1 Message Date
Ajay Ramachandran
b30acaac78 Merge pull request #195 from ajayyy/experimental-ajay
Small Fixes
2019-12-13 23:37:11 -05:00
Ajay Ramachandran
46ac654224 Update version number 2019-12-13 23:35:17 -05:00
Ajay Ramachandran
8578e96c3a Fixed channel whitelisting and channel finding on new YouTube layout. 2019-12-13 23:21:21 -05:00
Ajay Ramachandran
b42bdc6e6f Fixed popup stats padding. 2019-12-13 22:45:40 -05:00
Ajay Ramachandran
369364f574 Fixed downvoted sponsors reappearing. 2019-12-13 22:38:00 -05:00
Ajay Ramachandran
a5baebab3f Fixed new submissions getting added to the downloaded submissions. 2019-12-13 21:55:43 -05:00
Ajay Ramachandran
b34e6076e4 Moved error message handling to a util file and added a link to the status site. 2019-12-13 21:32:57 -05:00
Ajay Ramachandran
226c5d601c Added space to notification. 2019-12-10 18:17:07 -05:00
Ajay Ramachandran
cc1a12e1a2 Clarified that auto-upvote can be disabled. 2019-12-09 17:06:30 -05:00
Ajay Ramachandran
1d342b21fd Added small guideline reminder to submission confirmation dialog. 2019-12-08 12:08:36 -05:00
Ajay Ramachandran
3d01ffee1b Merge pull request #179 from ajayyy/experimental-ajay
Added better local stats.
2019-12-04 23:53:26 -05:00
Ajay Ramachandran
9c51df9159 Increased version number. 2019-12-04 23:51:47 -05:00
Ajay Ramachandran
3a29fcc3d8 Added time the user saved others from plus better time formatting. 2019-12-04 23:51:20 -05:00
Ajay Ramachandran
b18f2ae60d Made it show how much time you have saved yourself. 2019-12-04 23:38:07 -05:00
Ajay Ramachandran
ab07478e25 Updated build number 2019-12-03 17:01:34 -05:00
Ajay Ramachandran
d6aeec933a Merge pull request #176 from ajayyy/experimental-ajay
Better error messages and manual skipping
2019-12-03 00:02:07 -05:00
Ajay Ramachandran
cd5207f816 Added ability to disable auto skip.
Resolves https://github.com/ajayyy/SponsorBlock/issues/131 and https://github.com/ajayyy/SponsorBlock/issues/162
2019-12-02 23:58:29 -05:00
Ajay Ramachandran
381c11ed99 Updated error messages. 2019-11-28 18:03:33 -05:00
15 changed files with 400 additions and 141 deletions

View File

@@ -24,9 +24,6 @@
"409": {
"message": "This has already been submitted before"
},
"502": {
"message": "It seems the server is down. Contact the dev to inform them."
},
"channelWhitelisted": {
"message": "Channel Whitelisted!"
},
@@ -79,7 +76,7 @@
"message": "Paused"
},
"confirmMSG": {
"message": "\n\nTo edit or delete individual values, click the info button or open the extension popup by clicking the extension icon in the top right corner."
"message": "To edit or delete individual values, click the info button or open the extension popup by clicking the extension icon in the top right corner."
},
"clearThis": {
"message": "Are you sure you want to clear this?\n\n"
@@ -217,10 +214,10 @@
"message": "This is the button that allows you to clear all sponsors on the YouTube player."
},
"disableViewTracking": {
"message": "Disable Sponsor View Tracking"
"message": "Disable Sponsor Skip Count Tracking"
},
"enableViewTracking": {
"message": "Enable Sponsor View Tracking"
"message": "Enable Sponsor Skip Count Tracking"
},
"whatViewTracking": {
"message": "This feature tracks which sponsors you have skipped to let users know how much their submission has helped others and\nused as a metric along with upvotes to ensure that spam doesn't get into the database. The extension sends a message\nto the server each time you skip a sponsor. Hopefully most people don't change this setting so that the view numbers are accurate. :)"
@@ -272,5 +269,56 @@
"yourWork": {
"message": "Your Work",
"description": "Used to describe the section that will show you the statistics from your submissions."
},
"502": {
"message": "The server seems to be overloaded. Try again in a few seconds."
},
"errorCode": {
"message": "Error Code: "
},
"noticeTitleNotSkipped": {
"message": "Skip Sponsor?"
},
"skip": {
"message": "Skip"
},
"disableAutoSkip": {
"message": "Disable Auto Skip"
},
"enableAutoSkip": {
"message": "Enable Auto Skip"
},
"autoSkipDescription": {
"message": "Auto skip will skip sponsors for you. If disabled, a notice will appear asking if you'd like to skip."
},
"youHaveSkipped": {
"message": "You have skipped "
},
"youHaveSaved": {
"message": "You have saved yourself "
},
"minLower": {
"message": "minute"
},
"minsLower": {
"message": "minutes"
},
"hourLower": {
"message": "hour"
},
"hoursLower": {
"message": "hours"
},
"youHaveSavedTime": {
"message": "You have saved people"
},
"youHaveSavedTimeEnd": {
"message": " of their lives."
},
"guildlinesSummary": {
"message": "- Make sure your segment only contains paid promotion segment, nothing else.\n- Make sure skipping this segment will not skip valuable content\n- If the whole video is a sponsor, please do not report it. A full video reporting system will come out soon.\n- Please do not report disclaimers that could show bias (if a review video is sponsored, don't skip when they mention that)."
},
"statusReminder": {
"message": "Check status.sponsor.ajay.app for server status."
}
}

View File

@@ -24,9 +24,6 @@
"409": {
"message": "Déja soumis"
},
"502": {
"message": "Le serveur ne fonctionne pas. Contactez le développeur."
},
"channelWhitelisted": {
"message": "Cette chaîne est sur la liste blanche !"
},

View File

@@ -24,9 +24,6 @@
"409": {
"message": "Questo spezzone è già stato inviato"
},
"502": {
"message": "Sembra che il server non funzioni. Contatta lo sviluppatore."
},
"channelWhitelisted": {
"message": "Canale aggiunto alla whitelist!"
},

View File

@@ -24,9 +24,6 @@
"409": {
"message": "Isso já foi enviado antes"
},
"502": {
"message": "Parece que o servidor caiu. Contate o desenvolvedor para informá-los."
},
"channelWhitelisted": {
"message": "Canal adicionado à lista branca!"
},

View File

@@ -24,9 +24,6 @@
"409": {
"message": "Isso já foi enviado antes"
},
"502": {
"message": "Parece que o servidor caiu. Contacte o desenvolvedor para o informar."
},
"channelWhitelisted": {
"message": "Canal adicionado à whitelist!"
},

View File

@@ -24,9 +24,6 @@
"409": {
"message": "Этот запрос был отправлен ранее."
},
"502": {
"message": "Сервер недоступен. Свяжитесь с разработчиком и сообщите ему об этом."
},
"channelWhitelisted": {
"message": "Канал добавлен в белый список!"
},

View File

@@ -33,7 +33,7 @@ chrome.runtime.onMessage.addListener(function (request, sender, callback) {
case "alertPrevious":
chrome.notifications.create("stillThere" + Math.random(), {
type: "basic",
title: chrome.i18n.getMessage("wantToSubmit") + request.previousVideoID + "?",
title: chrome.i18n.getMessage("wantToSubmit") + " " + request.previousVideoID + "?",
message: chrome.i18n.getMessage("leftTimes"),
iconUrl: "./icons/LogoSponsorBlocker256px.png"
});
@@ -215,22 +215,4 @@ function sendRequestToServer(type, address, callback) {
//submit this request
xmlhttp.send();
}
function generateUserID(length = 36) {
let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
if (window.crypto && window.crypto.getRandomValues) {
values = new Uint32Array(length);
window.crypto.getRandomValues(values);
for (i = 0; i < length; i++) {
result += charset[values[i] % charset.length];
}
return result;
} else {
for (let i = 0; i < length; i++) {
result += charset[Math.floor(Math.random() * charset.length)];
}
return result;
}
}
}

View File

@@ -10,6 +10,9 @@ var sponsorVideoID = null;
//these are sponsors that have been downvoted
var hiddenSponsorTimes = [];
/** @type {Array[boolean]} Has the sponsor been skipped */
var sponsorSkipped = [];
//the video
var v;
@@ -76,6 +79,15 @@ chrome.storage.sync.get(["disableSkipping"], function(result) {
}
});
//should skips be manual
var disableAutoSkip = false;
chrome.storage.sync.get(["disableAutoSkip"], function(result) {
let disableAutoSkipStorage = result.disableAutoSkip;
if (disableAutoSkipStorage != undefined) {
disableAutoSkip = disableAutoSkipStorage;
}
});
//should view counts be tracked
var trackViewCount = false;
chrome.storage.sync.get(["trackViewCount"], function(result) {
@@ -409,6 +421,9 @@ function sponsorsLookup(id, channelIDPromise) {
sponsorTimes = JSON.parse(xmlhttp.responseText).sponsorTimes;
UUIDs = JSON.parse(xmlhttp.responseText).UUIDs;
// Reset skip save
sponsorSkipped = [];
//update the preview bar
//leave the type blank for now until categories are added
if (lastPreviewBarUpdate == id || (lastPreviewBarUpdate == null && !isNaN(v.duration))) {
@@ -464,7 +479,12 @@ function updatePreviewBar() {
//create an array of the sponsor types
let types = [];
for (let i = 0; i < localSponsorTimes.length; i++) {
types.push("sponsor");
if (!hiddenSponsorTimes.includes(i)) {
types.push("sponsor");
} else {
// Don't show this sponsor
types.push(null);
}
}
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
types.push("previewSponsor");
@@ -478,25 +498,20 @@ function updatePreviewBar() {
function getChannelID() {
//get channel id
let channelContainers = document.querySelectorAll(".ytd-channel-name#text");
let channelURLContainer = null;
let channelNameContainer = document.getElementById("channel-name");
let channelURLContainer = channelNameContainer.querySelector("#container").querySelector("#text-container").querySelector("#text").firstElementChild;
for (let i = 0; i < channelContainers.length; i++) {
let child = channelContainers[i].firstElementChild;
if (child != null && child.getAttribute("href") != "") {
channelURLContainer = child;
}
}
if (channelContainers.length == 0) {
if (channelURLContainer === null) {
//old YouTube theme
channelContainers = document.getElementsByClassName("yt-user-info");
let channelContainers = document.getElementsByClassName("yt-user-info");
if (channelContainers.length != 0) {
channelURLContainer = channelContainers[0].firstElementChild;
}
}
if (channelURLContainer == null) {
if (channelURLContainer === null) {
//try later
return false;
}
@@ -530,11 +545,9 @@ function whitelistCheck() {
chrome.storage.sync.get(["whitelistedChannels"], function(result) {
let whitelistedChannels = result.whitelistedChannels;
if (whitelistedChannels != undefined && whitelistedChannels.includes(channelURL)) {
//reset sponsor times to nothing
sponsorTimes = [];
UUIDs = [];
console.log(channelURL)
if (whitelistedChannels != undefined && whitelistedChannels.includes(channelURL)) {
channelWhitelisted = true;
}
});
@@ -546,6 +559,8 @@ function sponsorCheck() {
// Make sure this isn't called again
v.ontimeupdate = null;
return;
} else if (channelWhitelisted) {
return;
}
let skipHappened = false;
@@ -606,7 +621,9 @@ function checkIfTimeToSkip(currentVideoTime, startTime, endTime) {
//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];
if (!disableAutoSkip) {
v.currentTime = sponsorTimes[index][1];
}
lastSponsorTimeSkipped = sponsorTimes[index][0];
@@ -616,7 +633,7 @@ function skipToTime(v, index, sponsorTimes, openNotice) {
if (openNotice) {
//send out the message saying that a sponsor message was skipped
if (!dontShowNotice) {
let skipNotice = new SkipNotice(this, currentUUID);
let skipNotice = new SkipNotice(this, currentUUID, disableAutoSkip);
if (dontShowNoticeOld) {
//show why this notice is showing
@@ -628,15 +645,31 @@ function skipToTime(v, index, sponsorTimes, openNotice) {
}
//auto-upvote this sponsor
if (trackViewCount) {
if (trackViewCount && !disableAutoSkip) {
vote(1, currentUUID, null);
}
}
}
//send telemetry that a this sponsor was skipped happened
if (trackViewCount) {
if (trackViewCount && !sponsorSkipped[index]) {
sendRequestToServer("GET", "/api/viewedVideoSponsorTime?UUID=" + currentUUID);
if (!disableAutoSkip) {
// Count this as a skip
chrome.storage.sync.get(["minutesSaved"], function(result) {
if (result.minutesSaved === undefined) result.minutesSaved = 0;
chrome.storage.sync.set({"minutesSaved": result.minutesSaved + (sponsorTimes[index][1] - sponsorTimes[index][0]) / 60 });
});
chrome.storage.sync.get(["skipCount"], function(result) {
if (result.skipCount === undefined) result.skipCount = 0;
chrome.storage.sync.set({"skipCount": result.skipCount + 1 });
});
sponsorSkipped[index] = true;
}
}
}
@@ -905,6 +938,30 @@ function vote(type, UUID, skipNotice) {
skipNotice.resetNoticeInfoMessage.bind(skipNotice)();
}
let sponsorIndex = UUIDs.indexOf(UUID);
// See if the local time saved count and skip count should be reverted
if (type == 0 && sponsorSkipped[sponsorIndex] || type == 1 && !sponsorSkipped[sponsorIndex]) {
let factor = 1;
if (type == 0) {
factor = -1;
}
// Count this as a skip
chrome.storage.sync.get(["minutesSaved"], function(result) {
if (result.minutesSaved === undefined) result.minutesSaved = 0;
chrome.storage.sync.set({"minutesSaved": result.minutesSaved + factor * (sponsorTimes[sponsorIndex][1] - sponsorTimes[sponsorIndex][0]) / 60 });
});
chrome.storage.sync.get(["skipCount"], function(result) {
if (result.skipCount === undefined) result.skipCount = 0;
chrome.storage.sync.set({"skipCount": result.skipCount + factor * 1 });
});
sponsorSkipped[sponsorIndex] = !sponsorSkipped[sponsorIndex];
}
chrome.runtime.sendMessage({
message: "submitVote",
type: type,
@@ -923,14 +980,8 @@ function vote(type, UUID, skipNotice) {
skipNotice.addNoticeInfoMessage.bind(skipNotice)(chrome.i18n.getMessage("voteFail"))
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
} else if (response.successType == -1) {
if (response.statusCode == 502) {
skipNotice.addNoticeInfoMessage.bind(skipNotice)(chrome.i18n.getMessage("serverDown"))
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
} else {
//failure: unknown error
skipNotice.addNoticeInfoMessage.bind(skipNotice)(chrome.i18n.getMessage("connectionError") + response.statusCode);
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
}
skipNotice.addNoticeInfoMessage.bind(skipNotice)(getErrorMessage(response.statusCode))
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
}
}
}
@@ -990,8 +1041,11 @@ function submitSponsorTimes() {
//update sponsorTimes
chrome.storage.sync.set({[sponsorTimeKey]: sponsorTimes});
let confirmMessage = chrome.i18n.getMessage("submitCheck") + "\n\n" + getSponsorTimesMessage(sponsorTimes);
confirmMessage += "\n\n" + chrome.i18n.getMessage("confirmMSG");
//update sponsorTimesSubmitting
sponsorTimesSubmitting = sponsorTimes;
let confirmMessage = chrome.i18n.getMessage("submitCheck") + "\n\n" + getSponsorTimesMessage(sponsorTimes)
+ "\n\n" + chrome.i18n.getMessage("confirmMSG") + "\n\n" + chrome.i18n.getMessage("guildlinesSummary");
if(!confirm(confirmMessage)) return;
sendSubmitMessage();
@@ -1009,8 +1063,6 @@ function sendSubmitMessage(){
let currentVideoID = sponsorVideoID;
let currentSponsorTimes = submitSponsorTimes;
chrome.runtime.sendMessage({
message: "submitTimes",
videoID: currentVideoID
@@ -1034,24 +1086,25 @@ function sendSubmitMessage(){
//clear the sponsor times
let sponsorTimeKey = "sponsorTimes" + currentVideoID;
chrome.storage.sync.set({[sponsorTimeKey]: []}, () => void updatePreviewBar());
chrome.storage.sync.set({[sponsorTimeKey]: []});
//add submissions to current sponsors list
sponsorTimes = sponsorTimes.concat(sponsorTimesSubmitting);
for (let i = 0; i < sponsorTimesSubmitting.length; i++) {
// Add some random IDs
UUIDs.push(generateUserID());
}
// Empty the submitting times
sponsorTimesSubmitting = [];
updatePreviewBar();
} else {
//show that the upload failed
document.getElementById("submitButton").style.animation = "unset";
document.getElementById("submitImage").src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker256px.png");
if([400, 429, 409, 502, 0].includes(response.statusCode)) {
//treat them the same
if (response.statusCode == 503) response.statusCode = 502;
alert(chrome.i18n.getMessage(response.statusCode + ""));
} else {
alert(chrome.i18n.getMessage("connectionError") + response.statusCode);
}
alert(getErrorMessage(response.statusCode));
}
}
});

View File

@@ -39,7 +39,7 @@
<br/>
<br/>
Whenever you skip a video, you will get a notice report that submission. If the timing seems wrong, report it! You can also vote in the popup. The extension auto upvotes it if you don't report it, so make sure to report when necessary.
Whenever you skip a video, you will get a notice report that submission. If the timing seems wrong, report it! You can also vote in the popup. The extension auto upvotes it if you don't report it, so make sure to report when necessary (this can be disabled in the options).
</p>
<center><img height="120px" src="https://user-images.githubusercontent.com/12688112/63067735-5a638700-bede-11e9-8147-f321b57527ec.gif"></center>

View File

@@ -1,7 +1,7 @@
{
"name": "__MSG_fullName__",
"short_name": "__MSG_Name__",
"version": "1.1.9.6",
"version": "1.1.9.9",
"default_locale": "en",
"description": "__MSG_Description__",
"content_scripts": [

View File

@@ -114,27 +114,51 @@
<h2 class="recordingSubtitle popupElement">__MSG_yourWork__</h2>
<p class="popupElement">
<span id=sponsorTimesContributionsContainer class="popupElement" style="display: none">
<span id="sponsorTimesContributionsContainer" class="popupElement" style="display: none">
__MSG_soFarUHSubmited__
<span id="sponsorTimesContributionsDisplay" class="popupElement">
0
</span>
<span id="sponsorTimesContributionsDisplayEndWord" class="popupElement">
__MSG_Sponsors__.
</span>
<span id="sponsorTimesContributionsDisplayEndWord" class="popupElement">__MSG_Sponsors__</span>.
</span>
<span id=sponsorTimesViewsContainer class="popupElement" style="display: none">
<span id="sponsorTimesViewsContainer" class="popupElement" style="display: none">
__MSG_savedPeopleFrom__
<span id="sponsorTimesViewsDisplay" class="popupElement">
0
</span>
<span id="sponsorTimesViewsDisplayEndWord" class="popupElement">
__MSG_Segments__.
__MSG_savedPeopleFrom__
</span>
<span id="sponsorTimesViewsDisplayEndWord" class="popupElement">__MSG_Segments__</span>.
</span>
<span id="sponsorTimesOthersTimeSavedContainer" class="popupElement" style="display: none">
__MSG_youHaveSavedTime__
<span id="sponsorTimesOthersTimeSavedDisplay" class="popupElement">
0
</span>
<span id="sponsorTimesOthersTimeSavedEndWord" class="popupElement">__MSG_minsLower__</span>
<span class="popupElement">__MSG_youHaveSavedTimeEnd__</span>
</span>
<div id="sponsorTimesSkipsDoneContainer" class="popupElement" style="display: none">
__MSG_youHaveSkipped__
<span id="sponsorTimesSkipsDoneDisplay" class="popupElement">
0
</span>
<span id="sponsorTimesSkipsDoneEndWord" class="popupElement">__MSG_Segments__</span> since December 5th.
</div>
<div id="sponsorTimeSavedContainer" class="popupElement" style="display: none">
__MSG_youHaveSaved__
<span id="sponsorTimeSavedDisplay" class="popupElement">
0
</span>
<span id="sponsorTimeSavedEndWord" class="popupElement">__MSG_minsLower__</span> since December 5th.
</br/>
</br/>
</div>
<div class="popupElement">
__MSG_viewLeaderboard__ <a class="popupElement discreteLink" href="https://sponsor.ajay.app/stats" target="_blank">__MSG_here__</a>.
</div>
@@ -176,6 +200,16 @@
<h3>__MSG_Options__</h3>
<button id="disableAutoSkip" class="warningButton popupElement">__MSG_disableAutoSkip__</button>
<button id="enableAutoSkip" style="display: none" class="warningButton popupElement">__MSG_enableAutoSkip__</button>
<br/>
<sub class="popupElement">
__MSG_autoSkipDescription__
</sub>
<br/>
<br/>
<span id="keybindButtons">
<button id="setStartSponsorKeybind" class="warningButton popupElement">__MSG_setStartSponsorShortcut__</button>
<br/>

130
popup.js
View File

@@ -34,7 +34,10 @@ function runThePopup() {
// More controls
"clearTimes",
"submitTimes",
// options
"showNoticeAgain",
"disableAutoSkip",
"enableAutoSkip",
"hideVideoPlayerControls",
"showVideoPlayerControls",
"hideInfoButtonPlayerControls",
@@ -53,6 +56,18 @@ function runThePopup() {
"sponsorTimesViewsContainer",
"sponsorTimesViewsDisplay",
"sponsorTimesViewsDisplayEndWord",
// sponsorTimesOthersTimeSaved
"sponsorTimesOthersTimeSavedContainer",
"sponsorTimesOthersTimeSavedDisplay",
"sponsorTimesOthersTimeSavedEndWord",
// sponsorTimesSkipsDone
"sponsorTimesSkipsDoneContainer",
"sponsorTimesSkipsDoneDisplay",
"sponsorTimesSkipsDoneEndWord",
// sponsorTimeSaved
"sponsorTimeSavedContainer",
"sponsorTimeSavedDisplay",
"sponsorTimeSavedEndWord",
// discordButtons
"discordButtonContainer",
"hideDiscordButton",
@@ -89,6 +104,8 @@ function runThePopup() {
SB.clearTimes.addEventListener("click", clearTimes);
SB.submitTimes.addEventListener("click", submitTimes);
SB.showNoticeAgain.addEventListener("click", showNoticeAgain);
SB.disableAutoSkip.addEventListener("click", () => setAutoSkip(true));
SB.enableAutoSkip.addEventListener("click", () => setAutoSkip(false));
SB.setStartSponsorKeybind.addEventListener("click", () => setKeybind(true));
SB.setSubmitKeybind.addEventListener("click", () => setKeybind(false));
SB.hideVideoPlayerControls.addEventListener("click", hideVideoPlayerControls);
@@ -157,6 +174,15 @@ function runThePopup() {
SB.showNoticeAgain.style.display = "unset";
}
});
//show proper auto skip option
chrome.storage.sync.get(["disableAutoSkip"], function(result) {
let disableAutoSkip = result.disableAutoSkip;
if (disableAutoSkip != undefined && disableAutoSkip) {
SB.disableAutoSkip.style.display = "none";
SB.enableAutoSkip.style.display = "unset";
}
});
//show proper video player controls options
chrome.storage.sync.get(["hideVideoPlayerControls"], function(result) {
@@ -222,10 +248,55 @@ function runThePopup() {
}
}
});
//get this time in minutes
sendRequestToServer("GET", "/api/getSavedTimeForUser?userID=" + userID, function(xmlhttp) {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
let minutesSaved = JSON.parse(xmlhttp.responseText).timeSaved;
if (minutesSaved != 0) {
if (minutesSaved != 1) {
SB.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minsLower");
} else {
SB.sponsorTimesOthersTimeSavedEndWord.innerText = chrome.i18n.getMessage("minLower");
}
SB.sponsorTimesOthersTimeSavedDisplay.innerText = getFormattedHours(minutesSaved);
SB.sponsorTimesOthersTimeSavedContainer.style.display = "unset";
}
}
});
}
});
}
});
//get the amount of times this user has skipped a sponsor
chrome.storage.sync.get(["skipCount"], function(result) {
if (result.skipCount != undefined) {
if (result.skipCount != 1) {
SB.sponsorTimesSkipsDoneEndWord.innerText = chrome.i18n.getMessage("Sponsors");
} else {
SB.sponsorTimesSkipsDoneEndWord.innerText = chrome.i18n.getMessage("Sponsor");
}
SB.sponsorTimesSkipsDoneDisplay.innerText = result.skipCount;
SB.sponsorTimesSkipsDoneContainer.style.display = "unset";
}
});
//get the amount of time this user has saved.
chrome.storage.sync.get(["minutesSaved"], function(result) {
if (result.minutesSaved != undefined) {
if (result.minutesSaved != 1) {
SB.sponsorTimeSavedEndWord.innerText = chrome.i18n.getMessage("minsLower");
} else {
SB.sponsorTimeSavedEndWord.innerText = chrome.i18n.getMessage("minLower");
}
SB.sponsorTimeSavedDisplay.innerText = getFormattedHours(result.minutesSaved);
SB.sponsorTimeSavedContainer.style.display = "unset";
}
});
chrome.tabs.query({
active: true,
@@ -824,18 +895,7 @@ function runThePopup() {
clearTimes();
} else {
let errorMessage = "";
if([400, 429, 409, 502, 0].includes(response.statusCode)) {
//treat them the same
if (response.statusCode == 503) response.statusCode = 502;
errorMessage = chrome.i18n.getMessage(response.statusCode + "");
} else {
errorMessage = chrome.i18n.getMessage("connectionError") + response.statusCode;
}
document.getElementById("submitTimesInfoMessage").innerText = errorMessage;
document.getElementById("submitTimesInfoMessage").innerText = getErrorMessage(response.statusCode);
document.getElementById("submitTimesInfoMessageContainer").style.display = "unset";
SB.submitTimesInfoMessageContainer.style.display = "unset";
@@ -859,6 +919,21 @@ function runThePopup() {
SB.showNoticeAgain.style.display = "none";
}
function setAutoSkip(value) {
chrome.storage.sync.set({"disableAutoSkip": value});
if (value) {
// If it isn't shown, they can't manually skip
showNoticeAgain();
SB.disableAutoSkip.style.display = "none";
SB.enableAutoSkip.style.display = "unset";
} else {
SB.enableAutoSkip.style.display = "none";
SB.disableAutoSkip.style.display = "unset";
}
}
function hideVideoPlayerControls() {
chrome.storage.sync.set({"hideVideoPlayerControls": true});
@@ -1052,7 +1127,7 @@ function runThePopup() {
SB.usernameInput.style.display = "none";
SB.setUsernameStatusContainer.style.display = "unset";
SB.setUsernameStatus.innerText = "Couldn't connect to server. Error code: " + xmlhttp.status;
SB.setUsernameStatus.innerText = getErrorMessage(xmlhttp.status);
}
});
});
@@ -1074,15 +1149,7 @@ function runThePopup() {
SB.setUsernameStatus.innerText = chrome.i18n.getMessage("success");
} else if (xmlhttp.readyState == 4) {
let errorMessage = "";
if([400, 429, 409, 502].includes(xmlhttp.status)) {
errorMessage = chrome.i18n.getMessage(xmlhttp.status);
} else {
errorMessage = chrome.i18n.getMessage("connectionError") + xmlhttp.status;
}
SB.setUsernameStatus.innerText = errorMessage;
SB.setUsernameStatus.innerText = getErrorMessageI(xmlhttp.status);
}
});
});
@@ -1138,12 +1205,7 @@ function runThePopup() {
//failure: duplicate vote
addVoteMessage(chrome.i18n.getMessage("voteFail"), UUID)
} else if (response.successType == -1) {
if (response.statusCode == 502) {
addVoteMessage(chrome.i18n.getMessage("serverDown"), UUID)
} else {
//failure: unknown error
addVoteMessage(chrome.i18n.getMessage("connectionError") + response.statusCode, UUID)
}
addVoteMessage(getErrorMessage(response.statusCode), UUID)
}
}
});
@@ -1348,6 +1410,18 @@ function runThePopup() {
//submit this request
xmlhttp.send();
}
/**
* Converts time in hours to 5h 25.1
* If less than 1 hour, just returns minutes
*
* @param {float} seconds
* @returns {string}
*/
function getFormattedHours(minues) {
let hours = Math.floor(minues / 60);
return (hours > 0 ? hours + "h " : "") + (minues % 60).toFixed(1);
}
//end of function
}

View File

@@ -66,3 +66,42 @@ function localizeHtmlPage() {
}
}
function generateUserID(length = 36) {
let charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
if (window.crypto && window.crypto.getRandomValues) {
values = new Uint32Array(length);
window.crypto.getRandomValues(values);
for (i = 0; i < length; i++) {
result += charset[values[i] % charset.length];
}
return result;
} else {
for (let i = 0; i < length; i++) {
result += charset[Math.floor(Math.random() * charset.length)];
}
return result;
}
}
/**
* Gets the error message in a nice string
*
* @param {int} statusCode
* @returns {string} errorMessage
*/
function getErrorMessage(statusCode) {
let errorMessage = "";
if([400, 429, 409, 502, 0].includes(statusCode)) {
//treat them the same
if (statusCode == 503) statusCode = 502;
errorMessage = chrome.i18n.getMessage(statusCode + "") + " " + chrome.i18n.getMessage("errorCode") + statusCode
+ "\n\n" + chrome.i18n.getMessage("statusReminder");
} else {
errorMessage = chrome.i18n.getMessage("connectionError") + statusCode;
}
return errorMessage;
}

View File

@@ -59,6 +59,8 @@ class PreviewBar {
duration = Math.floor(duration * 100) / 100;
let width;
for (let i = 0; i < timestamps.length; i++) {
if (types[i] == null) continue;
width = (timestamps[i][1] - timestamps[i][0]) / duration * 100;
width = Math.floor(width * 100) / 100;

View File

@@ -1,10 +1,25 @@
'use strict';
//The notice that tells the user that a sponsor was just skipped
/**
* The notice that tells the user that a sponsor was just skipped
*/
class SkipNotice {
constructor(parent, UUID) {
/**
* @param {HTMLElement} parent
* @param {String} UUID
* @param {String} noticeTitle
* @param {boolean} manualSkip
*/
constructor(parent, UUID, manualSkip = false) {
this.parent = parent;
this.UUID = UUID;
this.manualSkip = manualSkip;
let noticeTitle = chrome.i18n.getMessage("noticeTitle");
if (manualSkip) {
noticeTitle = chrome.i18n.getMessage("noticeTitleNotSkipped");
}
this.maxCountdownTime = () => 4;
//the countdown until this notice closes
@@ -54,7 +69,7 @@ class SkipNotice {
noticeMessage.id = "sponsorSkipMessage" + this.idSuffix;
noticeMessage.classList.add("sponsorSkipMessage");
noticeMessage.classList.add("sponsorSkipObject");
noticeMessage.innerText = chrome.i18n.getMessage("noticeTitle");
noticeMessage.innerText = noticeTitle;
//create the first column
logoColumn.appendChild(logoElement);
@@ -136,7 +151,10 @@ class SkipNotice {
dontShowAgainButton.className = "sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton";
dontShowAgainButton.addEventListener("click", dontShowNoticeAgain);
dontshowContainer.appendChild(dontShowAgainButton);
// Don't let them hide it if manually skipping
if (!this.manualSkip) {
dontshowContainer.appendChild(dontShowAgainButton);
}
//add to row
secondRow.appendChild(voteButtonsContainer);
@@ -165,6 +183,10 @@ class SkipNotice {
referenceNode.prepend(noticeElement);
if (manualSkip) {
this.unskippedMode(chrome.i18n.getMessage("skip"));
}
this.startCountdown();
}
@@ -228,10 +250,13 @@ class SkipNotice {
unskip() {
unskipSponsorTime(this.UUID);
this.unskippedMode(chrome.i18n.getMessage("reskip"));
}
/** Sets up notice to be not skipped yet */
unskippedMode(buttonText) {
//change unskip button to a reskip button
let unskipButton = document.getElementById("sponsorSkipUnskipButton" + this.idSuffix);
unskipButton.innerText = chrome.i18n.getMessage("reskip");
unskipButton.removeEventListener("click", this.unskipCallback);
let unskipButton = this.changeUnskipButton(buttonText);
//setup new callback
this.unskipCallback = this.reskip.bind(this);
@@ -252,10 +277,8 @@ class SkipNotice {
reskip() {
reskipSponsorTime(this.UUID);
//change unskip button to a reskip button
let unskipButton = document.getElementById("sponsorSkipUnskipButton" + this.idSuffix);
unskipButton.innerText = chrome.i18n.getMessage("unskip");
unskipButton.removeEventListener("click", this.unskipCallback);
//change reskip button to a unskip button
let unskipButton = this.changeUnskipButton(chrome.i18n.getMessage("unskip"));
//setup new callback
this.unskipCallback = this.unskip.bind(this);
@@ -265,6 +288,27 @@ class SkipNotice {
this.maxCountdownTime = () => 4;
this.countdownTime = this.maxCountdownTime();
this.updateTimerDisplay();
// See if the title should be changed
if (this.manualSkip) {
this.changeNoticeTitle(chrome.i18n.getMessage("noticeTitle"));
vote(1, this.UUID, this);
}
}
/**
* Changes the text on the reskip button
*
* @param {string} text
* @returns {HTMLElement} unskipButton
*/
changeUnskipButton(text) {
let unskipButton = document.getElementById("sponsorSkipUnskipButton" + this.idSuffix);
unskipButton.innerText = text;
unskipButton.removeEventListener("click", this.unskipCallback);
return unskipButton;
}
afterDownvote() {
@@ -280,19 +324,17 @@ class SkipNotice {
//add this as a hidden sponsorTime
hiddenSponsorTimes.push(i);
let sponsorTimesLeft = sponsorTimes.slice();
for (let j = 0; j < hiddenSponsorTimes.length; j++) {
//remove this sponsor time
sponsorTimesLeft.splice(hiddenSponsorTimes[j], 1);
}
//update the preview
previewBar.set(sponsorTimesLeft, [], v.duration);
updatePreviewBar();
break;
}
}
}
changeNoticeTitle(title) {
let noticeElement = document.getElementById("sponsorSkipMessage" + this.idSuffix);
noticeElement.innerText = title;
}
addNoticeInfoMessage(message, message2) {
let previousInfoMessage = document.getElementById("sponsorTimesInfoMessage" + this.idSuffix);