Sleazy Fork is available in English.

IMPROVED EROME - experimental Ed.

Show more content per page, Bypass disclaimer, save what videos you watched, block unwanted content (per user OR album)

// ==UserScript==
// @name        IMPROVED EROME - experimental Ed.
// @name:ru     УЛУЧШЕННЫЙ EROME - в разработке
// @namespace   Violentmonkey Scripts
// @icon        https://www.google.com/s2/favicons?domain=erome.com
// @match       https://www.erome.com/*
// @grant          GM_getValue
// @grant          GM_setValue
// @grant          GM_registerMenuCommand
// @version     1.0BETA
// @license     Copyleft
// @author      @mbient
// @description Show more content per page, Bypass disclaimer, save what videos you watched, block unwanted content (per user OR album)
// @description:ru Показать больше контента на странице, скрыть дисклеймер, сохранить просмотренные видео, заблокировать нежелательный контент (для каждого пользователя ИЛИ альбома) 
// ==/UserScript==

// const censoredIMG_URI = 'data:image/png;base64,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';
const censoredIMG = 'https://www.onlygfx.com/wp-content/uploads/2018/04/censored-stamp-2.png';

(() => {
    "use strict";
    const $_ = document.querySelector.bind(document);
    const $$_ = document.querySelectorAll.bind(document);

    const append_ = $_("#albums");

    let structureOfSettings = {
        disclaimer: true,
        autoStart: false,
        limit: 10
    };

    if (GM_getValue("globalSettings") === undefined)
        GM_setValue("globalSettings", structureOfSettings);
    if (GM_getValue("bannedAlbums") === undefined)
        GM_setValue("bannedAlbums", new Array());
    if (GM_getValue("watchedVideos") === undefined)
        GM_setValue("watchedVideos", new Array());

    let gmset = GM_getValue("globalSettings");
    // DISCLAIMER BYPASS IF EXIST

    function disclaimerByPass() {
            $.ajax({
                type: 'POST',
                url: '/user/disclaimer',
                async: false,
                success: function() {
                    $('#disclaimer').remove();
                    $('body').css('overflow', 'visible');
                }
            });
        } // end function disclaimer

    // LOAD MORE CONTENT PER PAGE

    let counter = 0;
    let hidden = 0;
    const albums = [];
    const watched = new Set();
    const limitPages = gmset.limit == null ? 5 : gmset.limit;
    const LOAD_NEXT = document.createElement('div');
    LOAD_NEXT.className = "menu-tab f-left selected no-select";
    LOAD_NEXT.innerText = `LOAD NEXT ${limitPages}`;
    LOAD_NEXT.onclick = () => loadFirst(true);
    let appender = $_("#page > ul");
    if (appender) appender.append(LOAD_NEXT);

    function pushOnce(item) {
        watched.add(item);
    }

    function stringToHTML(str) {
        const dom = document.createElement('div');
        dom.innerHTML = str;
        return dom;
    }

    function loadFirst(next) {
        if (!document.location.pathname.match('a/')) {
            const searchParams = new URLSearchParams(document.location.search);
            console.log('User watching albums...\nPlease wait...');
            let urlFetch = "";
            let totalFetchedPages = 2;
            counter = parseInt(searchParams.has('page') ? searchParams.get('page') : parseInt(hidden) ? parseInt(hidden) : 1);
            const numMaxPages = counter + limitPages;

            if (searchParams.size !== 0 && searchParams.has('o') && !searchParams.has('page')) {
                urlFetch = `https://www.erome.com/search?q=${searchParams.get('q')}&o=${searchParams.get('o')}&page=`;
            } else if (searchParams.size !== 0 && searchParams.has('o') && searchParams.has('page')) {
                urlFetch = `https://www.erome.com/search?q=${searchParams.get('q')}&o=${searchParams.get('o')}&page=`;
            } else if (searchParams.size !== 0 && !searchParams.has('o') && !searchParams.has('page')) {
                urlFetch = `https://www.erome.com/search?q=${searchParams.get('q')}&page=`;
            } else if (searchParams.size !== 0 && !searchParams.has('o') && searchParams.has('page') && searchParams.has('q')) {
                urlFetch = `https://www.erome.com/search?q=${searchParams.get('q')}&page=`;
            } else {
                urlFetch = `https://www.erome.com${document.location.pathname}?page=`;
            }

            console.log(counter, "\n", urlFetch);

            let stop = false;

            if (!stop) {
                albums.length = 0;
                const nextPages = counter + limitPages;
                if (counter <= 2) {
                    counter++;
                } else {
                    counter++;
                }

                try {
                    const intervalThenFetchIsReady = setInterval(() => {
                        if (counter === nextPages) {
                            clearInterval(intervalThenFetchIsReady);
                            applyVisualChanges(counter, nextPages);
                        }

                        const fetchUrl = urlFetch + counter;
                        if (!watched.has(fetchUrl)) {
                            pushOnce(fetchUrl);
                            fetch(fetchUrl)
                                .then(response => {
                                    if (response.status === 200) {
                                        response.text()
                                            .then(myBlob => {
                                                const temp = stringToHTML(myBlob);
                                                if (temp.innerHTML !== undefined) {
                                                    const getAlbums = temp.querySelector('div#albums');
                                                    if (getAlbums === null || getAlbums === undefined || getAlbums.innerText.trim() === '') {
                                                        clearInterval(intervalThenFetchIsReady);
                                                        LOAD_NEXT.innerText = "No more pages";
                                                        LOAD_NEXT.style.cursor = "context-menu";
                                                        LOAD_NEXT.onclick = null;
                                                    } {
                                                        // Create the outer div element
                                                        const outerDiv = document.createElement('div');
                                                        outerDiv.style.display = 'contents';

                                                        // Create the inner div element
                                                        const innerDiv = document.createElement('div');

                                                        innerDiv.classList.add("baloon");

                                                        innerDiv.textContent = Number(counter);
                                                        innerDiv.title = `From here to down page ${counter} is shown`;
                                                        const innerA = document.createElement('a');
                                                        innerA.href = "#";
                                                        let verify_ = getAlbums.querySelector('.baloon');
                                                        if (!verify_) {
                                                            outerDiv.append(innerDiv);
                                                            outerDiv.append(innerA);
                                                            getAlbums.append(outerDiv);
                                                        }

                                                    }
                                                    albums.push(getAlbums);
                                                    applyVisualChanges(counter);
                                                    counter++;
                                                }
                                            });
                                    } else {
                                        clearInterval(intervalThenFetchIsReady);
                                        applyVisualChanges(counter);
                                    }
                                })
                                .catch(error => console.log(error));
                        }
                    }, 1000);
                } catch (error) {
                    console.log(error, "timer stopped");
                    clearInterval(intervalThenFetchIsReady);
                }
            }
        }
    }

    function applyVisualChanges(counter, nextPages) {

        for (const album of albums) {
            if (album) //$_("#albums").insertAdjacentElement('afterend', album);
                $$_('#albums').forEach(e => {
                //

                // let mmm = document.createElement('div');
                e.after(album);

            })
            markAsWatched();

        }

        $$_(".album-thumbnail-container:nth-child(1) a img").forEach(e => {
            e.setAttribute('src', e.getAttribute('data-src'));
        });

        $$_("#albums").forEach((e, i) => {
            $_("#lol > div > div > div:nth-child(2) > a").innerText = `Added pages: ${i}`;
            hidden = `${i + 1}`;
        });

        if (nextPages && counter === nextPages) console.log(counter + "\nDone.");
executeCensor();
    }

    function appendStyleToPage(newStyle) {
        let styles = document.createElement("style");
        styles.appendChild(document.createTextNode(newStyle));
        document.head.appendChild(styles);
        styles.type = "text/css";

    }

    // MATCH VIDEOS AS WATCHED

    const xu = /\/a\/([^\/\?]+)/;
    const xm = /("[^"]*")|([^\s"]+)/g;
    const watchedVideos = 'watchedVideos';
    const URL_TRIM = getVideoId(document.location.href);
    let oldValue = GM_getValue(watchedVideos);

    function getVideoId(url) {
        const vid = url.match(xu);
        return vid ? vid[1] : null;
    }

    function getAlbumsURI() {
        return Array.from($$_('#albums > div'), (e) => e.querySelector('a').href);

    }

    function getAlbums() {

            const data = Array.from($$_('div > a.album-title, div > span.album-user')).map((element) => {
                const albumTitle = element.innerText;
                const albumUser = (element.nextElementSibling) ? element.nextElementSibling.innerText : undefined;
                return {
                    albumTitle,
                    albumUser
                };
            });
            return data.filter((item) => item.albumUser !== undefined);

        }
        // console.log(getAlbums())

    function saveListWatched() {
        const LSKey = "watchedVideos";
        if (URL_TRIM != null) { // if the user opened the album
            //  alert("");
            let getLocalStorage = localStorage.getItem(LSKey);
            if (!getLocalStorage) {
                let verifyIfExist = GM_getValue(LSKey);
                if (verifyIfExist.length >= 1)
                    localStorage.setItem(LSKey, verifyIfExist); // safe mode
                else
                    localStorage.setItem(LSKey, URL_TRIM);
            } else

            {

                let newHero = getLocalStorage.split(',');
                newHero.push(URL_TRIM);
                let unique = [...new Set(newHero)];
                localStorage.setItem(LSKey, unique);
                GM_setValue(LSKey, unique);
                markAsWatched();

            }

        }

    }
    saveListWatched(); // on

    function markAsWatched() {

        let intersection = getAlbumsURI().filter((x) => GM_getValue("watchedVideos").includes(getVideoId(x)));

        intersection.forEach((el) => {
            $$_('#albums > div').forEach((e) => {
                if (e.querySelector('a').href == el) {
                    e.querySelector('.album-thumbnail-container').style.setProperty("border-bottom", "5px solid red");
                }
            });
        });

    }
    markAsWatched();

    function isEqualObjects(value1, value2) {
        return JSON.stringify(value1) === JSON.stringify(value2);
    }

    // Function to check for variable changes
    function updateWatched() {
        var newValue = GM_getValue(watchedVideos);
        if (!isEqualObjects(newValue, oldValue)) {
            markAsWatched();
            oldValue = newValue; // Update the old value

        }

    }

    // Check for changes
    setInterval(updateWatched, 3000);

    function executeCensor(){
      getAlbums().forEach((e) => {
        const aTitle = e.albumTitle.trim();
        const aUser = e.albumUser.trim();

        const extractEachTitle = new Set(aTitle.toLowerCase().split(/[ _.:;?!~,`"&|()<>{}\[\]\r\n/\\\-]+/g));
        const extractEachUserN = new Set(aUser.toLowerCase().split(/[ _.:;?!~,`"&|()<>{}\[\]\r\n/\\\-]+/g));

        let albumsForProcessingTitle = new Array();
        let albumsForProcessingUserN = new Array();

        let filtererWordsEachAlbums = Array.from(extractEachTitle).map(el => el.trim());
        // search from BLOCKLIST
        GM_getValue("bannedAlbums").forEach(w => {

            if (filtererWordsEachAlbums.includes(w.toLowerCase()) || aTitle === w.toLowerCase())
                console.log(aTitle, " _ ", w.toLowerCase(), filtererWordsEachAlbums.includes(w.toLowerCase()), aTitle === w.toLowerCase());

            //    full match
            //                includes spaces                      no spaces                                  strict

            if (extractEachTitle.has(w.toLowerCase()) || filtererWordsEachAlbums.includes(w.toLowerCase()) || aTitle.toLowerCase() === w.toLowerCase())

                albumsForProcessingTitle.push(aTitle);
            if ( /*extractEachTitle.has(w.toLowerCase()) || filtererWordsEachAlbums.includes(w.toLowerCase()) ||*/ aUser.toLowerCase() === w.toLowerCase())

                albumsForProcessingUserN.push(aTitle);

        })

        // logic after match

        let tempInner = `<a class="album-link" style="
                              position: absolute;
                              content: '';
                              background: URL(&quot;${ censoredIMG }&quot;) center no-repeat;
                                background-size: contain;
                              resize: both;
                              pointer-events: none;
                      "> </a>
                      `
        // let albumTitle = '';
        $$_('#albums > div').forEach((album) => {
         let albumTitleSel  = album.querySelector('div > a.album-title'); // .innerText ? album.querySelector('div > a.album-title').innerText : '';
          if(albumTitleSel) albumTitleSel = albumTitleSel.innerText;

            if (albumsForProcessingTitle.some((albumTitle) => albumTitle === albumTitleSel)) {
                album.querySelector('.album-thumbnail-container').innerHTML = tempInner;
            }

            // username
          // console.log(albumsForProcessingUserN);
            if (albumsForProcessingUserN.some((albumTitle) => albumTitle === albumTitleSel)) {
                album.querySelector('.album-thumbnail-container').innerHTML = tempInner;

            }

        })

    });

  }
executeCensor();


    const sMenuGeneral = `
  .baloon{
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 922299;
    transform: translate(-90%, -50%);
    width: 50px;
    height: 50px;
    background-color: rgba(0, 0, 0, 0.6);
    backdrop-filter: blur(8px);
    border-radius: 50%;
    color: white;
    position: absolute;
  }

.album-thumbnail {
    border-radius: 5px;
}

div.video {
    border-radius: 5px;
}

.box {
    display: block;
    width: 100%;
    height: 50px;
    line-height: 34px;
    padding: 8px 14px;
    margin: 0 0 10px;
    background: #eee;
    border: 0;
    font-size: 14px;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
    border-radius: 4px;
}

.hud-menu-zipp3 {
    display: none;
    position: fixed;
    top: 48%;
    left: 50%;
    width: 600px;
    height: 470px;
    margin: -270px 0 0 -300px;
    padding: 20px;
    background: rgba(0, 0, 0, 0.6);
    color: #eee;
    border-radius: 4px;
    z-index: 15;
}
/*.hud-menu-zipp3 h3 {
display: block;
margin: 0;
line-height: 20px;
}*/
.hud-menu-zipp3 .hud-zipp-grid3 {
    display: flex;
    height: 393px;
    padding: 10px;
    background: rgba(0, 0, 0, 0.3);
    backdrop-filter: blur(12px);
    border-radius: 7px;
    flex-direction: column;
    justify-content: flex-start;
}

.hud{
    font-family: var(--fa-style-family,"Font Awesome 6 Free");
    cursor: pointer;
}
.hud-menu-zipp3 {
     display: none;
     position: fixed;
     top: 48%;
     left: 50%;
     width: 550px;
     height: 460px;
     margin: -270px 0 0 -300px;
     padding: 20px;
     background: rgba(0, 0, 0, 0.6);
     color: #eee;
     border-radius: 20px;
     z-index: 99995;
}

.sp{
    -webkit-user-select: none; /* Safari */
    -ms-user-select: none; /* IE 10 and IE 11 */
    user-select: none; /* Standard syntax */
}
.no-select{
    -webkit-user-select: none; /* Safari */
    -ms-user-select: none; /* IE 10 and IE 11 */
    user-select: none; /* Standard syntax */
}
.no-select::selection, .no-select *::selection {
  background-color: Transparent;
}
#myModal{
    display: none; /* Hidden by default */
  position: fixed; /* Stay in place */
  z-index: 99999; /* Sit on top */
  padding-top: 100px; /* Location of the box */
  left: 0;
  top: 0;
  width: 100%; /* Full width */
  height: 100%; /* Full height */
  overflow: auto; /* Enable scroll if needed */
  background-color: rgb(0,0,0); /* Fallback color */
  background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}
.title-modal{

    text-align: center;
    display: flex;
    align-items: center;
    margin: 0 auto;
    justify-content: center;
    font-family: var(--fa-style-family,"Font Awesome 6 Brands");
    backdrop-filter: blur(12px);
    padding: 8px 8px 0px 8px;
    background: rgba(0, 0, 0, 0.7);
    border-radius: 8px 8px 0px 0px;
}
.ctitle{
  display: flex;

}
option[value="delete"]{
    float: right;
    margin-right: 8px;
}

`;

    appendStyleToPage(sMenuGeneral);

    // spell icon
    let spell = document.createElement("div"); // button
    spell.classList.add("sp");
    spell.classList.add("no-select");
    spell.classList.add("fa-play-circle");
    spell.classList.add("hud");
    spell.setAttribute("data-type", "Zippity3");
    spell.classList.add("hud-zipp3-icon");
    spell.textContent = "Script Menu";

    let xChild = $_(".container > div >  div:nth-child(6)");
    let onlineSign = $_(".container > div > div:nth-child(2) > span");
    if (xChild) xChild.parentNode.insertBefore(spell, xChild);
    if (onlineSign) spell.append(onlineSign);

    //Menu for spell icon
    let modHTML = `
<div id="myModal" class="modal">
  <div class="hud-menu-zipp3">
    <div class="ctitle" >
      <span class="close-modal no-select">&times;</span>
      <span class="title-modal no-select">Changes are applied automatically</span>
    </div>
    <div style="text-align:center">
      <div class="hud-zipp-grid3 no-select">
      </div>
    </div>
  </div>
</div>

`;

    document.body.insertAdjacentHTML("afterbegin", modHTML);
    let zipz123 = document.getElementsByClassName("hud-menu-zipp3")[0];

    var modal = document.getElementById("myModal");
    var span = document.getElementsByClassName("close-modal")[0];

    spell.onclick = function() {

        if (zipz123.style.display == "none" || zipz123.style.display == "") {
            modal.style.display = "block";
            zipz123.style.display = "block";
        } else {
            modal.style.display = "none";
            zipz123.style.display = "none";
        };

    }

    // When the user clicks on <span> (x), close the modal
    span.onclick = function() {
        modal.style.display = "none";
    }
    window.onclick = function(event) {
        if (event.target == modal) {
            modal.style.display = "none";
            zipz123.style.display = "none";
            $_(".container-btn > input").value = '';

        }
    }

    const sMenuStyle = `
.toggle-btn {
    left: 85%;
    position: relative;
    width: 40px;
    height: 20px;
    border: 2px solid #5f3f5f;
    border-radius: 20px;
    display: grid;
    justify-content: end;
    align-content: center;
    cursor: pointer;
    transition: .3s;
}
.circle-btn {
    position: absolute;
    left: 0;
    width: 20px;
    height: 20px;
    border-radius: 20px;
    background-color: #996395;
    transition: .3s;
}
.text {
    font-size: 23px;
    color: #eb6395;
    width: max-content;
    padding-right: 50px;
    -webkit-user-select: none; /* Safari */

    -ms-user-select: none; /* IE 10 and IE 11 */

    user-select: none; /* Standard syntax */
}
.active {
    border-color: #5f3f5f;
}
.active + .text {
    color: #eb6395;
}
.active .circle-btn {
    left: 100%;
    transform: translateX(-100%);
    transition: .3s;
    background-color: #eb6395;
}
select#BLOCKLIST {
    background: transparent;
    height: 150px;
    width: 173px;
    border: 1px solid #333;
    overflow: overlay;
    position: fixed;
    left: 64%;
    backdrop-filter: blur(21px);
    border-radius: 8px 8px 0px 0px;
    padding: 7px;
}
.input_filter {
    position: relative;
    top: 149px;
    z-index: 9;
    left: 65px;
}
#input_script {
    border-radius: 0px 0px 0px 8px;
    background: transparent;
    color: white;
    border: 1px solid #333;
    width: 54%;
}
#add_New_Block_List {
    position: absolute;
    z-index: 5;
    border-radius: 0px 0px 8px;
    border: 1px solid #333;
}
selstyle {
    display: flex;
    justify-content: space-evenly;
    align-items: stretch;
}

`;

    appendStyleToPage(sMenuStyle);

    let btntoggle = `
<div class="container-btn">

    <div class="toggle-btn pink ${gmset.disclaimer === true ? 'active' : ''}">
        <a class="text no-select">Disclaimer ByPass (if available)</a>
        <div class="circle-btn pink no-select"></div>
    </div>
    <br/>
    <div class="toggle-btn pink ${gmset.autoStart === true ? 'active' : ''}">
        <a class="text no-select">Start fetching at start (if available)</a>
        <div class="circle-btn pink no-select"></div>
    </div>
    <br/>
    <input type="number" min="5" max="50" class="form-control" autocomplete="off" placeholder="Set limit of pages to load (current is ${gmset.limit})">

</div>

<div class="container-btn">
    <form action="javascript:void(0);" style="padding-top: 10px;">
        <label for="option">Select from the list the method of using BLOCKLIST</label>
        <select class="form-control" name="option" id="option">
            <option value="select">Hide albums that includes OR contain words from BLOCKLIST (not in use)</option>                                                    <!-- Do Not Select This -->
            <option value="equal">Name of albums contain an word that are strict equal or match at BLOCKLIST (RECOMMENDED)</option>                     <!-- exact word from album - profiles are not touched -->
            <option value="contain">Name of albums can contain an combination of word that that can found at BLOCKLIST</option>                         <!-- for ex: tran -> trans, transgender, #trans, and others -->
            <option value="userequal">User username and albums contain an word that are strict equal or match at BLOCKLIST (RECOMMENDED)</option>       <!-- username and exact word from album - profiles are not touched -->
            <option value="usercontain">User username and albums can contain an combination of word that that can found at BLOCKLIST</option>           <!-- for ex: tran -> trans, transgender, #trans, and others | user:  transOfficial - also  -->
        </select>
    </form>

    <!--    action="javascript:void(0);" onkeyenter="console.log(event.which)" onsubmit="CheckPassword()" -->

    <form action="javascript:void(0);">
        <selstyle>
            <div>
                <select title="This is BLOCKLIST" id="BLOCKLIST" size="4"></select>
            </div>
            <div class="input_filter">
                <input type="text" id="input_script" value="" spellcheck="false">
                <input type="submit" id="add_New_Block_List" value="Add" title="If input contain value, after click list will updated and if item from list was selected this will removed">

            </div>
        </selstyle>
    </form>

</div>

`;
    document.getElementsByClassName("hud-zipp-grid3")[0].innerHTML = btntoggle;

    const blockListItems = $_("#BLOCKLIST");

    function updateBLOCKLIST() {
        let updatedBannedAlbums = new Array();
        for (let name of blockListItems.options) {
            if (name.value !== "delete".toLowerCase())
                updatedBannedAlbums.push(name.value);
        }
        //
        GM_setValue("bannedAlbums", updatedBannedAlbums);
        $_("#input_script").value = '';
        blockListItems.scroll(0, blockListItems.scrollHeight);

        console.log('BLOCKLIST was updated!');
    }

    $_("#add_New_Block_List").addEventListener("click", (evt) => {

        let inputList = $_("#input_script").value;
        evt.srcElement.disabled = true;

        //check list
        if (inputList.length > 0 && !GM_getValue("bannedAlbums").includes(inputList)) {
            const oOption = document.createElement("option");
            oOption.appendChild(document.createTextNode(inputList));
            oOption.setAttribute("value", inputList);
            blockListItems.appendChild(oOption);

        }
        updateBLOCKLIST();
    });

    function selectDeleteOption() {
        const dom = document.createElement("option");
        dom.value = "delete";
        dom.innerText = "Delete";

        return dom;

    }

    let notUndefined;

    blockListItems.onchange = function() { // THANKS Matt Howell   https://stackoverflow.com/questions/5069294/

        const options = this.getElementsByTagName("option");
        $$_(`#BLOCKLIST > option[value="delete"]`).forEach((kk, mm) =>
            kk.remove())

        notUndefined = options[this.selectedIndex] !== undefined ? options[this.selectedIndex] : notUndefined;

        if (this.selectedIndex !== -1)
            options[this.selectedIndex].before(selectDeleteOption());
        else {
            this.remove(notUndefined.index);
            updateBLOCKLIST();
        }

        $_("#input_script").value = this.value;

    };

    $_("#input_script").addEventListener('input', (evt) => {
        // only for beginners
        if (evt.srcElement.value.length > 0) $_("#add_New_Block_List").disabled = !true;
        else $_("#add_New_Block_List").disabled = true;
    })

    GM_getValue("bannedAlbums").forEach(e => {

        blockListItems.innerHTML += `<option value="${e}">${e}</option>`;
    });

    $$_("#BLOCKLIST option").forEach((e) => {
        const length = 15;
        var string = e.value
        var trimmedString = string.length > length ?
            string.substring(0, length - 3) + "..." :
            string

        e.innerText = trimmedString
    })

    // Menu user input - set limit of pages (LOGIC)
    $_(".container-btn > input").addEventListener('input', (evt) => {

        try {
            gmset.limit = evt.srcElement.valueAsNumber;
            GM_setValue("globalSettings", gmset);
            this.placeholder = `Set limit of pages to load (current is ${gmset.limit})`;

        } catch (ex) {}

    }, false);

    const btn = $$_(".toggle-btn").forEach((item, index) => {

        item.addEventListener("click", () => {

            item.classList.toggle("active");
            if (index === 0) gmset.disclaimer = !gmset.disclaimer;
            if (index === 1) gmset.autoStart = !gmset.autoStart;
            GM_setValue("globalSettings", gmset);
            // console.log(gmset);
        });
    });

    if (gmset.disclaimer == true) {
        disclaimerByPass();
    }
    if (gmset.autoStart == true) {
        loadFirst(true);
    }
    // skip login OR explore
    const exploreCheck = document.querySelector("#home-box > a");
    if (exploreCheck && exploreCheck.innerText === 'Explore') exploreCheck.click();

    GM_registerMenuCommand("Display Size Of Saves", () => {
        console.log(`Size of Watched Videos: ${new Blob([GM_getValue("watchedVideos") ]).size} bytes\
                 \nSize of Banned Albums:  ${new Blob([GM_getValue("bannedAlbums") ]).size} bytes`);

        alert(`Size of Watched Videos: ${new Blob([GM_getValue("watchedVideos") ]).size} bytes\
           \nSize of Banned Albums:  ${new Blob([GM_getValue("bannedAlbums") ]).size} bytes`);

    });

})();