返回首頁 

Greasy Fork is available in English.

IMDb: Link 'em all!

Adds all kinds of links to IMDb, customizable!


安装此脚本?
// ==UserScript==// @name        IMDb: Link 'em all!// @description Adds all kinds of links to IMDb, customizable!// @namespace   https://greasyfork.org/en/users/8981-buzz// @match       *://*.imdb.com/*title/tt*/*// @connect     *// @require     https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js// @require     https://unpkg.com/[email protected]/dist/preact.umd.js// @require     https://unpkg.com/[email protected]/hooks/dist/hooks.umd.js// @license     GPLv2// @noframes// @author      buzz// @version     2.0.15// @grant       GM_getValue// @grant       GM_setValue// @grant       GM_xmlhttpRequest// @grant       GM.getValue// @grant       GM.setValue// @grant       GM.xmlHttpRequest// ==/UserScript==(function (preact, hooks) {'use strict';var version = "2.0.15";var description = "Adds all kinds of links to IMDb, customizable!";var homepage = "https://github.com/buzz/imdb-link-em-all#readme";const DESCRIPTION = description;const HOMEPAGE = homepage;const NAME_VERSION = `Link 'em all! v${version}`;const SITES_URL = 'https://raw.githubusercontent.com/buzz/imdb-link-em-all/master/sites.json'; // gets replaced by rollup!const GM_CONFIG_KEY = 'config';const GREASYFORK_URL = 'https://greasyfork.org/scripts/17154-imdb-link-em-all';const DEFAULT_CONFIG = {enabled_sites: [],fetch_r###lts: true,first_run: true,open_blank: true,show_category_captions: true};const CATEGORIES = {search: 'Search',movie_site: 'Movie sites',pub_tracker: 'Public trackers',priv_tracker: 'Private trackers',streaming: 'Streaming',filehoster: 'Filehosters',subtitles: 'Subtitles',tv: 'TV'};const FETCH_STATE = {LOADING: 0,NO_R###LTS: 1,R###LTS_FOUND: 2,NO_ACCESS: 3,TIMEOUT: 4,ERROR: 5};var img$8 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABkklEQVQoz1VRTUsCYRBe/AHe/Qn+j710EbKLVJcyiAqLLkWJkdkSUdChOpQRRWVRG6RQUqirtq7pupZRUvRxyOIlIU9ed5+mbSFjDjPvzDPPM+8MB+7PVG9ekiXJ25qzXMVZtqu2fP0D7xDrZ7aY/djZAqiEy3qRKY4se8ULYizqENm+vhO2ADf+Z3zhCdlmyqjiDieG2FTBEMeC3wQUA7LxTIVHAlVNfwsVV5gwRgOWRE64QwkFXGAD28hCQYb65wVT4kqTa+nGAzQkMKOM81P8knJJIA2LjblaSONk/ZOICyhjD7P8T886L0ImNoUGHtI5SX8jTYU6olg2Aav8ATHEkaZ8j87taEu1rcY1QUrYVNb4FZLIkNw5+hqeWodmDikKORorhzwOsU9RCqcUDQjWHo4CEeOeyioqNEuemHJI0mvY6P/95q4/gVdEEGoKhkzqPmO4GSH9abj91h6C4RG9j405Qkwlhl7W6fAwl94WbjnWiHPQPmkL1pOIoaveaeu2u5z/rvlrPq9Hapfc/879DQmIXQjyme6GAAAAAElFTkSuQmCC";var img$7 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIsSURBVDjLpVNLSJQBEP7+h6uu62vLVAJDW1KQTMrINQ1vPQzq1GOpa9EppGOHLh0kCEKL7JBEhVCHihAsESyJiE4FWShGRmauu7KYiv6Pma+DGoFrBQ7MzGFmPr5vmDFIYj1mr1WYfrHPovA9VVOqbC7e/1rS9ZlrAVDYHig5WB0oPtBI0TNrUiC5yhP9jeF4X8NPcWfopoY48XT39PjjXeF0vWkZqOjd7LJYrmGasHPCCJbHwhS9/F8M4s8baid764Xi0Ilfp5voorpJfn2wwx/r3l77TwZUvR+qajXVn8PnvocYfXYH6k2ioOaCpaIdf11ivDcayyiMVudsOYqFb60gARJYHG9DbqQFmSVNjaO3K2NpAeK90ZCqtgcrjkP9aUCXp0moetDFEeRXnYCKXhm+uTW0CkBFu4JlxzZkFlbASz4CQGQVBFeEwZm8geyiMuRVntzsL3oXV+YMkvjRsydC1U+lhwZsWXgHb+oWVAEzIwvzyVlk5igsi7DymmHlHsFQR50rjl+981Jy1Fw6Gu0ObTtnU+cgs28AKgDiy+Awpj5OACBAhZ/qh2HOo6i+NeA73jUAML4/qWux8mt6NjW1w599CS9xb0mSEqQBEDAtwqALUmBaG5FV3oYPnTHMjAwetlWksyByaukxQg2wQ9FlccaK/OXA3/uAEUDp3rNIDQ1ctSk6kHh1/jRFoaL4M4snEMeD73gQx4M4PsT1IZ5AfYH68tZY7zv/ApRMY9mnuVMvAAAAAElFTkSuQmCC";var img$6 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKcSURBVDjLpZPLa9RXHMU/d0ysZEwmMQqZiTaP0agoaKGJUiwIxU0hUjtUQaIuXHSVbRVc+R8ICj5WvrCldJquhVqalIbOohuZxjDVxDSP0RgzyST9zdzvvffrQkh8tBs9yy9fPhw45xhV5X1U8+Yhc3U0LcEdVxdOVq20OA0ooQjhpnfhzuDZTx6++m9edfDFlZGMtXKxI6HJnrZGGtauAWAhcgwVnnB/enkGo/25859l3wIcvpzP2EhuHNpWF9/dWs/UnKW4EOGDkqhbQyqxjsKzMgM/P1ymhlO5C4ezK4DeS/c7RdzQoa3x1PaWenJjJZwT9rQ1gSp/js1jYoZdyfX8M1/mp7uFaTR8mrt29FEMQILr62jQ1I5kA8OF59jIItVA78dJertTiBNs1ZKfLNG+MUHX1oaURtIHEAOw3p/Y197MWHEJEUGCxwfHj8MTZIcnsGKxzrIURYzPLnJgbxvG2hMrKdjItjbV11CYKeG8R7ygIdB3sBMFhkem0RAAQ3Fuka7UZtRHrasOqhYNilOwrkrwnhCU/ON5/q04vHV48ThxOCuoAbxnBQB+am65QnO8FqMxNCjBe14mpHhxBBGCWBLxD3iyWMaYMLUKsO7WYH6Stk1xCAGccmR/Ozs/bKJuXS39R/YgIjgROloSDA39Deit1SZWotsjD8pfp5ONqZ6uTfyWn+T7X0f59t5fqDhUA4ry0fYtjJcWeZQvTBu4/VqRuk9/l9Fy5cbnX+6Od26s58HjWWaflwkusKGxjm1bmhkvLXHvh1+WMbWncgPfZN+qcvex6xnUXkzvSiYP7EvTvH4toDxdqDD4+ygT+cKMMbH+3MCZ7H9uAaDnqytpVX8cDScJlRY0YIwpAjcNcuePgXP/P6Z30QuoP4J7WbYhuQAAAABJRU5ErkJggg==";var img$5 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ/SURBVDjLbVJBaxNBGH2bpEkTmxi1NTRKTZtoQUHEWz0Igj2I4kG9eVNQhEBO7bEHc+yv8JAiHnr2B4gFqVrQRhObljQolBSTJqZJdnZmfbNr2rU68DEz33zfm/fejGHbNrxjaWlpRCk1J6WcYZxkgPGTsWJZ1mIul/vlrTe8AIVC4Qqbl5PJ5GQsFoPP5wP36PV6qNfr2OIg0L35+fm1fwDYPMLDj+l0OmOaJmq1Gjqdjr4dgUAAiUTCqSsWixvMXV5YWOjqvW+AxOSz8fHxjBAC5XJ5s91up7gO6tDrUqn0QwOTXYZSsoO+wGDB5EwkEkGlUgGb7mSz2apHajWfz9+sVqvFVCrl1P4PYExr5m16vYUjQ+c0O11DtmN/ebD95pG9UpnGzl7Y0Xz30ir8toAtLdiWG0JIvFi76piaGG7g9plVTD/5YLgMCPLg/g0YtMTwhznfApRBfsP6kAYJSKuN57Md5oXTsvHy7aEEfZMutHZfIRAahWGMsHAICMeZVsD+HmTrG8zudyhrH+HJLGyz7wEgRSh9k4nm+nvqPIb4xWuovV5k/2lMXJ9F8+s6ARqIpk6QsIQtTC+AcGTYpBqfvgBfcJTuKMi+xKfdMCZgIp6eRK8TYu2+w2oA4PwDm+5qVK218XmNLN7xxILqKfS7pGqTWekLmuVtV65STs8hA73RqJQQP5+CP3KKACamHj7FlGBDawfH00kEW0MuA8o9AmA6qMrSHqwTIAoM08hAkHkN0ES3UYfotBGdiNFu5cr2AmgJobOPET7nhxEMuU/o40soSjO7iHbbVNgnUen6pY0/AOCTbC7PuV44H0f8Cetg5g9zP5aU7loDcfwGcrKyzYdvwUUAAAAASUVORK5CYII=";var img$4 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAGrSURBVDjLvZPZLkNhFIV75zjvYm7VGFNCqoZUJ+roKUUpjRuqp61Wq0NKDMelGGqOxBSUIBKXWtWGZxAvobr8lWjChRgSF//dv9be+9trCwAI/vIE/26gXmviW5bqnb8yUK028qZjPfoPWEj4Ku5HBspgAz941IXZeze8N1bottSo8BTZviVWrEh546EO03EXpuJOdG63otJbjBKHkEp/Ml6yNYYzpuezWL4s5VMtT8acCMQcb5XL3eJE8VgBlR7BeMGW9Z4yT9y1CeyucuhdTGDxfftaBO7G4L+zg91UocxVmCiy51NpiP3n2treUPujL8xhOjYOzZYsQWANyRYlU4Y9Br6oHd5bDh0bCpSOixJiWx71YY09J5pM/WEbzFcDmHvwwBu2wnikg+lEj4mwBe5bC5h1OUqcwpdC60dxegRmR06TyjCF9G9z+qM2uCJmuMJmaNZaUrCSIi6X+jJIBBYtW5Cge7cd7sgoHDfDaAvKQGAlRZYc6ltJlMxX03UzlaRlBdQrzSCwksLRbOpHUSb7pcsnxCCwngvM2Rm/ugUCi84fycr4l2t8Bb6iqTxSCgNIAAAAAElFTkSuQmCC";var img$3 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALnSURBVDjLpZNbSNNxFMcN9b3opZce7CHqIagegqAgLB+NyMIMFCRBSX3wPm+Z1ZZZlhpT03ReZs7ZvKDpps7LmKa2uTbTnO7inM3L5vxvc3P+1X37zYeVGBF04Mvvxzmcz+/8Duf4AfD7Hx1yDPIKg0dbHonlnYz1r8JsWt6VRUubk1ZE1Unt7e+yLv8VIOGzylS9jG2jegxry1rYbFZQlAVLCyqopDwI38duNr9JyP0jYIjHLNHIymE1G6A2WPFxQI8ywTRK+d/Q0KPB5NwK9OpRdFfFgcOMSTsAEDUUXJF1ptKWVT0kChNaB/XQGG2w2Bww2zahXrShoVeDtmEdZhU94D6956xiPbzgA/TXZXTPk8D3hXXwxTp4zUpRmPuxjC1y98rhASq6NJAqDejjpqAiJ6LBBxioT1w2GabAFc1jhrzs3PHA4XSCXcPBKgHZ3W4IRAOQzFF42aTE1EQzqrLD9D6AuC5hy2pZQmGjEqsuGlb3HrZJIPNxPritHcjIy0fv6DimKBrJ7HEs6sdRk33H5QMIK2O3LGta5HMUWHTQBLIHI2XHs1dF+8kShQrmHUBmoZFY/BkG7TCqM8N+AQSvo3TaqR4U85UYnqdgIp822ml0D41At27Dyi6gamFjIPIM+oMD0R92HE2RZykfoJYZxRlqZmBUOYcCvhpm0jArDdj3iMh9vq0MqvSr2PpUBM+MEE5eMr7En/P0Xg9I3AdUP48/X/8k3DUrq0djjxwv+LNQ6DfgIP1wOGn0R5yCiySjNBTIOAawgmAuvAbRDX+db5Aq86MZHwruYmasDIMTMrA4Y0gvHUFKsXS/bI+8Fb/bRt4J4g/wHBhldk5kbiXjlqOj/D4mxUzoZrjQTdei7/ZRbFY/AEiSO90PViJDnD9EIf5Lh5aJnRt9qSQtrOlt8k1DeWqoyytBzEVqLOa0x5QRhLXMQGhjjkAcGrArDPHP+ue1lYafZJAX9d6yyWn0Jnv9PwH2GPv45gRecwAAAABJRU5ErkJggg==";var img$2 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIhSURBVDjLlZPrThNRFIWJicmJz6BWiYbIkYDEG0JbBiitDQgm0PuFXqSAtKXtpE2hNuoPTXwSnwtExd6w0pl2OtPlrphKLSXhx07OZM769qy19wwAGLhM1ddC184+d18QMzoq3lfsD3LZ7Y3XbE5DL6Atzuyilc5Ciyd7IHVfgNcDYTQ2tvDr5crn6uLSvX+Av2Lk36FFpSVENDe3OxDZu8apO5rROJDLo30+Nlvj5RnTlVNAKs1aCVFr7b4BPn6Cls21AWgEQlz2+Dl1h7IdA+i97A/geP65WhbmrnZZ0GIJpr6OqZqYAd5/gJpKox4Mg7pD2YoC2b0/54rJQuJZdm6Izcgma4TW1WZ0h+y8BfbyJMwBmSxkjw+VObNanp5h/adwGhaTXF4NWbLj9gEONyCmUZmd10pGgf1/vwcgOT3tUQE0DdicwIod2EmSbwsKE1P8QoDkcHPJ5YESjgBJkYQpIEZ2KEB51Y6y3ojvY+P8XEDN7uKS0w0ltA7QGCWHCxSWWpwyaCeLy0BkA7UXyyg8fIzDoWHeBaDN4tQdSvAVdU1Aok+nsNTipIEVnkywo/FHatVkBoIhnFisOBoZxcGtQd4B0GYJNZsDSiAEadUBCkstPtN3Avs2Msa+Dt9XfxoFSNYF/Bh9gP0bOqHLAm2WUF1YQskwrVFYPWkf3h1iXwbvqGfFPSGW9Eah8HSS9fuZDnS32f71m8KFY7xs/QZyu6TH2+2+FAAAAABJRU5ErkJggg==";var img$1 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMtSURBVDjLVZNLa1xlAIafc5szk8xkMkkm5MKY2EpT2qa2MTVCmoLS2gq6EKooimAW7iQb/0I2bgTRIog0oFW7KQpCS7VqrSmmJGlSQtswqWlLLmbGmcmcZM6cy/edz00r6bt8eXh4N6+mlGJnxiZHR4APgSNAFjCBKjClInXm05Gzl3by2mPB2OSoCUwAp1/LHbcziSyO24gbgJAegg2urF8UUsifhZBvfvXK99v/C8YmRy3gt8G2/cMv517E8Wx8ApYcjZiyKbkRSgQkcFn3rzG9Nn1LhOLYt2/8UNUfLZkYaN0zfLRrkLIMCHUNIXTqIoZLjLJvU/ASrFQtnko+z2BH38HAD78DMConHh4FPn5nz6vGgqyxTp16JNj2kpR9C8eD/OoW1VoNO1NCS+d5oW0vV27f2PX11MS8MTR6+JOTXUMHNCPBui5AtdMpk8xsGNQ9ndur20TxCnbPIn5TnmJUwaxIDrTm9Jn7d1tM4EiuqZs5d41iXGefsZsIwYNCgOfVSXconJbLLEWb4CuahU2+6HO8d4DQF/0m0NpgNvLAXaPgu6QadrEZpKhUItJZj/aMS1EewvHnsdUWW/+WKG82kEykCAPRbCqlNE1B4DsocpiW5OJfIVoiyfqSQFdNdGXrpLZGcFZDPKYJg2VQCiGEZkoRlZ3A6W41mknFn2WlaOKFFrG4Tbw9wb2/S3g3miHySLdbNDd2kzYKVGpVpIiqugjF7P3yQ55pyLFWmCSyVokZPqHnEoYmsWQGuyWOGdexNIkRFOnqbGN5bRngjh4G4rMLd6+KnmQW012lWrpOJuNjCh9LU9i6gRkEZHIrpNv/QK8vcijXz5lfLijgS+PmuYV75+fPDXr1Wt9znfsouy5x+2miuoltW1iawBJV0o0/wT8lBvbv5WZ+gaWNlasz43MfmQChH777e37uT78eHDx5+BiLBROjqhDaFmGkQ1KS6+mlr7+XX2evc+nWVB54+4kznfr8pZQIxXkRyhPvDb9vIjtQqgFN12hLO2yUZ/ni8o8SuAa8NTM+t/GE4HGGx4del0J+IGXUH8ko86iuAneAszPjc9/s5P8DuO6ZcsXuRqAAAAAASUVORK5CYII=";var img = "data:image/gif;base64,R0lGODlhEAAQAPUCAHR2dOTi5Pz6/PTy9MzKzNTW1Ly6vHx+fOTm5LSytHx6fLy+vPT29Nze3ISChIyOjOzq7JSWlJyenKSmpNTS1JSSlJyanNza3Pz+/MTGxOzu7KSipKyqrIyKjISGhLS2tMTCxMzOzKyurP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBQACACwAAAAAEAAQAAAFUaAgjsJ1kWgpXoBypsIGbGV7BlMwMi3AlK/JjCSjoXA60g+m3Eg0TGJLEo1EYtPqFSLZQKLHRRIcUNiODcxo0VscXTszXPMVYC7qnXiVAftFIQAh+QQJBQABACwAAAAADwAQAAAFUWAgjoEGkeioKYqWBouzlKzLZMLoAI5oihlFZhSboQS4l7JkMOSWMJ5h2TRIqc4mA6q6bKEMD+9LIl94QohEcgp/w+MKq+IrewMdNJdyOFBQIQAh+QQJBQAKACwAAAEADwAPAAAFSaAijkpVkWRhFaI5ImQEWKgSAMG71jbvv5TfC3AI+igFCtHIS9qYQtGgSYCMJDMU5LC0EXECgyH8JbSyCWICwS2+zllIlbojhQAAIfkECQUAEAAsAAABABAADwAABVMgJI6QYZDosAyiOTLoAiwoxBzwa7C1UP8/BAJoezwaCIVi+DMCjkpmzfmwSXvGAFEkCPhGMhpJ4PxCHM9WwfYEaFsOGuFJICvNJNnMih8nEjkkIQAh+QQJBQAGACwAAAEAEAAPAAAFV6AhjgZFiUMxkNiFiaYxOICzwsBFlnU+ti8WzbYrylS/oHHA4Qwwj4dyx6k5owKjoargyKY7plPL2hUihWLVO4p0URBZLwtDyxWBLYBdLNTSMmQtBGAGIQAh+QQJBQABACwBAAAADwAQAAAGVsCAUNh4PBrDZNIIeAQwGkxyIOw0OxhLU/oEUIudBqTpHVKV2a1yLYiu3xhQRvD5vIlNuf0Oyt/Nclx/aAZnSRlhQwYABkJtVU2AGl0KX4lsfoMBYm9BACH5BAkFAAQALAEAAAAPABAAAAZVQIJQOOBwBsMkYoEgbAAATpKogAY4UOnn8BEuoNHiBnmAUq3TbZfInLrf08uFEArB6db6/VKd39l/bxgXAm4XEn54iUMSUUMChF4bVItJHR2BRIVuQQAh+QQFBQABACwAAAAAEAAPAAAGWsCAcCgAgQTDZIBxYQRAAABIKWR4FB5mdPGshIYXrKJpRFYAFeI1qwx5k0UkNUlxjOdVTcAexWuwf1EOflEadQ4UeEt6io0DcwwLTmqPbQpccGAZVZKKIiJzQQA7";const iconSrcs = {cog: img$8,error: img$7,info: img$6,lock: img$5,tick: img$4,timeout: img$3,world: img$1,x: img$2,spinner: img};const Icon = ({className,title,type}) => preact.h("img", {alt: `${type} icon`,className: className,src: iconSrcs[type],title: title});function styleInject(css, ref) {if ( ref === void 0 ) ref = {};var insertAt = ref.insertAt;if (!css || typeof document === 'undefined') { return; }var head = document.head || document.getElementsByTagName('head')[0];var style = document.createElement('style');style.type = 'text/css';if (insertAt === 'top') {if (head.firstChild) {head.insertBefore(style, head.firstChild);} else {head.appendChild(style);}} else {head.appendChild(style);}if (style.styleSheet) {style.styleSheet.cssText = css;} else {style.appendChild(document.createTextNode(css));}}var css_248z$6 = ".Options_options__5TB2e {\n  margin-top: 10px;\n}\n\n  .Options_options__5TB2e > label > span {\n    margin-left: 10px;\n}\n";var css$6 = {"options":"Options_options__5TB2e"};styleInject(css_248z$6);const Options = ({options}) => {const optionLabels = options.map(([key, title, val, setter]) => preact.h("label", {key: key}, preact.h("input", {checked: val,onInput: ev => setter(ev.target.checked),type: "checkbox"}), preact.h("span", null, title), preact.h("br", null)));return preact.h("div", {className: css$6.options}, optionLabels);};const SiteIcon = ({className,site,title}) => site.icon ? preact.h("img", {alt: site.title,className: className,src: site.icon,title: title}) : null;var css_248z$5 = ".Sites_searchBar__omy0k {\n  display: flex;\n  flex-direction: row;\n  margin-bottom: 1em;\n}\n\n  .Sites_searchBar__omy0k .Sites_searchInput__0o5oY {\n    background-color: rgba(255, 255, 255, 0.9);\n    border-radius: 3px;\n    border-top-color: #949494;\n    border: 1px solid #a6a6a6;\n    box-shadow: 0 1px 0 rgba(0, 0, 0, .07) inset;\n    display: flex;\n    flex-direction: row;\n    height: 24px;\n    line-height: normal;\n    outline: 0;\n    padding: 3px 7px;\n    transition: all 100ms linear;\n    width: 100%;\n}\n\n  .Sites_searchBar__omy0k .Sites_searchInput__0o5oY:focus-within {\n      background-color: #fff;\n      border-color: #e77600;\n      box-shadow: 0 0 2px 2px rgba(228, 121, 17, 0.25);\n}\n\n  .Sites_searchBar__omy0k .Sites_searchInput__0o5oY > * {\n      background-color: transparent;\n      border: none;\n      height: 16px;\n}\n\n  .Sites_searchBar__omy0k .Sites_searchInput__0o5oY > button {\n      margin: 0 0 0 0.7em;\n      padding: 0;\n}\n\n  .Sites_searchBar__omy0k .Sites_searchInput__0o5oY > input {\n      flex-grow: 1;\n      outline: none;\n      padding: 0 0 0 0.5em;\n}\n\n  .Sites_searchBar__omy0k .Sites_r###ltCount__xMc-y {\n    font-weight: bold;\n    margin-left: 2em;\n    min-width: 140px;\n    text-align: right;\n}\n\n  .Sites_searchBar__omy0k .Sites_r###ltCount__xMc-y > span {\n      color: black;\n}\n\n.Sites_siteList__4rCbT .Sites_catList__Fv8G0 {\n    display: flex;\n    flex-wrap: wrap;\n}\n\n.Sites_siteList__4rCbT .Sites_catList__Fv8G0 h4 {\n      width: 100%;\n}\n\n.Sites_siteList__4rCbT .Sites_catList__Fv8G0 label {\n      align-items: center;\n      color: #444;\n      display: flex;\n      flex-flow: row;\n      padding: 0 6px;\n      transition: color 100ms;\n      width: 25%;\n}\n\n.Sites_siteList__4rCbT .Sites_catList__Fv8G0 label:hover {\n        color: #222;\n}\n\n.Sites_siteList__4rCbT .Sites_catList__Fv8G0 label.Sites_checked__nqnSg span {\n        color: black;\n}\n\n.Sites_siteList__4rCbT .Sites_catList__Fv8G0 label .Sites_title__4rEy0 {\n        flex-grow: 1;\n        overflow: hidden;\n        text-overflow: ellipsis;\n}\n\n.Sites_siteList__4rCbT .Sites_catList__Fv8G0 label input {\n        margin-right: 4px;\n}\n\n.Sites_siteList__4rCbT .Sites_catList__Fv8G0 label .Sites_extraIcon__YYfVy {\n        height: 12px;\n        margin-left: 4px;\n        width: 12px;\n}\n\n.Sites_siteList__4rCbT .Sites_catList__Fv8G0 label .Sites_siteIcon__GRVSj {\n        flex-shrink: 0;\n        height: 16px;\n        margin-right: 6px;\n        width: 16px;\n}\n";var css$5 = {"searchBar":"Sites_searchBar__omy0k","searchInput":"Sites_searchInput__0o5oY","r###ltCount":"Sites_r###ltCount__xMc-y","siteList":"Sites_siteList__4rCbT","catList":"Sites_catList__Fv8G0","checked":"Sites_checked__nqnSg","title":"Sites_title__4rEy0","extraIcon":"Sites_extraIcon__YYfVy","siteIcon":"Sites_siteIcon__GRVSj"};styleInject(css_248z$5);const SearchInput = ({q,setQ}) => preact.h("div", {className: css$5.searchInput}, preact.h("span", null, "\uD83D\uDD0D"), preact.h("input", {onInput: e => {setQ(e.target.value.toLowerCase().trim());},placeholder: "Search",value: q}), preact.h("button", {style: {display: q.length ? 'unset' : 'none'},title: "Clear",type: "button",onClick: () => setQ('')}, preact.h(Icon, {type: "x"})));const DummyIcon = ({size}) => {const sizePx = `${size}px`;const style = {display: 'inline-block',height: sizePx,width: sizePx};return preact.h("div", {className: css$5.siteIcon,style: style});};const SiteLabel = ({checked,setEnabled,site}) => {const input = preact.h("input", {checked: checked,onInput: e => setEnabled(prev => e.target.checked ? [...prev, site.id] : prev.filter(id => id !== site.id)),type: "checkbox"});const icon = site.icon ? preact.h(SiteIcon, {className: css$5.siteIcon,site: site,title: site.title}) : preact.h(DummyIcon, {size: 16});const title = preact.h("span", {className: css$5.title,title: site.title}, site.title);const extraIcons = [site.noAccessMatcher ? preact.h(Icon, {className: css$5.extraIcon,title: "Access restricted",type: "lock"}) : null, site.noR###ltsMatcher ? preact.h(Icon, {className: css$5.extraIcon,title: "Site supports fetching of r###lts",type: "tick"}) : null];return preact.h("label", {className: checked ? css$5.checked : null}, input, icon, " ", title, " ", extraIcons);};const CategoryList = ({enabled,name,setEnabled,sites}) => {const siteLabels = sites.map(site => preact.h(SiteLabel, {checked: enabled.includes(site.id),setEnabled: setEnabled,site: site}));return preact.h("div", {className: css$5.catList}, preact.h("h4", null, name, " ", preact.h("span", null, "(", sites.length, ")")), siteLabels);};const Sites = ({enabledSites,setEnabledSites,sites}) => {const [q, setQ] = hooks.useState('');const catSites = Object.keys(CATEGORIES).map(cat => {const s = sites.filter(site => site.category === cat);if (q.length) {return s.filter(site => site.title.toLowerCase().includes(q));}return s;});const cats = Object.entries(CATEGORIES).map(([cat, catName], i) => catSites[i].length ? preact.h(CategoryList, {enabled: enabledSites,key: cat,name: catName,setEnabled: setEnabledSites,sites: catSites[i]}) : null);const total = catSites.reduce((acc, s) => acc + s.length, 0);return preact.h(preact.Fragment, null, preact.h("div", {className: css$5.searchBar}, preact.h(SearchInput, {q: q,setQ: setQ}), preact.h("div", {className: css$5.r###ltCount}, "Showing ", preact.h("span", null, total), " sites.")), preact.h("div", {className: css$5.siteList}, cats));};var css_248z$4 = ".About_about__wuWQp {\n  padding: 1em 0;\n  position: relative;\n}\n\n  .About_about__wuWQp ul > li {\n    margin-bottom: 0;\n}\n\n  .About_about__wuWQp h2 {\n    font-size: 20px;\n    margin: 0.5em 0;\n}\n\n  .About_about__wuWQp > *:last-child {\n    margin-bottom: 0;\n}\n\n  .About_about__wuWQp .About_top__jQHYs {\n    text-align: center;\n}\n\n  .About_about__wuWQp .About_content__hReHO {\n    width: 61.8%;\n    margin: 0 auto;\n}\n";var css$4 = {"about":"About_about__wuWQp","top":"About_top__jQHYs","content":"About_content__hReHO"};styleInject(css_248z$4);const About = () => preact.h("div", {className: css$4.about}, preact.h("div", {className: css$4.top}, preact.h("h3", null, "\uD83C\uDFA5 ", NAME_VERSION), preact.h("p", null, DESCRIPTION)), preact.h("div", {className: css$4.content}, preact.h("h2", null, "\uD83D\uDD17 Links"), preact.h("ul", null, preact.h("li", null, preact.h("a", {target: "_blank",rel: "noreferrer",href: HOMEPAGE}, "GitHub")), preact.h("li", null, preact.h("a", {target: "_blank",rel: "noreferrer",href: GREASYFORK_URL}, "Greasy Fork"))), preact.h("h2", null, "\u2728 Contributions"), preact.h("p", null, "Add new sites or update existing entries."), preact.h("ul", null, preact.h("li", null, preact.h("a", {target: "_blank",rel: "noreferrer",href: "https://github.com/buzz/imdb-link-em-all/issues/new"}, "Open a GitHub issue"), ' ', "or"), preact.h("li", null, preact.h("a", {target: "_blank",rel: "noreferrer",href: "https://greasyfork.org/en/scripts/17154-imdb-link-em-all/feedback"}, "Give feedback"), ' ', "on Greasy Fork.")), preact.h("p", null, preact.h("em", null, "Thanks to all the contributors!"), " \uD83D\uDC4D"), preact.h("h2", null, "\u2696 License"), preact.h("p", null, "This script is licensed under the terms of the", ' ', preact.h("a", {target: "_blank",rel: "noreferrer",href: "https://github.com/buzz/imdb-link-em-all/blob/master/LICENSE"}, "GPL-2.0 License"), ".")));var css_248z$3 = ".Config_popover__qMfu9 {\n  background-color: #a5a5a5;\n  border-radius: 4px;\n  box-shadow: 0 0 2em rgba(0, 0, 0, 0.1);\n  color: #333;\n  display: block;\n  font-family: Verdana, Arial, sans-serif;\n  font-size: 11px;\n  left: calc(-800px + 35px);\n  line-height: 1.5rem;\n  padding: 10px;\n  position: absolute;\n  top: calc(20px + 8px);\n  white-space: nowrap;\n  width: 800px;\n  z-index: 100;\n}\n.Config_popover__qMfu9.Config_layout-legacy__M6fyd {\n    left: calc(-800px + 235px);\n}\n.Config_popover__qMfu9.Config_layout-legacy__M6fyd:before {\n      right: calc(235px - 2 * 8px);\n}\n.Config_popover__qMfu9:before {\n    border-bottom: 8px solid #a5a5a5;\n    border-left: 8px solid transparent;\n    border-right: 8px solid transparent;\n    border-top: 8px solid transparent;\n    content: \"\";\n    display: block;\n    height: 8px;\n    right: calc(35px - 2 * 8px);\n    position: absolute;\n    top: calc(-2 * 8px);\n    width: 0;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK {\n    display: flex;\n    flex-direction: column;\n    text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_top__6DKJ8 {\n      display: flex;\n      flex-direction: row;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_top__6DKJ8 .Config_link__GTbGq {\n        flex-grow: 1;\n        text-align: right;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_top__6DKJ8 .Config_link__GTbGq > a {\n          color: #333;\n          margin-left: 12px;\n          margin-right: 4px;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_top__6DKJ8 .Config_link__GTbGq > a:visited {\n            color: #333;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_top__6DKJ8 > button {\n        background-color: rgba(0, 0, 0, 0.05);\n        border-bottom-left-radius: 0;\n        border-bottom-right-radius: 0;\n        border-bottom: transparent;\n        border-left: 1px solid rgba(0, 0, 0, 0.25);\n        border-right: 1px solid rgba(0, 0, 0, 0.25);\n        border-top-left-radius: 2px;\n        border-top-right-radius: 2px;\n        border-top: 1px solid rgba(0, 0, 0, 0.25);\n        color: #424242;\n        font-size: 12px;\n        margin: 0 6px 0 0;\n        outline: none;\n        padding: 0 6px;\n        transform: translateY(1px);\n        text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_top__6DKJ8 > button:hover {\n          background-color: rgba(0, 0, 0, 0.1);\n          color: #222;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_top__6DKJ8 > button.Config_active__vD-Fl {\n          background-color: #c2c2c2;\n          color: #222;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_top__6DKJ8 > button:last-child {\n          margin-right: 0;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_top__6DKJ8 > button > img {\n          vertical-align: text-bottom;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_body__wtDKH {\n      background-color: #c2c2c2;\n      border-bottom-left-radius: 2px;\n      border-bottom-right-radius: 2px;\n      border-top-right-radius: 2px;\n      border: 1px solid rgba(0, 0, 0, 0.25);\n      padding: 12px 10px 12px;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_body__wtDKH > div {\n        overflow: hidden;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_body__wtDKH > div > *:first-child {\n          margin-top: 0;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_body__wtDKH > div > *:last-child {\n          margin-bottom: 0;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_controls__-N2ev {\n      display: flex;\n      flex-direction: row;\n      margin-top: 10px;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_controls__-N2ev > div:first-child {\n        flex-grow: 1;\n}\n.Config_popover__qMfu9 .Config_inner__oVRAK .Config_controls__-N2ev button {\n        padding-bottom: 0;\n        padding-top: 0;\n        margin-right: 12px;\n}\n";var css$3 = {"popover":"Config_popover__qMfu9","layout-legacy":"Config_layout-legacy__M6fyd","inner":"Config_inner__oVRAK","top":"Config_top__6DKJ8","link":"Config_link__GTbGq","active":"Config_active__vD-Fl","body":"Config_body__wtDKH","controls":"Config_controls__-N2ev"};styleInject(css_248z$3);const OPTIONS = [['show_category_captions', 'Show category captions'], ['open_blank', 'Open links in new tab'], ['fetch_r###lts', 'Automatically fetch r###lts']];const Config = ({config,layout,setConfig,setShow,show,sites}) => {const [enabledSites, setEnabledSites] = hooks.useState(config.enabled_sites);const showCategoryCaptionsArr = hooks.useState(config.show_category_captions);const openBlankArr = hooks.useState(config.open_blank);const fetchR###ltsArr = hooks.useState(config.fetch_r###lts);const [showCategoryCaptions, setShowCategoryCaptions] = showCategoryCaptionsArr;const [openBlank, setOpenBlank] = openBlankArr;const [fetchR###lts, setFetchR###lts] = fetchR###ltsArr;const optStates = [showCategoryCaptionsArr, openBlankArr, fetchR###ltsArr];const options = OPTIONS.map((opt, i) => [...opt, ...optStates[i]]);const [tab, setTab] = hooks.useState(0);const tabs = [{title: 'Sites',icon: 'world',comp: preact.h(Sites, {enabledSites: enabledSites,setEnabledSites: setEnabledSites,sites: sites})}, {title: 'Options',icon: 'cog',comp: preact.h(Options, {options: options})}, {title: 'About',icon: 'info',comp: preact.h(About, null)}];const onClickCancel = () => {setShow(false);// Restore statesetEnabledSites(config.enabled_sites);setFetchR###lts(config.fetch_r###lts);setOpenBlank(config.open_blank);setShowCategoryCaptions(config.show_category_captions);};const onClickSave = () => {setConfig({enabled_sites: enabledSites,fetch_r###lts: fetchR###lts,open_blank: openBlank,show_category_captions: showCategoryCaptions});setShow(false);};return preact.h("div", {className: `${css$3.popover} ${css$3['layout-' + layout]}`,style: {display: show ? 'block' : 'none'}}, preact.h("div", {className: css$3.inner}, preact.h("div", {className: css$3.top}, tabs.map(({title,icon}, i) => preact.h("button", {className: tab === i ? css$3.active : null,type: "button",onClick: () => setTab(i)}, preact.h(Icon, {title: title,type: icon}), " ", title)), preact.h("div", {className: css$3.link}, preact.h("a", {target: "_blank",rel: "noreferrer",href: HOMEPAGE}, "\uD83C\uDFA5 ", NAME_VERSION))), preact.h("div", {className: css$3.body}, tabs.map(({comp}, i) => preact.h("div", {style: {display: tab === i ? 'block' : 'none'}}, comp))), preact.h("div", {className: css$3.controls}, preact.h("div", null, preact.h("button", {className: "btn primary small",onClick: onClickSave,type: "button"}, "OK"), preact.h("button", {className: "btn small",onClick: onClickCancel,type: "button"}, "Cancel")))));};function _extends() {return _extends = Object.assign ? Object.assign.bind() : function (n) {for (var e = 1; e < arguments.length; e++) {var t = arguments[e];for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);}return n;}, _extends.apply(null, arguments);}const replaceFields = (str, {id,title,year}, encode = true) => str.replace(new RegExp('{{IMDB_TITLE}}', 'g'), encode ? encodeURIComponent(title) : title).replace(new RegExp('{{IMDB_ID}}', 'g'), id).replace(new RegExp('{{IMDB_YEAR}}', 'g'), year);const checkResponse = (resp, site) => {// Likely a redirect to login pageif (resp.responseHeaders && resp.responseHeaders.includes('Refresh: 0; url=')) {return FETCH_STATE.NO_ACCESS;}// There should be a responseTextif (!resp.responseText) {return FETCH_STATE.ERROR;}// Detect Blogger content warningif (resp.responseText.includes('The blog that you are about to view may contain content only suitable for adults.')) {return FETCH_STATE.NO_ACCESS;}// Detect CloudFlare anti DDOS pageif (resp.responseText.includes('Checking your browser before accessing')) {return FETCH_STATE.NO_ACCESS;}// Check site accessif (site.noAccessMatcher) {const matchStrings = Array.isArray(site.noAccessMatcher) ? site.noAccessMatcher : [site.noAccessMatcher];if (matchStrings.some(matchString => resp.responseText.includes(matchString))) {return FETCH_STATE.NO_ACCESS;}}// Check r###ltsif (Array.isArray(site.noR###ltsMatcher)) {// Advanced ways of checking, currently only EL_COUNT is supportedconst [checkType, selector, compType, number] = site.noR###ltsMatcher;const m = resp.responseHeaders.match(/content-type:\s([^\s;]+)/);const contentType = m ? m[1] : 'text/html';let doc;try {const parser = new DOMParser();doc = parser.parseFromString(resp.responseText, contentType);} catch (e) {console.error('Could not parse document!');return FETCH_STATE.ERROR;}switch (checkType) {case 'EL_COUNT':{let r###lt;try {r###lt = doc.querySelectorAll(selector);} catch (err) {console.error(err);return FETCH_STATE.ERROR;}if (compType === 'GT') {if (r###lt.length > number) {return FETCH_STATE.R###LTS_FOUND;}}if (compType === 'LT') {if (r###lt.length < number) {return FETCH_STATE.R###LTS_FOUND;}}break;}}return FETCH_STATE.NO_R###LTS;}const matchStrings = Array.isArray(site.noR###ltsMatcher) ? site.noR###ltsMatcher : [site.noR###ltsMatcher];if (matchStrings.some(matchString => resp.responseText.includes(matchString))) {return FETCH_STATE.NO_R###LTS;}return FETCH_STATE.R###LTS_FOUND;};const useR###ltFetcher = (imdbInfo, site) => {const [fetchState, setFetchState] = hooks.useState(null);hooks.useEffect(() => {let xhr;if (site.noR###ltsMatcher) {// Site supports r###lt fetchingconst {url} = site;const isPost = Array.isArray(url);const opts = {timeout: 20000,onload: resp => setFetchState(checkResponse(resp, site)),onerror: resp => {console.error(`Failed to fetch r###lts from URL '${url}': ${resp.statusText}`);setFetchState(FETCH_STATE.ERROR);},ontimeout: () => setFetchState(FETCH_STATE.TIMEOUT)};if (isPost) {const [postUrl, fields] = url;opts.method = 'POST';opts.url = postUrl;opts.headers = {'Content-Type': 'application/x-www-form-urlencoded'};opts.data = Object.keys(fields).map(key => {const val = replaceFields(fields[key], imdbInfo, false);return `${key}=${val}`;}).join('&');} else {opts.method = 'GET';opts.url = replaceFields(url, imdbInfo);}xhr = GM.xmlHttpRequest(opts);setFetchState(FETCH_STATE.LOADING);}return () => {if (xhr && xhr.abort) {xhr.abort();}};}, [imdbInfo, site]);return fetchState;};var css_248z$2 = ".SiteLink_linkWrapper__wGnJ- {\n  display: inline-block;\n  margin-right: 4px;\n}\n\n  .SiteLink_linkWrapper__wGnJ- img {\n    vertical-align: baseline;\n}\n\n  .SiteLink_linkWrapper__wGnJ- a {\n    white-space: pre-line;\n}\n\n  .SiteLink_linkWrapper__wGnJ- a > img {\n      height: 16px;\n      width: 16px;\n      margin-right: 4px;\n}\n\n  .SiteLink_linkWrapper__wGnJ- .SiteLink_r###ltsIcon__mjHYM {\n    margin-left: 4px;\n}\n";var css$2 = {"linkWrapper":"SiteLink_linkWrapper__wGnJ-","r###ltsIcon":"SiteLink_r###ltsIcon__mjHYM"};styleInject(css_248z$2);const R###ltsIndicator = ({imdbInfo,site}) => {const fetchState = useR###ltFetcher(imdbInfo, site);let iconType;let title;switch (fetchState) {case FETCH_STATE.LOADING:iconType = 'spinner';title = 'Loading…';break;case FETCH_STATE.NO_R###LTS:iconType = 'x';title = 'No R###lts found!';break;case FETCH_STATE.R###LTS_FOUND:iconType = 'tick';title = 'R###lts found!';break;case FETCH_STATE.NO_ACCESS:iconType = 'lock';title = 'You have to login to this site!';break;case FETCH_STATE.TIMEOUT:iconType = 'timeout';title = 'You have to login to this site!';break;case FETCH_STATE.ERROR:iconType = 'error';title = 'Error fetching r###lts! (See dev console for details)';break;default:return null;}return preact.h(Icon, {className: css$2.r###ltsIcon,title: title,type: iconType});};// As it is not possible to open links with POST request we need a trickconst usePostLink = (url, openBlank, imdbInfo) => {const formEl = hooks.useRef();const isPost = Array.isArray(url);const href = isPost ? url[0] : replaceFields(url, imdbInfo, false);const onClick = event => {if (isPost && formEl.current) {event.preventDefault();formEl.current.submit();}};hooks.useEffect(() => {if (isPost) {const [postUrl, fields] = url;const form = document.createElement('form');form.action = postUrl;form.method = 'POST';form.style.display = 'none';form.target = openBlank ? '_blank' : '_self';Object.keys(fields).forEach(key => {const input = document.createElement('input');input.type = 'text';input.name = key;input.value = replaceFields(fields[key], imdbInfo, false);form.appendChild(input);});document.body.appendChild(form);formEl.current = form;}return () => {if (formEl.current) {formEl.current.remove();}};});return [href, onClick];};const Sep = () => preact.h(preact.Fragment, null, "\xA0", preact.h("span", {className: "ghost"}, "|"));const SiteLink = ({config,imdbInfo,last,site}) => {const extraAttrs = config.open_blank ? {target: '_blank',rel: 'noreferrer'} : {};const [href, onClick] = usePostLink(site.url, config.open_blank, imdbInfo);return preact.h("span", {className: css$2.linkWrapper}, preact.h("a", _extends({className: "ipc-link ipc-link--base",href: href,onClick: onClick}, extraAttrs), preact.h(SiteIcon, {site: site}), preact.h("span", null, site.title)), config.fetch_r###lts ? preact.h(R###ltsIndicator, {imdbInfo: imdbInfo,site: site}) : null, last ? null : preact.h(Sep, null));};var css_248z$1 = ".LinkList_linkList__beWAL {\n  line-height: 1.6rem\n}\n\n.LinkList_h4__OVHW- {\n  margin-top: 0.5rem\n}\n";var css$1 = {"linkList":"LinkList_linkList__beWAL","h4":"LinkList_h4__OVHW-"};styleInject(css_248z$1);const LinkList = ({config,imdbInfo,sites}) => Object.entries(CATEGORIES).map(([category, categoryName]) => {const catSites = sites.filter(site => site.category === category && config.enabled_sites.includes(site.id));if (!catSites.length) {return null;}const caption = config.show_category_captions ? preact.h("h4", {className: css$1.h4}, categoryName) : null;return preact.h(preact.Fragment, null, caption, preact.h("div", {className: css$1.linkList}, catSites.map((site, i) => preact.h(SiteLink, {config: config,imdbInfo: imdbInfo,last: i === catSites.length - 1,site: site}))));});var css_248z = ".App_configWrapper__bVP2M {\n  position: absolute;\n  right: 20px;\n  top: 20px;\n}\n\n  .App_configWrapper__bVP2M > button {\n    background: transparent;\n    border: none;\n    cursor: pointer;\n    outline: none;\n    padding: 0;\n}\n\n  .App_configWrapper__bVP2M > button > img {\n      vertical-align: baseline;\n}\n";var css = {"configWrapper":"App_configWrapper__bVP2M"};styleInject(css_248z);// Note: GM.* only work in async functionsconst restoreConfig = async () => JSON.parse(await GM.getValue(GM_CONFIG_KEY));const saveConfig = async config => GM.setValue(GM_CONFIG_KEY, JSON.stringify(config));const useConfig = () => {const [config, setConfig] = hooks.useState();hooks.useEffect(() => {restoreConfig().then(c => setConfig(c)).catch(() => setConfig(DEFAULT_CONFIG));}, []);hooks.useEffect(() => {if (config) {saveConfig(config);}}, [config]);return {config,setConfig};};const loadSites = () => new Promise((resolve, reject) => GM.xmlHttpRequest({method: 'GET',url: SITES_URL,nocache: true,onload({response,status,statusText}) {if (status === 200) {try {resolve(JSON.parse(response).sort((a, b) => a.title.localeCompare(b.title)));} catch (e) {reject(e);}} else {reject(new Error(`LTA: Could not load sites (URL=${SITES_URL}): ${status} ${statusText}`));}},onerror({status,statusText}) {reject(new Error(`LTA: Could not load sites (URL=${SITES_URL}): ${status} ${statusText}`));}}));const useSites = () => {const [sites, setSites] = hooks.useState([]);hooks.useEffect(() => {loadSites().then(s => setSites(s)).catch(err => setSites(err.message));}, []);return sites;};const App = ({imdbInfo}) => {const {config,setConfig} = useConfig();const sites = useSites();const [showConfig, setShowConfig] = hooks.useState(false);hooks.useEffect(() => {if (config && config.first_run) {setShowConfig(true);setConfig(prev => ({...prev,first_run: false}));}}, [config]);if (typeof sites === 'string') {return sites; // Display error message}if (!config || !sites.length) {return null;}return preact.h(preact.Fragment, null, imdbInfo.layout === 'legacy' ? preact.h("hr", null) : null, preact.h("div", {className: css.configWrapper}, preact.h("button", {onClick: () => setShowConfig(cur => !cur),title: "Configure",type: "button"}, preact.h(Icon, {type: "cog"})), preact.h(Config, {config: config,layout: imdbInfo.layout,setConfig: setConfig,setShow: setShowConfig,sites: sites,show: showConfig})), preact.h(LinkList, {config: config,imdbInfo: imdbInfo,sites: sites}));};const divId = '__LTA__';const detectLayout = mUrl => {// Currently there seem to be 3 different IMDb layouts:// 1) "legacy": URL ends with '/reference'if (['reference', 'combined'].includes(mUrl[2])) {return ['legacy', 'h3[itemprop=name]', '.titlereference-section-overview > *:last-child'];}// 2) "redesign2020": Redesign 2020//    https://www.imdb.com/preferences/beta-control?e=tmd&t=in&u=/title/tt0163978/if (document.querySelector('main section > .ipc-page-content-container')) {return ['redesign2020', 'title', 'main > * > section > div'];}// 3) "new": The old default (has been around for many years)return ['new', 'h1', '.title-overview'];};const parseImdbInfo = () => {// TODO: extract type (TV show, movie, ...)// Parse IMDb number and layoutconst mUrl = /^\/(?:[a-z]{2}\/)?title\/tt([0-9]{7,8})\/([a-z]*)/.exec(window.location.pathname);if (!mUrl) {throw new Error('LTA: Could not parse IMDb URL!');}const [layout, titleSelector, containerSelector] = detectLayout(mUrl);const info = {id: mUrl[1],layout};info.title = document.querySelector(titleSelector).innerText.trim();const mTitle = /^(.+)\s+\((\d+)\)/.exec(info.title);if (mTitle) {info.title = mTitle[1].trim();info.year = parseInt(mTitle[2].trim(), 10);}return [info, containerSelector];};const [imdbInfo, containerSelector] = parseImdbInfo();const injectAndStart = () => {let injectionEl = document.querySelector(containerSelector);if (!injectionEl) {throw new Error('LTA: Could not find target container!');}const container = document.createElement('div');container.id = divId;container.style.position = 'relative';if (imdbInfo.layout === 'redesign2020') {container.className = 'ipc-page-content-container ipc-page-content-container--center';container.style.backgroundColor = 'white';container.style.padding = '0 var(--ipt-pageMargin)';container.style.minHeight = '50px';injectionEl.prepend(container);} else {container.classList.add('article');injectionEl.appendChild(container);}preact.render(preact.h(App, {imdbInfo: imdbInfo}), container);};const containerWatchdog = () => {const container = document.querySelector(`#${divId}`);if (container === null) {injectAndStart();}window.setTimeout(containerWatchdog, 1000);};window.setTimeout(containerWatchdog, 500);})(preact, preactHooks);