diff options
author | Ajay Ramachandran <[email protected]> | 2020-02-10 22:35:54 -0500 |
---|---|---|
committer | GitHub <[email protected]> | 2020-02-10 22:35:54 -0500 |
commit | c19e2bea29af509b365cf371f847718306744068 (patch) | |
tree | 0f89a78ebc29a7f6a8295225a9667387a7ae9ed7 | |
parent | 79b02c7ae775989be45d8e248219b16d80acfc79 (diff) | |
parent | 2f2c1ad49b1ee20bf3e2ba999509594fca66d4e6 (diff) | |
download | SponsorBlock-1.2.9.tar.gz SponsorBlock-1.2.9.zip |
Merge pull request #274 from ajayyy/experimental1.2.9
Various fixes
-rw-r--r-- | README.md | 2 | ||||
-rw-r--r-- | manifest/manifest.json | 8 | ||||
-rw-r--r-- | src/content.ts | 82 | ||||
-rw-r--r-- | src/popup.ts | 33 |
4 files changed, 75 insertions, 50 deletions
@@ -68,7 +68,7 @@ The result is in `dist`. # Credit -The awesome [Invidious API](https://github.com/omarroth/invidious/wiki/API) is used to grab the time the video was published. +The awesome [Invidious API](https://github.com/omarroth/invidious/wiki/API) used to be used. Original code from [YTSponsorSkip](https://github.com/OfficialNoob/YTSponsorSkip), but not much of the code is left. diff --git a/manifest/manifest.json b/manifest/manifest.json index ef72db83..d32d3ef3 100644 --- a/manifest/manifest.json +++ b/manifest/manifest.json @@ -1,11 +1,10 @@ { "name": "__MSG_fullName__", "short_name": "__MSG_Name__", - "version": "1.2.8", + "version": "1.2.9", "default_locale": "en", "description": "__MSG_Description__", - "content_scripts": [ - { + "content_scripts": [{ "run_at": "document_start", "matches": [ "https://*.youtube.com/*", @@ -21,8 +20,7 @@ "./libs/Source+Sans+Pro.css", "popup.css" ] - } - ], + }], "web_accessible_resources": [ "icons/LogoSponsorBlocker256px.png", "icons/IconSponsorBlocker256px.png", diff --git a/src/content.ts b/src/content.ts index 05255f4b..6e51aab3 100644 --- a/src/content.ts +++ b/src/content.ts @@ -27,7 +27,7 @@ var hiddenSponsorTimes = []; var sponsorSkipped = []; //the video -var v; +var video: HTMLVideoElement; var onInvidious; @@ -49,6 +49,10 @@ var channelWhitelisted = false; // create preview bar var previewBar = null; +// When not null, a sponsor is currently being previewed and auto skip should be enabled. +// This is set to a timeout function when that happens that will reset it after 3 seconds. +var previewResetter: NodeJS.Timeout = null; + //the player controls on the YouTube player var controls = null; @@ -85,7 +89,7 @@ var skipNoticeContentContainer = () => ({ unskipSponsorTime, sponsorTimes, UUIDs, - v, + v: video, reskipSponsorTime, hiddenSponsorTimes, updatePreviewBar @@ -132,16 +136,29 @@ function messageListener(request: any, sender: any, sendResponse: (response: any break; case "getVideoDuration": sendResponse({ - duration: v.duration + duration: video.duration }); break; case "skipToTime": - v.currentTime = request.time; + video.currentTime = request.time; + + // Unpause the video if needed + if (video.paused){ + video.play(); + } + + // Start preview resetter + if (previewResetter !== null){ + clearTimeout(previewResetter); + } + + previewResetter = setTimeout(() => previewResetter = null, 4000); + return case "getCurrentTime": sendResponse({ - currentTime: v.currentTime + currentTime: video.currentTime }); break; @@ -346,9 +363,9 @@ async function videoIDChange(id) { function sponsorsLookup(id: string, channelIDPromise?) { - v = document.querySelector('video') // Youtube video player + video = document.querySelector('video') // Youtube video player //there is no video here - if (v == null) { + if (video == null) { setTimeout(() => sponsorsLookup(id, channelIDPromise), 100); return; } @@ -357,7 +374,7 @@ function sponsorsLookup(id: string, channelIDPromise?) { durationListenerSetUp = true; //wait until it is loaded - v.addEventListener('durationchange', updatePreviewBar); + video.addEventListener('durationchange', updatePreviewBar); } if (channelIDPromise !== undefined) { @@ -415,7 +432,7 @@ function sponsorsLookup(id: string, channelIDPromise?) { //update the preview bar //leave the type blank for now until categories are added - if (lastPreviewBarUpdate == id || (lastPreviewBarUpdate == null && !isNaN(v.duration))) { + if (lastPreviewBarUpdate == id || (lastPreviewBarUpdate == null && !isNaN(video.duration))) { //set it now //otherwise the listener can handle it updatePreviewBar(); @@ -427,12 +444,19 @@ function sponsorsLookup(id: string, channelIDPromise?) { //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 + '?fields=published', function(xmlhttp, error) { + sendRequestToCustomServer('GET', "https://www.youtube.com/get_video_info?video_id=" + id, function(xmlhttp, error) { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { - let unixTimePublished = JSON.parse(xmlhttp.responseText).published; + let decodedData = decodeURIComponent(xmlhttp.responseText).match(/(?<=player_response=)[^&]*/)[0]; + + if (decodedData === undefined) { + console.error("[SB] Failed at getting video upload date info from YouTube."); + return; + } + + let dateUploaded = JSON.parse(decodedData).microformat.playerMicroformatRenderer.uploadDate; //if less than 3 days old - if ((Date.now() / 1000) - unixTimePublished < 259200) { + if (Date.now() - new Date(dateUploaded).getTime() < 259200000) { //TODO lower when server becomes better setTimeout(() => sponsorsLookup(id, channelIDPromise), 180000); } @@ -453,7 +477,7 @@ function sponsorsLookup(id: string, channelIDPromise?) { //add the event to run on the videos "ontimeupdate" if (!Config.config.disableSkipping) { - v.ontimeupdate = function () { + video.ontimeupdate = function () { sponsorCheck(); }; } @@ -568,7 +592,7 @@ function updatePreviewBar() { types.push("previewSponsor"); } - utils.wait(() => previewBar !== null).then((result) => previewBar.set(allSponsorTimes, types, v.duration)); + utils.wait(() => previewBar !== null).then((result) => previewBar.set(allSponsorTimes, types, video.duration)); //update last video id lastPreviewBarUpdate = sponsorVideoID; @@ -588,7 +612,7 @@ function whitelistCheck() { function sponsorCheck() { if (Config.config.disableSkipping) { // Make sure this isn't called again - v.ontimeupdate = null; + video.ontimeupdate = null; return; } else if (channelWhitelisted) { return; @@ -619,20 +643,20 @@ function sponsorCheck() { //don't keep track until they are loaded in if (sponsorTimes !== null || sponsorTimesSubmitting.length > 0) { - lastTime = v.currentTime; + lastTime = video.currentTime; } } function checkSponsorTime(sponsorTimes, index, openNotice): boolean { //this means part of the video was just skipped - if (Math.abs(v.currentTime - lastTime) > 1 && lastTime != -1) { + if (Math.abs(video.currentTime - lastTime) > 1 && lastTime != -1) { //make lastTime as if the video was playing normally - lastTime = v.currentTime - 0.0001; + lastTime = video.currentTime - 0.0001; } - if (checkIfTimeToSkip(v.currentTime, sponsorTimes[index][0], sponsorTimes[index][1]) && !hiddenSponsorTimes.includes(index)) { + if (checkIfTimeToSkip(video.currentTime, sponsorTimes[index][0], sponsorTimes[index][1]) && !hiddenSponsorTimes.includes(index)) { //skip it - skipToTime(v, index, sponsorTimes, openNotice); + skipToTime(video, index, sponsorTimes, openNotice); //something was skipped return true; @@ -652,7 +676,7 @@ 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) { - if (!Config.config.disableAutoSkip) { + if (!Config.config.disableAutoSkip || previewResetter !== null) { v.currentTime = sponsorTimes[index][1]; } @@ -690,14 +714,14 @@ function skipToTime(v, index, sponsorTimes, openNotice) { function unskipSponsorTime(UUID) { if (sponsorTimes != null) { //add a tiny bit of time to make sure it is not skipped again - v.currentTime = sponsorTimes[UUIDs.indexOf(UUID)][0] + 0.001; + video.currentTime = sponsorTimes[UUIDs.indexOf(UUID)][0] + 0.001; } } function reskipSponsorTime(UUID) { if (sponsorTimes != null) { //add a tiny bit of time to make sure it is not skipped again - v.currentTime = sponsorTimes[UUIDs.indexOf(UUID)][1]; + video.currentTime = sponsorTimes[UUIDs.indexOf(UUID)][1]; } } @@ -786,7 +810,7 @@ function startSponsorClicked() { //send back current time with message chrome.runtime.sendMessage({ message: "addSponsorTime", - time: v.currentTime, + time: video.currentTime, videoID: sponsorVideoID }, function(response) { //see if the sponsorTimesSubmitting needs to be updated @@ -875,6 +899,8 @@ function openInfoMenu() { closeButton.classList.add("smallLink"); closeButton.setAttribute("align", "center"); closeButton.addEventListener("click", closeInfoMenu); + // Theme based color + closeButton.style.color = "var(--yt-spec-text-primary)"; //add the close button popup.prepend(closeButton); @@ -1012,11 +1038,11 @@ function dontShowNoticeAgain() { } function sponsorMessageStarted(callback) { - v = document.querySelector('video'); + video = document.querySelector('video'); //send back current time callback({ - time: v.currentTime + time: video.currentTime }) //update button @@ -1039,8 +1065,8 @@ function submitSponsorTimes() { if (sponsorTimes != undefined && sponsorTimes.length > 0) { //check if a sponsor exceeds the duration of the video for (let i = 0; i < sponsorTimes.length; i++) { - if (sponsorTimes[i][1] > v.duration) { - sponsorTimes[i][1] = v.duration; + if (sponsorTimes[i][1] > video.duration) { + sponsorTimes[i][1] = video.duration; } } //update sponsorTimes diff --git a/src/popup.ts b/src/popup.ts index 478f1fd3..e47edf31 100644 --- a/src/popup.ts +++ b/src/popup.ts @@ -38,7 +38,7 @@ class MessageHandler { //make this a function to allow this to run on the content page async function runThePopup(messageListener?: MessageListener) { - var messageHandler = new MessageHandler(); + var messageHandler = new MessageHandler(messageListener); utils.localizeHtmlPage(); @@ -656,9 +656,9 @@ async function runThePopup(messageListener?: MessageListener) { tabs[0].id, {message: "getCurrentTime"}, function (response) { - let minutes = <HTMLInputElement> <unknown> document.getElementById(idStartName + "Minutes" + index); + let minutes = <HTMLInputElement> <unknown> document.getElementById(idStartName + "Minutes" + index); let seconds = <HTMLInputElement> <unknown> document.getElementById(idStartName + "Seconds" + index); - + minutes.value = String(getTimeInMinutes(response.currentTime)); seconds.value = getTimeInFormattedSeconds(response.currentTime); }); @@ -667,11 +667,11 @@ async function runThePopup(messageListener?: MessageListener) { //id start name is whether it is the startTime or endTime //gives back the time in seconds - function getSponsorTimeEditTimes(idStartName, index) { + function getSponsorTimeEditTimes(idStartName, index): number { let minutes = <HTMLInputElement> <unknown> document.getElementById(idStartName + "Minutes" + index); let seconds = <HTMLInputElement> <unknown> document.getElementById(idStartName + "Seconds" + index); - return parseInt(minutes.value) * 60 + seconds.value; + return parseInt(minutes.value) * 60 + parseInt(seconds.value); } function saveSponsorTimeEdit(index, closeEditMode = true) { @@ -679,16 +679,17 @@ async function runThePopup(messageListener?: MessageListener) { sponsorTimes[index][1] = getSponsorTimeEditTimes("endTime", index); //save this - Config.config.sponsorTimes.set(currentVideoID, sponsorTimes); - messageHandler.query({ - active: true, - currentWindow: true - }, tabs => { - messageHandler.sendMessage( - tabs[0].id, - {message: "sponsorDataChanged"} - ); - }); + Config.config.sponsorTimes.set(currentVideoID, sponsorTimes); + + messageHandler.query({ + active: true, + currentWindow: true + }, tabs => { + messageHandler.sendMessage( + tabs[0].id, + {message: "sponsorDataChanged"} + ); + }); if (closeEditMode) { displaySponsorTimes(); @@ -968,7 +969,7 @@ async function runThePopup(messageListener?: MessageListener) { secondsDisplay = "0" + secondsDisplay; } - let formatted = minutes+ ":" + secondsDisplay; + let formatted = minutes + ":" + secondsDisplay; return formatted; } |