// ==UserScript== // // @name Discogs Scout // @version 3.0 // @namespace https://github.com/Purfview/Discogs-Scout // @description Auto search for music on torrent, local drive, ddl, streaming, predb, and other sites. Adds links to Discogs pages from various sites. // @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAMFBMVEUBAAAAifwLExgFkP4NJTYQOFUQTHoRYZ0Kbr4Ol/4UgdMGft8acrIPiecWke4Znv7mtRJQAAAEFUlEQVRIx71US4wMURQ9KlXTHWye8utppJRpI8GiFN3Gt4xu4xcpdPuLpo0hhPaZ7sQnad8ZRIQxxiTiM8GEWOhIRCxEzPhEbIhPJCQiIWFHsLFx33uKNtqsxFm8uq/eeffce+vewn+GMi9Rl5hXbeAvmH/VtnTbsvuuLH59rc1+wH5a7HyzxTz0b7v2p8xcfpMxnbtp9Ou16IAhgfus75TsgdZV9fV15vLSeIc41HzjbMbSQqssu9vqlww5vwtMMBnhxpaq6wfzZOguoiiA9rHFZzdXVFj6ZSagJ6G5BYTJ46BmorHE0lPOWUGoILV4QYpWi7JCWNWYyrMN1Drk1vkV4kR36BjP42YSaBRv0/Aw+Lj6iAWz9cJL+YHmVn7XwLOfCmdz3XTueWzG4NuEYZpVdS4WeuUsCSRTJ7fyEpZCwPdtpzWgEn5PwxfBGAdVDYz1lSF9KGcVbxWoI7wkj6mb6DGMVPYZoWgoP6r7hWojBIyGROoWCRtQ2ii/9FKijbnDQwESEFCobMoOi2r33m6Khiz99G0sqBXBuTLGMQbU+a9OGgglKNGZl+MobzjBG89/RRC69Te4BIn8hKlMb6etdkbshveRSmLNSIahuPzVJkkIc9ucp9JTFXa8KrlX3HkisxzF7W3B3eRJPQ5ajtiMiAS5Ln9Mi9O9wf5KAUdAWGPbLeAhZQVhZ440VxtTVjlU1FI5QKsM0VF1grA7B7VpMH06InQNyrY0y0SV6j0Pfha5ibo7BoYTIepoNSURX7UJ1AjCxhF8KEo1Pf8Ok4gQizmhmrEvM0ngoCQcw2TGenU5+TBr7gzyvO/rWRa86XofIzUKXS29aXhanR+zqKrK1bWsRvZGpZyJ3tSITfMzcx6u9DGylUMz7C1Xm8/R0XlZScpddfHi5QqkdF4oRdvuLIlzo0VOjeyLeQbQ1ivlSreiQ9SktPa73jccfMwfuP2L4EtLc1G7eJS1UjNceic6HlKcbkoNhd+oYoY8mxSmlc/mVs9ZW6V403Ct2oFqLGwWwXdNql8gYQxzo3yWQhebG+5tfb1I/Dti5fCf+TlazhYiTAGisTkmp2IlMlFsKGjC56AANTnhlN6uuHJupSKUvJF2iD0wzGurzFHcDLq2J7snC/8gPUKU9metsVzNpdRPwIbpyXUogM8qI/9GyesN0cZlrgvlbka7hUKkepaJkJZUtofIGNrfWY/f4LejWwq2hzd1+4zfsZnZLkr2yM3QN9pEpwOhxNJzmFVB7udgcMDd34KOmG7lMJ3tghbB3NLFEfyJWW8wiIVD/jA2ngikixAUB0NZ8MDiMB7UtKM4hjAWJIJp4i/wMcbyI1H8XKZChKP4O1SLBTffQifIs+BDozNCigUr0Rmm6ePRKbTWWvxrfAfEou1mueFddwAAAABJRU5ErkJggg== // @license MIT // // @homepage https://github.com/Purfview/Discogs-Scout // @supportURL https://github.com/Purfview/Discogs-Scout/issues // // @compatible firefox // @compatible opera // @compatible chrome // @compatible safari (it doesn't support the sites with logins) // @compatible edge // // @require https://cdn.jsdelivr.net/gh/sizzlemctwizzle/GM_config@43fd0fe4de1166f343883511e53546e87840aeaf/gm_config.js // @require https://code.jquery.com/jquery-3.5.1.min.js // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js // // @include https://www.discogs.com/artist/* // @include https://www.discogs.com/master/* // @include https://www.discogs.com/release/* // @include https://www.discogs.com/label/* // @include https://www.discogs.com/user/*/collection* // @include https://www.discogs.com/wantlist* // @include https://www.discogs.com/mywantlist* // @include https://www.discogs.com/lists/* // // @include https://www.discogs.com/*/artist/* // @include https://www.discogs.com/*/master/* // @include https://www.discogs.com/*/release/* // @include https://www.discogs.com/*/label/* // @include https://www.discogs.com/*/user/*/collection* // @include https://www.discogs.com/*/wantlist* // @include https://www.discogs.com/*/mywantlist* // @include https://www.discogs.com/*/lists/* // // @connect * // @grant GM_getValue // @grant GM_setValue // @grant GM_addStyle // @grant GM_openInTab // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @grant GM.getValue // @grant GM.setValue // @grant GM.openInTab // @grant GM.xmlHttpRequest // @grant GM.registerMenuCommand // @grant GM.notification // // @run-at document-start // @noframes // // @downloadURL none // ==/UserScript== /* //============================================================================== // Version History: //============================================================================== 3.0 - Fixed: Release and Artist pages. 2.7.1 - Removed: PREovh. 2.7 - Adjusted "large covers" notification. 2.6 - New feature: Support for other sites's languages. Fixed: Bug with 'replaceSpecials', it was deleting 'f'. "E.P" removal. Added: NZBKing, Alterportal. Updated: Tidal. 2.5 - Fixed issues with a page reload/refresh. 2.4.1 - Added: HQMusic, BitSearch. 2.4 - Fixed: Inconsistency with mPOST formattings ["+" replacement with space for 2 & 3 formattings]. New feature: Added duplicate keys support for mPOST 1 formatting. Added: PunkTorrents, KrayTracker. 2.3 - Case insensitive "EP" & "E.P." removal. 2.2 - New feature: Option to remove "EP" & "E.P." from the end of release titles. [enabled by default] 2.1.1 - Added: Bemaniso, AnimeBytes. 2.1 - Fixed: Own wantlist page wasn't working. 2.0 - New feature: Support for the new version of the master pages (beta). New feature: Support for the wantlist/collection/label/list pages. New feature: Searching for Various/No Artist ect. albums should work now. Fixed: Old version of the master pages stopped working. Fixed: mPOST didn't work for the icon sites. Fixed: POST form submit didn't work on the release pages (jQuery issue, replaced with pure JS). Fixed: Searchable sites with mPOST didn't work if auto-search was disabled. Added: Voidtools-App, TPB-Proxy, RMT, Metal-Tracker, YesAsia, PandaCD, RlsBB, Sharing-DB, Mp3db, BoxAlbums, CorruptNet-Pre, CorruptNet-Trace, LeakedAlbums, Lossless-music, RockBox, TakeMetal, Core Radio, GetMetal Club, Gabber.od.ua, 1Gabba, FLAC Attack, zHouse, 1Techno, 1Trance, The Last Disaster, eBay, Spotify, Spotify-App, JunoDownload, Apple Music, Bleep, Qobuz, Deezer, Tidal. 1.7 - Fixed: Possible bug with sites (if it's mPOST and there are special chars in the name). Removed: PREcBurns, TPB-Proxy. 1.6 - New feature: Support for new Master release pages. 1.5 - Added: KG-Release. Removed: preFYP. Fix to keep the bars order consistent. Remove text in brackets from %release% names. New attribute 'replaceSpecials' to remove non-latin and special characters. 1.4.1 - Tweak: JPop. 1.4 - Added: LiB, LiB-Req, JPop, JPop-Req. The settings tweak: If site has 'goToUrl' attribute then show its hostname instead of 'searchUrl'. New feature: 'Pre databases' section in the settings. Added preDBs: PREcBurns, PreDB.de, PreDB.me, PreDB.org, PreDB.pw, preFYP, PREovh, srrDB, xREL. 1.3 - Fixed: "+" in band/release. Fixed: "&" in band/release. 1.2 - New setting to put all links into a single bar. 1.1 - Added: Bunch of sites. Blue color for requests. Tweaked default rate limit. 1.0 - First usable version. New feature: Support for Release/Master pages. New feature: Three bars for sites: 1st for no-auto-search sites, 2nd for searchable download sites 3rd for searchable other sites/tools. New feature: Auto open the settings if no sites selected. Added: First bunch of sites. Updated: OPS (advanced search is broken, switched to basic). 0.3 - Fixed OPS. Check if there are releases on artist page. 0.2.1 - Added the update links and OPS. 0.1 - Initial alpha test release. //============================================================================== // A list of all the sites. //============================================================================== -= Each site is a dictionary with the following attributes: =- # 'name': The site name, full or abbreviated, must be unique. # 'icon' (optional): Icon for the site. If not defined then script looks at homesite/favicon.ico. Can be URL or Base64 string (www.base64-image.de). # 'searchUrl': The URL to perform the search against, see below for how to tailor the string to a site. # 'matchRegex': The string which appears if the searchUrl *doesn't* return a result. # 'bar': 1,2 or 3 integer. Places site at 1st, 2nd or 3rd bar element. # 'positiveMatch' (optional): Changes the test to return true if the searchUrl *does* return a result that matches matchRegex. # 'SpaceEncode' (optional): Changes the character used to encode spaces in band/release names. Default is '+'. # 'replaceSpecials' (optional): Remove non latin and special characters in band/release names. # 'goToUrl' (optional): Most of the time the same URLs that are used for checking are the ones that are used to actually get to the movie, but this allows overriding that. # 'loggedOutRegex' (optional): If any text on the page matches this regex, the site is treated as being logged out, rather than mising the movie. This option is not effected by positiveMatch. # 'rateLimit' (optional): Connection rate limit in milliseconds. Default is 500. On the Artist/List pages if rateLimit<=1000 then it will be increased by a factor of 4. # 'mPOST': HTTP request by POST method. For the sites that doesn't support GET. Right mouse click won't submit such request. Atm 'goToUrl' not supported with it. Examples (3 types of formating): 1) 'cat1=4&cat2=6&filter=%tt%' // (supports duplicate keys) 2) '{"cat1":4,"cat2":6,"filter":"all=%band%+%release%&sort=date"}' 3) '{key:"cat",value:"4"},{key:"cat",value:"6"},{key:"filter",value:"%band%+%release%"}' // (supports duplicate keys) Note: only these special chars are allowed in a site name if mPOST: .- (). # 'ignore404' (optional): Ignores all 4** HTTP errors. # 'ignoreEmpty' (optional): Use it if an empty response means that no results found, otherwise by default it means 'logged_out'. -= Search URL parameters: =- # %band%: Band's name. # %release%: Album/EP/Single name. */ var icon_sites = [ { 'name': 'AllMusic', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAABMCAMAAADwSaEZAAAAPFBMVEUAKDkAERgAIS8AGSQkqeD+/v4djr0SZokFOE4LTmqVnJ6tt7tSXmI5RUrs7u7d3+B3gIQSIynL0dQnNDr+weAdAAADeklEQVRYw+2V2ZLbIBBFaRE2Sd7//19Db7qmZGdGmTxMpeaCJGjo081SdvjGqly1aD3u6o3vrfotED96ram2Imr1i6DQyi8olzax8ajUp2XDgNeO0zgBR+1xR9Kb9PEFym7V2jZ2sSmfxk01Wx7c7X15mhlr7/w5G9RealbUFFCAy9UMxhzQGsheyKtoQmMtSjMQEgALgfQlrMbOhrPCryY0n81vtMEAtSiL9YTRh2mWNbJwLNLBxjjLUtOY3rFx3TYUUMYo2SLrQC266aVOTiy60LF4XgDyq+lUVWVHU9kSzbalcMZr7MlMZ3EHqk8LzeMxA6VNbVSe6Cy9bfzn0/IzLUsbieDhN1SQmC7Hz0iXj9TKwFAMvgBYCOFyG5tZbBaDR8+xuZtW2TnKDiCfinVis97AQkX44lh3Chlj4P4hs4YtE1fssOMxLXwEQ8i4teqynLaFP23B9HnYtJ3EnNKis/8B7JrS/FUYWss9bIgI2IEDiDi7+/mG88W0F7CI3hiyueua0tXPt725GswJkT/7SxutWWJvLyld2FRkF8UjcxMcc+D3gJNpMhrZuX8eqWu1iyeOFhIyKztpU6SEZpYszjPD7pEzYwBPb5I0OGoNxoKlalCxh1xjDOfEOkXpil1/gtgBjsgMVt2OJhaOFeM1iZbIw1Fq84AgceHMBhzP7BKr6pJUD+16Yk3gz6XD9AtalNRKdK3JNLtF/1DgwEWChC0aoLxroN0ddnaL/tVFOBhOYA7eguifsHqe0qbrE6tgeeo/GQx8t2ajUaQFsEvvGiuTulk1hThq0nf2ld50hYpcybLOWAs0wJAv0xRGs+79areDBJaVgfmAvVan1e5rF/ZmX6IAFvQRjEomIr2wd7Ktmzm1QnQYRr3SRY+RyG7brXN6PQJzGhBEZ8WyOR7MjLj44hbqmu3ikgy9g72KRFrswq4M87bQ9i5iDP3xigHNK85YpW/fhXY02nyCMIEjsOhmF38WMUxvR/TiKO8Ha4DjheyHDMIGWnJ4aQnwHlGkF3avh6cG1JYZEnkqUtf0UjPp8IsSZGSHwo7vdL6R4wYPhfEX1RVP6Y2u2xRUffQABqsRF6zKdLXT1XF4jZlBSO2R/CqYYFrpjcIYBZotDXrSXW33IXj0lsP2up2xSqwT2b7Qe9hpVj2GCGZc38L+Rj+wH9j/AvsN1ksy9BiB4ZUAAAAASUVORK5CYII=', 'searchUrl': 'https://www.allmusic.com/search/albums/"%release%"', 'bar': 1}, { 'name': 'Amazon', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAkFBMVEUAAAD///8EBQX/qABUVlYbHR3/1ZCTlJT7+/vMzMzz8/P/8Nj/v1AwMTHZ2dn/rRN2dnb/6suioqIDBAT+pwD/+vL/9eW+vr6wsbH/4K7/ynLm5uaFhob/w2H/5bz/5Lv/yXL/uD7/9ebNzc2UlZX/0IJmZ2dERUVDRET/sin/rBPl5eX/2p//2Z9lZmZDRUXHx2gpAAAAAXRSTlMAQObYZgAAAclJREFUSMedlul2gjAQhUsm7JuAyqK4tNZq1/d/u0YYExKIob3n8CPH+2XuJEHydJdlENo0bgPjWTPlTfsTl9KCkB/q+mNinOcUE6G4UoiRP0E7Fw1GhOS3iao3mZA72Kj+gj2uUmI4WJAJ2UrbwwL3eePK911ezddWyNGxkPtxtQDFDAEGNAKn3nDGocsLqoBQwLK7CQ5KBKgCaOXjws4AElaH0nhehU1OCZcZCHBp5gK+Tf4ElJLvogHks4cLU7LNezEC9/x22Q2NQEBQOe60Caj4eTYBGsPCBHwrBuNOU1L0bzFPiPrQAFvpFQvEHm4NPRCbEX5MhPxpIBEO5YTEKsC71MjWAKXiy3GGS6ACattFN22FIc+B/njnIjzd4NIurIcvUE4ZY9NtgikpHqwsy9YcCGvrsbIWbgo5ABGj9WK/t04DkPFI+xQOiOgVwbPoIUzhEbJy0tZK02HT4RFgGdWrKfuOpYE6hKb/u/dwkgZuipxMjl8f0iVAurM+YT34ZGEjrAp7rtGr06mNYNlPw9JHjsUBnvQdhkI3XLtVX6ufUUSEGXWsR5cBT+4wHfiPTjjjKhDuHadhfXxl6qJ5/7mcGG8o6uS/49obpgvEcMsAAAAASUVORK5CYII=', 'searchUrl': 'https://www.amazon.com/s?k=%band%+%release%&i=music-intl-ship&ref=nb_sb_noss', 'bar': 1}, { 'name': 'Apple Music', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAhFBMVEUAAAD7W3T7Vm/6ITz7VW77V3D6Ij37V3D6Ij37V3D6Hzn7W3T6Iz76K0X6KUP7W3T6IDr6J0H7OlT6KUP6ITz6MUz7Ql3////7UGr7R2H7V3H7S2T7VW7+wsr9lqP7ZHn/8fP9pLD+1tv9q7X9nKn8jJv8gpH8dof+6ez+3OH+z9X9tLzq9unlAAAAEnRSTlMA9ubYyXZbSSsf9u/v7cu8j4UwG0qCAAABRElEQVQ4y4WRi3aCMAyGM0AF7xYoN0thAiK+//stoZFuY7gvhYb+3wmcAyDB6uTsPn6xc06rAEY2Xr6AtxlzJ1/EQSPwrm/wAlhd0xlXrXPuVuDRxkXk97ZWj75l1wMntegOsyohmsIcOUD3wqzGZFYgoLCoxFJmfPi/kE2wUD1U0/ZlxkBmUQlmnU4zWXyWchLkVEphhrBgCuQLFG7ckSC4BWlRN/GHICZIYDIUGBByKhS4I4FbEBY7QX6fIGKB109B9238EmJK6UbCuOt66BMUTEE8IYeatjv9MhQYQItW1tVDQoJQCdHFHPCEdKBTK1TaTiDCOiGaEFt6RdXEVgiJp5lLbazLVptTeoLDuI9fpkQ44wDH0BjPZ2dzyxEuponGNecCvhu9wfUB1vsoChfWfg3IenGGiznhn93tPN26Zx/DL8jaVsC2vSlKAAAAAElFTkSuQmCC', 'searchUrl': 'https://music.apple.com/search?term=%band%+%release%', 'bar': 1}, { 'name': 'Bandcamp', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAS1BMVEUAAAAdoMMdoMMdoMMdoMMdoMMdoMMdocQdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMMdoMO469wmAAAAGHRSTlMAA/xhZVUSCM/D8uba2K6bkodyW0xDMiMrDxECAAAAnUlEQVQ4y82SOQ7FIAwFCUuA7Ht8/5N+S4ls6fOaKE2moRgxkg3mW1SQJ4HgXYFfRZuNLP1jadJCIltAXS0BBwNe7seebOlTlMACA4HNRd0S8FlHmMsAs7O5/NmgwHB7PkYUsIcEDqRp1MCAAs0pgR2OOLO5ySjQ6pIDDCwSiAktuY/yCh4GnC65Q8+cjTDBJW86woo+Wqjef/ZP8QPdwiBy+gWrIwAAAABJRU5ErkJggg==', 'searchUrl': 'https://bandcamp.com/search?q=%band%+%release%', 'bar': 1}, { 'name': 'Beatport', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8BAMAAADI0sRBAAAAGFBMVEUAAAAB/5UB7YsAe0gBoV4ASywAIBMBxHNCtoKSAAABAElEQVQ4y+2SPwvCMBDFC2r3V4XOin9WNYOrFamriHUuqLhai/38Xqo54ZJ0Fuob2sLr7/LuLkEbdNxu0wY7ASZ/+6fsotHuDYGp3+4CuPvtA9nzxtpR7rWXBPfDTKnM9U+HYDxXukSZu+Foh1qlG47wUeqCvxqI8heQRoAbDxMAcUGPcZZtdAs2XA6p6p4GkMgB1PDZTO2iP2Sw6qYjmaMq0VacH3if/MU4ZV3wwm4yW2+ca3ttVivs4BSQbQJ1pE3y02xX9tksb3Jm4nffhejbBEJqTY0VmpkTHNHbkQ0zpR68MWvpvutiImmZiBYuYKmVuKmyvLznUlelTkEL9AK5yTckC7iHmgAAAABJRU5ErkJggg==', 'searchUrl': 'https://www.beatport.com/search?q=%band%+%release%', 'bar': 1}, { 'name': 'Bleep', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgBAMAAAAQtmoLAAAAMFBMVEU4NkGt/7ZEQ0wkGC2+/8e0/73I/9Jedmh1mX+EsI2Mxpav8LmWzqCk6K+h2aua4KTaTcj5AAADJUlEQVRYw+2VT0gUURzHX75AQgp+MLMXL7qrYdjh5Tu4JVm7zE4l/fHRznoQk41xXbcEaa1dkpDaRbdLSW5pCBEYQtKpqAQLJCXL7NKfQ4QRVEQQdKnO/d6sTCsV7t4M5nuZ32PeZ37v9/2994a4ixQpWhWkKJU4gAM4gAM4wNoAKM+JERmy1YHS0YzUYAUjNZlMz+rArohm6Uicbzb1l6sDO3xgSYnxSqHMFg6Aa7i2UEA1NV2AurusUKApkUgaAHsaJGDZRlB29CcQxRe9CGyTAK1LXh2kTM6vPz96Agl8i2POfgNdGO/0LWdgY7pmTlE5/xMaOM9IMjPILjx84snLwAgtE2qzrIH2dQBA6AUjbELaEUnRx/rxWtPQ7zMb2MdIyRyEUujSTL0JIc0HxyhtDIOuC7WTZ6FdQVSP20D50tIPnzrFpa3rferexBy4xukVUD4ngxDyZEEVkTCofmbbGjACoMwyCUyAEufbw6q/PgwxzquFazgLoI1kBXTZAAhAtcURuGRYnr2CLoTuMO4Nq81pUG9z5A2PDRhBrQMU/zqhjKBZJe6KG7B/o1Cuu92lPvCnwZUicoVxu+gSt/usgBi6NIq4pfY+kBLYnjQID6G9oKTyG4cpoR8Bq6KgMFoRCGoBwzCiaWjDrlQLZTi/cew1qBdzGQyp1jOyMBUMgcChHDD+d6DFbalS1iBVkbUyVAECK5eEgFU0t7TJp8zmoqz0h57CGvJ2a+KygPJ+/OhdOMgJv7b4xRuGTk7qvy6+t1ziH8Flu6RqGtoKTXIvDYDrEdliatG6AAR7yElTP4ydbsFeQtDuQ07q0XUINIRB+xYE1wc6AOqB5wEIxbPo19PvADG2EojEsc6ZunuYUEA3JV4THQYlyhEQms/eS42mZsmc51V4a9ANOvbBHGKE9kUMI9Qdp+jSz7zd6l2YlLp5jpOtC7eGCE8+m36AA3T69NvpNz0MgdaaiGafB8KXZZ1hgmPcS/jMRZQRBAyanByh/75b7ZNPMbIAD36w4MtYLkme57UETBhaccDY0rtiAJy15n+KDuAADuAA/zlQtNxF6hfzWR8gU8UUxQAAAABJRU5ErkJggg==', 'searchUrl': 'https://bleep.com/search/query?q=%release%', 'bar': 1}, { 'name': 'CorruptNet-Trace', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUNm7n////f65sSAAAAFklEQVQI12P4/x+KGhvxoQZGIAIqAwD/ohMPaSbQBQAAAABJRU5ErkJggg==', 'searchUrl': 'https://trace.corrupt-net.org/search.php?search=%band%+%release%+type:FLAC|MP3', 'replaceSpecials': true, 'bar': 1}, { 'name': 'Decks', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUAAABVVVVSUlJZWVlXV1dhYWFbW1tfX19dXV0PDw9EREQ1NTUEBAQGBgYcHBwTExNNTU04ODhjY2NPT088PDwpKSkgICAMDAx9fX1wcHBJSUkwMDAmJiYiIiIXFxeSkpKJiYl2dnZLS0tAQEA+Pj4aGhrFxcWkpKSbm5uHh4dpaWnNzc2goKCTk5M0fYJwAAAAAXRSTlMAQObYZgAAAXVJREFUOMtl09eCgyAQBVAYVBDUaOyJpvfd/f/fWye0GOf1XC9FJX7S+lwyzlleDSlZzkryMOTTCCEiVsVfnFQhDjoGooipZPY4Db8DLP8o2Ym1dW58Gli559EXgSAA05HQmftAsNH7qLT7Aheg6r0A2qJAByguIq0vCygtpvvjzpcFFFJSo7JtnLQ1lLIYN30XousAbch5cmj1cYbg/nP77f/WtoCCIhCGQjuJg9shisJH/3AFIEnEeWUvbHxFOIeuN06hJNPWRhPIsva9w6c8WAfAQOYCKTrrmr1ZAANMiNq+s0ahs6PsXEFOciFyE2izO5/8BUdmHSS5CCG2toLu988jXNauABQZ8O6KFK+hGXZZdr2qwDs0JGV4skAWF8pORX2tz5sPL6cnqwiH6QlwvIPC+zPm2bv+pgrLS9e7T/I5e5eJeUmAtvRT7D5rMDz3FXET49HmDDKe/Xrqi2Fr1vclBXgvVUyWk45KlgC5VE1K3PwDpGkX801HuPEAAAAASUVORK5CYII=', 'searchUrl': 'https://www.decks.de/decks/workfloor/search_db.php?such=%band%+%release%&wosuch=all&wassuch=atl&where=', 'bar': 1}, { 'name': 'Deejay', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUAAAAwMDD///8ZGRkZGRkaGhobGxsrKysvLy8dHR0eHh4fHx8gICAoKCgxMTFeXl5paWn///8YGBgZGRknJycqKir///8YGBj6phobGhibahlyUBmQYxmCWxl7VhlNHk6zAAAAF3RSTlMAfwb07OXdjILTy8K8lXxBOgP58JyQCX9zfsoAAAB5SURBVBjTTY9XEsMgDERXFBuXuKQp2Enuf0xbiMG8H94ugwZBMK/O+YFmZG6sWDIQGi60q95fEPDmmseCZ5K4fWOSoBPi5yQ1I6wcmxQ/MQ9Xir+Yw1CesNAh6NB9zz/BfOcaA1Cdg2zWXrnXXcnmPCGz0Nj4flrFDxy7ERm/Z/oDAAAAAElFTkSuQmCC', 'searchUrl': 'https://www.deejay.de/%band%+%release%', 'bar': 1}, { 'name': 'Deezer', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAMAAADVRocKAAABO1BMVEUAAAD5jBUbql34gxYRqF0OrWIXWsgbqVjzkB9IJ6keTcENr2wRm4mxF3oPp3cmQbx0FpcQg7PrdCjxiCHvfSUTYssPgbxWHqcRlJL0rR/1pB/0nR/5kRURaM7yth5nF6AQhqoUrG/jSULpVjjoay6qD4QPooEPgcaIFovPQE3aUUDhYTX0lyGeDIvpYzHvwx0wOLBfH5qWE4fcPkzruRw8O5x/EZagF30OgKv5lhUPddGTDJEXn30QcLUpSKFPL5fVNlXQMF7VSEfugyQQbdEPebPINlXcWTrweCWIDpYYVrjvbir0fRprKI0YpXHmbyzsqBwQcdAQd7wSZLmuKG/0hBwOeKcfV6ETjpuAJYaXJnvHKmQQbK0TY7D2mBbgrR7cux0QfMPCL1vtmB6+Kl/jmyEYY5/kkCXifypyVdifAAAAAXRSTlMAQObYZgAAA5VJREFUaN7t1glT2lAUBWCL1YJ1YRNRsXXBioIUUKRWUKvF3VoXXLGtpaj//xf0nty8vITMJOkMzDidd1DGeZM5n/e9iOlSUVFRUVFRMec18sYUn8/XZgDpOMDNLHQC8IGAQK9OTAABhI+JdgM99OIh0N+RCYSA8vYfck8P1dObENoN9Mh0FPBpbx0E2OjwFklA5WXno8gy5xfF6fq3pkxRvlE8AMsy/w6UXQDUvxP5iXgDpkS/G8Dto8h3xB3gdu4fLLsBsp3TbDadrh9E9Hr6Cf39joDoH0PGxxuNZvPJGZApc78bgH5uR3/j6ckjUKZv1PfHXQCjvpHx+/2RyPaz0/UfzOF+FwC/P+ozev32s2egX6uPX7sA6Jf10XD4xOn6fkvi6HcGrP3RPepPegXi3O8JQH0tSv2HyWza6fq4NdeUyS6Vl53RMe0WquF8D7PZmZnp6S2sX1zc3t4cH29sFIvF9fWrq6vHx0esX15efqJMyoRCbgBuIQJE//SSAUgBBANCkP0xR2CMAb5BZwAstQBSwHq9DkESIU9AJMIDcP+mGRACRQfqlWq1SkBIT8wFGBcABrACKQh5CExg/f6+XqmYgZgrkCGAPoKME9hkYKBUSqVugsd5XcgJgIWq7J9zA/wE7IXlDn3B+gABhVQqGMyTEAgEirlcDusHViDmClh2yA6wMBKg6MDB/TkLMQT9zgAGwA4B4H4ToI0QfA9BAgfn55XK2VlV1HsBotFwMtsCkABgRQoa0EcAC2fc7wZkDCAtdkgAswUpjEDQAAgMPDw8zLkDvEMMLOAeMgGLi2tr+/srBEBgYAiAFBhQeRn5sZpIvEq8oiQoq1qwzg8T4WQynV5Y2NJuojs+5NlZOmU+5hU6ZjplrOeGhuhG6u0dnpj4evqZIwEREBLAw8pJMr1LwPy8CaAAWLMDfQSQcArBDhhTMBAxgF0AHiYYAsAjnNqBbhPBAP4Kwkk5wZ0NQL8dYAGRAAtGsB4BQANkdWDHDvAAFqBPBzgC0Oq1mIAa+rFDAtixADwA75ANoLQC3TICwPOiBfhtAHIAO8AChwE5gGBqWJf9BvDHAAoF9IsBbMCwGfAzQO2ivtbNAPoZ2LIApRJ/mgLI2wAIIgz40W/JEdb3tAGy2CErUNIB9LcCEJBWQBTj64iC9TD65Q61ACnxL80OyDBAj/+0KSKoZwD9YgAnICABCBaiS0VFRUVF5b/JXz0ZRzzMCJOoAAAAAElFTkSuQmCC', 'searchUrl': 'https://www.deezer.com/search/%band%+%release%/album', 'bar': 1}, { 'name': 'eBay', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPQAAAD0BAMAAABeARbNAAAAMFBMVEUAAAAAAACZzAD/zAEBZt7+AABDQ0OGkn5mZgEzMwBgAABATaf+QEAAGjgBM28nJyijxz+KAAAAAXRSTlMAQObYZgAAAjFJREFUeNrslrFywyAQREljlYYGSn4Nmqg0asRviyptZtJk4ksG7rJHY14vLewuB2axWCxenPpFMZOpD/fNPlH+dE/E3UzhbI4SZ+z8cL/zYZTZmvsLTzaupkwh2hrK87WJ8jTt7HpEo8Ph+nijwc2NEAxBO2gaN97u+XFvbhRrCHrtppYrd+x9r7WeD62m0Y7RO3oj6skAuT/dUuVnD7Li4c6dME+1tG/dV8HWlNI+BtzMKtvehl5CTeNsv5H9dIeOwsm6BhuR4H770UoEuN9l2B6033Z88lxgvxmjJ2D9tpzZg/WbNXEvpN+WNXID0u/Cu2gA85u3jTtwqnB/NZgPJ7zIdcnDorbsux32Pinsw5hQUQt8Ap3qwG9HAD1FE84obl8l3xRIy7zEqQvSMivph4W0LEnuOg9pmawgiFkWZROwAAoeMDFJUrPa5aQIl5/F0tS5gsqJP44B7RT+wgOWLJQO2kFRDmld/i+dpeezkQ/Bi8fbRaUBSUnbotlPNxe/pD/Zm0MCAGEoCoBkoQIVqICiAJ4SZMGQgjrLMDn1vpi+K3AltVqtVqvV6oJarZ6u3+xr2fVMWob/iM49u7dsrajVarVarVar1Wp1b98OagAGgQAI1kJNtpZaCyRIQgg/FHAPQgghswZGwaLRaDQajUaj0Wg0Go1Go9FoNBqNRqPRaDQajUajj6NTv1z61X+sb48X4A5Do9FoNBqNDkKj0Wg0Go0OQk+nn7W9lySdUwPQF080xci5zgAAAABJRU5ErkJggg==', 'searchUrl': 'https://www.ebay.com/sch/11233/i.html?_nkw=%band%+%release%&_sop=15', 'bar': 1}, { 'name': 'Genius', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaBAMAAADKhlwxAAAAGFBMVEX//2QAAABnZyjPz1ExMRORkTjj41mxsUXipzHLAAABcUlEQVRYw+2VPXKDMBCFscG45RFs2nCDMOQAdnIBSC5gN67x/ZtMBsFjpBWSxq1etSN9WvZPIomKinpVedd1H8p+PG4OugFQTOYegDq4k+EjVjTNXSHSd40uZ1OkodEzhXcB3hu0onAW6J1BKxuQKmLQ53mjt4RNmmm2KMzWAGCRs3+7mkMsLUnWqyQutC1JXmR6lGg60U4WIl0zLCfN1atG1wbN7qWNnkMl0ovn6Sh3NuhhonsHXdIkIdKHqSRLIxlryxZTS0k46Ry3XqYZCjckeiCdPNffVvWh2DJTuUinFjoTI0muxgVkEqOwfJLo53RJDKGyPhzSN6XFVNGmRBdW+iCsDbz9puSw37xQvmB+4jXyUMo3yTsQhOSIU5DrIsQ1Ri/4joCwjwgJBEq9DzwouPKH7YHko9bySdY2f/O/sqjYqNjX7y3Jf7CSowqUY/wyUB4j0uq0x/RTo7vMbpj6BEKamDee48ETSVRU1Lb+ABmoNtvoYv3FAAAAAElFTkSuQmCC', 'searchUrl': 'https://genius.com/search?q=%band%+%release%', 'bar': 1}, { 'name': 'Google', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABMlBMVEUAAABFi///STpP/37/vwX/////////////////////////////////////////6eery///XE7///////9V/4D////////////////////////E2v//wLvw//X/rKTo/+7/UUP/TDvJ/9eJ/6j////+/fz/8/L/4Yj/3n7/1ln/0Ef/xRyjxv//u7VXlv//opv/h37/enD/bF/////A/9H///+1/8hr/5Nl/49c/4j////0+P/o8f//9vX/9+D/997g7P/2//j/0c3/0Mz/siL/xL97rP/0//dkn///mRb/lnL/m5P/lo3/kYj/fiL/c2f/Y1bY/+P/2TNJmv/S/97Q/928/9ev/8VOs/+3/6ee/7iP/61//6F2/5r8/y6P//LC/0pS/5RY/77////////5+/9A6TfbAAAAZHRSTlMA9Oqo++j2myLz+M+XJQn8+uzIxamKh1hVLwv89/X17+vr3L0N/v79/fz8+/n39fTx8O7l2NLSsrCsB/7+/v7+/fn5+fn49/f29fTz8vLx7+3l5OPh4NLOysfGwLm2tbGwpaAOaYKM8gAAAZNJREFUOMt9k9d6wjAMhd3ssiFhlg3d7FKge++99w7v/wq1lGFC+PgvgqMj58hCJoxyXI6IkiRG5HiZuPHLk7rNpOwfkgNRj+7AEw04ti/rLrwK05MihoLZZrhQCDezQXwVk/Z+EeUGZ9PAFFEx/fH76Tw3QP4AXYw6orDOck4u0CWGBh7YzyGterVab9HFuXkWMJHBH79/vasje+Ez3UQm5A/6cwr61YwV3mAdS5E4/dkSLjkuDLqLBDrMCsJJIa2Pwkci9LkgCML+9MgElUCTFmnCvBmZYExBs4hEnwJlzp0Qoq/SuIQKJIyzCIGFXeSto8htqwbVOuanVhxMCEHCOhwTG7UpfPN874jpazWqHxuNKkOrX3jK+46l9w+xBKPV6JFZgYzujaHnvkCv9cHB+rsfeOTjqVjslHj+984oUVLsgWnzDn6eK/bAkIAX1vfUhaE94sitEkTBoc28Mr2Ug8iSMjT2mfZbV9N6pQ6VQU8SG8U75uIggZjHKUsxw5+hOC6vTyFuUgmfCtdf9SVSLPoPxFrAszCo93cAAAAASUVORK5CYII=', 'searchUrl': 'https://www.google.com/search?q="%band%"+"%release%"', 'bar': 1}, { 'name': 'Juno', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAALVBMVEUAAABvpecwgt2r0PRGjeBCi9+ozfE4hd02iOSLtOlhn+k1hN0vgdz///8nftvYoGGGAAAAB3RSTlMA4plb4uJb9GWAzwAAAFhJREFUCNdjYGAwWl6lzAAEjB3bqzsEgIyIciBoAQq0gxgVAgwW5WDQzKBRXl5zvLy8iWF1efnLeeXluxiAAnNvAoXgDLgUXDFcO8JABg+oFQhLGZLAzgAAp7o0US8mEgIAAAAASUVORK5CYII=', 'searchUrl': 'https://www.juno.co.uk/search/?q[all][]=%band%+%release%&hide_forthcoming=0', 'bar': 1}, { 'name': 'JunoDownload', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAilBMVEUlJSX////29vZmZmb8/PxLS0tgYGAoKCjGxsY1NTXMzMyoqKhjY2NVVVU6Ojrv7+/t7e3i4uLf39/Y2NjNzc3IyMjCwsK9vb26urqtra2cnJyYmJiTk5N6enp3d3dcXFxEREQ+Pj739/fq6urT09PDw8O0tLSxsbGGhoZ1dXVNTU0yMjIwMDAsLCyz3MgwAAAAsUlEQVQ4y93SRw7DIBAFUIZgIO691/R6/+vFVXKsjKzsovwF6KO3oJH/Cue8mtUH3y4AA6CzqsDmWyCDIFwANM+PQPV92c1NYgGNFXQPiu0Uhp7QEgHCc/vjlTYC+LQuEZBSMdQCAdFhrAYCQnXlJs/uWDkCLmAONUdAw7K+3fcIICm7tqMpIwwIDbzTcRebS1DD9Ny3XMsMIqq3DyMs1gKHoBHQRVsB6pbg0XVek5/NC42kB7iHLzSAAAAAAElFTkSuQmCC', 'searchUrl': 'https://www.junodownload.com/search/?q[all][]=%band%+%release%', 'bar': 1}, { 'name': 'Last.fm', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAGFBMVEUAAAC5AAD6+fnDJibSYWHtycn15+fglpbOL1ALAAAAAXRSTlMAQObYZgAAAJtJREFUKM9jYGAURAICMD5CBFNAEA3QT0C4VC0ERKoWQwXMlJSUkgWNlJTUDCECSSrCTqqCQcEiSoVgARElRxBOKhR0gagQVwKpCgxKMYQaKqoKpIuUnZTUipEEnFSEy5TUkLSIAUXNkQwVFgcSgkGBYAHhJBVjN+ckdUMTqApBN6DDCs2UYA4DOxrodNegVJAtAxSEhOMWIzkAAPkjMgYRFB9BAAAAAElFTkSuQmCC', 'searchUrl': 'https://www.last.fm/search?q=%band%+%release%', 'bar': 1}, { 'name': 'MusicBrainz', 'icon': 'data:image/png;base64,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', 'searchUrl': 'https://musicbrainz.org/search?query="%release%"+AND+artist:"%band%"&type=release_group&limit=25&method=advanced', 'bar': 1}, { 'name': 'Qobuz', 'icon': 'data:image/png;base64,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', 'searchUrl': 'https://www.qobuz.com/search?q=%band%+%release%', 'bar': 1}, { 'name': 'RYM', 'icon': 'data:image/png;base64,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', 'searchUrl': 'https://rateyourmusic.com/search?searchterm=%band%+%release%', 'bar': 1}, { 'name': 'SoundCloud', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAclBMVEX/IwD/////dgD/dAD/cAD/JgD/NAD/MAD/ZQD/XwD/bQD/KgD/LAD/aQD/KAD/QwD/WQD/PAD/VAD/TwD/SgD/+/r/4dr/+Pb/5dv/59r/2cz/3cr/1Lv/dU//hUv/8ej/2MD/xLX/uYj/o2L/m2L/chQ3aOvQAAAA2ElEQVQ4y83KyXaDMAwF0KdQBhfq4AJlyND5/3+x78gcG9KFN1nkSjqyLOGQcIeDzPfskDG1U3zzICF98JSQPnhOwMuNr+H9/L2ZUd0YhE6/YUZlTGUqpvbZiPrg6P9hgpklRrwfs0IbSDuzxDu3K7yqiSU+VuPpqht0SrqJpRFdO0JPUy8xoqUnHEm2EY1HgvMHzsfuYOHKwdHkJEZ0cYRCvYX4FBloHJeLbsAqi5JZRNs/lAlovLqpmc1/qPdsbZmbN3Jrc5srPkhn5tqRJyAHc9cDnR/BH8VZGrE9ue1uAAAAAElFTkSuQmCC', 'searchUrl': 'https://soundcloud.com/search/albums?q=%band%+%release%', 'bar': 1}, { 'name': 'Spotify', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAkFBMVEUAAAAe2GAe2GAe2GAe2WEe3mMe3GIe2WEe3GIe2WEe2WEe22Ie3GIe2mEe2mEe2mEe22Ie3WMe2WEe2WEe2mEe2GAe2GAe2GEe2mEe2mEe2WAe2WEe2WEe22Ie2GAe2WEe2mEe22Ee2mEe2mEe22Ie22Ie3GIe2mEe2mEe2mEe2mEe2mEe22Ee2WEe2mEe12DL2uVYAAAAL3RSTlMA/PPpwgUTtAvJqDkWz3BdGwe6oWL379VsVuOLiCHbrJx7UUw0Lg+Wg3dEkCe+QMe8CCIAAAGjSURBVDjLdVPXtoMgEERAsfdeYklMT/z/v7u0E7wxzhOwZZbZXaBgOn6CPQ8nvmOCLdw0RtrCoSGSul/mqLKkVfrgSf8X/oDLF2BjKHvYq3CVxA4/8f3yE7bMoT+W39AaUUcFlx3AiRNY7JzVFkkuj8vQvwr0qQgzkpRei/HenSNBaLpz1eJckARUv5iGH4GEUrU9sDzEBA6iDhOIOqcqb+Pop8fZ5bV1V5oFnYDPHA8XcoCSOUOF7c+M70I5SpB8PgVRXddI+KH+GEXMNADMrXl8rZxn13XzO21e7BuQ9Oz7MfB4dKmvK5x9nMm8lnQI9PCd3trm6lcOq/FcYU04SIo6PkBZSl4kQUgbSPXjFImSPoM5zDR2Km5hKCIH9k3+lIzB3Tk59+BKao3ePfFeMqGYEE82Vucz01t/+nK8uFAm4Yc0aG3s0ZG1x7sBjJKFCalBKnJpqsnWLYzIp1nAxdtJ8exctRtMuwOTiy7rzd7ItVJfw94dWonQ/jn2q+0ymu3itAZYQZ/w1+odJb9KEpDV8gYG2MI8lUNsWfFQnlbr/wewimayPmhpnAAAAABJRU5ErkJggg==', 'searchUrl': 'https://open.spotify.com/search/%band%+%release%/albums', 'spaceEncode': ' ', 'bar': 1}, { 'name': 'Spotify-App', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAkFBMVEUAAAAe2GAe2GAe2GAe2WEe3mMe3GIe2WEe3GIe2WEe2WEe22Ie3GIe2mEe2mEe2mEe22Ie3WMe2WEe2WEe2mEe2GAe2GAe2GEe2mEe2mEe2WAe2WEe2WEe22Ie2GAe2WEe2mEe22Ee2mEe2mEe22Ie22Ie3GIe2mEe2mEe2mEe2mEe2mEe22Ee2WEe2mEe12DL2uVYAAAAL3RSTlMA/PPpwgUTtAvJqDkWz3BdGwe6oWL379VsVuOLiCHbrJx7UUw0Lg+Wg3dEkCe+QMe8CCIAAAGjSURBVDjLdVPXtoMgEERAsfdeYklMT/z/v7u0E7wxzhOwZZbZXaBgOn6CPQ8nvmOCLdw0RtrCoSGSul/mqLKkVfrgSf8X/oDLF2BjKHvYq3CVxA4/8f3yE7bMoT+W39AaUUcFlx3AiRNY7JzVFkkuj8vQvwr0qQgzkpRei/HenSNBaLpz1eJckARUv5iGH4GEUrU9sDzEBA6iDhOIOqcqb+Pop8fZ5bV1V5oFnYDPHA8XcoCSOUOF7c+M70I5SpB8PgVRXddI+KH+GEXMNADMrXl8rZxn13XzO21e7BuQ9Oz7MfB4dKmvK5x9nMm8lnQI9PCd3trm6lcOq/FcYU04SIo6PkBZSl4kQUgbSPXjFImSPoM5zDR2Km5hKCIH9k3+lIzB3Tk59+BKao3ePfFeMqGYEE82Vucz01t/+nK8uFAm4Yc0aG3s0ZG1x7sBjJKFCalBKnJpqsnWLYzIp1nAxdtJ8exctRtMuwOTiy7rzd7ItVJfw94dWonQ/jn2q+0ymu3itAZYQZ/w1+odJb9KEpDV8gYG2MI8lUNsWfFQnlbr/wewimayPmhpnAAAAABJRU5ErkJggg==', 'searchUrl': 'spotify:search:artist:%band% album:%release%', 'spaceEncode': ' ', 'bar': 1}, { 'name': 'Tidal', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAAAAACpc9xZAAABNElEQVRIx+3VPY7CMBAF4FmEtKHkpwFxAxA1zh0oNhyAnp46oqelS8UBKLamzgmSK+QANAitEm8ce8YrbWJhl8iv8sj+JCt6VgB8fHzePx+vDf8z2Id6mB/megj3AxP8jJ85w2F65dcZDix/xoEJPjjPGEFOlGWcP7ppA5E2sKZThAYaSCipgpJK2EkJ1nQ9QyguvM5w3U43dzrMb+eK1tX5pjfumxY5TkrcL6JVSofTVVTgukzGbdcdIi0igAXSdAGAtEyG7Z9IUQGJCoi0EyoqoaISSmqAglYIG4oQ4KuoTBBgdNrqYXlZ6mF7Gpkr3+/pNftmeuj1X39wdXMy5vJSm8q5UNVVe0pdtaUhlZznoZU8/mn80UpSh83NMVFriNQBSuoEBf1xgwCT3cT/9Hx8VH4BDjJCoXu/TPcAAAAASUVORK5CYII=', 'searchUrl': 'https://listen.tidal.com/search?q=%band%+%release%', 'bar': 1}, { 'name': 'TPB-Proxy', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAAA8BAMAAAAkp6FXAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAkUExURQAAABkZGTMZAEwzM0xMM0xMTGZMM2ZMTGZmTH9mZn9/Zv///0CpG+oAAAGySURBVDjLxdXNitNgFMbxx2NlHHMThz8DfmRTBnfdSDeDuhFczc5LKINQ0M2Ay16CFyDSTYxgnT435yLph0lqVXA8q5D8kpf3Oe8h8pHS7YF5tzpgrH6V+yDoV/FHYOA55X8CkhSHQBBczOfzKUEMgPzoa2y7zoWrAXBir8K26/v2OvqgtN2AYnejC/gVKLaJHwB37VUD2qtuN3PiV00AOfGs06ybaHNo48oATvdAPRT16Bg4+SdAABkHQAYGKOsG9sDjunAFace6C74GUPjUFeTS99zdpgU8qvMpwNkzPveOfZ2QQgFIKUDL3x7evHMERE6OgLbzA/Xals1BUKmw7DdwAIx50HyBeDEIZhSWK0gUiwEApeUZ+WQq9cgKkbYMYa+nktiRT0jNAMvXKleLlsQ72+u3SCARnDRRq8n9AyhICSm4tMekZbuOpnPft6dt2bYwtmDk1XkGqBmJJmRZ0SwRIAUSF0tfKYjndkW+3LT7C6TEZbuFK4XiIeRkA74FZz+lMBUJ2h6YmuxkeHO+GW/ZdjXQrs1LLRj1GxH5freEigGwt8Rg5TFQ6bb/en8PfgCTTMM5Mqng0wAAAABJRU5ErkJggg==', 'searchUrl': 'https://tpb.one/search.php?q=%band%+%release%&cat=101,104', 'bar': 1}, { 'name': 'Wikipedia', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACABAMAAAAxEHz4AAAAGFBMVEUAAAD///8BAQFdXV3n5+csLCyPj4/CwsJBNwprAAAAAXRSTlMAQObYZgAAA39JREFUaN7tmc1ymzAUhds+QVRjs275W0Nm2jUe3Kzx5AVwm+5h2vcvFZa+XDJCxsrCC2uTOYH76d4jISnRB9s+qhXtwUTReLgeQffrCcSHEdRVLSABUiA+hKCubiQQkkI4QAU0EghIIRigglowgAqureEGACqw3QF3wB1wB9wBc8DmkfZ91LufZ/GtUyoy4rEcxW/e7AB8+krLRr23qhjpUtBSC3hYBGytyN8ZUFwI2PgzUJ9HyVuvO22Vio9GPCPGlpUAVNP81b9MmmbSP6b+tYqap//iz1k0B/2kqeU82Nn8p3bUPMXD3D4aRlW+nUhTbp2RJy3rSRx0MaZVo+oBiAheO8DTz0BHpAbAGlfIkr7YEIrbmNcAEAE6OpohmYfsdaIAyMxWTUkZrlErFgDAhE6a0OMablOPAOylizsrY0pjSAFgjnQxMlLbmwqzWwGQEZksKWEQmUYoAVAVVVNSrccjq3nLKAAyopQmlLOiYxQAYUIqS0pn477hFQDABf40STmIe5IEIEzIalnSk3EWau0CDEwlTHg5DyYzPFEuwJaphAnGWKCpExCbuUNJfCD0UboALEOYgK9U2bsBA/0xriJnLAAgTSBFTOhEkYUDgO8pJvB5kFPrAGBCjgm4yi96N4BliA5ll5V56gIcZM2R9QSduwEsQ9KEVDxu3QCWITmuiUiwWwSwDAGQK3VWLwP2RLDflUgscAA2IiI2MxGZegAREZwTEoUsFwD4nmPBVBKyXgAQk722AOcrk4wLgAk9s4KSIkbYAcC3FgvkJl0uAjChsJPiBRP4kpwAJp89V8SYcMICF4C867MFxWTk83lBLi4A0OW0JQ3aBL4kL4Aupy1pY3abrZYeADuaOY2R0cD8cAIwIeNoVelx5UtaBDB9enO0MibEGuMDYEKrf9Rmbmb6R+cFYEIxnSQYlkFb6QOwsiYcrSo9LJXmeQGYwNFq0EDD8wPY1jOxRWqeF4AJrCsxu/yFgD1/72ACX5IPQM69XNlSPwAT6BFgeRmAnAuAJOQHYEIJkIT8AHKuJbBYAYjpEWDrB0gT0pmr/RrAwLzjZLIGsDUBmFD4AdKEfOZquwqgjjIgwoILAcMs4JSpdYBtIvUhXwmIfkkdd44Xb+C/+6GAG7hjCQQE3zMFX5WFAsJv+wJTeIcr07AUgm99wy+uadcWQAuLp4r1+f8DlVKhz9lAdawAAAAASUVORK5CYII=', 'searchUrl': 'https://en.wikipedia.org/w/index.php?search=%band%+%release%&go=Go', 'bar': 1}, { 'name': 'YouTube', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAP1BMVEUAAAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/AAD/////8PD/0ND/wMD/kJD/gID/UFD/QED/ICD/EBBwI9TdAAAACnRSTlMAwECAMBDwsGAgE90AyAAAAHFJREFUOMvVkkkOgCAMRYXKYBEH9P5nVdCoIdImuuJt/1t0+E09KGkBxAMAK9UVtwJfEe2ZayygD8NgEZMEJIh5RwlxUIk3cy7ITHDDwgiun2hhxwdKSIzrP8GHD0MSa7KHYk/NPYt9N1sYrnJcaathA2rBFn/0Nk1kAAAAAElFTkSuQmCC', 'searchUrl': 'https://www.youtube.com/results?search_query=%band%+%release%', 'bar': 1} ]; var public_sites = [ { 'name': '1Gabba', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAulBMVEV0WUj////6+vqKhIN1Wkn08vLVzsqxopiVgXR3XUxxVkVnTj9iSjxZQjU+LCUzJiU6Jx8rGhXp5ePTysW9ubmzrq2TjIugjoKNd2lyammKc2RdVFRYTk1GOztOOC0oFxT8/Pz49vbu7e3t7Ozn5ubj4eHl4N3g2tfKx8fOxb/Hvba0sLDBtq65q6O1pp2hnJymloukk4ifjIF7dHSSfXBtZWSEbV5iWlpTR0VsUkNTPTFIMik1KilDLibbc1XpAAAAyUlEQVQ4y7WR1xKCMBREE6JIb1IEEey99/r/v6VjdMwMueaJfd0zOye5qJxUjorCb9QkWk5lT8I4NIvtVvba+JvWpQhM8C/VnLM/ZICZxTGTGCDmKCSYyV0rAhHTD1yOwiYgh5RQYHVDnBg6QnMKnAwEZEQBG+pV+pK+CwF7OhA8IKBGgZ0JAfXPITTozNV3L+XQQIMOjB2BQpgJFJr6fwVsCxR6rkDBtyBApgC5QofoCBwVLHBcvMquT1Lwm9bx2XIyA8HRUCl5AhutCp6fvI66AAAAAElFTkSuQmCC', 'searchUrl': 'https://1gabba.pw/frontpage?title=%band%+-+%release%', 'loggedOutRegex': /Cloudflare|Ray ID/, 'matchRegex': /class="node/, 'positiveMatch': true, 'bar': 2}, { 'name': '1Techno', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAUVBMVEUAqlQAqlUA/wAAqlX////P799pzZsDq1ft+fNly5jb8+ef379byJJwz5/5/fuy5ctVxo5IwoU6vnzL7dzB6tag38CU27iE1a1Xxo8VsWMPrl/oZoaWAAAAA3RSTlPmewHs1fhnAAAAeklEQVQ4y+2TywqAIBBFx8xeWqm9+/8PzUEjCVKIFi46qwtzFjMwFzIC9BEgGRAahACEBZyHSUjY2pExJqlgPsoJpey7HClom/sIJ2iTg8J+CYpzPmHsuEGfO/SzWKyAlBir+xX1L3wkrI1BWAHjkOBPvq8WRMsbrf8B/wsPKn5qb10AAAAASUVORK5CYII=', 'searchUrl': 'https://1techno.org/?t=%band%+-+%release%', 'loggedOutRegex': /Cloudflare|Ray ID/, 'matchRegex': /find any results/, 'bar': 2}, { 'name': '1Trance', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABL1BMVEUAAAAAzWQExWEAzWQDymMHpVQC6HIC0GYHpVQAzWQC6HIHpVQAzWQC6HIC6HIAzWQGqlYB320HpVQB428CvF0C6HIHpVQAzWQC6HIHpVQHpVQC6HIAzmQAzWQHpVQHpVQC6HIAzmQAzWQC6HIHpVQAzmQAzWQHplQC6HIC53EAz2QHpVQC5nAA0WYC6HIAzWQHpVQB324C6HIC6HIHpVQAzWQB2moHpVQC6nMHolIB22sAzWQC6HIC6HIC6HIHpFQAzWQAzWQC6HIC6HIHpVQHpVQC6HIHpVQHpVQAzWQHpVQAzWQHpVQC6HIHpVQGqVYBxWEFsFgHpVQDvV0B22sAzWQC6HIEtVoHpVQAzWQAzWQC6HIC6HIHpVQAzWQC6HIAzWQHpVQC6HIHpVQAzWTZU+3UAAAAYnRSTlMA+AREAnN0B/r89fLx76aMVBISDQn79+3q6uPi4dfXzMvAt6+vrZqajIqBfnNuaF9eWlFIPjkvJB8YF+nd2dPRy8rEwMC6uLa0paKhjoKCgHVva2ppaV5cSUhCPzYtLCUkDYPAI4AAAAE1SURBVDjL3ZJVkoRAEAULRmAcGHd3d1l3d/dd4P5n2Oi3AhNzg8mfrujMjvppWkKs/MIw7/s9AkJ7RECpm73QitgxyL6wBcO4IJq8XHGqCD6LDg7BIK1phv/IqyqC4aaus4DvxDRT8JJREfDthI7gq+7SjIC/j6uMRqDm1hFMj0XNCPxnHvi17olDZ2SlXWjxEH7iDcLv3GahuaOrFLzrXGH+dRs66G0m4d2+iyh8rMOz9b1VeE+1FoZPXJZD8OkB1tt/1scbJQ5+6+ZAA4Ux9nud8JluDtpRfNiADp0qBFSQnzzjPefz2+Cj1wIZgbMik4UFK3cCIUg9EhlBpCUQguSTlRDsvZEpWO9bCUHunYgFYnlKpmB/hNPiLs0IgcsWIBPVGYFh8/dakuZ/Ef93/g+0hHwDCu1apon9qdkAAAAASUVORK5CYII=', 'searchUrl': 'https://1trance.org/?t=%band%+-+%release%', 'loggedOutRegex': /Cloudflare|Ray ID/, 'matchRegex': /find any results/, 'bar': 2}, { 'name': 'Alterportal', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAXVBMVEUBAAAMChFVVVUzNDUlIiEYFxYRNUoHJS8OGiYjUWnP/P6s5f2GvOc2ncoYXIctdpgskrNPjK0wWYeM1vx70PqOy952ptNriK5Wco7z//+t2PSa0/SOyPGJ2ONGbrnTmD37AAAAjUlEQVQY012LBw7DMAwDqTqRvJ2ddP7/mZVbowF6WiBE4vIHjDHszAm6jvLQnYB6KolIj62LoJ2TpR/VkRNTr9i6oHBiCOGEB5bBiQDCqFB2MrnM4CLNwlbcWspo61sLNj19WA5Cw47+6ue9CZ1p9v7+MNWvQsfFcIsbfTReBBpDiPFo+Z0gW4jLar+JN3L0BYwvMQFJAAAAAElFTkSuQmCC', 'searchUrl': 'https://alterportal.net/index.php?do=search&subaction=search&titleonly=3&story=%band%+%release%', 'loggedOutRegex': /Cloudflare|Ray ID/, 'matchRegex': /никаких результатов/, 'bar': 2}, { 'name': 'BitSearch', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAALVBMVEUAAABpMeY+LupRL+hbMef///9HL+lxT+uLcu+nlPO/sPbTyfn18v7j3fvs6P0FKMLaAAAAAXRSTlMAQObYZgAAArdJREFUSMd9lc9rE1EQxx9paX6csrCgVbzswbtsIPHW1cUkSg+iDzVJezBlbT0lTUhbT61Ni70FpFqhij9BpHgy+Bd48OhB8C6l/0Zn3subeZts+80lyXzzeTNvdiYirlwuJ87RgaO0cUY445A2k+Lp0GG1kuJh4LquE2jHswl+CHLOYYQo+HUAL61BLN4PlSgOuhhLoBAaRPIhHT/UgiRdY7hgAXzfQriMYIBPCI4zIgNxQqy3Jy90ykfp+Du5sEWMvNC66RPispTyESPoBELsS9DWWJozTd8ggl9o+EOEWWXoRYSoSNQDrkQZoogQVW2IJ5GOIkJowl2+zjymEDGiPE64BIbdyEJ8QcNDBxDc0luRhbiChrrVVJWjhQiO0NFnhBBZDDMieLE3lCeB3Y6r2sHXWR4udgnREtOeNpTe9E1HbiOC6kx5CrF8LBvbIwTU8rUNCGNQiB0szyDuwIefTEDEkurSS98vfv8HWcD7RttxVbs+eohYlqh6v3woG90wHMKHDy46kICIp5L1GR4LajoSQMkGRMwCARH6iIWDPYBvQxnooyNQlGTp728o5FjKxa6aESQoBJZZw+sswiNcxTJxRpjgrcB3r0xHduCicAZgEPNixtOIjW+vTUdK+HOUIqQ9LW5qYb8W0qS2RGZkME1dW3srf5hJVe32bMTSoQR1eNiFMjBiHuM1HnY0rNqIodRdNYgyGFIW4ol+7H1CzOFceIxYUYb7vC9wcLImTk29x/tC7cLHjNCE/7QvAoFKMULn8Ike8KrecR5JVdHo0L4Y7TmPEfNYJc+I0HrOjuaRrPdozCpmj1qI5nqPx4w26So77Em9Joym2WBP6pwg3UhCFAQrnYRgQHIWRWErM4kY+2ucGkeYA0i7ccR1wWIHI0qJf72MaIlEZUeQijhb7webAxHTKcR6cpKOAKdYAAAAAElFTkSuQmCC', 'searchUrl': 'https://bitsearch.to/search?q=%band%+%release%&category=7&subcat=', 'loggedOutRegex': /Cloudflare|Ray ID/, 'matchRegex': /Found 0Total hits : 0Not FoundRemember meRemember meYes<|Nichts gefunden!|Aucune requête trouvée!|Nada Encontrado!|Нет результатов!|何も見つかりませんでした/, 'bar': 2}, { 'name': 'KG-Release', 'icon': 'data:image/png;base64,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', 'searchUrl': 'https://karagarga.in/browse.php?search="%release%"&search_type=title&cat=2', 'loggedOutRegex': /Cloudflare|Ray ID|Not logged in!/, 'matchRegex': /No torrents found/, 'bar': 2}, { 'name': 'KrayTracker', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAGFBMVEX///8PDw9DQ0PPz8+1tbXm5uaZmZlycnIcxpxNAAAAWklEQVQI12MQhAIGAQYGBhY1BkYww7EUxGAuYBZjADFYRI0cwAxmFRUGMINByQDCYBaEMoLVYVJljgkQRhKbeACY4cSgqApmGAWECwWAGQ4MhgpQBrMQI9wZAKfJCmjjqO55AAAAAElFTkSuQmCC', 'searchUrl': 'https://kraytracker.com/torrents.php?searchstr=%band%+%release%', 'loggedOutRegex': /Cloudflare|Ray ID|>Remember meRemember meKeep me logged in.Keep me logged in.Remember meRemember meRemember meRemember me0 results0 results<\/tbody>/, 'replaceSpecials': true, 'bar': 3}, { 'name': 'srrDB', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAAAUVBMVEUAAAAAAAAAAAAAAAAAAAC7u7v///+ZzP/Mmf+Z/5n/mZn//2b/mWaMjIxymL6Ycr5yvnK+cnK+vky+ckxUcY1xVI1nZ2dUjVSNVFSNjTiNVDi2juC+AAAABHRSTlN9PL4AffGBGQAAAMlJREFUWMPtlzcOwzAQBElLVKZy/v9DjXVBLK5Q4StkyJxygJ3uCNAk1qRfY2xi7CtV8LLGpCqw1/EJ7ENFDDvcOTXEdMIdY02MRwhgzwU47LkAhz0XQqASwDUCuFoQAzHwtIDqmPTnrOBJga0viX6Dm9ucaGe4pSuIbgkB7LkAhz0X4LDnQgiUArhcAFcIYiAGnhZQHJPunH/oRbo/sHpH+BXOu4xw/jKAPRfgsOfCZcAJ4DJBDMTAPwR0x6Q/53u/rkb9+VZ//9+xTWbto7vDzQAAAABJRU5ErkJggg==', 'searchUrl': 'https://api.srrdb.com/v1/search/%band%/%release%', 'goToUrl': 'https://www.srrdb.com/browse/%band%/%release%', 'matchRegex': /resultsCount":"0/, 'spaceEncode': '/', 'replaceSpecials': true, 'bar': 3}, { 'name': 'xREL', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAV1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/vgD/uwD/mgD/sAD/owD/twD/jAA3cDarAAAAFXRSTlMAFgdFUjEbD9U+TS4OwsC+639yYihON4QCAAAAgElEQVQY04WOSQ7DMAwDLctrk3Snt/b/76ycGr4FGeggigJIdYD25Bx5PTVZNoYt6S5WIhc3CFfru7lENk/knBKYlPL2hhBwB5BgnFLEyH1PKef/4YIPZIQ6DgG1Aq2VAqb9owEFM4W4qy8er9FjpGz83puOHhwXMQfSVFinPuUHh/cIEFGhr1oAAAAASUVORK5CYII=', 'searchUrl': 'https://www.xrel.to/search.html?xrel_search_query=%band%+%release%&lang=en_US', 'matchRegex': /not return any results/, 'bar': 3} ]; var sites = public_sites.concat(private_sites, other_sites, pre_databases); //============================================================================== // Replace Search URL parameters //============================================================================== // URLs for tests: // https://www.discogs.com/artist/2274430-Tuning-Circuits // https://www.discogs.com/master/2385727-Twice-Formula-Of-Love-OT3 // https://www.discogs.com/master/1257041-For-King-Country-Crave // https://www.discogs.com/master/1787931-Baauer-Planets-Mad async function replaceSearchUrlParams(site, band, release, mPOSTsearch) { var search_url = ('mPOST' in site && !mPOSTsearch) ? site['mPOST'] : site['searchUrl']; var space_replace = ('spaceEncode' in site) ? site['spaceEncode'] : '+'; let band_str = band.replace(/\(\d+\)/g, '') // delete brackets with numbers inside .replace(/\*/g, '') // delete * .replace(/^Unknown Artist$/, '') // delete string if Various and ect.: .replace(/^No Artist$/, '') .replace(/^Anonymous$/, '') .replace(/^Various$/, '').trim(); let release_str = release.replace(/\(.+\)/g, '') // delete brackets with anything inside .replace(/-|–/g, ' ').trim(); // replace - – with space release_str = GM_config.get('remove_ep') ? release_str.replace(/\sEP+$|\sE\.P\.+$|\sE\.P/i, '') : release_str // remove " EP"," E.P." & " E.P" from the end if (site['replaceSpecials'] === true) { // Replace non latin | Special chars remove. Not included "`", "-", ".", "_". band_str = band_str.trim().replace(/[\u0250-\ue007]/g, ' ').replace(/\'/g, '').replace(/\¬|\!|\"|\£|\$|\%|\^|\&|\*|\(|\)|\+|\=|\||\\|\[|\]|\;|\#|\,|\?|\/|\{|\}|\:|\@|\~|\<|\>/g, ' '); release_str = release_str.trim().replace(/[\u0250-\ue007]/g, ' ').replace(/\'/g, '').replace(/\¬|\!|\"|\£|\$|\%|\^|\&|\*|\(|\)|\+|\=|\||\\|\[|\]|\;|\#|\,|\?|\/|\{|\}|\:|\@|\~|\<|\>/g, ' '); } // encode illegal chars band_str = band_str.replace(/\+/g, '%2B').replace(/&/g, '%26').replace(/#/g, '%23').replace(/=/g, '%3D').replace(/\s+/g, space_replace).trim(); release_str = release_str.replace(/\+/g, '%2B').replace(/&/g, '%26').replace(/#/g, '%23').replace(/=/g, '%3D').replace(/\s+/g, space_replace).trim(); var s = search_url.replace(/%band%/g, band_str) .replace(/%release%/g, release_str); return s; } //============================================================================== // Get site's icon //============================================================================== function getFavicon(site, hide_on_err) { var favicon; if (typeof(hide_on_err) === 'undefined') { hide_on_err = false; } else if (hide_on_err === false) { return; } if ('icon' in site) { favicon = site['icon']; } else { var url = new URL(site['searchUrl']); favicon = url.origin + '/favicon.ico'; } const size = GM_config.get('mod_icons_size'); const border = parseInt(GM_config.get('iconsborder_size')) *2; var iconsize = (site['bar'] == 1) ? size : GM_config.get('auto_search') ? size - border : size; var title = site['name']; var img = $('').attr({'style': '-moz-opacity: 0.4; border: 0', 'width': iconsize, 'height': iconsize, 'src': favicon, 'title': title, 'alt': site['name']}); if (hide_on_err) { img.attr('onerror', "this.style.display='none';"); } return img; } //============================================================================== // Create elements and add search links //============================================================================== function addLink(elem, site_name, target, site, state, scout_tick, post_data) { // State should always be one of the values defined in valid_states. if ($.inArray(state, valid_states) < 0) { console.log("Unknown state: " + state); } var link = $('').attr('href', target).attr('target', '_blank').attr('rel', 'noreferrer'); // Link and add Form element for POST method. if ('mPOST' in site) { var form_name = site['name'] + '-form-' + scout_tick; form_name = form_name.replace(/\s|\.|\(|\)/g, '-'); var placebo_url = new URL(target).origin; link = $('').attr('href', placebo_url).attr('onclick', "document.getElementById('"+form_name+"').submit(); return false;").attr('target', '_blank').attr('rel', 'noreferrer'); //var data = (post_data.match('{')) ? post_data.replace(/\+/g, ' ') : '{"' + post_data.replace(/&/g, '","').replace(/=/g, '":"').replace(/\+/g, ' ') + '"}'; var data = (post_data.match('{')) ? post_data.replace(/\+/g, ' ') : '{key:"' + post_data.replace(/&/g, '"},{key:"').replace(/=/g, '",value:"').replace(/\+/g, ' ') + '"}'; var addform = $('
'); addform.attr('id', form_name); addform.attr('action', target); addform.attr('method', 'post'); addform.attr('style', 'display: none;'); addform.attr('target', '_blank'); addform.attr('rel', 'noreferrer'); if (data.match('},{')) { const dataArray = (new Function("return [" +data+ "];")()); dataArray.forEach(function (item, index) { let addinput = $(""); addinput.attr('type', 'text'); addinput.attr('name', item.key); addinput.attr('value', item.value); addform.append(addinput); $('body').append(addform); }); } else { data = JSON.parse(data); for (const name in data) { let addinput = $(""); addinput.attr('type', 'text'); addinput.attr('name', name); addinput.attr('value', data[name]); addform.append(addinput); $('body').append(addform); } } } // Icon appearance. let icon; const border_width = GM_config.get('iconsborder_size'); if (GM_config.get('auto_search') && site['bar'] != 1) { icon = getFavicon(site); icon.css({'border-width': border_width, 'border-style': 'solid', 'border-radius': '2px', 'margin': '1px 2px 2px'}); if (state == 'error' || state == 'logged_out') { (GM_config.get('highlight_sites').split(',').includes(site['name'])) ? icon.css('border-color', 'rgb(255,0,0)') : icon.css('border-color', 'rgb(180,0,0)'); } else if (state == 'missing') { (GM_config.get('highlight_sites').split(',').includes(site['name'])) ? icon.css('border-color', 'rgb(255,255,0)') : icon.css('border-color', 'rgb(230,200,100)'); } else if (state == 'found') { (GM_config.get('highlight_sites').split(',').includes(site['name'])) ? icon.css('border-color', 'rgb(0,220,0)') : icon.css('border-color', 'rgb(0,130,0)'); if ((site['name']).match('-Req')) icon.css('border-color', 'rgb(50,50,200)'); } link.append(icon); } else { icon = getFavicon(site); icon.css({'border-width': '0px', 'border-style': 'solid', 'border-radius': '2px', 'margin': '1px 2px 2px'}); (GM_config.get('highlight_sites').split(',').includes(site['name'])) ? icon.css('border-color', 'rgb(0,220,0)') : icon.css('border-color', 'rgb(0,130,0)'); if ((site['name']).match('-Req')) icon.css('border-color', 'rgb(50,50,200)'); link.append(icon); } // Create elements on Release/Master pages. if (onReleasePage) { const background = GM_config.get('greybackground_view') ? 'rgb(51, 51, 51)' : ''; if ($('.result_box_main').length == 0) { $(elem).after($('
').addClass('result_box_main')); $('.result_box_main').css({'background-color': background, 'padding': '4px 4px 0px 4px'}); $('.result_box_main').append($('
').addClass('result_bar_1st')); $.each(valid_states, function(i, name) { $('.result_bar_1st').append(""+''); }); $('.result_box_main').append($('
').addClass('result_bar_2nd')); $.each(valid_states, function(i, name) { $('.result_bar_2nd').append(""+''); }); $('.result_box_main').append($('
').addClass('result_bar_3rd')); $.each(valid_states, function(i, name) { $('.result_bar_3rd').append(""+''); }); } // Add links to elements on Release/Master pages. if (site['bar'] == 1 || GM_config.get('all_in_one_bar')) { $('#discogscout1_' + state).append(link); } else if (site['bar'] == 2) { $('#discogscout2_' + state).append(link); } else if (site['bar'] == 3) { $('#discogscout3_' + state).append(link); } } else { // Create elements on Artist/Label/Collection/Wantlist/MyWantlist/List pages. const background = GM_config.get('greybackground_view') ? 'rgb(51, 51, 51)' : ''; if ($('.result_box_main' + scout_tick).length == 0) { $(elem).after($('').append($('',{'colspan':'11'}).addClass('result_box_main' + scout_tick))); $('.result_box_main' + scout_tick).css({'background-color': background, 'padding': '0px 4px'}); $('.result_box_main' + scout_tick).append($('
').addClass('result_bar_1st' + scout_tick)); $.each(valid_states, function(i, name) { $('.result_bar_1st' + scout_tick).append(""+''); }); $('.result_box_main' + scout_tick).append($('
').addClass('result_bar_2nd' + scout_tick)); $.each(valid_states, function(i, name) { $('.result_bar_2nd' + scout_tick).append(""+''); }); $('.result_box_main' + scout_tick).append($('
').addClass('result_bar_3rd' + scout_tick)); $.each(valid_states, function(i, name) { $('.result_bar_3rd' + scout_tick).append(""+''); }); } // Add links to elements on Artist/Label/Collection/Wantlist/MyWantlist/List pages. if (site['bar'] == 1 || GM_config.get('all_in_one_bar')) { $('#discogscout1_' + state + scout_tick).append(link); } else if (site['bar'] == 2) { $('#discogscout2_' + state + scout_tick).append(link); } else if (site['bar'] == 3) { $('#discogscout3_' + state + scout_tick).append(link); } } } //============================================================================== // Determine whether a site should be displayed //============================================================================== async function maybeAddLink(elem, site_name, search_url, site, scout_tick, band, release) { // Connection rate limiter per domain. var set_rate = ('rateLimit' in site) ? site['rateLimit'] : 500; var rate = (set_rate > 1000) ? set_rate : set_rate * 4; var domain = search_url.split('/')[2]; var now = (new Date())*1; var lastLoaded = window.localStorage[domain+'_lastLoaded']; if (!lastLoaded) { lastLoaded = now - 50000; } else { lastLoaded = parseInt(lastLoaded); } if (now - lastLoaded < rate) { window.setTimeout(maybeAddLink.bind(undefined, elem, site['name'], search_url, site, scout_tick, band, release), rate); return; } else { window.localStorage[domain+'_lastLoaded'] = (new Date())*1; } var success_match = ('positiveMatch' in site) ? site['positiveMatch'] : false; var target = search_url; if ('goToUrl' in site) { target = await replaceSearchUrlParams({'searchUrl': site['goToUrl'], 'spaceEncode': ('spaceEncode' in site) ? site['spaceEncode'] : '+', 'replaceSpecials': ('replaceSpecials' in site) ? site['replaceSpecials'] : false}, band, release); } // Check for results with POST method. if ('mPOST' in site) { const post_data = await replaceSearchUrlParams(site, band, release); GM.xmlHttpRequest({ method: 'POST', timeout: parseInt(GM_config.get('timeout_ms')), url: search_url, data: post_data, headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, onload: function(response) { if (GM_config.get('debug_sites')) { const name = site['name']; console.log(name + " POST Response Status: " + response.status + "\n "); console.log(name + " POST Response Headers: " + response.responseHeaders + "\n "); console.log(name + " POST Response: " + response.responseText + "\n "); } if (response.responseHeaders.indexOf('efresh: 0; url') > -1 || response.status > 499 || (response.status > 399 && !site.ignore404) || (response.responseText == "" && !site.ignoreEmpty)) { addLink(elem, site_name, target, site, 'logged_out', scout_tick, post_data); } else if (site['positiveMatch'] && site['loggedOutRegex'] && String(response.responseText).match(site['loggedOutRegex'])) { addLink(elem, site_name, target, site, 'logged_out', scout_tick, post_data); } else if (String(response.responseText).match(site['matchRegex']) ? !(success_match) : success_match) { if (!GM_config.get('hide_missing')) { addLink(elem, site_name, target, site, 'missing', scout_tick, post_data); } } else if (site['loggedOutRegex'] && String(response.responseText).match(site['loggedOutRegex'])) { addLink(elem, site_name, target, site, 'logged_out', scout_tick, post_data); } else { addLink(elem, site_name, target, site, 'found', scout_tick, post_data); } }, onerror: function() { addLink(elem, site_name, target, site, 'error', scout_tick, post_data); console.log("Discogs Scout (POST-Request Error. Site): " +site_name); }, onabort: function() { addLink(elem, site_name, target, site, 'error', scout_tick, post_data); console.log("Discogs Scout (POST-Request aborted. Site): " +site_name); }, ontimeout: function() { addLink(elem, site_name, target, site, 'error', scout_tick, post_data); console.log("Discogs Scout (POST-Request timed out. Site): " +site_name); } }); return; } // Request header tweaks let reqHeader = {}; // Check for results with GET method. GM.xmlHttpRequest({ method: 'GET', headers: reqHeader, timeout: parseInt(GM_config.get('timeout_ms')), url: search_url, onload: function(response) { if (GM_config.get('debug_sites')) { const name = site['name']; console.log(name + " GET Response Status: " + response.status + "\n "); console.log(name + " GET Response Headers: " + response.responseHeaders + "\n "); console.log(name + " GET Response: " + response.responseText + "\n "); } if (response.responseHeaders.indexOf('efresh: 0; url') > -1 || response.status > 499 || (response.status > 399 && !site.ignore404) || (response.responseText == "" && !site.ignoreEmpty)) { addLink(elem, site_name, target, site, 'logged_out', scout_tick); } else if (site['positiveMatch'] && site['loggedOutRegex'] && String(response.responseText).match(site['loggedOutRegex'])) { addLink(elem, site_name, target, site, 'logged_out', scout_tick); } else if (String(response.responseText).match(site['matchRegex']) ? !(success_match) : success_match) { if (!GM_config.get('hide_missing')) { addLink(elem, site_name, target, site, 'missing', scout_tick); } } else if (site['loggedOutRegex'] && String(response.responseText).match(site['loggedOutRegex'])) { addLink(elem, site_name, target, site, 'logged_out', scout_tick); } else { addLink(elem, site_name, target, site, 'found', scout_tick); } }, onerror: function() { addLink(elem, site_name, target, site, 'error', scout_tick); console.log("Discogs Scout (GET-Request Error. Site): " +site_name); }, onabort: function() { addLink(elem, site_name, target, site, 'error', scout_tick); console.log("Discogs Scout (GET-Request aborted. Site): " +site_name); }, ontimeout: function() { addLink(elem, site_name, target, site, 'error', scout_tick); console.log("Discogs Scout (GET-Request timed out. Site): " +site_name); } }); } //============================================================================== // Perform code for sites //============================================================================== function perform(elem, band, release, scout_tick) { let site_shown = false; $.each(icon_sites, async function(index, site) { if (site['show']) { site_shown = true; const searchUrl = await replaceSearchUrlParams(site, band, release, true); const post_data = await replaceSearchUrlParams(site, band, release, false); // run on non-post sites too to keep order of icons addLink(elem, site['name'], searchUrl, site, 'found', scout_tick, post_data); } }); $.each(sites, async function(index, site) { if (site['show']) { site_shown = true; var searchUrl = await replaceSearchUrlParams(site, band, release, true); if ('goToUrl' in site && GM_config.get('auto_search')) { maybeAddLink(elem, site['name'], searchUrl, site, scout_tick, band, release); } if ('goToUrl' in site && !GM_config.get('auto_search')) { searchUrl = await replaceSearchUrlParams({'searchUrl': site['goToUrl'], 'spaceEncode': ('spaceEncode' in site) ? site['spaceEncode'] : '+', 'replaceSpecials': ('replaceSpecials' in site) ? site['replaceSpecials'] : false}, band, release); addLink(elem, site['name'], searchUrl, site, 'found', scout_tick); } if (!('goToUrl' in site) && GM_config.get('auto_search')) { maybeAddLink(elem, site['name'], searchUrl, site, scout_tick, band, release); } if (!('goToUrl' in site) && !GM_config.get('auto_search')){ const post_data = await replaceSearchUrlParams(site, band, release, false); // run on non-post sites too to keep order of icons addLink(elem, site['name'], searchUrl, site, 'found', scout_tick, post_data); } } }); // Open settings if no sites selected: if (!site_shown) { GM_config.open(); } } //============================================================================== // Artist Page code //============================================================================== async function performArtist() { const band = $('meta[property="og\:title"]').attr('content').replace(/\(\d+\)/, '').trim(); // Wait for dynamic content to be loaded: await sleep(1000); if($('.textWithCoversRow_3IhZ3').length == 0) { await sleep(1000); if($('.textWithCoversRow_3IhZ3').length == 0) { await sleep(1000); } } if($('.textWithCoversRow_3IhZ3').length !== 0) { $('.textWithCoversRow_3IhZ3').each(function() { const elem = $(this); const release = $(this).find('.title_oY1q1>.link_1ctor').text(); let scout_tick = window.localStorage['_discogscout_tick']; if (!scout_tick) { scout_tick = 1; window.localStorage['_discogscout_tick'] = scout_tick; } perform(elem, band, release, scout_tick); scout_tick = parseInt(scout_tick) + 1; window.localStorage['_discogscout_tick'] = scout_tick; }); startObserver2(); } else { GM.notification("Artist page code error or No releases!", "Discogs Scout"); console.log("Discogs Scout: Artist page code error or No releases!"); } } function startObserver2() { console.log('Discogs Scout: Starting Observer2.'); if ($('.releasesPath_2MuQ7').length) { const obscfg = {childList: true}; const obs = new MutationObserver(start_performArtist); obs.observe($('.releasesPath_2MuQ7')[0], obscfg); } } function start_performArtist(mutation, observer) { console.log('Discogs Scout: Observer2 is triggered.'); observer.disconnect(); performArtist(); } //============================================================================== // Release Page code //============================================================================== async function performRelease() { const elem = $('[class^=body]'); // This won't work properly if " - " is in band's name: // const title = $('meta[property="og\:title"]').attr('content').trim(); // const band = title.replace(/ - .+/, '').trim(); // const release = title.replace(/.+? - /, '').trim(); let band = ""; let release = ""; if (Boolean(location.href.match('/master/'))) { if ($('[id*=profile_title]').length > 0) { // the old version of the master page band = $('[id*=profile_title]').find('a').text().trim(); release = $('[id*=profile_title]').children().last().text().trim(); } else if ($('#master_schema').length > 0) { // the new version of the master page (beta) band = $('[class^=body]').find('h1>span>a.link_15cpV:first').text().trim(); release = JSON.parse(document.getElementById('master_schema').textContent)['@graph'][0]['name']; } } else if (Boolean(location.href.match('/release/'))) { if ($('#release_schema').length > 0) { band = $('[class^=body]').find('h1>span>a.link_15cpV:first').text().trim(); release = JSON.parse(document.getElementById('release_schema').textContent)['name']; } } if (band == "" || release == "") { GM.notification("Release code error!", "Discogs Scout"); console.log("Discogs Scout: Release code error!"); return; } perform(elem, band, release); } //============================================================================== // Label/Collection/Wantlist/List Page code //============================================================================== function performList() { if($('.shortcut_navigable').length !== 0) { $('.shortcut_navigable').each(function() { const elem = $(this); let band = ""; let release = ""; if (onLabelPage) { // https://www.discogs.com/label/34268-Roadrunner-Records band = $(this).find('.artist>a').text().trim(); release = $(this).find('.title>a' ).text().trim(); } else if (onWantlistPage || onCollectionPage) { // https://www.discogs.com/wantlist?user=GPX // https://www.discogs.com/user/GPX/collection band = $(this).find('.release_title>a:eq(0)').text().trim(); if ($(this).find('.release_title>a[href*="/release/"]').length > 0) { release = $(this).find('.release_title>a[href*="/release/"]:eq(0)').text().trim(); } else if ($(this).find('.release_title>a[href*="/master/"]').length > 0) { release = $(this).find('.release_title>a[href*="/master/"]:eq(0)').text().trim(); } } else if (onMyCollectionPage) { // own collection page band = $(this).find('.collection-card-title>a:eq(0)').text().trim(); if ($(this).find('.collection-card-title>a[href*="/release/"]').length > 0) { release = $(this).find('.collection-card-title>a[href*="/release/"]:eq(0)').text().trim(); } else if ($(this).find('.collection-card-title>a[href*="/master/"]').length > 0) { release = $(this).find('.collection-card-title>a[href*="/master/"]:eq(0)').text().trim(); } } else if (onMyWantlistPage) { // own wantlist page // https://www.discogs.com/mywantlist band = $(this).find('.release_title>a:eq(0)').text().trim(); if ($(this).find('.release_title_link>a[href*="/release/"]').length > 0) { release = $(this).find('.release_title_link>a[href*="/release/"]:eq(0)').text().trim(); } else if ($(this).find('.release_title_link>a[href*="/master/"]').length > 0) { release = $(this).find('.release_title_link>a[href*="/master/"]:eq(0)').text().trim(); } } else if (onListPage) { // This won't work properly if " - " is in band's name or there are more than one artist in title: const title = $(this).find('.listitem_title>a:eq(0)').text().trim(); band = title.replace(/ - .+/, '').trim(); release = title.replace(/.+? - /, '').trim(); } if (band == "" || release == "") { GM.notification("List page code error 1!", "Discogs Scout"); console.log("Discogs Scout: List page code error 1!"); Discogs_Scout__Generate_Not_Defined_Error_To_Stop_The_Script(); } let scout_tick = window.localStorage['_discogscout_tick']; if (!scout_tick) { scout_tick = 1; window.localStorage['_discogscout_tick'] = scout_tick; } perform(elem, band, release, scout_tick); scout_tick = parseInt(scout_tick) + 1; window.localStorage['_discogscout_tick'] = scout_tick; }); } else { GM.notification("List page code error 2!", "Discogs Scout"); console.log("Discogs Scout: List page code error 2!"); return; } } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } //============================================================================// //================================ MAIN ====================================// //============================================================================// //============================================================================== // Polyfill for GM3 notifications //============================================================================== if (typeof GM.notification === "undefined") { this.GM_notification = function(options) { const opts = {}; if (typeof options === "string") { opts.text = options; opts.title = arguments[1]; opts.image = arguments[2]; opts.onclick = arguments[3]; } else { Object.keys(options).forEach(function(key) { opts[key] = options[key]; }); } checkPermission(); function checkPermission() { if (Notification.permission === "granted") { fireNotice(opts); } else if (Notification.permission === "denied") { alert("User has denied notifications for this page/site!"); // eslint-disable-next-line no-useless-return return; } else { Notification.requestPermission(function(permission) { console.log("New permission: ", permission); checkPermission(); }); } } function fireNotice(ntcOptions) { if (ntcOptions.text && !ntcOptions.body) { ntcOptions.body = ntcOptions.text; } var ntfctn = new Notification(ntcOptions.title, ntcOptions); if (ntcOptions.onclick) { ntfctn.onclick = ntcOptions.onclick; } if (ntcOptions.timeout) { setTimeout(function() { ntfctn.close(); }, ntcOptions.timeout); } } }; GM.notification = GM_notification; } //============================================================================== // Settings Menu (GM_config) //============================================================================== // To have consistent spacing in different browsers. var set_cfg_iconsize_spacing = "   "; var timeout_ms_spacing = " "; if (navigator.userAgent.toLowerCase().indexOf('firefox') > -1) { set_cfg_iconsize_spacing = "  "; timeout_ms_spacing = ""; } var config_fields = { 'aftertitle': { 'section': ' ', 'label': '  ', 'type': 'hidden' }, 'mod_icons_size': { 'label': 'Size of the icons (pixels):    ', 'type': 'text', 'default': '32' }, 'iconsborder_size': { 'label': 'Size of the icons border:     ', 'type': 'select', 'options': ['2px', '3px', '4px', '5px', '6px'], 'default': '3px' }, 'cfg_iconsize': { 'label': 'Size of the settings icons:' + set_cfg_iconsize_spacing, 'type': 'text', 'default': '22' }, 'timeout_ms': { 'label': 'Timeout requests after:      ' + timeout_ms_spacing, 'type': 'select', 'options': ['10000 ms', '20000 ms', '30000 ms', '45000 ms', '60000 ms'], 'default': '30000 ms' }, 'debug_sites': { 'type': 'checkbox', 'label': 'Debug (the searchable sites)?', 'default': false }, 'auto_search': { 'type': 'checkbox', 'label': 'Auto-search sites for results?', 'default': true }, 'hide_missing': { 'type': 'checkbox', 'label': "Hide link if search didn't found results?", 'default': false }, 'greybackground_view': { 'type': 'checkbox', 'label': 'Enable grey background for the links?', 'default': true }, 'all_in_one_bar': { 'type': 'checkbox', 'label': 'Put all links into one bar?', 'default': false }, 'run_artistpages': { 'type': 'checkbox', 'label': 'Enable the script on Artist/Label/Collection/Wantlist/List pages?', 'default': false }, 'remove_ep': { 'type': 'checkbox', 'label': 'Remove "EP", "E.P." & "E.P" from the end of release titles?', 'default': true }, 'highlight_sites': { 'label': 'Highlight sites:      ', 'type': 'text', 'default': 'RED,OPS' } }; //============================================================================== // Add sites to Settings (GM_config) //============================================================================== $.each(icon_sites, function(index, site) { config_fields['show_' + site['name']] = { 'section': (index == 0) ? ['Icon sites (no search):'] : '', 'type': 'checkbox', 'label': ' ' + site['name'] }; }); $.each(public_sites, function(index, site) { config_fields['show_' + site['name']] = { 'section': (index == 0) ? ['Public download sites:'] : '', 'type': 'checkbox', 'label': ' ' + site['name'] }; }); $.each(private_sites, function(index, site) { config_fields['show_' + site['name']] = { 'section': (index == 0) ? ['Private download sites:'] : '', 'type': 'checkbox', 'label': ' ' + site['name'] }; }); $.each(other_sites, function(index, site) { config_fields['show_' + site['name']] = { 'section': (index == 0) ? ['Other sites/tools:'] : '', 'type': 'checkbox', 'label': ' ' + site['name'] }; }); $.each(pre_databases, function(index, site) { config_fields['show_' + site['name']] = { 'section': (index == 0) ? ['Pre databases:'] : '', 'type': 'checkbox', 'label': ' ' + site['name'] }; }); //============================================================================== // Initialize and register GM_config //============================================================================== GM_config.init({ 'id': 'discogs_scout', 'title': 'Discogs Scout Settings', 'fields': config_fields, 'css': `#discogs_scout_section_header_1, #discogs_scout_section_header_2, #discogs_scout_section_header_3, \ #discogs_scout_section_header_4, #discogs_scout_section_header_5 { \ background: #00ab00 !important; \ color: black !important; \ font-weight: bold !important; \ border: 0px !important; \ padding-left: 0px !important; \ text-align: middle !important;}\ .field_label { \ display: flex !important; \ align-items: center !important; \ font-weight: normal !important;}\ .config_var { \ margin-top: 2px !important; \ margin-bottom: 2px !important; \ display: flex !important; \ align-items: center !important;}\ #discogs_scout_aftertitle_var { \ margin-top: 0px !important; \ margin-bottom: 0px !important;}\ input { \ margin-top: 0px !important; \ margin-bottom: 0px !important;}\ .grey_link { \ margin-left: 4px !important;}\ #discogs_scout_section_header_0 { \ font-weight: bold !important; \ border: 0px !important; \ margin-top: 0px !important; \ background: #bfbfbf !important;}\ #discogs_scout_header { \ background: black !important; \ color: white !important;}\ #discogs_scout_section_0 { \ margin-top: 0px !important;}`, 'events': { 'open': function() { // Iframe position. this.frame.style.top = '50px'; this.frame.style.left = 'auto'; this.frame.style.right = '150px'; this.frame.style.height = '90%'; this.frame.style.width = '450px'; $('#discogs_scout').contents().find('input#discogs_scout_field_mod_icons_size').attr('size', '1'); $('#discogs_scout').contents().find('input#discogs_scout_field_cfg_iconsize').attr('size', '1'); const modVersion = 'Discogs Scout v' + GM.info.script.version; const modUrl = 'https://greasyfork.org/en/scripts/439452-discogs-scout'; $('#discogs_scout').contents().find('#discogs_scout_section_header_0').append($(''+modVersion+'')); $('#discogs_scout').contents().find('#discogs_scout_section_header_0').find('a').css({ 'text-decoration': 'none', 'color': '#cb0000' }); $('#discogs_scout').contents().find('#discogs_scout_section_1').find('.field_label').each(function(index, label) { var url = (icon_sites[index].goToUrl) ? new URL(icon_sites[index].goToUrl) : new URL(icon_sites[index].searchUrl); $(label).append(' ' + '' + (/www./.test(url.hostname) ? url.hostname.match(/www.(.*)/)[1] : url.hostname) + ''); $(label).prepend(getFavicon(icon_sites[index], true)); }); $('#discogs_scout').contents().find('#discogs_scout_section_2').find('.field_label').each(function(index, label) { var url = (public_sites[index].goToUrl) ? new URL(public_sites[index].goToUrl) : new URL(public_sites[index].searchUrl); $(label).append(' ' + '' + (/www./.test(url.hostname) ? url.hostname.match(/www.(.*)/)[1] : url.hostname) + ''); $(label).prepend(getFavicon(public_sites[index], true)); }); $('#discogs_scout').contents().find('#discogs_scout_section_3').find('.field_label').each(function(index, label) { var url = (private_sites[index].goToUrl) ? new URL(private_sites[index].goToUrl) : new URL(private_sites[index].searchUrl); $(label).append(' ' + '' + (/www./.test(url.hostname) ? url.hostname.match(/www.(.*)/)[1] : url.hostname) + ''); $(label).prepend(getFavicon(private_sites[index], true)); }); $('#discogs_scout').contents().find('#discogs_scout_section_4').find('.field_label').each(function(index, label) { var url = (other_sites[index].goToUrl) ? new URL(other_sites[index].goToUrl) : new URL(other_sites[index].searchUrl); $(label).append(' ' + '' + (/www./.test(url.hostname) ? url.hostname.match(/www.(.*)/)[1] : url.hostname) + ''); $(label).prepend(getFavicon(other_sites[index], true)); }); $('#discogs_scout').contents().find('#discogs_scout_section_5').find('.field_label').each(function(index, label) { var url = (pre_databases[index].goToUrl) ? new URL(pre_databases[index].goToUrl) : new URL(pre_databases[index].searchUrl); $(label).append(' ' + '' + (/www./.test(url.hostname) ? url.hostname.match(/www.(.*)/)[1] : url.hostname) + ''); $(label).prepend(getFavicon(pre_databases[index], true)); }); $('#discogs_scout').contents().find("img").css({"margin-right": "4px", "width": GM_config.get('cfg_iconsize'), "height": GM_config.get('cfg_iconsize')}); }, 'close': function() { window.location.reload(true); } } }); GM.registerMenuCommand('Discogs Scout Settings', function() {GM_config.open();}); //============================================================================== // Fetch per-site values from GM_config //============================================================================== $.each(icon_sites, function(index, site) { site['show'] = GM_config.get('show_' + site['name']); }); $.each(sites, function(index, site) { site['show'] = GM_config.get('show_' + site['name']); }); //============================================================================== // Global variables //============================================================================== // For internal use (order matters). const valid_states = [ 'found', 'missing', 'logged_out', 'error' ]; var onArtistPage = false; var onReleasePage = false; var onLabelPage = false; var onMyCollectionPage = false; var onCollectionPage = false; var onMyWantlistPage = false; var onWantlistPage = false; var onListPage = false; if (Boolean(location.href.match('/artist/'))) { // artist page? onArtistPage = true; if (Boolean(location.href.match('type='))) { if (Boolean(location.href.match('subtype=Videos'))) { onArtistPage = false; } else if (!Boolean(location.href.match('type=Releases'))) { onArtistPage = false; } } } else if (Boolean(location.href.match('/release/')) || Boolean(location.href.match('/master/'))) { // release page? onReleasePage = true; } else if (Boolean(location.href.match('/label/'))) { // label page? onLabelPage = true; } else if (Boolean(location.href.match('/collection')) && Boolean(location.href.match('/user/'))) { // collection page? onCollectionPage = true; } else if (Boolean(location.href.match('/wantlist'))) { // wantlist page? onWantlistPage = true; } else if (Boolean(location.href.match('/mywantlist'))) { // own wantlist page? onMyWantlistPage = true; } else if (Boolean(location.href.match('/lists/')) && !Boolean(location.href.match('/byuser/'))) { // list page? onListPage = true; } //============================================================================== // Stuff for /release/ pages (to start after reflow) //============================================================================== function startObserver() { console.log('Discogs Scout (Initialization): Starting Observer.'); if ($('[class^=body]').length) { addDummyElem(); const obscfg = {childList: true}; const obs = new MutationObserver(checkDummyElem); obs.observe($('[class^=body]')[0], obscfg); } else { GM.notification("Element not found! Please report it.", "Discogs Scout"); console.log("Discogs Scout (Start Error): Element not found! Please report it."); return; } } function addDummyElem() { const temp = $('').attr('id','temp_scout').css({'display':'none'}); $('[class^=body]').append(temp); setTimeout(function(){ temp.remove(); }, 2000); } function checkDummyElem(mutation, observer) { if (!$('#temp_scout').length) { observer.disconnect(); startDiscogsScout(); } } //============================================================================== // Start: Add links to sites //============================================================================== function startDiscogsScout() { // We don't want to run on these urls if (Boolean(location.href.match('/image')) || Boolean(location.href.match('/history'))) { console.log("Discogs Scout: Not starting. [Report it if you think that it should start here!]"); return; } else if (Boolean(location.href.match('layout=big')) || $('.cards_layout_large').length > 0) { if (!GM_config.get('run_artistpages') && !onReleasePage) { console.log("Discogs Scout: Not starting. [Report it if you think that it should start here!]"); return; } else { GM.notification("Large covers layout is not supported!", "Discogs Scout"); console.log("Discogs Scout: Not starting. [Report it if you think that it should start here!]"); return; } } // Check if we are on the own collection page if (onCollectionPage && $('.collection-row').length > 0) { onMyCollectionPage = true; onCollectionPage = false; } if (onReleasePage) { console.log("Discogs Scout: Starting a release page."); performRelease(); } else if (GM_config.get('run_artistpages')) { if (onArtistPage) { console.log("Discogs Scout: Starting an artist page."); performArtist(); } else if (onLabelPage) { console.log("Discogs Scout: Starting a label page."); performList(); } else if (onMyCollectionPage) { console.log("Discogs Scout: Starting a mycollection page."); performList(); } else if (onCollectionPage) { console.log("Discogs Scout: Starting a collection page."); performList(); } else if (onWantlistPage) { console.log("Discogs Scout: Starting a wantlist page."); performList(); } else if (onMyWantlistPage) { console.log("Discogs Scout: Starting a mywantlist page."); performList(); } else if (onListPage) { console.log("Discogs Scout: Starting a list page."); performList(); } else { console.log("Discogs Scout: Not starting. [Report it if you think that it should start here!]"); } } else { console.log("Discogs Scout: Not starting."); } } if (document.readyState !== 'loading') { console.log('Discogs Scout (Initialization): Document is already ready.'); if (onReleasePage) { startObserver(); } else { startDiscogsScout(); } } else { console.log('Discogs Scout (Initialization): Waiting for "DOMContentLoaded" event.'); if (onReleasePage) { document.addEventListener('DOMContentLoaded', startObserver); } else { document.addEventListener('DOMContentLoaded', startDiscogsScout); } }