Skip to content

Instantly share code, notes, and snippets.

@ETiV
Created September 10, 2013 11:16
Show Gist options
  • Save ETiV/6507991 to your computer and use it in GitHub Desktop.
Save ETiV/6507991 to your computer and use it in GitHub Desktop.
YouTube Repeater 的 UserScript 在YouTube上开启洗脑循环
// ==UserScript==
// @name YouTube Repeater
// @namespace ETiV
// @include http://www.youtube.com/watch?v=*
// @version 1
// ==/UserScript==
(function(){
var player = null, run_state = 0, repeat_state = false;
var btnTogglePlayState = document.createElement('button');
const HTML_PLAY = '<span>&#9654;</span>',
HTML_PAUSE = '<span style="display:inline-block;transform:rotate(90deg);">&#12307;</span>';
var getPlayer = function () {
var _p = document.getElementById('movie_player');
if (_p.getPlayerState() === 1) {
player = _p;
player.addEventListener('onStateChange', 'onYTStateChange');
run_state = 1;
}
};
var getDuration = function () {
try {
if (player) return player.getDuration();
else return -1;
} catch (e) {
return -1;
}
};
var getCurrentTime = function () {
try {
if (player) return player.getCurrentTime();
else return -1;
} catch (e) {
return -1;
}
};
var play = function () {
try {
if (player) player.playVideo();
} catch (e) {
}
};
var pause = function () {
try {
if (player) player.pauseVideo();
} catch (e) {
}
};
// var stop = function () {
// try {
// if (player) player.stopVideo();
// } catch (e) {
// }
// };
var state = function () {
try {
if (player) return player.getPlayerState();
else return -1;
} catch (e) {
return -1;
}
};
var seekTo = function (start) {
try {
if (player) player.seekTo(start, true);
} catch (e) {
}
};
var interval = setInterval(function () {
if (run_state === 0 && player === null) {
getPlayer();
} else if (run_state === 1) {
document.querySelector('#masthead-upload-button-group').style.marginRight = '5px';
btnTogglePlayState.className = 'yt-uix-pager-button yt-uix-pager-show-more yt-uix-button yt-uix-button-default yt-uix-button-size-default';
if (state() == 1) {
btnTogglePlayState.innerHTML = HTML_PAUSE;
}
if (state() == 2) {
btnTogglePlayState.innerHTML = HTML_PLAY;
}
document.querySelector('#masthead-upload-button-group').appendChild(btnTogglePlayState);
btnTogglePlayState.onclick = function () {
if (state() == 1) {
pause();
} else if (state() == 2) {
play();
}
};
var btnToggleRepeat = document.createElement('button');
btnToggleRepeat.className = 'yt-uix-pager-button yt-uix-pager-show-more yt-uix-button yt-uix-button-default yt-uix-button-size-default';
btnToggleRepeat.innerHTML = '<span style="display:inline-block;transform:rotate(90deg);">&#65304;</span>:' + (repeat_state?'ON':'OFF');
document.querySelector('#masthead-upload-button-group').appendChild(btnToggleRepeat);
btnToggleRepeat.onclick = function () {
repeat_state = !repeat_state;
btnToggleRepeat.innerHTML = '<span style="display:inline-block;transform:rotate(90deg);">&#65304;</span>:' + (repeat_state?'ON':'OFF');
if (repeat_state === true && state() === 0) {
play();
}
};
clearInterval(interval);
}
}, 500);
// NOTE : this `onYTStateChange` must be set in the global scope,
// because the event listener registered to youtube player need this name as string
// to invoke the certain event
window['onYTStateChange'] = function(state){
if (state === 0 && repeat_state) {
play();
} else {
if (state == 1) {
btnTogglePlayState.innerHTML = HTML_PAUSE;
}
if (state == 2) {
btnTogglePlayState.innerHTML = HTML_PLAY;
}
}
};
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment