您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Quickly create playlists from your Youtube subscription feed
当前为
// ==UserScript== // @name Youtube Subscription List Quick Playlist // @namespace https://greasyfork.org/en/users/13981-chk1 // @description Quickly create playlists from your Youtube subscription feed // @include https://www.youtube.com/feed/subscriptions/activity // @version 1.0.1 // @grant GM_addStyle // @run-at document-end // ==/UserScript== GM_addStyle("#subs2playlistContainer { position:fixed; bottom: 10px; right: 10px; } "); GM_addStyle("#subs2playlistLink { display: block; clear: both; } "); GM_addStyle("#subs2playlistClear { float: right; font-size: smaller; clear: both; padding-top: 5px; display: block; color: #b00; }"); GM_addStyle(".subs2playlist.subs2playlist-add span::after { content: 'Add to playlist' }"); GM_addStyle(".subs2playlist.subs2playlist-remove span::after { content: 'Remove from playlist' }"); var videoIds = []; var playlistElements; function createPlaylistLink() { var playlistLinkContainer = document.createElement('div'); playlistLinkContainer.className = "yt-card yt-card-has-padding"; playlistLinkContainer.id = "subs2playlistContainer"; var playlistLinkH3 = document.createElement('h3'); playlistLinkH3.className = "yt-lockup-title"; var playlistLink = document.createElement('a'); playlistLink.href = "https://www.youtube.com/watch_videos?video_ids="; playlistLink.id = "subs2playlistLink"; var playlistLinkText = document.createTextNode('Your playlist link'); var clearLink = document.createElement('a'); clearLink.id = "subs2playlistClear"; clearLink.onclick = function() { clearPlaylist() }; var clearText = document.createTextNode('Clear'); clearLink.appendChild(clearText); playlistLink.appendChild(playlistLinkText); playlistLinkH3.appendChild(playlistLink); playlistLinkContainer.appendChild(playlistLinkH3); playlistLinkContainer.appendChild(clearLink); return { 'container': playlistLinkContainer, 'link': playlistLink, 'text': playlistLinkText }; } function updatePlaylistLink() { if(playlistElements.text.textContent.length > 2048){ playlistElements.text.textContent = "Too many videos, URL too long :("; } else { playlistElements.link.href="https://www.youtube.com/watch_videos?video_ids="+videoIds.join(','); playlistElements.text.textContent = "Your playlist link ("+videoIds.length+" videos)"; } } function clearPlaylist() { videoIds = []; var buttons = document.querySelectorAll('#browse-items-primary > .section-list .subs2playlist'); for (var i = 0; i < buttons.length; ++i) { buttons[i].classList.remove("subs2playlist-remove"); //buttons[i].classList.remove("yt-uix-button-subscribed-branded"); buttons[i].classList.remove("c4-module-editor-delete"); buttons[i].classList.add("subs2playlist-add"); buttons[i].classList.add("c4-editor-plus"); } updatePlaylistLink(); } function toggleVideoId(videoId){ var alreadyIn = videoIds.indexOf(videoId); if(alreadyIn === -1){ videoIds.push(videoId); return true; } else { videoIds.splice(alreadyIn, 1); return false; } } function createPlusButton(videoId){ var container = document.createElement('button'); container.setAttribute('onclick', 'toggleVideoId(\''+videoId+'\');'); container.className = "subs2playlist subs2playlist-add yt-uix-button yt-uix-button-size-default yt-uix-button-default yt-uix-button-has-icon no-icon-markup yt-uix-inlineedit-edit c4-editor-plus"; container.onclick = function(){ toggleVideoId(videoId); container.classList.toggle("c4-module-editor-delete"); container.classList.toggle("c4-editor-plus"); container.classList.toggle("subs2playlist-remove"); container.classList.toggle("subs2playlist-add"); updatePlaylistLink(); }; container.innerHTML = "<span class=\"yt-uix-button-content\"></span>"; return container; } function appendAllTheThings(node) { var videoId = node.getAttribute("data-context-item-id"); var plusButtonNode = createPlusButton(videoId); node.appendChild(plusButtonNode); } var observerConfig = { childList: true, attributes: true, subtree: false, attributeOldValue: false }; var listObserver = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { if(mutation.type == "childList" && mutation.addedNodes.length >= 1) { console.log(mutation); for (var i = 0; i < mutation.addedNodes.length; ++i) { var node = mutation.addedNodes[i]; if(node.nodeType === 1){ var videoLinkContainer = node.querySelector('.yt-lockup'); appendAllTheThings(videoLinkContainer); } } } }); }); var subListContainer = document.querySelector('#browse-items-primary > .section-list'); listObserver.observe(subListContainer, observerConfig); function firstRun(){ var videoLinkNodes = document.querySelectorAll('div.yt-lockup'); for (var i = 0; i < videoLinkNodes.length; ++i) { var node = videoLinkNodes[i]; appendAllTheThings(node); } playlistElements = createPlaylistLink(); document.body.appendChild(playlistElements.container); } firstRun();