// ==UserScript== // @name Plex GUID Grabber // @namespace @soitora/plex-guid-grabber // @description Grab the GUID of a Plex entry on demand // @version 3.1.0 // @license MPL-2.0 // @icon https://app.plex.tv/desktop/favicon.ico // @homepageURL https://soitora.com/Plex-GUID-Grabber/ // @include *:32400/* // @include *://plex.*/* // @include https://app.plex.tv/* // @require https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.11/clipboard.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js // @require https://cdn.jsdelivr.net/npm/sweetalert2@11 // @grant GM_addStyle // @grant GM_getResourceText // @run-at document-end // @downloadURL none // ==/UserScript== GM_addStyle(`button[id$="-guid-button"] { margin-right: 4px; } button[id$="-guid-button"]:not([id="imdb-guid-button"]):hover img { filter: invert(100%) grayscale(100%) contrast(120%); } button[id="imdb-guid-button"]:hover img { filter: grayscale(100%) contrast(120%); } button[id="imdb-guid-button"] img { width: 30px !important; height: 30px !important; } `); // SweetAlert2 Toast const Toast = Swal.mixin({ toast: true, position: "bottom-right", showConfirmButton: false, timer: 5000, timerProgressBar: true, }); // Variables let buttonContainer = null; let clipboard = null; const siteConfig = { plex: { id: "plex-guid-button", name: "Plex", icon: "https://raw.githubusercontent.com/Soitora/Plex-GUID-Grabber/main/.github/images/plex.webp", buttonLabel: "Copy Plex GUID", visible: ["album", "artist", "movie", "season", "episode", "show"], }, imdb: { id: "imdb-guid-button", name: "IMDb", icon: "https://raw.githubusercontent.com/Soitora/Plex-GUID-Grabber/main/.github/images/imdb.webp", buttonLabel: "Open IMDB", visible: ["movie", "show"], }, tmdb: { id: "tmdb-guid-button", name: "TMDB", icon: "https://raw.githubusercontent.com/Soitora/Plex-GUID-Grabber/main/.github/images/tmdb-small.webp", buttonLabel: "Open TMDB", visible: ["movie", "show"], }, tvdb: { id: "tvdb-guid-button", name: "TVDB", icon: "https://raw.githubusercontent.com/Soitora/Plex-GUID-Grabber/main/.github/images/tvdb.webp", buttonLabel: "Open TVDB", visible: ["movie", "show"], }, mbid: { id: "musicbrainz-guid-button", name: "MusicBrainz", icon: "https://raw.githubusercontent.com/Soitora/Plex-GUID-Grabber/main/.github/images/musicbrainz.webp", buttonLabel: "Open MusicBrainz", visible: ["album", "artist"], }, anidb: { id: "anidb-guid-button", name: "AniDB", icon: "https://raw.githubusercontent.com/Soitora/Plex-GUID-Grabber/main/.github/images/anidb.webp", buttonLabel: "Open AniDB", visible: ["show", "movie"], }, youtube: { id: "youtube-guid-button", name: "YouTube", icon: "https://raw.githubusercontent.com/Soitora/Plex-GUID-Grabber/main/.github/images/youtube.webp", buttonLabel: "Open YouTube", visible: ["movie", "show", "episode"], }, }; // Initialize console.log("\x1b[36mPGG", "🔍 Plex GUID Grabber"); function handleButtons(metadata, pageType, guid) { const buttonContainer = $(document).find(".PageHeaderRight-pageHeaderRight-j9Yjqh"); console.debug("\x1b[36mPGG \x1b[32mDebug", "Button container found:", buttonContainer.length > 0); // Check if container exists or button already exists if (!buttonContainer.length || $("#" + siteConfig.plex.id).length) return; const buttons = Object.keys(siteConfig).reduce((acc, site) => { acc[site] = { handler: (event) => handleButtonClick(event, site, guid[site], pageType, metadata), config: siteConfig[site], }; return acc; }, {}); Object.entries(buttons).forEach(([site, { handler, config }]) => { if (siteConfig[site].visible.includes(pageType)) { const $button = $("