NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name BLU Add Wikidata Metadata_BETA // @description Search Wikidata and add more metadata // @version 1.3.0 // @author MiM // @copyright 2024 // @license MIT // @match https://blutopia.cc/torrents/similar/* // @match https://blutopia.cc/torrents/* // @match https://blutopia.cc/requests/* // @match https://blutopia.cc/wikidata // @grant GM_xmlhttpRequest // @icon https://blutopia.cc/favicon.ico // @updateURL https://openuserjs.org/meta/MiM/BLU_Add_Wikidata_Metadata.meta.js // @downloadURL https://openuserjs.org/install/MiM/BLU_Add_Wikidata_Metadata.user.js // @connect query.wikidata.org // ==/UserScript== // How long to cache. 24 hours is the default. const CACHE_TIME = 1000 * 60 * 60 * 24; var streamingRow; var socialRow; var customSites; var customRow; var imdb_id; const break_html = `<div style="flex-basis: 100%; height: 0;"></div>`; // Base URL to be used, potentially create this dynamically later updates const sparql = "https://query.wikidata.org/sparql?query=" const sparql_log = "https://query.wikidata.org/index.html#" const base_query = `SELECT DISTINCT * WHERE { ?subject wdt:P345 "{IMDB}". ` // Add metadata_links const metadata_links_sparql = ` OPTIONAL {?Wikipedia schema:about ?subject} OPTIONAL {?subject wdt:P2671 ?Google} OPTIONAL {?subject wdt:P1258 ?RottenTomatoes} OPTIONAL {?subject wdt:P345 ?IMDb} OPTIONAL {?subject wdt:P8013 ?Trakt} OPTIONAL {?subject wdt:P4983 ?TMDbTV} OPTIONAL {?subject wdt:P4947 ?TMDbMovie} OPTIONAL {?subject wdt:P4835 ?TVDbTV} OPTIONAL {?subject wdt:P12196 ?TVDbMovie} OPTIONAL {?subject wdt:P8600 ?TVMaze} OPTIONAL {?subject wdt:P3808 ?TheNumbers} OPTIONAL {?subject wdt:P6127 ?Letterboexd} OPTIONAL {?subject wdt:P5865 ?IGN} OPTIONAL {?subject wdt:P4839 ?WolframSearch BIND(ENCODE_FOR_URI(?WolframSearch) AS ?Wolfram)} OPTIONAL {?subject wdt:P7334 ?Vudu} OPTIONAL {?subject wdt:P1874 ?Netflix} OPTIONAL {?subject wdt:P7596 ?DisneyPlusSeries} OPTIONAL {?subject wdt:P7595 ?DisneyPlusMovie} OPTIONAL {?subject wdt:P6466 ?HuluMovie} OPTIONAL {?subject wdt:P6467 ?HuluSeries} OPTIONAL {?subject wdt:P8055 ?AmazonPrimeUS} OPTIONAL {?subject wdt:P9751 ?AppleTV} OPTIONAL {?subject wdt:P9586 ?AppleMovie} OPTIONAL {?subject wdt:P11460 ?Plex} OPTIONAL {?subject wdt:P1651 ?Youtube} OPTIONAL {?subject wdt:P8823 ?Xfinity} OPTIONAL {?subject wdt:P2013 ?Facebook} OPTIONAL {?subject wdt:P2002 ?Twitter} OPTIONAL {?subject wdt:P2003 ?Instagram} OPTIONAL {?subject wdt:P3943 ?Tumblr} } ` const base_order_by = " ORDER BY ASC(IF(contains(str(?Wikipedia),'en.wikipedia'), 0, 1)) " const original_language_sparql = " ASC(IF(contains(str(?Wikipedia),'{LANGUAGE_CODE}.wikipedia'), 0, 1)) " const final_order_by = " ASC(?Wikipedia) " const metadataType = Object.freeze({ METADATA: Symbol("metadata"), STREAMING: Symbol("streaming"), SOCIAL: Symbol("metadata"), CUSTOM: Symbol("custom") }); const tvdb_logo = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxzdmcgaGVpZ2h0PSIxMzgzIiB2aWV3Qm94PSIwIC0uNDQxIDEwMCA1NC44ODMiIHdpZHRoPSIyNTAwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Im0wIDBoMTAwdjU0aC0xMDB6IiBvcGFjaXR5PSIuNjkiLz48cGF0aCBkPSJtMCA1LjA5NmMwLTMuMjg2IDIuOTY0LTUuNTM3IDYuNDYyLTUuMDIzbDQ1LjY0IDUuOTYyYzIuMDUuMzAyIDMuNjg1IDIuNTEyIDMuNjg1IDQuOTE5djYuMjNjLTMuODQ2IDIuNTc3LTYuMzY3IDYuODktNi4zNjcgMTEuNzc2IDAgNC45MzIgMi40NiA5LjIwOCA2LjM2NyAxMS43NzZ2Mi43NGMwIDIuNDA3LTEuNjM0IDQuNjE3LTMuNjg2IDQuOTE5bC00MC40OTggNS41MzJjLTMuNDk5LjUxNS02LjQ2Mi0xLjczNy02LjQ2Mi01LjAyM3ptMTkuNjggNS43MjZoLTYuMDE5djcuODg0aC0zLjgxOXY0LjU1NmgzLjgydjguNzZjLS4xNzcgNS41MDUgMS45ODUgNy45NyA2Ljk1MyA4LjAxN2g0LjYzNnYtNC41NTZoLTIuMzhjLTIuNjk2LS4xMzEtMy4yOC0uOTItMy4xOS00LjQ2OHYtNy43NTNoNy40bDYuODUzIDE2Ljc3Nmg2LjQ2OWw5LjQzNC0yMS4zMzJoLTYuMzhsLTYuMTEgMTQuNjc1LTUuNTctMTQuNjc1aC0xMi4wOTd6IiBmaWxsPSIjNmNkNTkxIi8+PHBhdGggZD0ibTg4LjYxIDE4LjI3N2MzLjkwOCAwIDYuNTEzLjk2NCA4LjQ5IDMuMTU0IDEuNjE3IDEuNzUyIDIuNDcgNC4zMzcgMi40NyA3LjIyNyAwIDQuMjA1LTEuNzA2IDcuNDktNC44MDYgOS4zNzQtMi4wMjIgMS4yMjctMy43NzMgMS41NzctNy43MjcgMS41NzdoLTkuNzkzdi0yOS4yMTZoNi4wMnY3Ljg4NHptLTUuMzQ2IDE2Ljc3N2g0LjQ0N2MzLjU0OSAwIDUuNzA1LTIuMzY2IDUuNzA1LTYuMjIgMC00LjAzLTEuODg2LTYuMDAyLTUuNzA1LTYuMDAyaC00LjQ0N3ptLTE1LjI1LTI0LjY2MWg2LjAydjI5LjIxNmgtMTAuMzc4Yy00LjIyMiAwLTYuMjQ0LS42MTMtOC40LTIuNDk2LTIuMjAyLTEuOTcxLTMuMzI1LTQuNzc1LTMuMzI1LTguMzIzIDAtMy42OCAxLjIxMy02LjQ4MyAzLjc3NC04LjU0MiAxLjYxNy0xLjMxNCAzLjgxOS0xLjk3IDYuNjQ5LTEuOTdoNS42NnptMCAxMi40NGgtNC4zNThjLTMuNTA0IDAtNS42MTUgMi4yMzQtNS42MTUgNS45NTcgMCAzLjg5OCAyLjE1NiA2LjI2NCA1LjYxNSA2LjI2NGg0LjM1OHoiIGZpbGw9IiNmZmYiLz48L3N2Zz4='; const trakt_logo = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxOC4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMTQ0LjggMTQ0LjgiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDE0NC44IDE0NC44IiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxjaXJjbGUgZmlsbD0iI0ZGRkZGRiIgY3g9IjcyLjQiIGN5PSI3Mi40IiByPSI3Mi40Ii8+DQoJPHBhdGggZmlsbD0iI0VEMjIyNCIgZD0iTTI5LjUsMTExLjhjMTAuNiwxMS42LDI1LjksMTguOCw0Mi45LDE4LjhjOC43LDAsMTYuOS0xLjksMjQuMy01LjNMNTYuMyw4NUwyOS41LDExMS44eiIvPg0KCTxwYXRoIGZpbGw9IiNFRDIyMjQiIGQ9Ik01Ni4xLDYwLjZMMjUuNSw5MS4xTDIxLjQsODdsMzIuMi0zMi4yaDBsMzcuNi0zNy42Yy01LjktMi0xMi4yLTMuMS0xOC44LTMuMWMtMzIuMiwwLTU4LjMsMjYuMS01OC4zLDU4LjMNCgkJYzAsMTMuMSw0LjMsMjUuMiwxMS43LDM1bDMwLjUtMzAuNWwyLjEsMmw0My43LDQzLjdjMC45LTAuNSwxLjctMSwyLjUtMS42TDU2LjMsNzIuN0wyNywxMDJsLTQuMS00LjFsMzMuNC0zMy40bDIuMSwybDUxLDUwLjkNCgkJYzAuOC0wLjYsMS41LTEuMywyLjItMS45bC01NS01NUw1Ni4xLDYwLjZ6Ii8+DQoJPHBhdGggZmlsbD0iI0VEMUMyNCIgZD0iTTExNS43LDExMS40YzkuMy0xMC4zLDE1LTI0LDE1LTM5YzAtMjMuNC0xMy44LTQzLjUtMzMuNi01Mi44TDYwLjQsNTYuMkwxMTUuNywxMTEuNHogTTc0LjUsNjYuOGwtNC4xLTQuMQ0KCQlsMjguOS0yOC45bDQuMSw0LjFMNzQuNSw2Ni44eiBNMTAxLjksMjcuMUw2OC42LDYwLjRsLTQuMS00LjFMOTcuOCwyM0wxMDEuOSwyNy4xeiIvPg0KCTxnPg0KCQk8Zz4NCgkJCTxwYXRoIGZpbGw9IiNFRDIyMjQiIGQ9Ik03Mi40LDE0NC44QzMyLjUsMTQ0LjgsMCwxMTIuMywwLDcyLjRDMCwzMi41LDMyLjUsMCw3Mi40LDBzNzIuNCwzMi41LDcyLjQsNzIuNA0KCQkJCUMxNDQuOCwxMTIuMywxMTIuMywxNDQuOCw3Mi40LDE0NC44eiBNNzIuNCw3LjNDMzYuNSw3LjMsNy4zLDM2LjUsNy4zLDcyLjRzMjkuMiw2NS4xLDY1LjEsNjUuMXM2NS4xLTI5LjIsNjUuMS02NS4xDQoJCQkJUzEwOC4zLDcuMyw3Mi40LDcuM3oiLz4NCgkJPC9nPg0KCTwvZz4NCjwvZz4NCjwvc3ZnPg0K'; const tvmaze_logo = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMjUwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDI1MCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMTUyXzQxMjQpIj4KPHBhdGggZD0iTTIyNi45NDQgOTkuOTgxNEMyMjYuNTk0IDk4LjM2MDYgMjI2LjIyMiA5Ni43NDg4IDIyNS44MyA5NS4xNDU4QzIyNC4yNSA4OC43MjQ2IDIyMC43NzYgODIuOTI5OSAyMTUuODYxIDc4LjUxNzlDMjEwLjk0NiA3NC4xMDYgMjA0LjgxOCA3MS4yODE3IDE5OC4yNzcgNzAuNDEzOEwxOTEuODc1IDY5LjYxODNDMTc5LjYyNCA2OC4xNDM1IDE2Ni45MDkgNjcuMDI2MiAxNTMuODE5IDY2LjMxMTFMMjA0LjI3OCAzNi42ODk5QzIwNS40MDQgMzYuMDMwNSAyMDYuMzgzIDM1LjE0NTkgMjA3LjE1MyAzNC4wOTExQzIwNy45MjMgMzMuMDM2NCAyMDguNDY5IDMxLjgzNCAyMDguNzU2IDMwLjU1ODhDMjA5LjA0MyAyOS4yODM3IDIwOS4wNjUgMjcuOTYzIDIwOC44MjEgMjYuNjc4OUMyMDguNTc3IDI1LjM5NDggMjA4LjA3MSAyNC4xNzQ4IDIwNy4zMzcgMjMuMDk0OEMyMDUuOTc4IDIxLjA5OTIgMjAzLjkxNSAxOS42OTQzIDIwMS41NjMgMTkuMTYzNUMxOTkuMjEyIDE4LjYzMjcgMTk2Ljc0NyAxOS4wMTU1IDE5NC42NjYgMjAuMjM0NkwxMjQuMzQ5IDYxLjUzODFMNTIuMjA0NiAxOS4yNjkzQzUwLjEwNyAxOC4wNDE5IDQ3LjYxMzYgMTcuNjg1OCA0NS4yNTc1IDE4LjI3NzFDNDIuOTAxNSAxOC44NjgzIDQwLjg2OTYgMjAuMzYwMSAzOS41OTY0IDIyLjQzMzRDMzguOTQ1NyAyMy40OTE2IDM4LjUxMjcgMjQuNjY5NSAzOC4zMjI5IDI1Ljg5NzhDMzguMTMzIDI3LjEyNjIgMzguMTkwMiAyOC4zODAyIDM4LjQ5MDkgMjkuNTg2MkMzOC43OTE3IDMwLjc5MjEgMzkuMzMgMzEuOTI1NSA0MC4wNzQyIDMyLjkxOThDNDAuODE4MyAzMy45MTQxIDQxLjc1MzMgMzQuNzQ5MiA0Mi44MjQyIDM1LjM3NTlMOTQuODI2MiA2NS44NDYzQzgyLjUwOTMgNjYuMjg3MyA3MC41MTY0IDY3LjEwMzYgNTguODQ3NSA2OC4yOTU0TDUyLjg0NjYgNjguOTAzMkM0Ni4xNDY4IDY5LjY1NzQgMzkuODM4MyA3Mi40NTA5IDM0Ljc3MDQgNzYuOTA3OUMyOS43MDI1IDgxLjM2NDkgMjYuMTE4MyA4Ny4yNzEyIDI0LjUwMDUgOTMuODMxOUMyNC4yNTk3IDk0Ljc4ODMgMjQuMDE5IDk1LjczNTggMjMuNzk2MSA5Ni42OTIxQzE1Ljc2MDQgMTMxLjMzNCAxNi4wNjYgMTY3LjM5NSAyNC42ODc3IDIwMS44OTVDMjUuMDI2NiAyMDMuMjI3IDI1LjM3NDMgMjA0LjU3NiAyNS43NDg4IDIwNS44NjRDMjcuNTIxOSAyMTIuMTkgMzEuMTUwMSAyMTcuODM3IDM2LjE2MzEgMjIyLjA3MUM0MS4xNzYxIDIyNi4zMDYgNDcuMzQyNiAyMjguOTMzIDUzLjg2MzEgMjI5LjYxMkM1Ni4yNDA4IDIyOS44NjMgNTguNjE4NiAyMzAuMTAxIDYwLjk5NjQgMjMwLjMyN0M3OS41NTIgMjMyLjExNSA5OS4wMjYgMjMzLjAwOSAxMTkuMDg4IDIzMy4wMDlDMTQyLjY4IDIzMy4wNDIgMTY2LjI1MyAyMzEuNzA4IDE4OS42OTEgMjI5LjAxNEMxOTIuMTY5IDIyOC43MzYgMTk0LjYyMiAyMjguNDI0IDE5Ny4wNzQgMjI4LjEyQzIwMy41NzIgMjI3LjI3MiAyMDkuNjcyIDIyNC41MDQgMjE0LjU5NSAyMjAuMTY4QzIxOS41MTggMjE1LjgzMSAyMjMuMDQxIDIxMC4xMjQgMjI0LjcxNSAyMDMuNzcyQzIyNS4xNyAyMDIuMDgzIDIyNS42MDcgMjAwLjM4NCAyMjUuOTk5IDE5OC42NTlDMjI5Ljk3MSAxODEuODc5IDIzMS45NTggMTY0LjY4OSAyMzEuOTIgMTQ3LjQ0M0MyMzEuOTc4IDEzMS40ODkgMjMwLjMxIDExNS41NzUgMjI2Ljk0NCA5OS45ODE0Wk0yMDUuOTE5IDE4OC4xNzVDMjA0LjczNSAxOTMuMDk3IDIwMi4xMSAxOTcuNTUyIDE5OC4zODEgMjAwLjk2N0MxOTQuNjUxIDIwNC4zODIgMTg5Ljk4OSAyMDYuNjAxIDE4NC45OTIgMjA3LjMzOEMxNjMuMTkgMjEwLjUyNCAxNDEuMTgzIDIxMi4wOTUgMTE5LjE1MSAyMTIuMDRDMTAxLjY5OSAyMTIuMDYgODQuMjU5NyAyMTEuMDkxIDY2LjkxNzEgMjA5LjEzNUM2MS41NzE0IDIwOC41MjYgNTYuNTQwMyAyMDYuMjkgNTIuNTAwNiAyMDIuNzI4QzQ4LjQ2MSAxOTkuMTY2IDQ1LjYwNjggMTk0LjQ0OSA0NC4zMjIyIDE4OS4yMTJDMzcuODc5MSAxNjIuMjQ2IDM3Ljc2MDEgMTM0LjE1MSA0My45NzQ1IDEwNy4xMzJDNDUuMDYyIDEwMi41NTIgNDcuNTI2NyA5OC40MTY5IDUxLjAzNTIgOTUuMjg2OEM1NC41NDM3IDkyLjE1NjcgNTguOTI2NyA5MC4xODI0IDYzLjU5MTEgODkuNjMxQzY4LjcwOTMgODkuMDA1MyA3My45MzQ1IDg4LjQ1MTEgNzkuMjU3NyA4OC4wMTMxQzkyLjA2MiA4Ni44OTU5IDEwNS40MjggODYuMzIzOCAxMTkuMTUxIDg2LjMyMzhIMTE5Ljc3NUMxMjMuMTk5IDg2LjMyMzggMTI2LjYwMiA4Ni4zNjU1IDEyOS45ODUgODYuNDQ4OUMxNDQuNDIxIDg2Ljc3MDcgMTU4LjQwMiA4Ny43MjcxIDE3MS42NjEgODkuMjU1NUMxNzcuMTYzIDg5Ljg5OTEgMTgyLjU1NyA5MC42MzIgMTg3LjgwOSA5MS40NTQ0QzE5Mi4yOTYgOTIuMTQ0NCAxOTYuNDcyIDk0LjE3MjcgMTk5Ljc5MiA5Ny4yNzVDMjAzLjExMyAxMDAuMzc3IDIwNS40MjUgMTA0LjQxIDIwNi40MjcgMTA4Ljg0OEMyMDkuMjI1IDEyMS41MTUgMjEwLjYyNCAxMzQuNDUyIDIxMC42IDE0Ny40MjVDMjEwLjYyNyAxNjEuMTQ1IDIwOS4wNTYgMTc0LjgyMSAyMDUuOTE5IDE4OC4xNzVaIiBmaWxsPSIjMDEwMTAxIi8+CjxwYXRoIGQ9Ik04MC41NTkyIDE3MC44NzlDOTUuMDkxNSAxNzAuODc5IDEwNi44NzIgMTU5LjA3IDEwNi44NzIgMTQ0LjUwM0MxMDYuODcyIDEyOS45MzUgOTUuMDkxNSAxMTguMTI2IDgwLjU1OTIgMTE4LjEyNkM2Ni4wMjY5IDExOC4xMjYgNTQuMjQ2MSAxMjkuOTM1IDU0LjI0NjEgMTQ0LjUwM0M1NC4yNDYxIDE1OS4wNyA2Ni4wMjY5IDE3MC44NzkgODAuNTU5MiAxNzAuODc5WiIgZmlsbD0iIzNGOTE4QiIvPgo8cGF0aCBkPSJNMTY5LjQ0MSAxNzIuMDVDMTgzLjk3MyAxNzIuMDUgMTk1Ljc1NCAxNjAuMjQxIDE5NS43NTQgMTQ1LjY3NEMxOTUuNzU0IDEzMS4xMDYgMTgzLjk3MyAxMTkuMjk3IDE2OS40NDEgMTE5LjI5N0MxNTQuOTA5IDExOS4yOTcgMTQzLjEyOCAxMzEuMTA2IDE0My4xMjggMTQ1LjY3NEMxNDMuMTI4IDE2MC4yNDEgMTU0LjkwOSAxNzIuMDUgMTY5LjQ0MSAxNzIuMDVaIiBmaWxsPSIjM0Y5MThCIi8+CjwvZz4KPGRlZnM+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMjE1Ml80MTI0Ij4KPHJlY3Qgd2lkdGg9IjIxNCIgaGVpZ2h0PSIyMTUiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOCAxOCkiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K'; const metadata_map = { 'Wikidata': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/6/66/Wikidata-logo-en.svg', 'uri': '{id}', 'row': metadataType.METADATA, 'title': 'Wikidata ({id})' // Needs URL replaced. }, 'IMDb': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/6/69/IMDB_Logo_2016.svg', 'uri': 'https://www.imdb.com/title/{id}', 'row': metadataType.METADATA, 'title': 'Internet Movie DB ({id})' }, 'Trakt': { 'icon': trakt_logo, 'uri': 'https://trakt.tv/{id}', 'row': metadataType.METADATA, 'title': 'Trakt ({id})' }, 'TMDbTV': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/8/89/Tmdb.new.logo.svg', 'uri': 'https://www.themoviedb.org/tv/{id}', 'row': metadataType.METADATA, 'title': 'The Movie DB (tv/{id})' }, 'TMDbMovie': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/8/89/Tmdb.new.logo.svg', 'uri': 'https://www.themoviedb.org/movie/{id}', 'row': metadataType.METADATA, 'title': 'The Movie DB (movie/{id})' }, 'TVDbTV': { 'icon': tvdb_logo, 'uri': 'https://thetvdb.com/dereferrer/series/{id}', 'row': metadataType.METADATA, 'title': 'TheTV DB (series/{id})' }, 'TVDbMovie': { 'icon': tvdb_logo, 'uri': 'https://thetvdb.com/dereferrer/movie/{id}', 'row': metadataType.METADATA, 'title': 'TheTV DB (movie/{id})' }, 'TVMaze': { 'icon': tvmaze_logo, 'uri': 'https://tvmaze.com/shows/{id}', 'row': metadataType.METADATA, 'title': 'TVMaze (shows/{id})' }, 'Wikipedia': { 'icon': 'https://upload.wikimedia.org/wikipedia/en/8/80/Wikipedia-logo-v2.svg', 'uri': '{id}', 'row': metadataType.METADATA, 'title': 'Wikipedia' }, 'RottenTomatoes': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/6/6f/Rotten_Tomatoes_logo.svg', 'uri': 'https://www.rottentomatoes.com/{id}', 'row': metadataType.METADATA, 'title': 'Rotten Tomatoes ({id})' }, 'Google': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/archive/c/c1/20230822192910%21Google_%22G%22_logo.svg', 'uri': 'https://www.google.com/search?kgmid={id}', 'row': metadataType.METADATA, 'title': 'Google ({id})' }, 'TheNumbers': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/6/69/The_Numbers_logo.svg', 'uri': 'https://www.the-numbers.com/movie/{id}', 'row': metadataType.METADATA, 'title': 'The Numbers ({id})' }, 'Letterboxd': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/9/93/Letterboxd_2018_logo_%28vertical%29.svg', 'uri': 'https://letterboxd.com/film/{id}', 'row': metadataType.METADATA, 'title': 'Letterboxd ({id})' }, 'IGN': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/4/47/IGN_logo.svg', 'uri': 'https://www.ign.com/movies/{id}', 'row': metadataType.METADATA, 'title': 'IGN ({id})' }, 'Wolfram': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/2/20/Mathematica_Logo.svg', 'uri': 'https://www.wolframalpha.com/input/?i={id}', 'row': metadataType.METADATA, 'title': 'WolframAlphha ({id})' }, 'Vudu': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/e/ef/Vudu_2014_logo.svg', 'uri': 'https://www.vudu.com/content/browse/details/wd/{id}', 'row': metadataType.STREAMING, 'title': 'Vudu ({id})' }, 'HuluMovie': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/2/20/Hulu_2019.svg', 'uri': 'https://www.hulu.com/movie/{id}', 'row': metadataType.STREAMING, 'title': 'Hulu (movie/{id})' }, 'HuluSeries': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/2/20/Hulu_2019.svg', 'uri': 'https://www.hulu.com/series/{id}', 'row': metadataType.STREAMING, 'title': 'Hulu (series/{id})' }, 'Netflix': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/0/0c/Netflix_2015_N_logo.svg', 'uri': 'https://www.netflix.com/title/{id}', 'row': metadataType.STREAMING, 'title': 'Netflix ({id})' }, 'DisneyPlusSeries': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/6/64/Disney%2B_2024.svg', 'uri': 'https://www.disneyplus.com/series/wp/{id}', 'row': metadataType.STREAMING, 'title': 'Disney+ (series/{id})' }, 'DisneyPlusMovie': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/6/64/Disney%2B_2024.svg', 'uri': 'https://www.disneyplus.com/movies/wd/{id}', 'row': metadataType.STREAMING, 'title': 'Disney+ (movies/{id})' }, 'AmazonPrimeUS': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/1/11/Amazon_Prime_Video_logo.svg', 'uri': 'https://www.amazon.com/gp/video/detail/{id}', 'row': metadataType.STREAMING, 'title': 'Amazon Prime US ({id})' }, 'AppleTV': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/8/8a/Apple_Logo.svg', 'uri': 'https://tv.apple.com/show/{id}', 'row': metadataType.STREAMING, 'title': 'iTunes (show/{id})' }, 'AppleMovie': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/8/8a/Apple_Logo.svg', 'uri': 'https://tv.apple.com/movie/{id}', 'row': metadataType.STREAMING, 'title': 'iTunes (movie/{id})' }, 'Plex': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/7/7b/Plex_logo_2022.svg', 'uri': 'https://app.plex.tv/desktop/#!/provider/tv.plex.provider.metadata/details?key=/library/metadata/{id}', 'row': metadataType.STREAMING, 'title': 'Plex ({id})' }, 'Youtube': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/0/09/YouTube_full-color_icon_%282017%29.svg', 'uri': 'https://www.youtube.com/watch?v={id}', 'row': metadataType.STREAMING, 'title': 'YouTube ({id})' }, 'Xfinity': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/5/58/Xfinity_logo.svg', 'uri': 'https://www.xfinity.com/stream/entity/{id}', 'row': metadataType.STREAMING, 'title': 'Xfinity ({id})' }, 'Facebook': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/b/b9/2023_Facebook_icon.svg', 'uri': 'https://www.facebook.com/{id}', 'row': metadataType.SOCIAL, 'title': 'Facebook ({id})' }, 'Tumblr': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/2/2c/Tumblr_Logo.svg', 'uri': 'https://{id}.tumblr.com/', 'row': metadataType.SOCIAL, 'title': 'Tumblr ({id})' }, 'Twitter': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/6/6f/Logo_of_Twitter.svg', 'uri': 'https://twitter.com/{id}', 'row': metadataType.SOCIAL, 'title': 'Twitter/X ({id})' }, 'Instagram': { 'icon': 'https://upload.wikimedia.org/wikipedia/commons/e/e7/Instagram_logo_2016.svg', 'uri': 'https://www.instagram.com/{id}', 'row': metadataType.SOCIAL, 'title': 'Instagram ({id})' }, } const settings_page_body = ` <h1>Wikidata Settings</h1> <ul> <li>Row numbers, 0 means do not display/show. <li>Custom Sites, searh by IMDb. {ttimdb} and {imdb}, ex: <ul> <li>{ttimdb}: tt7907922 <li>{imdb}: 7907922 </ul> <li>Pipe separated required "|" <li>One site per line. <li>Order: <ol> <li>Site Name (hover over) <li>Search Pattern, eg: <ul> <li>https://mysite.com/search/imdb/{ttimdb} </ul> <li>Icon </ol> <li>Example:<br> <pre>Best site ever | https://mysite.com/search/imdb/{ttimdb} | https://mysite.com/mylogo.png</pre> </ul> <hr/> <label for="social">Social Media Row:</label> <input type="number" step="1" pattern="\\d+" min="0" max="3" id="social" name="social"><br><br> <label for="streaming">Streaming Services Row:</label> <input type="number" step="1" pattern="\\d+" min="0" max="4" id="streaming" name="streaming"><br><br> <label for="customPos">Custom Sites Row:</label> <input type="number" step="1" pattern="\\d+" min="0" max="4" id="customPos" name="customPos"><br><br> <label for="custom">Custom Sites (by IMDb):</label><br> <textarea id="custom" name="custom" rows="10" cols="100"></textarea><br><br> <input type="submit" id="update_wikidata" value="Update Settings"> ` async function search_wikidata_com(imdb, original_language_code) { let url = base_query.replace(`{IMDB}`, imdb); url += metadata_links_sparql + base_order_by if (original_language_code != '') { url = url.replace(`{ORIGINAL_LANGUAGE}`, ''); let original_language_order = original_language_sparql.replace(`{LANGUAGE_CODE}`, original_language_code); url += original_language_sparql } url += final_order_by url = encodeURIComponent(url) console.log(sparql_log + url); url = sparql + url const headers = { "Accept": "application/json" }; let resolver; let rejecter; const p = new Promise((resolveFn, rejectFn) => { resolver = resolveFn; rejecter = rejectFn; }); const final = GM_xmlhttpRequest({ method: "GET", url: url, headers: headers, onload: (response) => resolver(response), onerror: (response) => rejecter(response), ontimeout: (response) => rejecter(response) }); return p; } function get_imdb_id() { let imdb_id = '' try { let imdb_url = document.getElementsByClassName("meta__imdb")[0].getElementsByTagName("a")[0].href; let url_regex = /^(.*)(tt\d+)([^\d]*)$/; imdb_id = imdb_url.match(url_regex)[2]; } catch {} return imdb_id; } function get_primary_language() { let primary_language = '' try { primary_language = document.getElementsByClassName("meta__language")[0].getElementsByClassName("meta-chip__value")[0].innerText; if (primary_language.length != 2) { primary_language = '' } } catch {} return primary_language; } function removeDuplicates(arr) { let unique = arr.reduce(function (acc, curr) { if (!acc.includes(curr)) { acc.push(curr); } return acc; }, []); return unique; } function get_custom_sites_html() { var custom_html = ""; var sites = customSites.trim().split(`\n`); var site; var site_title; var site_uri; var site_icon; var site_class; for (var s = 0; s < sites.length; s++) { site = sites[s].split(`|`); if (site.length != 3) { continue; } site_title = site[0].trim().replace('"', "'"); site_class = site_title.replace(" ", "") site_uri = site[1].trim().replace("{ttimdb}", imdb_id).replace("{imdb}", imdb_id.replace("tt", "")); site_icon = site[2].trim(); custom_html = custom_html + ` <li class="meta__${site_class}"> <a class="meta-id-tag" href="${site_uri}" title="${site_title}" target="_blank"> <img src="${site_icon}"> </a> </li>`; } return custom_html; } function add_to_site(wikidata) { let meta_html_tag = document.getElementsByClassName("meta__ids")[0]; var meta_row; var meta_url; var meta_img; var meta_title; var social_found = false; var streaming_found = false; var meta_html; let url = ''; var metadata_html = ''; var streaming_html = ""; var social_html = ""; var custom_html = ""; for (var w in wikidata) { if (metadata_map.hasOwnProperty(w)) { meta_url = metadata_map[w].uri.replace("{id}", wikidata[w].value); meta_row = metadata_map[w].row; meta_img = metadata_map[w].icon; meta_title = metadata_map[w].title.replace("{id}", wikidata[w].value); meta_html = `<li class="meta__${w}"> <a class="meta-id-tag" href="${meta_url}" title="${meta_title}" target="_blank"> <img src="${meta_img}"> </a> </li>`; if (meta_row === metadataType.METADATA && !( (w == "IMDb" && document.getElementsByClassName("meta__imdb").length != 0) || ((w == "TMDbTV" || w == "TMDbMovie") && document.getElementsByClassName("meta__tmdb").length != 0) || ((w == "TVDbTV" || w == "TVDbTV") && document.getElementsByClassName("meta__tvdb").length != 0) || (w == "RottenTomatoes" && document.getElementsByClassName("meta__rotten").length != 0) )) { metadata_html += meta_html; } else if (meta_row === metadataType.STREAMING) { streaming_html += meta_html; streaming_found = true; } else if (meta_row === metadataType.SOCIAL) { social_html += meta_html; social_found = true; } else if (w == "RottenTomatoes" && document.getElementsByClassName("meta__rotten").length != 0) { document.getElementsByClassName("meta__rotten")[0].getElementsByTagName("a")[0].href = meta_url; } } else if (w == 'subject') { meta_url = metadata_map.Wikidata.uri.replace("{id}", wikidata[w].value) meta_row = metadata_map.Wikidata.row; meta_img = metadata_map.Wikidata.icon; meta_title = metadata_map.Wikidata.title.replace("{id}", wikidata[w].value.replace("http://www.wikidata.org/entity/", "")); meta_html = ` <li class="meta__wikidata"> <a class="meta-id-tag" href="${meta_url}" title="${meta_title}" target="_blank"> <img src="${meta_img}"> </a> </li>`; document.getElementsByClassName("meta__ids")[0].innerHTML += meta_html } } var num_rows_added = 0; var rows_needed = []; if (streamingRow > 1 && streaming_found) { rows_needed.push(streamingRow) } if (socialRow > 1 && social_found) { rows_needed.push(socialRow) } if (customSites.length > 0 && customRow > 1) { rows_needed.push(customRow) } rows_needed = removeDuplicates(rows_needed); num_rows_added = rows_needed.length; custom_html = get_custom_sites_html(); var current_row = 0; rows_needed.sort(); meta_html_tag.innerHTML += metadata_html if (streaming_found && streamingRow == 1) { meta_html_tag.innerHTML += streaming_html } if (social_found && socialRow == 1) { meta_html_tag.innerHTML += social_html } if (custom_html.length > 0 && customRow == 1) { meta_html_tag.innerHTML += custom_html } var row_html = ''; if (num_rows_added >= 1) { row_html = '' row_html += (streaming_found && streamingRow == rows_needed[current_row]) ? streaming_html : ""; row_html += (social_found && socialRow == rows_needed[current_row]) ? social_html : ""; row_html += (custom_html.length > 0 && customRow == rows_needed[current_row]) ? custom_html : ""; document.getElementsByClassName("meta__ids")[0].innerHTML += break_html; document.getElementsByClassName("meta__ids")[0].innerHTML += row_html; } current_row++; if (num_rows_added >= 2) { row_html = ""; row_html += (streaming_found && streamingRow == rows_needed[current_row]) ? streaming_html : ""; row_html += (social_found && socialRow == rows_needed[current_row]) ? social_html : ""; row_html += (custom_html.length > 0 && customRow == rows_needed[current_row]) ? custom_html : ""; document.getElementsByClassName("meta__ids")[0].innerHTML += break_html; document.getElementsByClassName("meta__ids")[0].innerHTML += row_html; } current_row++; if (num_rows_added >= 3) { row_html = ""; row_html += (streaming_found && streamingRow == rows_needed[current_row]) ? streaming_html : ""; row_html += (social_found && socialRow == rows_needed[current_row]) ? social_html : ""; row_html += (custom_html.length > 0 && customRow == rows_needed[current_row]) ? custom_html : ""; document.getElementsByClassName("meta__ids")[0].innerHTML += break_html; document.getElementsByClassName("meta__ids")[0].innerHTML += row_html; } } function set_from_user_settings() { try { streamingRow = Number(JSON.parse(window.localStorage.getItem(`wikidata-settings-streaming`)).row) } catch {} try { socialRow = Number(JSON.parse(window.localStorage.getItem(`wikidata-settings-social`)).row) } catch {} try { customRow = JSON.parse(window.localStorage.getItem(`wikidata-settings-custom`)).row } catch {} try { customSites = JSON.parse(window.localStorage.getItem(`wikidata-settings-custom`)).sites } catch {} streamingRow = streamingRow >= 0 ? streamingRow : 2; socialRow = socialRow >= 0 ? socialRow : 3; customRow = customRow >= 0 ? customRow : 4; customSites = customSites ? customSites : ''; } function settings_page() { if (streamingRow >= 0) { document.getElementById("streaming").value = streamingRow } if (socialRow >= 0) { document.getElementById("social").value = socialRow } if (customRow >= 0) { document.getElementById("customPos").value = customRow } if (customSites) { document.getElementById("custom").value = customSites } } function update_settings_page() { var streaming_value; var social_value; var custom_value; var customPos_value; try { streaming_value = document.getElementById("streaming").value >= 0 ? document.getElementById("streaming").value : 2 } catch { streaming_value = 2; } try { social_value = document.getElementById("social").value >= 0 ? document.getElementById("social").value : 3 } catch { social_value = 3; } try { customPos_value = document.getElementById("customPos").value >= 0 ? document.getElementById("customPos").value : 4 } catch { customPos_value = 4; } try { custom_value = document.getElementById("custom").value ? document.getElementById("custom").value : '' } catch { custom_value = ''; } window.localStorage.setItem('wikidata-settings-streaming', JSON.stringify({ 'row': streaming_value })); window.localStorage.setItem('wikidata-settings-social', JSON.stringify({ 'row': social_value })); window.localStorage.setItem('wikidata-settings-custom', JSON.stringify({ 'sites': custom_value, 'row': customPos_value })); } const currentUrl = window.location.href; (async function () { set_from_user_settings(); if (currentUrl.endsWith("/wikidata")) { document.head.innerHTML = ''; document.body.innerHTML = settings_page_body; settings_page(); document.getElementById("update_wikidata").onclick = update_settings_page; return; } 'use strict'; imdb_id = get_imdb_id(); if (imdb_id === '') { return; // No IMDb to search by } let primary_language = get_primary_language(); // Set flex-wrap so meta doesn't overflow. document.getElementsByClassName("meta__ids")[0].style["flex-wrap"] = "wrap" var wikidata; try { let updateCache = true; try { let oldTime = JSON.parse(window.localStorage.getItem(`wikidata-${imdb_id}-time`)).time let difference = (new Date).getTime() - oldTime; updateCache = difference > CACHE_TIME } catch {} if (updateCache) { try { window.localStorage.removeItem(`wikidata-${imdb_id}-wikidata`); window.localStorage.removeItem(`wikidata-${imdb_id}-time`); } catch {} let wikidata_response = await search_wikidata_com(imdb_id, primary_language) let wikidata_json = JSON.parse(wikidata_response.response); wikidata = wikidata_json.results.bindings[0]; window.localStorage.setItem(`wikidata-${imdb_id}-wikidata`, JSON.stringify(wikidata)); window.localStorage.setItem(`wikidata-${imdb_id}-time`, JSON.stringify({ 'time': (new Date).getTime() })); } else { wikidata = JSON.parse(window.localStorage.getItem(`wikidata-${imdb_id}-wikidata`)); } add_to_site(wikidata); } catch { //No Wikidata found, try adding custom let meta_html_tag = document.getElementsByClassName("meta__ids")[0]; var custom_html = get_custom_sites_html(); if (custom_html.length > 0 && customRow == 1) { meta_html_tag.innerHTML += custom_html } else if (custom_html.length > 0 && customRow >= 1) { document.getElementsByClassName("meta__ids")[0].innerHTML += `<div style="flex-basis: 100%; height: 0;"></div>`; document.getElementsByClassName("meta__ids")[0].innerHTML += custom_html; } } })();