您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a button linking to the channel's playlist on YouTube channel pages
- // ==UserScript==
- // @name YouTube Channel Playlist Button
- // @namespace https://greasyfork.org/en/users/703184-floriegl
- // @version 1.2
- // @description Adds a button linking to the channel's playlist on YouTube channel pages
- // @author floriegl
- // @match https://www.youtube.com/*
- // @license MIT
- // @grant none
- // ==/UserScript==
- (function () {
- 'use strict';
- let actionModel = undefined;
- let channelId = undefined;
- const readdObserver = new MutationObserver(() => {
- if (!document.getElementById('channel-playlist-link')) {
- addPlaylistButton();
- }
- });
- function addPlaylistButton() {
- readdObserver.disconnect();
- readdObserver.observe(actionModel, { childList: true, subtree: false });
- if (!document.getElementById('channel-playlist-link')) {
- const link = document.createElement("a");
- link.className = "yt-flexible-actions-view-model-wiz__action";
- link.id = "channel-playlist-link";
- link.style.textDecoration = "none";
- const buttonView = document.createElement("button-view-model");
- buttonView.className = "yt-spec-button-view-model";
- link.appendChild(buttonView);
- const button = document.createElement("button");
- button.className = "yt-spec-button-shape-next yt-spec-button-shape-next--outline yt-spec-button-shape-next--mono yt-spec-button-shape-next--size-m yt-spec-button-shape-next--enable-backdrop-filter-experiment";
- button.setAttribute("aria-label", "Go to Channel Playlist");
- buttonView.appendChild(button);
- const buttonText = document.createElement("div");
- buttonText.className = "yt-spec-button-shape-next__button-text-content";
- buttonText.textContent = "Channel Playlist";
- button.appendChild(buttonText);
- actionModel.appendChild(link);
- }
- document.getElementById('channel-playlist-link').href = `/playlist?list=UU${channelId.substring(2)}`;
- }
- window.addEventListener('yt-navigate-finish', async (e) => {
- if (e.detail && e.detail.pageType === 'channel' && e.detail.endpoint && e.detail.endpoint.browseEndpoint && typeof e.detail.endpoint.browseEndpoint.browseId === 'string' && e.detail.endpoint.browseEndpoint.browseId.startsWith('UC')) {
- channelId = e.detail.endpoint.browseEndpoint.browseId;
- actionModel = document.querySelector('.yt-flexible-actions-view-model-wiz');
- if (!actionModel) {
- actionModel = await new Promise((resolve) => {
- new MutationObserver((mutations, obs) => {
- const item = document.querySelector('.yt-flexible-actions-view-model-wiz');
- if (item) {
- resolve(item);
- obs.disconnect();
- }
- }).observe(document, { childList: true, subtree: true });
- });
- }
- addPlaylistButton();
- } else {
- channelId = null;
- readdObserver.disconnect();
- }
- });
- window.addEventListener("resize", () => {
- if (actionModel !== document.querySelector('.yt-flexible-actions-view-model-wiz')) {
- actionModel = document.querySelector('.yt-flexible-actions-view-model-wiz');
- if (channelId && actionModel) {
- addPlaylistButton();
- }
- }
- });
- })();