Warning: fopen(/www/sites/update.greasyfork.icu/index/store/temp/3a38ac33a36eeeff40f429ee88374046.js): failed to open stream: No space left on device in /www/sites/update.greasyfork.icu/index/scriptControl.php on line 65
// ==UserScript==
// @name Youtube: Add to Playlist Icons
// @namespace http://xshade.ca
// @version 6
// @description Adds icons to the video toolbar which adds to specific playlists with 1 click.
// @icon https://youtube.com/favicon.ico
// @author Chris H (Zren / Shade)
// @include http*://*.youtube.com/*
// @include http*://youtube.com/*
// @include http*://*.youtu.be/*
// @include http*://youtu.be/*
// @grant GM_addStyle
// @downloadURL https://update.greasyfork.icu/scripts/21703/Youtube%3A%20Add%20to%20Playlist%20Icons.user.js
// @updateURL https://update.greasyfork.icu/scripts/21703/Youtube%3A%20Add%20to%20Playlist%20Icons.meta.js
// ==/UserScript==
(function (window) {
//--- Settings
// name is case sensitive
var addToPlaylistButtons = [
{ name: "Saved", label: "♥" },
{ name: "Music", label: "♫" },
{ name: "Watch Later", label: "⏱" },
];
//---
var el = function(html) {
var e = document.createElement('div');
e.innerHTML = html;
return e.removeChild(e.firstChild);
}
var isWatchUrl = function(url) {
if (!url)
url = document.location.href;
return url.match(/https?:\/\/(www\.)?youtube.com\/watch\?/)
|| url.match(/https?:\/\/(www\.)?youtube.com\/(c|channel)\/[^\/]+\/live/);
}
function waitFor(selector, callback) {
var tick = function(){
var e = document.querySelector(selector);
if (e) {
callback(e);
} else {
setTimeout(tick, 100);
}
};
tick();
}
window.waitFor = waitFor
//--- History
var HistoryEvent = function() {}
HistoryEvent.listeners = []
HistoryEvent.dispatch = function(state, title, url) {
var stack = this.listeners
for (var i = 0, l = stack.length; i < l; i++) {
stack[i].call(this, state, title, url)
}
}
HistoryEvent.onPushState = function(state, title, url) {
HistoryEvent.dispatch(state, title, url)
return HistoryEvent.origPushState.apply(window.history, arguments)
}
HistoryEvent.onReplaceState = function(state, title, url) {
HistoryEvent.dispatch(state, title, url)
return HistoryEvent.origReplaceState.apply(window.history, arguments)
}
HistoryEvent.inject = function() {
if (!HistoryEvent.injected) {
HistoryEvent.origPushState = window.history.pushState
HistoryEvent.origReplaceState = window.history.replaceState
window.history.pushState = HistoryEvent.onPushState
window.history.replaceState = HistoryEvent.onReplaceState
HistoryEvent.injected = true
}
}
HistoryEvent.timerId = 0
HistoryEvent.onTick = function() {
var currentPage = window.location.pathname + window.location.search
if (HistoryEvent.lastPage != currentPage) {
HistoryEvent.dispatch({}, document.title, window.location.href)
HistoryEvent.lastPage = currentPage
}
}
HistoryEvent.startTimer = function() {
HistoryEvent.lastPage = window.location.pathname + window.location.search
HistoryEvent.timerId = setInterval(HistoryEvent.onTick, 500)
}
HistoryEvent.stopTimer = function() {
clearInterval(HistoryEvent.timerId)
}
//---
var YoutubeScript = function(name) {
this.name = name;
}
YoutubeScript.prototype.registerMaterialListeners = function() {
this._materialPageTransition = this.materialPageTransition.bind(this)
HistoryEvent.listeners.push(this._materialPageTransition);
HistoryEvent.startTimer();
}
YoutubeScript.prototype.materialPageTransition = function() {
console.log('checkIfWatchPage');
if (isWatchUrl())
this.onWatchPage();
}
YoutubeScript.prototype.checkIfWatchPage = function() {
console.log('checkIfWatchPage');
if (isWatchUrl())
this.onWatchPage();
}
YoutubeScript.prototype.onWatchPage = function() {}
//---
var ytScript = new YoutubeScript('ytplaylisticons');
ytScript.onWatchPage = function() {
this.injectUI();
}
ytScript.injectUI = function() {
console.log('[playlisticons] injectUI')
var resizeButton = document.querySelector('.ytp-size-button.ytp-button');
console.log('[playlisticons] resizeButton', resizeButton)
waitFor('.ytp-size-button.ytp-button', function(resizeButton){
console.log('[playlisticons] waitFor')
console.log('[playlisticons] waitFor.resizeButton', resizeButton)
if (resizeButton) {
for (var i = 0; i < addToPlaylistButtons.length; i++) {
var playlistData = addToPlaylistButtons[i];
var button = document.querySelector('.yt-playlist-enqueue-button[data-playlist-name="' + playlistData.name + '"].ytp-button');
if (!button) {
button = el('