Beatport - Hide Duplicate across "tracks" pages

When author has several "Tracks" pages, a specific track can be shown multiple times across author's "tracks" pages. So, this script leaves only unique track on one page, and hides its duplicates on all other pages/occurences.

Ajankohdalta 2.1.2022. Katso uusin versio.

// ==UserScript==
// @name         Beatport - Hide Duplicate across "tracks" pages
// @namespace    http://tampermonkey.net/
// @version      0.12
// @description  When author has several "Tracks" pages, a specific track can be shown multiple times across author's "tracks" pages. So, this script  leaves only  unique track on one page, and hides its duplicates on all other pages/occurences.
// @author       https://puvox.software
// @match        https://www.beatport.com/artist/*/tracks*
// @icon         https://www.google.com/s2/favicons?domain=beatport.com
// @grant        none
// @license MIT
// ==/UserScript==






(function() {
    'use strict';

    class trackDuplicateClass
    {
        storage = window.localStorage;
        iName   = 'authorBlocks';
        intervalSeconds=3;
        removeIfNotAuthor = true;

        cacheGet() {
            let resultStored = this.storage.getItem(this.iName);
            if (resultStored==null || resultStored==''){
                resultStored = '{}';
            }
            return JSON.parse(resultStored);
        }

        cacheSet(obj) {
            this.storage.setItem(this.iName, JSON.stringify(obj));
        }


        //
        authorarrayGet(authorName) {
            let allAuthors = this.cacheGet();
            let authorTracksArray = {};
            if( authorName in allAuthors ){
                authorTracksArray = allAuthors[authorName];
            }
            else{
                authorTracksArray = { 0 : [] };
            }
            return authorTracksArray;
        }

        authorAdd(authorName, pageId, trackName) {
            let allAuthors = this.cacheGet();
            if( !(authorName in allAuthors) ){
                allAuthors[authorName] = {};
            }
            if( !(pageId in allAuthors[authorName]) ){
                allAuthors[authorName][pageId] = [];
            }
            if( !(allAuthors[authorName][pageId].includes(trackName)) ){
                allAuthors[authorName][pageId].push(trackName);
            }
            this.cacheSet(allAuthors);
        }


        startCheckCurrentTracks()
        {
            window.setInterval(this.checkCurrentTracks.bind(this), this.intervalSeconds * 1000 );
            //this.checkCurrentTracks();
        }

        checkedPagesInSession = [];

        checkCurrentTracks()
        {
            if ( location.href.includes('/artist') && location.href.includes('/tracks') )
            {
                let curPageNum   = this.getCurrentPage();
                let authorName   = this.getAuthorName();

                // avoid endless rechecks
                let authorPageKey = authorName+"_"+curPageNum;
                if (this.checkedPagesInSession.includes(authorPageKey)) return;
                this.checkedPagesInSession.push(authorPageKey);
                //

                this.deleteDuplicatesOnSamePage();
                let pageTracks   = this.getCurrentTracks();
                let authorArr    = this.authorarrayGet(authorName);
                for(var trackName of pageTracks)
                {
                    let	foundPageNum =0;
                    for (let [arrayPageNum, arr] of Object.entries(authorArr) )
                    {
                        if ( arr.includes(trackName) )
                        {
                            foundPageNum = arrayPageNum;
                        }
                    }

                    // add or hide
                    if (!foundPageNum){
                        this.authorAdd( authorName, curPageNum, trackName );
                    }
                    else{
                        if (curPageNum != foundPageNum){
                            this.hideTracksByTitle(trackName);
                        }
                    }
                }
            }
        }


        hideTracksByTitle(trackTitle)
        {
            let AuthorName = this.getAuthorName();
            for( var x of document.querySelectorAll(".ec-bucket .bucket-item") )
            {
                if ( x.getAttribute("data-ec-d1") == AuthorName  && (x.getAttribute("data-ec-name")+x.querySelector(".buk-track-remixed").textContent) ==trackTitle)
                {
                    x.parentNode.removeChild(x);
                }
            }
        }

        getCurrentTracks()
        {
            let AuthorName = this.getAuthorName();

            let allNames = [];
            for( var x of document.querySelectorAll(".ec-bucket .bucket-item") )
            {
                if (x.getAttribute("data-ec-d1") == AuthorName )
                {
                    allNames.push((x.getAttribute("data-ec-name")+x.querySelector(".buk-track-remixed").textContent) );
                }
            }
            return allNames;
        }


        getAuthorName(){
            return this.checkValue( document.querySelector(".interior-title h1").textContent, null);
        }
        getCurrentPage(){
            return this.checkValue( document.querySelector(".pag-number-current").textContent, null);
        }
        checkValue(what, ifEquals){
            if (what == ifEquals) alert("error on script on page..");
            return what;
        }

        deleteDuplicatesOnSamePage()
        {
            let allNames = [];
            let AuthorName = this.getAuthorName();
            let reversedArr =  [].slice.call(document.querySelectorAll(".ec-bucket .bucket-item"), 0).reverse();
            for( var x of reversedArr )
            {
                // track name also retrieved from: x.getAttribute("data-ec-name")
                let curName = x.getAttribute(".buk-track-title .buk-track-primary-title").textContent +"_"+x.querySelector(".buk-track-remixed").textContent;
                if (!allNames.includes(curName) )
                {
                    allNames.push(curName);
                }
                else{
                    x.parentNode.removeChild(x);
                }
                // if option set
                if (this.removeIfNotAuthor) {
                    if( !querySelector(".buk-track-artists").textContent.includes(AuthorName) ) {
                        x.parentNode.removeChild(x);
                    }
                }
            }
            return allNames;
        }

    }


    (new trackDuplicateClass()).startCheckCurrentTracks();


})();