2019-07-09 20:50:19 +02:00
//was sponsor data found when doing SponsorsLookup
var sponsorDataFound = false ;
2019-08-08 21:33:05 +02:00
var previousVideoID = null ;
2019-07-16 00:56:16 +02:00
//the actual sponsorTimes if loaded and UUIDs associated with them
2019-07-28 23:22:05 +02:00
var sponsorTimes = null ;
var UUIDs = null ;
//what video id are these sponsors for
var sponsorVideoID = null ;
2019-08-13 02:22:00 +02:00
//these are sponsors that have been downvoted
var hiddenSponsorTimes = [ ] ;
2019-08-03 04:37:12 +02:00
//the time this video is starting at when first played, if not zero
var youtubeVideoStartTime = null ;
2019-07-09 21:05:16 +02:00
//the video
var v ;
2019-08-13 19:02:35 +02:00
var listenerAdded ;
2019-08-14 01:18:53 +02:00
//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 ;
2019-08-04 03:35:41 +02:00
//the channel this video is about
var channelURL ;
//is this channel whitelised from getting sponsors skipped
var channelWhitelisted = false ;
2019-08-13 01:34:44 +02:00
// create preview bar
2019-08-13 20:05:32 +02:00
var previewBar ;
2019-08-13 01:34:44 +02:00
2019-08-13 20:05:32 +02:00
if ( id = getYouTubeVideoID ( document . URL ) ) { // Direct Links
2019-08-11 04:04:32 +02:00
videoIDChange ( id ) ;
}
2019-07-09 21:05:16 +02:00
//the last time looked at (used to see if this time is in the interval)
2019-07-26 02:00:07 +02:00
var lastTime = - 1 ;
2019-01-18 20:49:43 +01:00
2019-07-26 02:00:07 +02:00
//the actual time (not video time) that the last skip happened
var lastUnixTimeSkipped = - 1 ;
2019-07-24 01:37:33 +02:00
2019-08-12 05:18:50 +02:00
//the amount of times the sponsor lookup has retried
//this only happens if there is an error
var sponsorLookupRetries = 0 ;
2019-07-10 03:44:41 +02:00
//the last time in the video a sponsor was skipped
//used for the go back button
var lastSponsorTimeSkipped = null ;
2019-07-16 00:56:16 +02:00
//used for ratings
var lastSponsorTimeSkippedUUID = null ;
2019-07-10 03:44:41 +02:00
2019-07-12 22:48:07 +02:00
//if showing the start sponsor button or the end sponsor button on the player
var showingStartSponsor = true ;
2019-07-13 01:04:24 +02:00
//should the video controls buttons be added
var hideVideoPlayerControls = false ;
2019-07-30 03:40:13 +02:00
var hideInfoButtonPlayerControls = false ;
var hideDeleteButtonPlayerControls = false ;
2019-07-13 01:04:24 +02:00
2019-08-02 02:01:33 +02:00
//the downloaded sponsor times
var sponsorTimes = [ ] ;
var UUIDs = [ ] ;
//the sponsor times being prepared to be submitted
var sponsorTimesSubmitting = [ ] ;
2019-07-29 21:42:14 +02:00
//becomes true when isInfoFound is called
//this is used to close the popup on YouTube when the other popup opens
var popupInitialised = false ;
2019-07-24 03:06:36 +02:00
//should view counts be tracked
var trackViewCount = false ;
chrome . storage . sync . get ( [ "trackViewCount" ] , function ( result ) {
let trackViewCountStorage = result . trackViewCount ;
if ( trackViewCountStorage != undefined ) {
trackViewCount = trackViewCountStorage ;
} else {
trackViewCount = true ;
}
} ) ;
2019-07-10 04:10:25 +02:00
//if the notice should not be shown
//happens when the user click's the "Don't show notice again" button
var dontShowNotice = false ;
2019-07-22 22:42:57 +02:00
chrome . storage . sync . get ( [ "dontShowNoticeAgain" ] , function ( result ) {
2019-07-10 04:10:25 +02:00
let dontShowNoticeAgain = result . dontShowNoticeAgain ;
if ( dontShowNoticeAgain != undefined ) {
dontShowNotice = dontShowNoticeAgain ;
}
} ) ;
2019-07-30 19:27:20 +02:00
//get messages from the background script and the popup
chrome . runtime . onMessage . addListener ( messageListener ) ;
2019-08-08 20:26:26 +02:00
2019-07-30 19:27:20 +02:00
function messageListener ( request , sender , sendResponse ) {
2019-07-09 06:05:27 +02:00
//messages from popup script
2019-08-08 21:15:23 +02:00
if ( request . message == "update" ) {
2019-08-14 01:18:53 +02:00
if ( id = getYouTubeVideoID ( document . URL ) ) {
videoIDChange ( id ) ;
} else {
resetValues ( ) ;
}
2019-08-08 21:15:23 +02:00
}
2019-07-10 04:10:25 +02:00
if ( request . message == "sponsorStart" ) {
2019-07-29 21:42:14 +02:00
sponsorMessageStarted ( sendResponse ) ;
2019-07-09 05:43:06 +02:00
}
2019-07-09 06:05:27 +02:00
2019-08-02 02:01:33 +02:00
if ( request . message == "sponsorDataChanged" ) {
updateSponsorTimesSubmitting ( ) ;
}
2019-07-10 04:10:25 +02:00
if ( request . message == "isInfoFound" ) {
2019-07-10 00:03:56 +02:00
//send the sponsor times along with if it's found
2019-07-09 06:05:27 +02:00
sendResponse ( {
2019-07-10 00:03:56 +02:00
found : sponsorDataFound ,
2019-07-18 04:53:42 +02:00
sponsorTimes : sponsorTimes ,
2019-08-13 02:22:00 +02:00
hiddenSponsorTimes : hiddenSponsorTimes ,
2019-07-18 04:53:42 +02:00
UUIDs : UUIDs
2019-07-29 21:42:14 +02:00
} ) ;
if ( popupInitialised && document . getElementById ( "sponsorBlockPopupContainer" ) != null ) {
//the popup should be closed now that another is opening
closeInfoMenu ( ) ;
}
popupInitialised = true ;
2019-07-09 06:05:27 +02:00
}
2019-07-09 21:55:33 +02:00
2019-07-10 04:10:25 +02:00
if ( request . message == "getVideoID" ) {
2019-07-09 21:55:33 +02:00
sendResponse ( {
videoID : getYouTubeVideoID ( document . URL )
} )
}
2019-07-10 04:10:25 +02:00
2019-08-12 18:21:20 +02:00
if ( request . message == "skipToTime" ) {
v . currentTime = request . time ;
}
2019-08-12 21:27:35 +02:00
if ( request . message == "getCurrentTime" ) {
sendResponse ( {
currentTime : v . currentTime
} ) ;
}
2019-08-04 03:35:41 +02:00
if ( request . message == "getChannelURL" ) {
sendResponse ( {
channelURL : channelURL
} )
}
if ( request . message == "isChannelWhitelisted" ) {
sendResponse ( {
value : channelWhitelisted
} )
}
if ( request . message == "whitelistChange" ) {
channelWhitelisted = request . value ;
sponsorsLookup ( getYouTubeVideoID ( document . URL ) ) ;
}
2019-07-10 04:10:25 +02:00
if ( request . message == "showNoticeAgain" ) {
dontShowNotice = false ;
}
2019-07-12 23:45:20 +02:00
2019-07-22 00:19:56 +02:00
if ( request . message == "changeStartSponsorButton" ) {
2019-07-22 22:46:50 +02:00
changeStartSponsorButton ( request . showStartSponsor , request . uploadButtonVisible ) ;
2019-07-12 23:45:20 +02:00
}
2019-07-13 01:04:24 +02:00
if ( request . message == "changeVideoPlayerControlsVisibility" ) {
hideVideoPlayerControls = request . value ;
2019-07-30 03:40:13 +02:00
updateVisibilityOfPlayerControlsButton ( ) ;
} else if ( request . message == "changeInfoButtonPlayerControlsVisibility" ) {
hideInfoButtonPlayerControls = request . value ;
updateVisibilityOfPlayerControlsButton ( ) ;
} else if ( request . message == "changeDeleteButtonPlayerControlsVisibility" ) {
hideDeleteButtonPlayerControls = request . value ;
2019-07-13 01:04:24 +02:00
updateVisibilityOfPlayerControlsButton ( ) ;
}
2019-07-24 03:06:36 +02:00
if ( request . message == "trackViewCount" ) {
trackViewCount = request . value ;
}
2019-07-30 19:27:20 +02:00
}
2018-06-23 17:09:05 +02:00
2019-07-26 22:20:07 +02:00
//check for hotkey pressed
document . onkeydown = function ( e ) {
e = e || window . event ;
var key = e . which || e . keyCode ;
let video = document . getElementById ( "movie_player" ) ;
//is the video in focus, otherwise they could be typing a comment
if ( document . activeElement === video ) {
if ( key == 186 ) {
//semicolon
startSponsorClicked ( ) ;
} else if ( key == 222 ) {
//single quote
submitSponsorTimes ( ) ;
}
}
}
2019-08-14 01:18:53 +02:00
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 ;
}
2019-07-13 00:28:41 +02:00
function videoIDChange ( id ) {
2019-07-28 23:22:05 +02:00
//not a url change
2019-08-08 15:44:48 +02:00
if ( sponsorVideoID == id ) return ;
2019-08-08 18:03:58 +02:00
2019-08-13 20:05:32 +02:00
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 ) ;
}
2019-08-08 18:03:58 +02:00
//warn them if they had unsubmitted times
if ( previousVideoID != null ) {
//get the sponsor times from storage
let sponsorTimeKey = 'sponsorTimes' + previousVideoID ;
chrome . storage . sync . get ( [ sponsorTimeKey ] , function ( result ) {
let sponsorTimes = result [ sponsorTimeKey ] ;
if ( sponsorTimes != undefined && sponsorTimes . length > 0 ) {
//warn them that they have unsubmitted sponsor times
2019-08-11 22:21:04 +02:00
chrome . runtime . sendMessage ( {
message : "alertPrevious" ,
previousVideoID : previousVideoID
} )
2019-08-08 18:03:58 +02:00
}
2019-07-28 23:22:05 +02:00
2019-08-08 18:03:58 +02:00
//set the previous video id to the currentID
previousVideoID = id ;
} ) ;
} else {
2019-08-11 18:49:25 +02:00
//set the previous id now, don't wait for chrome.storage.get
2019-08-08 18:03:58 +02:00
previousVideoID = id ;
}
2019-08-08 15:44:48 +02:00
2019-08-04 05:30:45 +02:00
//close popup
closeInfoMenu ( ) ;
2019-08-14 01:18:53 +02:00
resetValues ( ) ;
2019-08-13 19:02:35 +02:00
2019-08-03 04:37:12 +02:00
//see if there is a video start time
youtubeVideoStartTime = getYouTubeVideoStartTime ( document . URL ) ;
2019-07-13 00:28:41 +02:00
sponsorsLookup ( id ) ;
2019-08-02 18:18:56 +02:00
//make sure everything is properly added
2019-08-03 20:11:47 +02:00
updateVisibilityOfPlayerControlsButton ( true ) ;
2019-08-02 18:18:56 +02:00
2019-08-02 02:01:33 +02:00
//reset sponsor times submitting
sponsorTimesSubmitting = [ ] ;
2019-07-13 00:28:41 +02:00
//see if the onvideo control image needs to be changed
chrome . runtime . sendMessage ( {
message : "getSponsorTimes" ,
videoID : id
} , function ( response ) {
if ( response != undefined ) {
let sponsorTimes = response . sponsorTimes ;
2019-07-28 23:22:05 +02:00
if ( sponsorTimes != null && sponsorTimes . length > 0 && sponsorTimes [ sponsorTimes . length - 1 ] . length >= 2 ) {
2019-07-29 00:48:28 +02:00
changeStartSponsorButton ( true , true ) ;
2019-07-28 23:22:05 +02:00
} else if ( sponsorTimes != null && sponsorTimes . length > 0 && sponsorTimes [ sponsorTimes . length - 1 ] . length < 2 ) {
2019-07-29 00:48:28 +02:00
changeStartSponsorButton ( false , true ) ;
} else {
2019-07-30 02:54:10 +02:00
changeStartSponsorButton ( true , false ) ;
2019-07-13 00:28:41 +02:00
}
2019-08-02 02:01:33 +02:00
//see if this data should be saved in the sponsorTimesSubmitting variable
if ( sponsorTimes != undefined && sponsorTimes . length > 0 ) {
sponsorTimesSubmitting = sponsorTimes ;
}
2019-07-13 00:28:41 +02:00
}
} ) ;
2019-07-13 01:04:24 +02:00
2019-07-30 03:40:13 +02:00
//see if video controls buttons should be added
2019-07-22 22:42:57 +02:00
chrome . storage . sync . get ( [ "hideVideoPlayerControls" ] , function ( result ) {
2019-07-13 01:04:24 +02:00
if ( result . hideVideoPlayerControls != undefined ) {
hideVideoPlayerControls = result . hideVideoPlayerControls ;
}
updateVisibilityOfPlayerControlsButton ( ) ;
} ) ;
2019-07-30 03:40:13 +02:00
chrome . storage . sync . get ( [ "hideInfoButtonPlayerControls" ] , function ( result ) {
if ( result . hideInfoButtonPlayerControls != undefined ) {
hideInfoButtonPlayerControls = result . hideInfoButtonPlayerControls ;
}
updateVisibilityOfPlayerControlsButton ( ) ;
} ) ;
chrome . storage . sync . get ( [ "hideDeleteButtonPlayerControls" ] , function ( result ) {
if ( result . hideDeleteButtonPlayerControls != undefined ) {
hideDeleteButtonPlayerControls = result . hideDeleteButtonPlayerControls ;
}
2019-08-03 20:11:47 +02:00
updateVisibilityOfPlayerControlsButton ( false ) ;
2019-07-30 03:40:13 +02:00
} ) ;
2019-07-13 00:28:41 +02:00
}
2019-07-09 20:50:19 +02:00
function sponsorsLookup ( id ) {
2019-08-02 02:01:33 +02:00
v = document . querySelector ( 'video' ) // Youtube video player
2019-08-02 18:18:56 +02:00
//there is no video here
2019-08-03 20:11:47 +02:00
if ( v == null ) {
setTimeout ( ( ) => sponsorsLookup ( id ) , 100 ) ;
return ;
}
2019-08-14 01:18:53 +02:00
if ( ! durationListenerSetUp ) {
durationListenerSetUp = true ;
//wait until it is loaded
v . addEventListener ( 'durationchange' , updatePreviewBar ) ;
}
2019-08-02 02:01:33 +02:00
//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 ;
2019-08-04 03:35:41 +02:00
2019-08-13 01:34:44 +02:00
//update the preview bar
//leave the type blank for now until categories are added
2019-08-14 01:18:53 +02:00
if ( lastPreviewBarUpdate == id || ( lastPreviewBarUpdate == null && ! isNaN ( v . duration ) ) ) {
2019-08-13 19:02:35 +02:00
//set it now
2019-08-14 01:18:53 +02:00
//otherwise the listener can handle it
2019-08-13 19:02:35 +02:00
updatePreviewBar ( ) ;
}
2019-08-13 01:34:44 +02:00
2019-08-04 03:35:41 +02:00
getChannelID ( ) ;
2019-08-12 05:18:50 +02:00
sponsorLookupRetries = 0 ;
} else if ( xmlhttp . readyState == 4 && xmlhttp . status == 404 ) {
2019-08-02 02:01:33 +02:00
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 ;
//if less than 3 days old
if ( ( Date . now ( ) / 1000 ) - unixTimePublished < 259200 ) {
setTimeout ( ( ) => sponsorsLookup ( id ) , 10000 ) ;
2019-07-22 03:08:23 +02:00
}
2019-08-02 02:01:33 +02:00
}
} ) ;
2019-08-12 05:18:50 +02:00
sponsorLookupRetries = 0 ;
2019-08-13 19:02:54 +02:00
} else if ( xmlhttp . readyState == 4 && sponsorLookupRetries < 90 ) {
2019-08-12 05:18:50 +02:00
//some error occurred, try again in a second
setTimeout ( ( ) => sponsorsLookup ( id ) , 1000 ) ;
sponsorLookupRetries ++ ;
2019-07-26 02:00:07 +02:00
}
2019-08-02 02:01:33 +02:00
} ) ;
2019-07-26 02:00:07 +02:00
2019-08-02 02:01:33 +02:00
//add the event to run on the videos "ontimeupdate"
v . ontimeupdate = function ( ) {
sponsorCheck ( ) ;
} ;
}
2019-07-24 01:33:12 +02:00
2019-08-13 19:02:35 +02:00
function updatePreviewBar ( ) {
previewBar . set ( sponsorTimes , [ ] , v . duration ) ;
2019-08-14 01:18:53 +02:00
//update last video id
lastPreviewBarUpdate = getYouTubeVideoID ( document . URL ) ;
2019-08-13 19:02:35 +02:00
}
2019-08-04 03:35:41 +02:00
function getChannelID ( ) {
//get channel id
let channelContainers = document . querySelectorAll ( "#owner-name" ) ;
let channelURLContainer = null ;
for ( let i = 0 ; i < channelContainers . length ; i ++ ) {
if ( channelContainers [ i ] . firstElementChild != null ) {
channelURLContainer = channelContainers [ i ] . firstElementChild ;
}
}
2019-08-04 04:12:20 +02:00
if ( channelContainers . length == 0 ) {
//old YouTube theme
channelContainers = document . getElementsByClassName ( "yt-user-info" ) ;
if ( channelContainers . length != 0 ) {
channelURLContainer = channelContainers [ 0 ] . firstElementChild ;
}
}
2019-08-04 03:35:41 +02:00
if ( channelURLContainer == null ) {
//try later
setTimeout ( getChannelID , 100 ) ;
return ;
}
channelURL = channelURLContainer . getAttribute ( "href" ) ;
//see if this is a whitelisted channel
chrome . storage . sync . get ( [ "whitelistedChannels" ] , function ( result ) {
let whitelistedChannels = result . whitelistedChannels ;
if ( whitelistedChannels != undefined && whitelistedChannels . includes ( channelURL ) ) {
//reset sponsor times to nothing
sponsorTimes = [ ] ;
UUIDs = [ ] ;
channelWhitelisted = true ;
}
} ) ;
}
2019-08-02 02:01:33 +02:00
//video skipping
function sponsorCheck ( ) {
let skipHappened = false ;
2019-07-24 01:33:12 +02:00
2019-08-02 02:01:33 +02:00
if ( sponsorTimes != null ) {
//see if any sponsor start time was just passed
for ( let i = 0 ; i < sponsorTimes . length ; i ++ ) {
//if something was skipped
2019-08-02 02:21:45 +02:00
if ( checkSponsorTime ( sponsorTimes , i , true ) ) {
2019-08-02 02:01:33 +02:00
skipHappened = true ;
break ;
}
}
}
2019-07-24 01:33:12 +02:00
2019-08-02 02:01:33 +02:00
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 ) ;
2019-07-24 03:06:36 +02:00
}
2019-07-16 00:56:16 +02:00
}
2019-07-24 01:33:12 +02:00
}
2019-07-26 02:00:07 +02:00
//don't keep track until they are loaded in
2019-08-02 02:01:33 +02:00
if ( sponsorTimes != null || sponsorTimesSubmitting . length > 0 ) {
2019-07-26 02:00:07 +02:00
lastTime = v . currentTime ;
}
2018-06-23 17:09:05 +02:00
}
2019-01-18 20:49:43 +01:00
2019-08-02 02:01:33 +02:00
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 ;
}
2019-08-13 02:22:00 +02:00
if ( checkIfTimeToSkip ( v . currentTime , sponsorTimes [ index ] [ 0 ] ) && ! hiddenSponsorTimes . includes ( index ) ) {
2019-08-02 02:01:33 +02:00
//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)
2019-08-03 04:37:12 +02:00
//the last term makes 0 second start times possible only if the video is not setup to start at a different time from zero
2019-08-02 02:01:33 +02:00
return ( Math . abs ( currentVideoTime - startTime ) < 0.3 && startTime >= lastTime && startTime <= currentVideoTime &&
2019-08-03 04:37:12 +02:00
( lastUnixTimeSkipped == - 1 || currentTime - lastUnixTimeSkipped > 500 ) ) || ( lastTime == - 1 && startTime == 0 && youtubeVideoStartTime == null )
2019-08-02 02:01:33 +02:00
}
//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 ) ;
}
2019-08-15 03:50:32 +02:00
//vote on this
vote ( 1 , currentUUID , true ) ;
2019-08-02 02:01:33 +02:00
}
}
2019-07-18 01:42:13 +02:00
function goBackToPreviousTime ( UUID ) {
2019-07-28 23:22:05 +02:00
if ( sponsorTimes != null ) {
2019-07-10 03:44:41 +02:00
//add a tiny bit of time to make sure it is not skipped again
2019-07-18 01:42:13 +02:00
v . currentTime = sponsorTimes [ UUIDs . indexOf ( UUID ) ] [ 0 ] + 0.001 ;
2019-07-10 03:44:41 +02:00
2019-07-18 01:42:13 +02:00
closeSkipNotice ( UUID ) ;
2019-07-10 03:44:41 +02:00
}
}
2019-07-12 16:42:39 +02:00
//Adds a sponsorship starts button to the player controls
2019-07-12 22:44:50 +02:00
function addPlayerControlsButton ( ) {
2019-07-14 19:10:53 +02:00
if ( document . getElementById ( "startSponsorButton" ) != null ) {
//it's already added
return ;
}
2019-07-12 16:42:39 +02:00
let startSponsorButton = document . createElement ( "button" ) ;
2019-07-13 01:04:24 +02:00
startSponsorButton . id = "startSponsorButton" ;
2019-07-23 03:11:37 +02:00
startSponsorButton . className = "ytp-button playerButton" ;
2019-08-12 23:15:25 +02:00
startSponsorButton . setAttribute ( "title" , chrome . i18n . getMessage ( "sponsorStart" ) ) ;
2019-07-12 22:44:50 +02:00
startSponsorButton . addEventListener ( "click" , startSponsorClicked ) ;
2019-07-12 16:42:39 +02:00
let startSponsorImage = document . createElement ( "img" ) ;
2019-07-12 22:48:07 +02:00
startSponsorImage . id = "startSponsorImage" ;
2019-07-23 03:11:37 +02:00
startSponsorImage . className = "playerButtonImage" ;
2019-07-12 16:42:39 +02:00
startSponsorImage . src = chrome . extension . getURL ( "icons/PlayerStartIconSponsorBlocker256px.png" ) ;
//add the image to the button
startSponsorButton . appendChild ( startSponsorImage ) ;
2019-08-02 18:18:56 +02:00
let controls = document . getElementsByClassName ( "ytp-right-controls" ) ;
let referenceNode = controls [ controls . length - 1 ] ;
2019-08-03 20:11:47 +02:00
if ( referenceNode == undefined ) {
//page not loaded yet
setTimeout ( addPlayerControlsButton , 100 ) ;
return ;
}
2019-07-12 16:42:39 +02:00
referenceNode . prepend ( startSponsorButton ) ;
}
2019-07-13 01:04:24 +02:00
function removePlayerControlsButton ( ) {
document . getElementById ( "startSponsorButton" ) . style . display = "none" ;
2019-07-22 00:19:56 +02:00
document . getElementById ( "submitButton" ) . style . display = "none" ;
2019-07-13 01:04:24 +02:00
}
//adds or removes the player controls button to what it should be
function updateVisibilityOfPlayerControlsButton ( ) {
2019-08-02 18:18:56 +02:00
//not on a proper video yet
if ( ! getYouTubeVideoID ( document . URL ) ) return ;
2019-07-26 22:20:07 +02:00
addPlayerControlsButton ( ) ;
2019-07-29 21:42:14 +02:00
addInfoButton ( ) ;
2019-07-30 02:54:10 +02:00
addDeleteButton ( ) ;
2019-07-26 22:20:07 +02:00
addSubmitButton ( ) ;
2019-07-13 01:04:24 +02:00
if ( hideVideoPlayerControls ) {
removePlayerControlsButton ( ) ;
}
2019-07-30 03:40:13 +02:00
if ( hideInfoButtonPlayerControls ) {
document . getElementById ( "infoButton" ) . style . display = "none" ;
}
if ( hideDeleteButtonPlayerControls ) {
document . getElementById ( "deleteButton" ) . style . display = "none" ;
}
2019-07-13 01:04:24 +02:00
}
2019-07-12 16:42:39 +02:00
2019-07-12 22:44:50 +02:00
function startSponsorClicked ( ) {
2019-07-29 21:42:14 +02:00
//it can't update to this info yet
closeInfoMenu ( ) ;
2019-07-12 22:50:26 +02:00
toggleStartSponsorButton ( ) ;
//send back current time with message
chrome . runtime . sendMessage ( {
message : "addSponsorTime" ,
2019-07-26 22:20:07 +02:00
time : v . currentTime ,
videoID : getYouTubeVideoID ( document . URL )
2019-08-02 02:01:33 +02:00
} , 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 ;
}
}
2019-07-12 22:50:26 +02:00
} ) ;
}
2019-07-22 22:46:50 +02:00
function changeStartSponsorButton ( showStartSponsor , uploadButtonVisible ) {
2019-07-30 02:54:10 +02:00
//if it isn't visible, there is no data
2019-07-30 03:40:13 +02:00
if ( uploadButtonVisible && ! hideDeleteButtonPlayerControls ) {
2019-07-30 02:54:10 +02:00
document . getElementById ( "deleteButton" ) . style . display = "unset" ;
} else {
document . getElementById ( "deleteButton" ) . style . display = "none" ;
}
2019-07-22 22:46:50 +02:00
if ( showStartSponsor ) {
2019-07-12 22:48:07 +02:00
showingStartSponsor = true ;
document . getElementById ( "startSponsorImage" ) . src = chrome . extension . getURL ( "icons/PlayerStartIconSponsorBlocker256px.png" ) ;
2019-08-12 23:15:25 +02:00
document . getElementById ( "startSponsorButton" ) . setAttribute ( "title" , chrome . i18n . getMessage ( "sponsorStart" ) ) ;
2019-07-22 00:19:56 +02:00
2019-07-30 03:40:13 +02:00
if ( document . getElementById ( "startSponsorImage" ) . style . display != "none" && uploadButtonVisible && ! hideInfoButtonPlayerControls ) {
2019-07-22 00:19:56 +02:00
document . getElementById ( "submitButton" ) . style . display = "unset" ;
} else if ( ! uploadButtonVisible ) {
//disable submit button
document . getElementById ( "submitButton" ) . style . display = "none" ;
}
} else {
showingStartSponsor = false ;
document . getElementById ( "startSponsorImage" ) . src = chrome . extension . getURL ( "icons/PlayerStopIconSponsorBlocker256px.png" ) ;
2019-08-12 23:15:25 +02:00
document . getElementById ( "startSponsorButton" ) . setAttribute ( "title" , chrome . i18n . getMessage ( "sponsorEND" ) ) ;
2019-07-22 00:19:56 +02:00
//disable submit button
document . getElementById ( "submitButton" ) . style . display = "none" ;
}
}
function toggleStartSponsorButton ( ) {
changeStartSponsorButton ( ! showingStartSponsor , true ) ;
}
2019-07-29 21:42:14 +02:00
//shows the info button on the video player
function addInfoButton ( ) {
if ( document . getElementById ( "infoButton" ) != null ) {
//it's already added
return ;
}
//make a submit button
let infoButton = document . createElement ( "button" ) ;
infoButton . id = "infoButton" ;
infoButton . className = "ytp-button playerButton" ;
infoButton . setAttribute ( "title" , "Open SponsorBlock Popup" ) ;
infoButton . addEventListener ( "click" , openInfoMenu ) ;
let infoImage = document . createElement ( "img" ) ;
infoImage . id = "infoButtonImage" ;
infoImage . className = "playerButtonImage" ;
infoImage . src = chrome . extension . getURL ( "icons/PlayerInfoIconSponsorBlocker256px.png" ) ;
//add the image to the button
infoButton . appendChild ( infoImage ) ;
2019-08-02 18:18:56 +02:00
let controls = document . getElementsByClassName ( "ytp-right-controls" ) ;
let referenceNode = controls [ controls . length - 1 ] ;
2019-08-03 20:11:47 +02:00
if ( referenceNode == undefined ) {
//page not loaded yet
setTimeout ( addInfoButton , 100 ) ;
return ;
}
2019-07-29 21:42:14 +02:00
referenceNode . prepend ( infoButton ) ;
}
2019-07-30 02:54:10 +02:00
//shows the delete button on the video player
function addDeleteButton ( ) {
if ( document . getElementById ( "deleteButton" ) != null ) {
//it's already added
return ;
}
//make a submit button
let deleteButton = document . createElement ( "button" ) ;
deleteButton . id = "deleteButton" ;
deleteButton . className = "ytp-button playerButton" ;
deleteButton . setAttribute ( "title" , "Clear Sponsor Times" ) ;
deleteButton . addEventListener ( "click" , clearSponsorTimes ) ;
//hide it at the start
deleteButton . style . display = "none" ;
let deleteImage = document . createElement ( "img" ) ;
deleteImage . id = "deleteButtonImage" ;
deleteImage . className = "playerButtonImage" ;
deleteImage . src = chrome . extension . getURL ( "icons/PlayerDeleteIconSponsorBlocker256px.png" ) ;
//add the image to the button
deleteButton . appendChild ( deleteImage ) ;
2019-08-02 18:18:56 +02:00
let controls = document . getElementsByClassName ( "ytp-right-controls" ) ;
let referenceNode = controls [ controls . length - 1 ] ;
2019-08-03 20:11:47 +02:00
if ( referenceNode == undefined ) {
//page not loaded yet
setTimeout ( addDeleteButton , 100 ) ;
return ;
}
2019-07-30 02:54:10 +02:00
referenceNode . prepend ( deleteButton ) ;
}
2019-07-22 00:19:56 +02:00
//shows the submit button on the video player
function addSubmitButton ( ) {
if ( document . getElementById ( "submitButton" ) != null ) {
//it's already added
return ;
2019-07-12 22:48:07 +02:00
}
2019-07-22 00:19:56 +02:00
//make a submit button
let submitButton = document . createElement ( "button" ) ;
submitButton . id = "submitButton" ;
2019-07-23 03:11:37 +02:00
submitButton . className = "ytp-button playerButton" ;
2019-07-22 00:19:56 +02:00
submitButton . setAttribute ( "title" , "Submit Sponsor Times" ) ;
submitButton . addEventListener ( "click" , submitSponsorTimes ) ;
//hide it at the start
submitButton . style . display = "none" ;
let submitImage = document . createElement ( "img" ) ;
submitImage . id = "submitButtonImage" ;
2019-07-23 03:11:37 +02:00
submitImage . className = "playerButtonImage" ;
2019-07-22 00:19:56 +02:00
submitImage . src = chrome . extension . getURL ( "icons/PlayerUploadIconSponsorBlocker256px.png" ) ;
//add the image to the button
submitButton . appendChild ( submitImage ) ;
2019-08-02 18:18:56 +02:00
let controls = document . getElementsByClassName ( "ytp-right-controls" ) ;
let referenceNode = controls [ controls . length - 1 ] ;
2019-08-03 20:11:47 +02:00
if ( referenceNode == undefined ) {
//page not loaded yet
setTimeout ( addSubmitButton , 100 ) ;
return ;
}
2019-08-02 18:18:56 +02:00
2019-07-22 00:19:56 +02:00
referenceNode . prepend ( submitButton ) ;
2019-07-12 22:44:50 +02:00
}
2019-07-29 21:42:14 +02:00
function openInfoMenu ( ) {
if ( document . getElementById ( "sponsorBlockPopupContainer" ) != null ) {
//it's already added
return ;
}
popupInitialised = false ;
//hide info button
document . getElementById ( "infoButton" ) . style . display = "none" ;
2019-07-30 19:27:20 +02:00
sendRequestToCustomServer ( 'GET' , chrome . extension . getURL ( "popup.html" ) , function ( xmlhttp ) {
if ( xmlhttp . readyState == 4 && xmlhttp . status == 200 ) {
var popup = document . createElement ( "div" ) ;
popup . id = "sponsorBlockPopupContainer" ;
popup . innerHTML = xmlhttp . responseText
//close button
let closeButton = document . createElement ( "div" ) ;
closeButton . innerText = "Close Popup" ;
closeButton . classList = "smallLink" ;
closeButton . setAttribute ( "align" , "center" ) ;
closeButton . addEventListener ( "click" , closeInfoMenu ) ;
//add the close button
popup . prepend ( closeButton ) ;
let parentNode = document . getElementById ( "secondary" ) ;
if ( parentNode == null ) {
//old youtube theme
parentNode = document . getElementById ( "watch7-sidebar-contents" ) ;
}
2019-07-29 21:42:14 +02:00
2019-07-30 19:27:20 +02:00
//make the logo source not 404
//query selector must be used since getElementByID doesn't work on a node and this isn't added to the document yet
let logo = popup . querySelector ( "#sponsorBlockPopupLogo" ) ;
logo . src = chrome . extension . getURL ( "icons/LogoSponsorBlocker256px.png" ) ;
2019-07-29 21:42:14 +02:00
2019-07-30 19:27:20 +02:00
//remove the style sheet and font that are not necessary
popup . querySelector ( "#sponorBlockPopupFont" ) . remove ( ) ;
popup . querySelector ( "#sponorBlockStyleSheet" ) . remove ( ) ;
2019-07-29 21:42:14 +02:00
2019-07-30 19:27:20 +02:00
parentNode . insertBefore ( popup , parentNode . firstChild ) ;
2019-07-29 21:42:14 +02:00
2019-07-30 19:27:20 +02:00
//run the popup init script
runThePopup ( ) ;
}
} ) ;
2019-07-29 21:42:14 +02:00
}
function closeInfoMenu ( ) {
let popup = document . getElementById ( "sponsorBlockPopupContainer" ) ;
if ( popup != null ) {
popup . remove ( ) ;
//show info button
document . getElementById ( "infoButton" ) . style . display = "unset" ;
}
}
2019-07-30 02:54:10 +02:00
function clearSponsorTimes ( ) {
//it can't update to this info yet
closeInfoMenu ( ) ;
let currentVideoID = getYouTubeVideoID ( document . URL ) ;
let sponsorTimeKey = 'sponsorTimes' + currentVideoID ;
chrome . storage . sync . get ( [ sponsorTimeKey ] , function ( result ) {
let sponsorTimes = result [ sponsorTimeKey ] ;
if ( sponsorTimes != undefined && sponsorTimes . length > 0 ) {
2019-08-12 23:15:25 +02:00
let confirmMessage = chrome . i18n . getMessage ( "clearThis" ) + getSponsorTimesMessage ( sponsorTimes ) ;
confirmMessage += chrome . i18n . getMessage ( "confirmMSG" )
2019-07-30 02:54:10 +02:00
if ( ! confirm ( confirmMessage ) ) return ;
//clear the sponsor times
let sponsorTimeKey = "sponsorTimes" + currentVideoID ;
chrome . storage . sync . set ( { [ sponsorTimeKey ] : [ ] } ) ;
2019-08-02 02:01:33 +02:00
//clear sponsor times submitting
sponsorTimesSubmitting = [ ] ;
2019-07-30 02:54:10 +02:00
//set buttons to be correct
changeStartSponsorButton ( true , false ) ;
}
} ) ;
}
2019-07-10 03:31:21 +02:00
//Opens the notice that tells the user that a sponsor was just skipped
2019-07-26 02:00:07 +02:00
function openSkipNotice ( UUID ) {
2019-07-10 04:10:25 +02:00
if ( dontShowNotice ) {
//don't show, return
return ;
}
2019-07-18 01:42:13 +02:00
let amountOfPreviousNotices = document . getElementsByClassName ( "sponsorSkipNotice" ) . length ;
if ( amountOfPreviousNotices > 0 ) {
//already exists
let previousNotice = document . getElementsByClassName ( "sponsorSkipNotice" ) [ 0 ] ;
previousNotice . classList . add ( "secondSkipNotice" )
}
2019-07-12 16:42:39 +02:00
let noticeElement = document . createElement ( "div" ) ;
2019-07-18 01:42:13 +02:00
//what sponsor time this is about
2019-07-26 02:00:07 +02:00
noticeElement . id = "sponsorSkipNotice" + UUID ;
2019-07-18 01:42:13 +02:00
noticeElement . classList . add ( "sponsorSkipObject" ) ;
noticeElement . classList . add ( "sponsorSkipNotice" ) ;
2019-08-02 02:32:04 +02:00
noticeElement . style . zIndex = 50 + amountOfPreviousNotices ;
2019-07-10 20:43:14 +02:00
2019-08-14 05:43:02 +02:00
//the row that will contain the info
let firstRow = document . createElement ( "tr" ) ;
2019-08-15 03:30:02 +02:00
firstRow . id = "sponsorSkipNoticeFirstRow" + UUID ;
2019-08-14 05:43:02 +02:00
let logoColumn = document . createElement ( "td" ) ;
2019-07-12 16:42:39 +02:00
let logoElement = document . createElement ( "img" ) ;
2019-07-26 02:00:07 +02:00
logoElement . id = "sponsorSkipLogo" + UUID ;
2019-08-14 05:43:02 +02:00
logoElement . className = "sponsorSkipLogo sponsorSkipObject" ;
logoElement . src = chrome . extension . getURL ( "icons/IconSponsorBlocker256px.png" ) ;
2019-07-11 22:15:47 +02:00
2019-08-14 05:43:02 +02:00
let noticeMessage = document . createElement ( "span" ) ;
2019-07-26 02:00:07 +02:00
noticeMessage . id = "sponsorSkipMessage" + UUID ;
2019-07-18 01:42:13 +02:00
noticeMessage . classList . add ( "sponsorSkipMessage" ) ;
noticeMessage . classList . add ( "sponsorSkipObject" ) ;
2019-08-15 03:53:38 +02:00
noticeMessage . innerText = chrome . i18n . getMessage ( "noticeTitle" ) ;
2019-08-14 05:43:02 +02:00
//create the first column
logoColumn . appendChild ( logoElement ) ;
logoColumn . appendChild ( noticeMessage ) ;
//add the x button
let closeButtonContainer = document . createElement ( "td" ) ;
2019-08-14 20:07:00 +02:00
closeButtonContainer . className = "sponsorSkipNoticeRightSection" ;
closeButtonContainer . style . top = "11px" ;
2019-08-14 05:43:02 +02:00
2019-08-14 20:07:00 +02:00
let timeLeft = document . createElement ( "span" ) ;
2019-08-15 03:53:38 +02:00
timeLeft . innerText = chrome . i18n . getMessage ( "noticeClosingMessage" ) ;
2019-08-14 20:07:00 +02:00
timeLeft . className = "sponsorSkipObject sponsorSkipNoticeTimeLeft" ;
let hideButton = document . createElement ( "img" ) ;
hideButton . src = chrome . extension . getURL ( "icons/close.png" ) ;
hideButton . className = "sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeCloseButton sponsorSkipNoticeRightButton" ;
2019-08-14 05:43:02 +02:00
hideButton . addEventListener ( "click" , ( ) => closeSkipNotice ( UUID ) ) ;
2019-08-14 20:07:00 +02:00
closeButtonContainer . appendChild ( timeLeft ) ;
2019-08-14 05:43:02 +02:00
closeButtonContainer . appendChild ( hideButton ) ;
//add all objects to first row
firstRow . appendChild ( logoColumn ) ;
firstRow . appendChild ( closeButtonContainer ) ;
let spacer = document . createElement ( "hr" ) ;
2019-08-15 03:30:02 +02:00
spacer . id = "sponsorSkipNoticeSpacer" + UUID ;
2019-08-14 05:43:02 +02:00
spacer . className = "sponsorBlockSpacer" ;
//the row that will contain the buttons
let secondRow = document . createElement ( "tr" ) ;
2019-08-15 03:30:02 +02:00
secondRow . id = "sponsorSkipNoticeSecondRow" + UUID ;
2019-07-15 22:28:41 +02:00
//thumbs up and down buttons
2019-08-14 05:43:02 +02:00
let voteButtonsContainer = document . createElement ( "td" ) ;
2019-07-26 02:00:07 +02:00
voteButtonsContainer . id = "sponsorTimesVoteButtonsContainer" + UUID ;
2019-07-15 22:28:41 +02:00
let downvoteButton = document . createElement ( "img" ) ;
2019-07-26 02:00:07 +02:00
downvoteButton . id = "sponsorTimesDownvoteButtonsContainer" + UUID ;
2019-07-15 22:28:41 +02:00
downvoteButton . className = "sponsorSkipObject voteButton" ;
2019-08-15 03:30:02 +02:00
downvoteButton . src = chrome . extension . getURL ( "icons/report.png" ) ;
2019-07-20 04:24:59 +02:00
downvoteButton . addEventListener ( "click" , ( ) => vote ( 0 , UUID ) ) ;
2019-07-15 22:28:41 +02:00
//add thumbs up and down buttons to the container
voteButtonsContainer . appendChild ( downvoteButton ) ;
2019-07-10 03:15:43 +02:00
2019-08-14 05:43:02 +02:00
//add unskip button
let unskipContainer = document . createElement ( "td" ) ;
unskipContainer . className = "sponsorSkipNoticeUnskipSection" ;
2019-07-10 03:44:41 +02:00
2019-08-14 05:43:02 +02:00
let unskipButton = document . createElement ( "button" ) ;
unskipButton . innerText = chrome . i18n . getMessage ( "goBack" ) ;
2019-08-14 20:07:00 +02:00
unskipButton . className = "sponsorSkipObject sponsorSkipNoticeButton" ;
2019-08-14 05:43:02 +02:00
unskipButton . addEventListener ( "click" , ( ) => goBackToPreviousTime ( UUID ) ) ;
2019-07-10 03:44:41 +02:00
2019-08-14 05:43:02 +02:00
unskipContainer . appendChild ( unskipButton ) ;
//add don't show again button
let dontshowContainer = document . createElement ( "td" ) ;
dontshowContainer . className = "sponsorSkipNoticeRightSection" ;
2019-07-10 03:46:11 +02:00
2019-07-12 16:42:39 +02:00
let dontShowAgainButton = document . createElement ( "button" ) ;
2019-08-12 22:23:11 +02:00
dontShowAgainButton . innerText = chrome . i18n . getMessage ( "Hide" ) ;
2019-08-14 20:07:00 +02:00
dontShowAgainButton . className = "sponsorSkipObject sponsorSkipNoticeButton sponsorSkipNoticeRightButton" ;
2019-07-10 04:10:25 +02:00
dontShowAgainButton . addEventListener ( "click" , dontShowNoticeAgain ) ;
2019-08-14 05:43:02 +02:00
dontshowContainer . appendChild ( dontShowAgainButton ) ;
//add to row
secondRow . appendChild ( voteButtonsContainer ) ;
secondRow . appendChild ( unskipContainer ) ;
secondRow . appendChild ( dontshowContainer ) ;
noticeElement . appendChild ( firstRow ) ;
noticeElement . appendChild ( spacer ) ;
noticeElement . appendChild ( secondRow ) ;
2019-07-10 03:15:43 +02:00
2019-08-02 02:32:04 +02:00
let referenceNode = document . getElementById ( "movie_player" ) ;
2019-08-02 02:55:47 +02:00
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 ++ ;
}
}
2019-07-10 03:15:43 +02:00
referenceNode . prepend ( noticeElement ) ;
2019-01-18 20:49:43 +01:00
}
2019-07-09 05:43:06 +02:00
2019-07-20 04:24:59 +02:00
function afterDownvote ( UUID ) {
2019-08-15 03:30:02 +02:00
addVoteButtonInfo ( chrome . i18n . getMessage ( "Voted" ) , UUID ) ;
addNoticeInfoMessage ( chrome . i18n . getMessage ( "hitGoBack" ) , UUID ) ;
2019-08-13 02:00:42 +02:00
//remove this sponsor from the sponsors looked up
//find which one it is
for ( let i = 0 ; i < sponsorTimes . length ; i ++ ) {
if ( UUIDs [ i ] == UUID ) {
2019-08-13 02:22:00 +02:00
//this one is the one to hide
//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 ) ;
}
2019-08-13 02:00:42 +02:00
2019-08-13 02:22:00 +02:00
//update the preview
previewBar . set ( sponsorTimesLeft , [ ] , v . duration ) ;
2019-08-15 03:30:02 +02:00
break ;
2019-08-13 02:22:00 +02:00
}
2019-08-13 02:00:42 +02:00
}
2019-07-16 01:13:09 +02:00
}
2019-08-15 03:30:02 +02:00
function addNoticeInfoMessage ( message , UUID ) {
2019-07-20 19:41:13 +02:00
let previousInfoMessage = document . getElementById ( "sponsorTimesInfoMessage" + UUID ) ;
if ( previousInfoMessage != null ) {
//remove it
2019-08-15 03:30:02 +02:00
document . getElementById ( "sponsorSkipNotice" + UUID ) . removeChild ( previousInfoMessage ) ;
2019-07-20 19:41:13 +02:00
}
2019-07-20 04:24:59 +02:00
2019-08-15 03:30:02 +02:00
//add info
2019-07-20 04:24:59 +02:00
let thanksForVotingText = document . createElement ( "p" ) ;
2019-07-20 19:41:13 +02:00
thanksForVotingText . id = "sponsorTimesInfoMessage" + UUID ;
thanksForVotingText . className = "sponsorTimesInfoMessage" ;
2019-07-20 04:24:59 +02:00
thanksForVotingText . innerText = message ;
//add element to div
2019-08-15 03:30:02 +02:00
document . getElementById ( "sponsorSkipNotice" + UUID ) . insertBefore ( thanksForVotingText , document . getElementById ( "sponsorSkipNoticeSpacer" + 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" ) ;
2019-07-20 04:24:59 +02:00
}
2019-08-15 03:50:32 +02:00
//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 ) ;
}
2019-07-20 19:41:13 +02:00
2019-07-16 01:13:09 +02:00
chrome . runtime . sendMessage ( {
message : "submitVote" ,
type : type ,
2019-07-18 01:42:13 +02:00
UUID : UUID
2019-07-20 04:24:59 +02:00
} , function ( response ) {
if ( response != undefined ) {
//see if it was a success or failure
2019-08-15 03:50:32 +02:00
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 )
2019-08-15 03:30:02 +02:00
resetVoteButtonInfo ( UUID ) ;
2019-08-15 03:50:32 +02:00
} 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 ) ;
}
2019-07-30 03:06:15 +02:00
}
2019-07-20 04:24:59 +02:00
}
}
2019-07-16 01:13:09 +02:00
} ) ;
}
2019-07-18 01:42:13 +02:00
//Closes the notice that tells the user that a sponsor was just skipped for this UUID
function closeSkipNotice ( UUID ) {
let notice = document . getElementById ( "sponsorSkipNotice" + UUID ) ;
2019-07-10 03:44:41 +02:00
if ( notice != null ) {
notice . remove ( ) ;
}
2019-07-10 03:31:21 +02:00
}
2019-07-18 01:42:13 +02:00
//Closes all notices that tell the user that a sponsor was just skipped
function closeAllSkipNotices ( ) {
let notices = document . getElementsByClassName ( "sponsorSkipNotice" ) ;
for ( let i = 0 ; i < notices . length ; i ++ ) {
notices [ i ] . remove ( ) ;
}
}
2019-07-10 04:10:25 +02:00
function dontShowNoticeAgain ( ) {
2019-07-22 22:42:57 +02:00
chrome . storage . sync . set ( { "dontShowNoticeAgain" : true } ) ;
2019-07-10 04:10:25 +02:00
dontShowNotice = true ;
2019-07-18 01:42:13 +02:00
closeAllSkipNotices ( ) ;
2019-07-10 04:10:25 +02:00
}
2019-07-29 21:42:14 +02:00
function sponsorMessageStarted ( callback ) {
2019-08-03 20:11:47 +02:00
v = document . querySelector ( 'video' ) ;
2019-07-09 05:43:06 +02:00
//send back current time
2019-07-29 21:42:14 +02:00
callback ( {
2019-07-09 05:43:06 +02:00
time : v . currentTime
2019-07-29 21:42:14 +02:00
} )
2019-07-12 22:50:26 +02:00
//update button
toggleStartSponsorButton ( ) ;
2019-07-10 03:15:43 +02:00
}
2019-07-22 00:19:56 +02:00
function submitSponsorTimes ( ) {
2019-07-27 17:08:29 +02:00
if ( document . getElementById ( "submitButton" ) . style . display == "none" ) {
//don't submit, not ready
return ;
}
2019-07-29 21:42:14 +02:00
//it can't update to this info yet
closeInfoMenu ( ) ;
2019-07-29 17:36:57 +02:00
let currentVideoID = getYouTubeVideoID ( document . URL ) ;
let sponsorTimeKey = 'sponsorTimes' + currentVideoID ;
chrome . storage . sync . get ( [ sponsorTimeKey ] , function ( result ) {
let sponsorTimes = result [ sponsorTimeKey ] ;
if ( sponsorTimes != undefined && sponsorTimes . length > 0 ) {
let confirmMessage = "Are you sure you want to submit this?\n\n" + getSponsorTimesMessage ( sponsorTimes ) ;
2019-07-29 22:29:20 +02:00
confirmMessage += "\n\nTo edit or delete values, click the info button or open the extension popup by clicking the extension icon in the top right corner."
2019-07-29 17:36:57 +02:00
if ( ! confirm ( confirmMessage ) ) return ;
sendSubmitMessage ( ) ;
}
} ) ;
}
//send the message to the background js
//called after all the checks have been made that it's okay to do so
function sendSubmitMessage ( ) {
2019-07-22 00:19:56 +02:00
//add loading animation
document . getElementById ( "submitButtonImage" ) . src = chrome . extension . getURL ( "icons/PlayerUploadIconSponsorBlocker256px.png" ) ;
document . getElementById ( "submitButton" ) . style . animation = "rotate 1s 0s infinite" ;
let currentVideoID = getYouTubeVideoID ( document . URL ) ;
chrome . runtime . sendMessage ( {
message : "submitTimes" ,
videoID : currentVideoID
} , function ( response ) {
if ( response != undefined ) {
if ( response . statusCode == 200 ) {
//hide loading message
2019-07-22 21:59:21 +02:00
let submitButton = document . getElementById ( "submitButton" ) ;
//finish this animation
submitButton . style . animation = "rotate 1s" ;
//when the animation is over, hide the button
2019-08-04 02:52:09 +02:00
let animationEndListener = function ( ) {
2019-08-01 21:19:58 +02:00
changeStartSponsorButton ( true , false ) ;
2019-08-04 02:52:09 +02:00
submitButton . style . animation = "none" ;
submitButton . removeEventListener ( "animationend" , animationEndListener ) ;
} ;
submitButton . addEventListener ( "animationend" , animationEndListener ) ;
2019-07-22 00:19:56 +02:00
//clear the sponsor times
let sponsorTimeKey = "sponsorTimes" + currentVideoID ;
2019-07-22 22:42:57 +02:00
chrome . storage . sync . set ( { [ sponsorTimeKey ] : [ ] } ) ;
2019-08-12 05:13:07 +02:00
//request the sponsors from the server again
sponsorsLookup ( currentVideoID ) ;
2019-07-22 00:19:56 +02:00
} else {
//for a more detailed error message, they should check the popup
//show that the upload failed
document . getElementById ( "submitButton" ) . style . animation = "unset" ;
document . getElementById ( "submitButtonImage" ) . src = chrome . extension . getURL ( "icons/PlayerUploadFailedIconSponsorBlocker256px.png" ) ;
2019-07-30 03:09:10 +02:00
2019-08-12 21:10:13 +02:00
if ( [ 400 , 429 , 409 , 502 ] . includes ( response . statusCode ) ) {
2019-08-12 22:23:11 +02:00
alert ( chrome . i18n . getMessage ( response . statusCode ) ) ;
2019-07-30 03:09:10 +02:00
} else {
2019-08-12 22:23:11 +02:00
alert ( chrome . i18n . getMessage ( "connectionError" ) + response . statusCode ) ;
2019-07-30 03:09:10 +02:00
}
2019-07-22 00:19:56 +02:00
}
}
} ) ;
}
2019-07-29 17:36:57 +02:00
//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 ;
}
//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 ;
}
2019-07-20 21:33:52 +02:00
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 ( ) ;
}
2019-07-22 03:08:23 +02:00
function sendRequestToCustomServer ( type , fullAddress , callback ) {
let xmlhttp = new XMLHttpRequest ( ) ;
xmlhttp . open ( type , fullAddress , true ) ;
if ( callback != undefined ) {
xmlhttp . onreadystatechange = function ( ) {
callback ( xmlhttp , false ) ;
} ;
xmlhttp . onerror = function ( ev ) {
callback ( xmlhttp , true ) ;
} ;
}
//submit this request
xmlhttp . send ( ) ;
}