// ==UserScript== // @name Plex GUID Grabber // @namespace @soitora/plex-guid-grabber // @description Grab the GUID of a Plex entry on demand // @version 3.0.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; } `); const Toast = Swal.mixin({ toast: true, position: "bottom-right", showConfirmButton: false, timer: 5000, timerProgressBar: true, }); // Variables const buttonConfig = { plex: { id: "plex-guid-button", label: "Copy Plex GUID", icon: "https://raw.githubusercontent.com/Soitora/PlexAniSync-Mapping-Assistant/main/.github/icons/plex.opti.png", }, imdb: { id: "imdb-guid-button", label: "Open IMDB", icon: "https://raw.githubusercontent.com/Soitora/PlexAniSync-Mapping-Assistant/main/.github/icons/imdb.opti.png", }, tmdb: { id: "tmdb-guid-button", label: "Open TMDB", icon: "https://raw.githubusercontent.com/Soitora/PlexAniSync-Mapping-Assistant/main/.github/icons/tmdb-small.opti.png", }, tvdb: { id: "tvdb-guid-button", label: "Open TVDB", icon: "https://raw.githubusercontent.com/Soitora/PlexAniSync-Mapping-Assistant/main/.github/icons/tvdb.opti.png", }, }; const buttonVisibility = { plex: ["album", "artist", "movie", "season", "episode", "show"], imdb: ["movie", "show"], tmdb: ["movie", "show"], tvdb: ["movie", "show"], }; const siteDisplayNames = { plex: "Plex", imdb: "IMDb", tmdb: "TMDB", tvdb: "TVDB", }; let buttonContainer = null; let clipboard = null; // 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 || $("#" + buttonConfig.plex.id).length) return; const buttons = { plex: { handler: () => handleButtonClick("plex", guid.plex, pageType, metadata), config: buttonConfig.plex, }, tmdb: { handler: () => handleButtonClick("tmdb", guid.tmdb, pageType, metadata), config: buttonConfig.tmdb, }, tvdb: { handler: () => handleButtonClick("tvdb", guid.tvdb, pageType, metadata), config: buttonConfig.tvdb, }, imdb: { handler: () => handleButtonClick("imdb", guid.imdb, pageType, metadata), config: buttonConfig.imdb, }, }; Object.entries(buttons).forEach(([site, { handler, config }]) => { if (buttonVisibility[site].includes(pageType)) { const $button = $("