diff --git a/_locales/en/messages.json b/_locales/en/messages.json new file mode 100644 index 00000000..954b309c --- /dev/null +++ b/_locales/en/messages.json @@ -0,0 +1,115 @@ +{ + "Name": { + "message": "SponsorBlock", + "description": "Name of the extension." + }, + "fullName": { + "message": "SponsorBlock for YouTube - Skip Sponsorships", + "description": "Name of the extension." + }, + + "Description": { + "message": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", + "description": "Description of the extension." + }, + "helpPage": { + "message": "index_en.html" + }, + "400": { + "message": "Server said this request was invalid" + }, + "429": { + "message": "You have submitted too many sponsor times for this one video, are you sure there are this many?" + }, + "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!" + }, + "Sponsor": { + "message": "Sponsor" + }, + "Sponsors": { + "message": "Sponsors" + }, + "Segment": { + "message": "sponsor segment" + }, + "Segments": { + "message": "sponsor segments" + }, + "noticeTitle": { + "message": "Sponsor Skipped" + }, + "noticeClosingMessage": { + "message": "closes in 7s" + }, + "Dismiss": { + "message": "Dismiss" + }, + "Loading": { + "message": "Loading..." + }, + "Mins": { + "message": "Minutes" + }, + "Secs": { + "message": "Seconds" + }, + "Hide": { + "message": "Never Show" + }, + "hitGoBack": { + "message": "Hit unskip to get to where you came from." + }, + "goBack": { + "message": "Unskip" + }, + "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." + }, + "clearThis": { + "message": "Are you sure you want to clear this?\n\n" + }, + "Unknown": { + "message": "There was an error submitting your sponsor times, please try again later." + }, + + "sponsorFound": { + "message": "This video's sponsors are in the database!" + }, + "sponsor404": { + "message": "No sponsors found" + }, + "sponsorStart": { + "message": "Sponsorship Starts Now" + }, + "sponsorEnd": { + "message": "Sponsorship Ends Now" + }, + "noVideoID": { + "message": "This probably isn't a YouTube tab, or you clicked too early. \n If you know this is a YouTube tab,\n close this popup and open it again." + }, + "Voted": { + "message": "Voted!" + }, + "voteFail": { + "message": "You have already voted this way before." + }, + "serverDown": { + "message": "It seems the sever is down. Contact the dev immediately." + }, + "connectionError": { + "message": "A connection error has occured. Error code: " + }, + "wantToSubmit": { + "message": "Do you want to submit the sponsor times for video id" + }, + "leftTimes": { + "message": "You seem to have left some sponsor times unsubmitted. Go back to that page to submit them (they are not deleted)." + } +} diff --git a/background.js b/background.js index 6cd14ee5..e531869d 100644 --- a/background.js +++ b/background.js @@ -56,7 +56,8 @@ chrome.runtime.onInstalled.addListener(function (object) { // TODO (shownInstallPage): remove this if statement, but leave contents if (!shownInstallPage){ //open up the install page - chrome.tabs.create({url: chrome.extension.getURL("/help/index.html")}); + + chrome.tabs.create({url: chrome.extension.getURL("/help/"+chrome.i18n.getMessage("helpPage"))}); } // TODO (shownInstallPage): delete if statement and contents diff --git a/content.css b/content.css index c05f2f16..074bca68 100644 --- a/content.css +++ b/content.css @@ -41,16 +41,16 @@ } .sponsorSkipObject { - font-family: 'Source Sans Pro', sans-serif; + font-family: Roboto, Arial, Helvetica, sans-serif; + + margin-left: 2px; + margin-right: 2px; } .sponsorSkipLogo { - height: 64px; - position: absolute; - top: 0; - bottom: 0; - margin: auto; - margin-left: 10px; + height: 18px; + + float: left; } @keyframes fadeIn { @@ -58,33 +58,89 @@ to { opacity: 1; } } +.sponsorBlockSpacer { + background-color: rgb(100, 100, 100); + border-color: rgb(100, 100, 100); + + margin-left: 5px; +} + .sponsorSkipNotice { - min-height: 165px; - min-width: 400px; - background-color: rgba(255, 217, 217, 0.8); + min-width: 280px; + background-color: rgba(28, 28, 28, 0.9); position: absolute; - border: 3px solid rgba(0, 0, 0, 0.8); - right: 0; - bottom: 90px; - zoom: 85%; + right: 5px; + bottom: 100px; + right: 10px; + + border-radius: 5px; animation: fadeIn 0.5s; + + border-spacing: 5px 10px; + padding-left: 5px; + padding-right: 5px; +} + +.sponsorSkipNoticeTimeLeft { + color: #eeeeee; + + border-radius: 4px; + padding: 2px 5px; + font-size: 12px; + + border: 1px solid #eeeeee; } /* if two are very close to eachother */ .secondSkipNotice { - bottom: 280px; + bottom: 250px; transition: bottom 0.2s; } +.sponsorSkipNoticeUnskipSection { + float: left; + + border-left: 1px solid rgb(150, 150, 150); +} + +.sponsorSkipNoticeCloseButton { + height: 10px; + width: 10px; +} + +.sponsorSkipNoticeButton { + background: none; + color: rgb(235, 235, 235); + border: none; + display: inline-block; + + cursor: pointer; + + margin-right: 10px; +} + +.sponsorSkipNoticeRightSection { + right: 0; + position: absolute; + + float: right; + + margin-right: 5px; +} + +.sponsorSkipNoticeRightButton { + margin-left: 7px; + padding: 0px; +} + .sponsorSkipMessage { - font-size: 18px; - color: #000000; - text-align: center; - margin-top: 10px; + font-size: 14px; font-weight: bold; - margin-top: 4px; + color: rgb(235, 235, 235); + + display: inline-block; } .sponsorSkipInfo { @@ -111,16 +167,18 @@ margin-top: 0px; } +.sponsorTimesVoteButtonMessage { + float: left; +} + .sponsorTimesInfoMessage { - font-size: 15px; - font-weight: bold; - color: #000000; + font-size: 13.3333px; + color: rgb(235, 235, 235); text-align: center; } .voteButton { - height: 32px; - margin-right: 15px; + height: 18px; cursor: pointer; } .voteButton:hover { diff --git a/content.js b/content.js index 868c8ddf..c05cd9ad 100644 --- a/content.js +++ b/content.js @@ -18,6 +18,12 @@ var v; var listenerAdded; +//the video id of the last preview bar update +var lastPreviewBarUpdate; + +//whether the duration listener listening for the duration changes of the video has been setup yet +var durationListenerSetUp = false; + //the channel this video is about var channelURL; @@ -25,10 +31,9 @@ var channelURL; var channelWhitelisted = false; // create preview bar -let progressBar = document.getElementsByClassName("ytp-progress-bar-container")[0] || document.getElementsByClassName("no-model cue-range-markers")[0]; -var previewBar = new PreviewBar(progressBar); +var previewBar; -if(id = getYouTubeVideoID(document.URL)){ // Direct Links +if (id = getYouTubeVideoID(document.URL)) { // Direct Links videoIDChange(id); } @@ -95,7 +100,11 @@ function messageListener(request, sender, sendResponse) { //messages from popup script if (request.message == "update") { - if(id = getYouTubeVideoID(document.URL)) videoIDChange(id); + if(id = getYouTubeVideoID(document.URL)){ + videoIDChange(id); + } else { + resetValues(); + } } if (request.message == "sponsorStart") { @@ -202,11 +211,34 @@ document.onkeydown = function(e){ } } -function videoIDChange(id) { +function resetValues() { + //reset last sponsor times + lastTime = -1; + lastUnixTimeSkipped = -1; + //reset sponsor times + sponsorTimes = null; + UUIDs = null; + sponsorVideoID = id; + sponsorLookupRetries = 0; + + //empty the preview bar + previewBar.set([], [], 0); + + //reset sponsor data found check + sponsorDataFound = false; +} + +function videoIDChange(id) { //not a url change if (sponsorVideoID == id) return; + if (previewBar == null) { + //create it + let progressBar = document.getElementsByClassName("ytp-progress-bar-container")[0] || document.getElementsByClassName("no-model cue-range-markers")[0]; + previewBar = new PreviewBar(progressBar); + } + //warn them if they had unsubmitted times if (previousVideoID != null) { //get the sponsor times from storage @@ -233,24 +265,11 @@ function videoIDChange(id) { //close popup closeInfoMenu(); - //reset last sponsor times - lastTime = -1; - lastUnixTimeSkipped = -1; - - //reset sponsor times - sponsorTimes = null; - UUIDs = null; - sponsorVideoID = id; - sponsorLookupRetries = 0; - - //empty the preview bar - previewBar.set([], [], 0); + resetValues(); //see if there is a video start time youtubeVideoStartTime = getYouTubeVideoStartTime(document.URL); - //reset sponsor data found check - sponsorDataFound = false; sponsorsLookup(id); //make sure everything is properly added @@ -308,12 +327,18 @@ function videoIDChange(id) { function sponsorsLookup(id) { v = document.querySelector('video') // Youtube video player - //there is no video here if (v == null) { setTimeout(() => sponsorsLookup(id), 100); return; } + + if (!durationListenerSetUp) { + durationListenerSetUp = true; + + //wait until it is loaded + v.addEventListener('durationchange', updatePreviewBar); + } //check database for sponsor times sendRequestToServer('GET', "/api/getVideoSponsorTimes?videoID=" + id, function(xmlhttp) { @@ -325,12 +350,9 @@ function sponsorsLookup(id) { //update the preview bar //leave the type blank for now until categories are added - console.log(v.duration) - if (isNaN(v.duration)) { - //wait until it is loaded - v.addEventListener('durationchange', updatePreviewBar); - } else { + if (lastPreviewBarUpdate == id || (lastPreviewBarUpdate == null && !isNaN(v.duration))) { //set it now + //otherwise the listener can handle it updatePreviewBar(); } @@ -371,8 +393,8 @@ function sponsorsLookup(id) { function updatePreviewBar() { previewBar.set(sponsorTimes, [], v.duration); - //the listener is only needed once - v.removeEventListener('durationchange', updatePreviewBar); + //update last video id + lastPreviewBarUpdate = getYouTubeVideoID(document.URL); } function getChannelID() { @@ -494,6 +516,9 @@ function skipToTime(v, index, sponsorTimes, openNotice) { //send telemetry that a this sponsor was skipped happened if (trackViewCount) { sendRequestToServer("GET", "/api/viewedVideoSponsorTime?UUID=" + currentUUID); + + //upvote this + vote(1, currentUUID, true); } } } @@ -517,7 +542,7 @@ function addPlayerControlsButton() { let startSponsorButton = document.createElement("button"); startSponsorButton.id = "startSponsorButton"; startSponsorButton.className = "ytp-button playerButton"; - startSponsorButton.setAttribute("title", "Sponsor Starts Now"); + startSponsorButton.setAttribute("title", chrome.i18n.getMessage("sponsorStart")); startSponsorButton.addEventListener("click", startSponsorClicked); let startSponsorImage = document.createElement("img"); @@ -609,7 +634,7 @@ function changeStartSponsorButton(showStartSponsor, uploadButtonVisible) { if (showStartSponsor) { showingStartSponsor = true; document.getElementById("startSponsorImage").src = chrome.extension.getURL("icons/PlayerStartIconSponsorBlocker256px.png"); - document.getElementById("startSponsorButton").setAttribute("title", "Sponsor Starts Now"); + document.getElementById("startSponsorButton").setAttribute("title", chrome.i18n.getMessage("sponsorStart")); if (document.getElementById("startSponsorImage").style.display != "none" && uploadButtonVisible && !hideInfoButtonPlayerControls) { document.getElementById("submitButton").style.display = "unset"; @@ -620,7 +645,7 @@ function changeStartSponsorButton(showStartSponsor, uploadButtonVisible) { } else { showingStartSponsor = false; document.getElementById("startSponsorImage").src = chrome.extension.getURL("icons/PlayerStopIconSponsorBlocker256px.png"); - document.getElementById("startSponsorButton").setAttribute("title", "Sponsor Ends Now"); + document.getElementById("startSponsorButton").setAttribute("title", chrome.i18n.getMessage("sponsorEND")); //disable submit button document.getElementById("submitButton").style.display = "none"; @@ -808,8 +833,8 @@ function clearSponsorTimes() { let sponsorTimes = result[sponsorTimeKey]; if (sponsorTimes != undefined && sponsorTimes.length > 0) { - let confirmMessage = "Are you sure you want to clear this?\n\n" + getSponsorTimesMessage(sponsorTimes); - confirmMessage += "\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." + let confirmMessage = chrome.i18n.getMessage("clearThis") + getSponsorTimesMessage(sponsorTimes); + confirmMessage += chrome.i18n.getMessage("confirmMSG") if(!confirm(confirmMessage)) return; //clear the sponsor times @@ -848,73 +873,99 @@ function openSkipNotice(UUID){ noticeElement.classList.add("sponsorSkipNotice"); noticeElement.style.zIndex = 50 + amountOfPreviousNotices; + //the row that will contain the info + let firstRow = document.createElement("tr"); + firstRow.id = "sponsorSkipNoticeFirstRow" + UUID; + + let logoColumn = document.createElement("td"); + let logoElement = document.createElement("img"); logoElement.id = "sponsorSkipLogo" + UUID; - logoElement.className = "sponsorSkipLogo"; - logoElement.src = chrome.extension.getURL("icons/LogoSponsorBlocker256px.png"); + logoElement.className = "sponsorSkipLogo sponsorSkipObject"; + logoElement.src = chrome.extension.getURL("icons/IconSponsorBlocker256px.png"); - let noticeMessage = document.createElement("div"); + let noticeMessage = document.createElement("span"); noticeMessage.id = "sponsorSkipMessage" + UUID; noticeMessage.classList.add("sponsorSkipMessage"); noticeMessage.classList.add("sponsorSkipObject"); - noticeMessage.innerText = "Hey, you just skipped a sponsor!"; - - let noticeInfo = document.createElement("p"); - noticeInfo.id = "sponsorSkipInfo" + UUID; - noticeInfo.classList.add("sponsorSkipInfo"); - noticeInfo.classList.add("sponsorSkipObject"); - noticeInfo.innerText = "This message will disapear in 7 seconds"; + noticeMessage.innerText = chrome.i18n.getMessage("noticeTitle"); + + //create the first column + logoColumn.appendChild(logoElement); + logoColumn.appendChild(noticeMessage); + + //add the x button + let closeButtonContainer = document.createElement("td"); + closeButtonContainer.className = "sponsorSkipNoticeRightSection"; + closeButtonContainer.style.top = "11px"; + + let timeLeft = document.createElement("span"); + timeLeft.innerText = chrome.i18n.getMessage("noticeClosingMessage"); + timeLeft.className = "sponsorSkipObject sponsorSkipNoticeTimeLeft"; + + let hideButton = document.createElement("img"); + hideButton.src = chrome.extension.getURL("icons/close.png"); + hideButton.className = "sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton"; + hideButton.addEventListener("click", () => closeSkipNotice(UUID)); + + closeButtonContainer.appendChild(timeLeft); + closeButtonContainer.appendChild(hideButton); + + //add all objects to first row + firstRow.appendChild(logoColumn); + firstRow.appendChild(closeButtonContainer); + + let spacer = document.createElement("hr"); + spacer.id = "sponsorSkipNoticeSpacer" + UUID; + spacer.className = "sponsorBlockSpacer"; + + //the row that will contain the buttons + let secondRow = document.createElement("tr"); + secondRow.id = "sponsorSkipNoticeSecondRow" + UUID; //thumbs up and down buttons - let voteButtonsContainer = document.createElement("div"); + let voteButtonsContainer = document.createElement("td"); voteButtonsContainer.id = "sponsorTimesVoteButtonsContainer" + UUID; - voteButtonsContainer.setAttribute("align", "center"); - - let upvoteButton = document.createElement("img"); - upvoteButton.id = "sponsorTimesUpvoteButtonsContainer" + UUID; - upvoteButton.className = "sponsorSkipObject 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 = "sponsorSkipObject voteButton"; - downvoteButton.src = chrome.extension.getURL("icons/downvote.png"); + downvoteButton.src = chrome.extension.getURL("icons/report.png"); downvoteButton.addEventListener("click", () => vote(0, UUID)); //add thumbs up and down buttons to the container - voteButtonsContainer.appendChild(upvoteButton); voteButtonsContainer.appendChild(downvoteButton); - let buttonContainer = document.createElement("div"); - buttonContainer.setAttribute("align", "center"); + //add unskip button + let unskipContainer = document.createElement("td"); + unskipContainer.className = "sponsorSkipNoticeUnskipSection"; - let goBackButton = document.createElement("button"); - goBackButton.innerText = "Go back"; - goBackButton.className = "sponsorSkipButton"; - goBackButton.addEventListener("click", () => goBackToPreviousTime(UUID)); + let unskipButton = document.createElement("button"); + unskipButton.innerText = chrome.i18n.getMessage("goBack"); + unskipButton.className = "sponsorSkipObject sponsorSkipNoticeButton"; + unskipButton.addEventListener("click", () => goBackToPreviousTime(UUID)); - let hideButton = document.createElement("button"); - hideButton.innerText = "Dismiss"; - hideButton.className = "sponsorSkipButton"; - hideButton.addEventListener("click", () => closeSkipNotice(UUID)); + unskipContainer.appendChild(unskipButton); + + //add don't show again button + let dontshowContainer = document.createElement("td"); + dontshowContainer.className = "sponsorSkipNoticeRightSection"; let dontShowAgainButton = document.createElement("button"); - dontShowAgainButton.innerText = "Don't Show This Again"; - dontShowAgainButton.className = "sponsorSkipDontShowButton"; + dontShowAgainButton.innerText = chrome.i18n.getMessage("Hide"); + dontShowAgainButton.className = "sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton"; dontShowAgainButton.addEventListener("click", dontShowNoticeAgain); - buttonContainer.appendChild(goBackButton); - buttonContainer.appendChild(hideButton); - buttonContainer.appendChild(document.createElement("br")); - buttonContainer.appendChild(document.createElement("br")); - buttonContainer.appendChild(dontShowAgainButton); + dontshowContainer.appendChild(dontShowAgainButton); - noticeElement.appendChild(logoElement); - noticeElement.appendChild(noticeMessage); - noticeElement.appendChild(noticeInfo); - noticeElement.appendChild(voteButtonsContainer); - noticeElement.appendChild(buttonContainer); + //add to row + secondRow.appendChild(voteButtonsContainer); + secondRow.appendChild(unskipContainer); + secondRow.appendChild(dontshowContainer); + + noticeElement.appendChild(firstRow); + noticeElement.appendChild(spacer); + noticeElement.appendChild(secondRow); let referenceNode = document.getElementById("movie_player"); if (referenceNode == null) { @@ -935,36 +986,8 @@ function openSkipNotice(UUID){ } function afterDownvote(UUID) { - //change text to say thanks for voting - //remove buttons - let upvoteButton = document.getElementById("sponsorTimesUpvoteButtonsContainer" + UUID); - let downvoteButton = document.getElementById("sponsorTimesDownvoteButtonsContainer" + UUID); - if (upvoteButton != null) { - document.getElementById("sponsorTimesVoteButtonsContainer" + UUID).removeChild(upvoteButton); - } - if (downvoteButton != null) { - document.getElementById("sponsorTimesVoteButtonsContainer" + UUID).removeChild(downvoteButton); - } - - let previousInfoMessage = document.getElementById("sponsorTimesInfoMessage" + UUID); - if (previousInfoMessage != null) { - //remove it - document.getElementById("sponsorTimesVoteButtonsContainer" + UUID).removeChild(previousInfoMessage); - } - - //add thanks for voting text - let thanksForVotingText = document.createElement("p"); - thanksForVotingText.id = "sponsorTimesThanksForVotingText"; - thanksForVotingText.innerText = "Thanks for voting!" - - //add extra info for voting - let thanksForVotingInfoText = document.createElement("p"); - thanksForVotingInfoText.id = "sponsorTimesThanksForVotingInfoText"; - thanksForVotingInfoText.innerText = "Hit go back to get to where you came from." - - //add element to div - document.getElementById("sponsorTimesVoteButtonsContainer" + UUID).appendChild(thanksForVotingText); - document.getElementById("sponsorTimesVoteButtonsContainer" + UUID).appendChild(thanksForVotingInfoText); + addVoteButtonInfo(chrome.i18n.getMessage("Voted"), UUID); + addNoticeInfoMessage(chrome.i18n.getMessage("hitGoBack"), UUID); //remove this sponsor from the sponsors looked up //find which one it is @@ -983,41 +1006,74 @@ function afterDownvote(UUID) { //update the preview previewBar.set(sponsorTimesLeft, [], v.duration); + + break; } } } -function addLoadingInfo(message, UUID) { - //change text to say thanks for message - //remove buttons - let upvoteButton = document.getElementById("sponsorTimesUpvoteButtonsContainer" + UUID); - let downvoteButton = document.getElementById("sponsorTimesDownvoteButtonsContainer" + UUID); - if (upvoteButton != null) { - document.getElementById("sponsorTimesVoteButtonsContainer" + UUID).removeChild(upvoteButton); - } - if (downvoteButton != null) { - document.getElementById("sponsorTimesVoteButtonsContainer" + UUID).removeChild(downvoteButton); - } - +function addNoticeInfoMessage(message, UUID) { let previousInfoMessage = document.getElementById("sponsorTimesInfoMessage" + UUID); if (previousInfoMessage != null) { //remove it - document.getElementById("sponsorTimesVoteButtonsContainer" + UUID).removeChild(previousInfoMessage); + document.getElementById("sponsorSkipNotice" + UUID).removeChild(previousInfoMessage); } - //add thanks for voting text + //add info let thanksForVotingText = document.createElement("p"); thanksForVotingText.id = "sponsorTimesInfoMessage" + UUID; thanksForVotingText.className = "sponsorTimesInfoMessage"; thanksForVotingText.innerText = message; //add element to div - document.getElementById("sponsorTimesVoteButtonsContainer" + UUID).appendChild(thanksForVotingText); + document.getElementById("sponsorSkipNotice" + UUID).insertBefore(thanksForVotingText, document.getElementById("sponsorSkipNoticeSpacer" + UUID)); } -function vote(type, UUID) { - //add loading info - addLoadingInfo("Loading...", UUID) +function resetNoticeInfoMessage(UUID) { + let previousInfoMessage = document.getElementById("sponsorTimesInfoMessage" + UUID); + if (previousInfoMessage != null) { + //remove it + document.getElementById("sponsorSkipNotice" + UUID).removeChild(previousInfoMessage); + } +} + +function addVoteButtonInfo(message, UUID) { + resetVoteButtonInfo(UUID); + + //hide vote button + let downvoteButton = document.getElementById("sponsorTimesDownvoteButtonsContainer" + UUID); + if (downvoteButton != null) { + document.getElementById("sponsorTimesDownvoteButtonsContainer" + UUID).style.display = "none"; + } + + //add info + let thanksForVotingText = document.createElement("td"); + thanksForVotingText.id = "sponsorTimesVoteButtonInfoMessage" + UUID; + thanksForVotingText.className = "sponsorTimesInfoMessage sponsorTimesVoteButtonMessage"; + thanksForVotingText.innerText = message; + + //add element to div + document.getElementById("sponsorSkipNoticeSecondRow" + UUID).prepend(thanksForVotingText); +} + +function resetVoteButtonInfo(UUID) { + let previousInfoMessage = document.getElementById("sponsorTimesVoteButtonInfoMessage" + UUID); + if (previousInfoMessage != null) { + //remove it + document.getElementById("sponsorSkipNoticeSecondRow" + UUID).removeChild(previousInfoMessage); + } + + //show button again + document.getElementById("sponsorTimesDownvoteButtonsContainer" + UUID).style.removeProperty("display"); +} + +//if inTheBackground is true, then no UI methods will be called +function vote(type, UUID, inTheBackground = false) { + if (!inTheBackground) { + //add loading info + addVoteButtonInfo("Loading...", UUID) + resetNoticeInfoMessage(UUID); + } chrome.runtime.sendMessage({ message: "submitVote", @@ -1026,24 +1082,26 @@ function vote(type, UUID) { }, function(response) { if (response != undefined) { //see if it was a success or failure - if (response.successType == 1) { - //success - if (type == 0) { - afterDownvote(UUID); - } else if (type == 1) { - closeSkipNotice(UUID); + if (!inTheBackground) { + if (response.successType == 1) { + //success + if (type == 0) { + afterDownvote(UUID); + } + } else if (response.successType == 0) { + //failure: duplicate vote + addNoticeInfoMessage(chrome.i18n.getMessage("voteFAIL"), UUID) + resetVoteButtonInfo(UUID); + } else if (response.successType == -1) { + if (response.statusCode == 502) { + addNoticeInfoMessage(chrome.i18n.getMessage("serverDown"), UUID) + resetVoteButtonInfo(UUID); + } else { + //failure: unknown error + addNoticeInfoMessage(chrome.i18n.getMessage("connectionError") + response.statusCode, UUID); + resetVoteButtonInfo(UUID); + } } - } else if (response.successType == 0) { - //failure: duplicate vote - addLoadingInfo("It seems you've already voted before", UUID) - } else if (response.successType == -1) { - if (response.statusCode == 502) { - addLoadingInfo("It seems the sever is down. Contact the dev immediately.", UUID) - } else { - //failure: unknown error - addLoadingInfo("A connection error has occured. Error code: " + response.statusCode, UUID) - } - } } }); @@ -1153,16 +1211,10 @@ function sendSubmitMessage(){ document.getElementById("submitButton").style.animation = "unset"; document.getElementById("submitButtonImage").src = chrome.extension.getURL("icons/PlayerUploadFailedIconSponsorBlocker256px.png"); - if(response.statusCode == 400) { - alert("Server said this request was invalid"); - } else if(response.statusCode == 429) { - alert("You have submitted too many sponsor times for this one video, are you sure there are this many?"); - } else if(response.statusCode == 409) { - alert("This has already been submitted before"); - } else if(response.statusCode == 502) { - alert("It seems the server is down. Contact the dev to inform them. Error code " + response.statusCode); + if([400,429,409,502].includes(response.statusCode)) { + alert(chrome.i18n.getMessage(response.statusCode)); } else { - alert("There was an error submitting your sponsor times, please try again later. Error code " + response.statusCode); + alert(chrome.i18n.getMessage("connectionError") + response.statusCode); } } } diff --git a/help/index.html b/help/index_en.html similarity index 99% rename from help/index.html rename to help/index_en.html index 61e4e6ad..52f24c27 100644 --- a/help/index.html +++ b/help/index_en.html @@ -119,4 +119,4 @@ -
\ No newline at end of file + diff --git a/icons/close.png b/icons/close.png new file mode 100644 index 00000000..1b28870f Binary files /dev/null and b/icons/close.png differ diff --git a/icons/report.png b/icons/report.png new file mode 100644 index 00000000..2376d3e9 Binary files /dev/null and b/icons/report.png differ diff --git a/manifest.json b/manifest.json index d71a7f4b..cc8f81fb 100644 --- a/manifest.json +++ b/manifest.json @@ -1,8 +1,9 @@ { - "name": "SponsorBlock for YouTube - Skip Sponsorships", - "short_name": "SponsorBlock", - "version": "1.0.35", - "description": "Skip over sponsorship on YouTube videos. Report sponsors on videos you watch to save the time of others.", + "name": "__MSG_fullName__", + "short_name": "__MSG_Name__", + "version": "1.0.37", + "default_locale": "en", + "description": "__MSG_Description__", "content_scripts": [ { "matches": [ @@ -32,6 +33,8 @@ "icons/PlayerUploadFailedIconSponsorBlocker256px.png", "icons/upvote.png", "icons/downvote.png", + "icons/report.png", + "icons/close.png", "icons/PlayerInfoIconSponsorBlocker256px.png", "icons/PlayerDeleteIconSponsorBlocker256px.png", "popup.html" @@ -42,7 +45,7 @@ "https://sponsor.ajay.app/*" ], "browser_action": { - "default_title": "SponsorBlock", + "default_title": "__MSG_Name__", "default_popup": "popup.html" }, "background": { diff --git a/popup.css b/popup.css index 1d5dd91e..ae3f79dc 100644 --- a/popup.css +++ b/popup.css @@ -51,6 +51,10 @@ h1.popupElement { padding: 5px; } +.discreteLink.popupElement { + color: black; +} + .recordingSubtitle.popupElement { margin-bottom: 10px; } diff --git a/popup.html b/popup.html index 0c829494..b9affd64 100644 --- a/popup.html +++ b/popup.html @@ -1,6 +1,6 @@
-
+
@@ -73,6 +73,10 @@ sponsor segments. + +
@@ -119,6 +123,10 @@
+
+
+ This is used on the public stats page to show off how much you've contributed. See it here.
+