// ==UserScript== // // @name Discogs Scout // @version 0.2 // @namespace https://github.com/Purfview/Discogs-Scout // @description Auto search for music on torrent 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/* // // @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 ================================== 0.1 - Initial alpha test release. ==============================================================================*/ var public_sites = [ { 'name': 'Dummy', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAADsSURBVHja3NhbFoMwCEVR5j9p+ltr4B7Io0v1L6nslGSZoLntve0IIK/kefWY+hUcZg8o5qIKNNLNgfaMCiBeWKNrjPzGs2GDDJ4xKVALHiLhHIjgcR8D0vAqdSMiAch0auIKlEYPCA7c2ynxDYDxk1bXAF05JJ1XpTR+Z4v5DvgLAfVyyHoXAF4D1ox/GtD/dwog6ZwA2GwtALwH2JLwzwfsr4BtAhovC3KEgTtaG4i2TJtIUbwn2wogP1UAgvUiwMoAOdnhs2kb2H66PlAfVCocr1c40zWa8yrT91aZR+rkA5U+Qdi3ip33ZwAb5/CcnuFpKAAAAABJRU5ErkJggg==', 'searchUrl': 'https://dummy.dummy', 'loggedOutRegex': /dummy/, 'matchRegex': /dummy/} ]; var private_sites = [ { 'name': 'RED', 'icon': 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAMFBMVEUAAAAAAADu7vnLzOG9vszc3O6wsdNBQkvnAAArLDAaGh1dXWSen72HiKdub32FAAA3CR0mAAAAAXRSTlMAQObYZgAAARVJREFUKM9jAAOdnQulZh9igANrQTAogfG5BcWvBKn6FgpugPCZCqWDlIBAdaO4AliAXSpJ+flCqXlOKguLwAIbF6tuBBkhbmQlDeKzCKZaQgxdFiJ4AKRDLngiREDK9WEBUMBxcbggFEy2kgEZsfkgTEDWThxoqWByIUxA0kRQgYFZ0k0QDo5MdGDgFfdDCDzZ+ICBWy4dxPzRDyLLgNZwymYCWfIdHR9BLrk4gYFLfCGQJdHR0QhySaEAAyOQhgqAAFBA6pqpIkSLkKrtRKCAbApQAGQoUMDkIlBABiQABGCBxMEjwCmLLHBxAQO3JNAvIsCIqnME+WUDAxMoDgrAMQgKVWBk8k0UFDcACTAXCko+YAAA5BtcVzEnMFcAAAAASUVORK5CYII=', 'searchUrl': 'https://redacted.ch/torrents.php?artistname=%band%&groupname=%release%&filter_cat[1]=1', 'loggedOutRegex': /Cloudflare|Ray ID|>Remember meRemember meRemember me').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; } //============================================================================== // Add search links to an element //============================================================================== 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; var placebo_url = new URL(target).origin; link = $('').attr('href', placebo_url).attr('onclick', "$('#" + form_name + "').submit(); return false;").attr('target', '_blank').attr('rel', 'noreferrer'); var data = (post_data.match('{')) ? post_data : '{"' + post_data.replace(/&/g, '","').replace(/=/g, '":"').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 (post_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')) { 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)'); } 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)'); link.append(icon); } // Create/find elements for Artist pages. if (onArtistPage) { if ($('.result_box' + scout_tick).length == 0) { $(elem).after($('').append($('',{'colspan':'8'}).append($('
').addClass('result_box' + scout_tick)))); $.each(valid_states, function(i, name) { $('.result_box' + scout_tick).append(""+''); }); } } if (onArtistPage && GM_config.get('load_second_bar')) { if ($('.result_box_2nd' + scout_tick).length == 0) { $(elem).after($('').append($('',{'colspan':'8'}).append($('
').addClass('result_box_2nd' + scout_tick)))); $.each(valid_states, function(i, name) { $('.result_box_2nd' + scout_tick).append(""+''); }); } } // Add links to Discogs page. var in_element_two = ('inSecondSearchBar' in site) ? site['inSecondSearchBar'] : false; if (in_element_two && !GM_config.get('load_second_bar')) { return; } else if (!in_element_two) { $('#discogscout_' + state + scout_tick).append(link); } else { $('#discogscout2_' + 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) { // Don't check the second/third bar sites if a 2nd bar is disabled in the Settings. var in_element_two = ('inSecondSearchBar' in site) ? site['inSecondSearchBar'] : false; if (in_element_two && !GM_config.get('load_second_bar')) { return; } // Connection rate limiter per domain. var set_rate = ('rateLimit' in site) ? site['rateLimit'] : 200; 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'] : '+'}, 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 to create fields and display sites //============================================================================== function perform(elem, band, release, scout_tick) { $.each(sites, async function(index, site) { if (site['show']) { 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'] : '+'}, 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')){ addLink(elem, site['name'], searchUrl, site, 'found', scout_tick); } } }); } //============================================================================== // Artist Page code //============================================================================== function performArtist() { const band = $('.profile>h1').text(); if($('.card').length !== 0) { $('.card').each(function() { const elem = $(this); const release = $(this).find('.title>a').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; }); } } //============================================================================== // 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': { 'section': 'Artist Page:', 'type': 'checkbox', 'label': 'Auto-search sites for results?', 'default': true }, 'load_second_bar': { 'type': 'checkbox', 'label': 'Enable the 2nd search bar?', 'default': false }, 'hide_missing': { 'type': 'checkbox', 'label': "Hide link if search didn't found results?", 'default': false }, 'highlight_sites': { 'label': 'Highlight sites:      ', 'type': 'text', 'default': '' } }; //============================================================================== // Add sites to Settings (GM_config) //============================================================================== $.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'] }; }); //============================================================================== // 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 { \ 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/'; /////////////////////////////////////////////////////////////////////////////////////////////////// $('#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_2').find('.field_label').each(function(index, label) { var url = 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 = 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("img").css({"margin-right": "4px", "width": GM_config.get('cfg_iconsize'), "height": GM_config.get('cfg_iconsize')}); }, 'close': function() { location.reload(); } } }); GM.registerMenuCommand('Discogs Scout Settings', function() {GM_config.open();}); //============================================================================== // Fetch per-site values from GM_config //============================================================================== $.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' ]; // Are we on a artist releases page? var onArtistPage = Boolean(location.href.match('/artist/')); if (onArtistPage && Boolean(location.href.match('type='))) { if (Boolean(location.href.match('subtype=Videos'))) { onArtistPage = false; } else if (!Boolean(location.href.match('type=Releases'))) { onArtistPage = false; } } // Are we on a release page? var onReleasePage = false; if (!Boolean(location.href.match('/artist/'))) { if (Boolean(location.href.match('/release/')) || Boolean(location.href.match('/master/'))) { onReleasePage = true; } } //============================================================================== // Start: Add links to sites //============================================================================== function startDiscogsScout() { if (onArtistPage) { console.log("START ARTIST") performArtist(); } } window.addEventListener('DOMContentLoaded', startDiscogsScout);