Greasy Fork is available in English.

Reddit Fix

Fix of the infinite scroll, Hide subreddits, see full image actually shows the full image, html5 video player, remove background effects, copy video adress

// ==UserScript==
// @name         Reddit Fix
// @namespace    http://tampermonkey.net/
// @version      1.9.7
// @description  Fix of the infinite scroll, Hide subreddits, see full image actually shows the full image, html5 video player, remove background effects, copy video adress
// @author       Bum
// @require      http://code.jquery.com/jquery-3.4.1.min.js
// @match        https://www.reddit.com/*
// @match        https://new.reddit.com/*
// @grant        GM_addStyle
// ==/UserScript==

var holdTopicsInMemory = "false";
var commentEffects = "false";
var originalBehavior = "false";
var topicLimitInDom = 70;
var lastScrollTop = 0;
var scrollTopWhenREmoved = -1;
var menuButtonWasAdded = false;
var subsToHide = "";
var removeBorderRadius = true;
var hideRecentSection = false;
var customFeedState = "open";

var lastTopicRemovedTime =  new Date().getTime();

if (localStorage.getItem("removeBorderRadius") != null) {
    removeBorderRadius = localStorage.getItem("removeBorderRadius");
}
if (localStorage.getItem("holdTopicsInMemory") != null) {
    holdTopicsInMemory = localStorage.getItem("holdTopicsInMemory");
}

if (localStorage.getItem("commentEffects") != null) {
    commentEffects = localStorage.getItem("commentEffects");
}

if (localStorage.getItem("originalBehavior") != null) {
    originalBehavior = localStorage.getItem("originalBehavior");
}
if (localStorage.getItem("subsToHide") != null) {
    subsToHide = localStorage.getItem("subsToHide");
}

if (localStorage.getItem("hideRecentSection") != null){
    hideRecentSection = localStorage.getItem("hideRecentSection");
}
if (localStorage.getItem("customFeedState") != null){
    customFeedState = localStorage.getItem("customFeedState");
}
var topicsInMemory = [];
var isAPop = false;
var maxOffset = 0;

(function() {
    'use strict';
    function GM_addStyle(css) {
        const style = document.getElementById("GM_addStyle") || (function() {
            const style = document.createElement('style');
            style.type = 'text/css';
            style.id = "GM_addStyle";
            document.head.appendChild(style);
            return style;
        })();
        const sheet = style.sheet;
        sheet.insertRule(css, (sheet.rules || sheet.cssRules || []).length);
    }

    function RemoveCssRule(css) {
        const style = document.getElementById("GM_addStyle") || (function() {
            const style = document.createElement('style');
            style.type = 'text/css';
            style.id = "GM_addStyle";
            document.head.appendChild(style);
            return style;
        })();
        const sheet = style.sheet;
        for (var i=0; i<sheet.cssRules.length; i++) {
            if (sheet.cssRules[i].selectorText == css) {
                sheet.deleteRule (i);
            }
        }
    }
    fRemoveBorderRadius(removeBorderRadius);
    fHideRecentSection(hideRecentSection);

    HideAllSubs();
    if (commentEffects == "false")
    {
        GM_addStyle ( 'img[src*="flame"]{display:none;}' );
        GM_addStyle ( 'div[aria-role="presentation"]{box-shadow:none !important;background : transparent !important;}' );
    }
    GM_addStyle ( '.wwHbgRV0ZXGp5CHHlpo5u{display:block !important;}' );
    GM_addStyle ( '._1Q2mF3u7v9hBVu_4bkC7R4{display:block !important;}' );
    GM_addStyle ( '._3hUbl08LBz2mbXjy0iYhOS,._3b8u2OJXaSDdBWoRB7zUoK {height: 50px !important;width: 100% !important; bottom: 0 !important;}' );


    GM_addStyle ( '._3UEq__yL-82zX4EyuluREz,.gUpEQXQu8G8UvISmBIPsj,._1RZSSlyqzokrcxh0ESwE2e{display:none !important;}' );
    GM_addStyle ( '.vLH0XV-l8Y4mNGUvw4HHy{display:none !important;}' );
    GM_addStyle ( '.eI6Ep6BNFA5DZjPWNVb4,._2XQ3ZY6qCbEm9_WtvLLFru{display:none !important;}' );

    //POPUP
    GM_addStyle('.fixmodal {position:fixed;background-color:rgba(0, 0, 0, 0.5);height:100%;width:100%;top:0;left:0;display:none; z-index: 1000;}');
    GM_addStyle('#fixPopup {padding:5px;text-align:center;}');
    GM_addStyle('.fixmodalWrap {margin: 50px auto; position:relative;width: fit-content;} ');
    var maxWidthPop = window.screen.height - 200;
    GM_addStyle('#fixPopup img {max-height:'+maxWidthPop+'px;}');
    GM_addStyle('._2f5uYHvlfzs2DngQsiCdvB {height: 50px !important;width: 100% !important; position: relative !important; bottom: 50px !important;}');
    GM_addStyle('.videoFixIcon {margin: 50px auto; background: url("https://www.pngall.com/white-play-png")} ');
    GM_addStyle('.expandDivCaption {padding: 5px!important; white-space: pre-wrap !important;max-height: max-content !important; display: inline-block !important; overflow-wrap: break-word !important;} ');
    GM_addStyle('.expandSpanCaption{height: auto !important; position: absolute !important; bottom: 0;} ');
    GM_addStyle('.expandDisableClick{pointer-events: none; } ');
    GM_addStyle('.expandEnableClick{pointer-events: auto; !important; } ');
    GM_addStyle('.expandGarbageRedditCaptions{position:relative !important; } ');


    window.addEventListener('scroll', throttle(callback, 300));

    function throttle(fn, wait) {
        var time = Date.now();
        return function() {
            if ((time + wait - Date.now()) < 0) {
                fn();
                time = Date.now();
            }
        }
    }

    function getMenuItem(id, display)
    {
        return '<a class="M2Hk_S2yvXpsNPfZMBMur customRedditFixMenu" id = "'+id+'" ><div class="_1lwNBHmCQJObvqs1fXKSYR" style="margin-right: 0px;">'+display+'</div></a>';
    }

    function getCheckBoxItem(checked, id, display){

        if (checked == 'true')
            return '  <span style="width: 100%;"><input type="checkbox" checked id="'+ id +'" name="'+display+'" /> ' + display + '</span>';
        else
            return '<span style="width: 100%;"><input type="checkbox" id="'+ id +'" name="'+display+'" /> ' + display + '</span>';
    }

    function RemoveMenu(){
        $("#redditFixReloadAll").remove();
        $("#redditFixReload25").remove();
    }
    function AddMenu(){
        var menu = $("._2pUO1Sfe7WlIHvq6goN3Pz");
        if (menu.find(".customRedditFixMenu").length > 0 )
            return;
        menu.append(getMenuItem('redditFixReloadAll', 'Reload All'));
        $("#redditFixReloadAll").click(function(){
            for (var i = topicsInMemory.length - 1; i >= 0; --i) {
                var el = topicsInMemory.pop(i);
                $(".rpBJOHq2PR60pnwJlUyP0").prepend(el);
            }
            maxOffset = $(document).height();
        });
        menu.append(getMenuItem('redditFixReload25', 'Reload 25'));
        $("#redditFixReload25").click(function(){
            var reloadTill = topicsInMemory.length;
            if (reloadTill > 25)
                reloadTill = 25;
            for (var i = 0; i < 25; ++i) {
                var el = topicsInMemory.pop(i);
                $(".rpBJOHq2PR60pnwJlUyP0").prepend(el);
            }
            maxOffset = $(document).height();
        });
    }
    
    

    function attachCustomFeed(){
        let isReady = $('[aria-controls="multireddits_section"]').length > 0;
        if (!isReady) {
            setTimeout(attachCustomFeed, 300);
            return;
        }

        let customFeed = $('[aria-controls="multireddits_section"]').closest("faceplate-expandable-section-helper");
        customFeed.bind("click",function(){
            if ($(this).is("[open]"))
            {
                customFeedState = "open";
                localStorage.setItem("customFeedState", "open");
            }
            else{
                localStorage.setItem("customFeedState", "");
                customFeedState = "";
            }
        });
        if (customFeedState == "")
            customFeed.removeAttr("open");
    }

    function attachObserver(){
        let isReady = $(".subgrid-container").length > 0;
        if (!isReady || $(".observerIsAttached").length == 1 ) {
            setTimeout(attachObserver, 300);
            return;
        }
        HideAllSubs();
        $(".subgrid-container").addClass("observerIsAttached");
        var config = { attributes: false, childList: true, subtree: true };
        var targetNodeRoot = $(".subgrid-container").first().get(0);
        var configRoot = { attributes: false, childList: true, subtree: true };

        var callbackRoot = function(mutationsList, observer) {
            for(var mutation of mutationsList) {
                mutation.addedNodes.forEach(function(node) {

                    if ($(node).find("article.w-full")){
                        HideAllSubs();
                    }
                    // Not needed anymore, it's not virtualized by reddit so dom fixed

                    // var currentTime = new Date().getTime();
                    // var time = currentTime - lastTopicRemovedTime;
                    //                     if ($(node).find("article.w-full")){
                    //                         if ($("article.w-full").length > topicLimitInDom){
                    //                             let newHeight = $(window).scrollTop();
                    //                             $("article.w-full").slice(0,49).each(function(){
                    //                                 var currElHeight = 0;
                    //                                 if ($(this).attr("style") != ""){
                    //                                     var el = $(this);
                    //                                     if (holdTopicsInMemory)
                    //                                         topicsInMemory.push(el);
                    //                                     currElHeight = el.height();

                    //                                     if(el.find(".promotedlink")){
                    //                                     }
                    //                                     else{
                    //                                         if (currElHeight == 0){
                    //                                             currElHeight = currElHeight + 500;
                    //                                         }
                    //                                     }
                    //                                     console.log("removed:" + el);
                    //                                     el.remove();
                    //                                     newHeight = newHeight - currElHeight;
                    //                                     currElHeight = 0;
                    //                                 }
                    //                                 lastTopicRemovedTime = new Date().getTime();
                    //                                 scrollTopWhenREmoved = lastScrollTop+10000;
                    //                             });
                    //                             $(window).scrollTop(newHeight);
                    //                         }
                    //                     }
                });
            }
        };


        var observerroot = new MutationObserver(callbackRoot);
        observerroot.observe(targetNodeRoot, config);
    }

    function fadeOutThePicture(){
        $(".fixmodal").fadeOut("fast");
        document.removeEventListener("click", fadeOutThePicture);
    }

    function doSomething() {
        attachObserver();
    }

    let currentUrl = location.href;

    setInterval(() => {
        if (location.href !== currentUrl) {
            currentUrl = location.href;
            doSomething();
        }
    }, 500);

    $(document).on("mousedown", "._15nNdGlBIgryHV04IfAfpA", function(e) {

        $(this).parent().toggleClass( "expandSpanCaption" );
        $(this).toggleClass( "expandDivCaption" );

        if ($(".DraftEditor-root").length > 0){
            $(this).parent().toggleClass("expandGarbageRedditCaptions");
        }

        //If anyone ever find how to stop this fucking propagation send me a dm like fuck none of this shit work on this element...
        e.stopPropagation();
        e.preventDefault();
        e.cancelBubble = true;
        e.stopImmediatePropagation();
        return false
    });
    var control = false;
    $("img").on('keyup keydown', function(e) {
        control = e.ctrlKey;
    });

    $('img').on('click', function() {
        if (control) {
            e.stopPropagation();
            e.preventDefault();
            e.cancelBubble = true;
            e.stopImmediatePropagation();
            return false
        }
    });



    $(document).on("mousedown", "._3b8u2OJXaSDdBWoRB7zUoK,._3hUbl08LBz2mbXjy0iYhOS,._2f5uYHvlfzs2DngQsiCdvB", function(e) {

        $(".fixmodal").fadeIn("fast");
        $("#fixPopup img").remove();
        $("#fixPopup iframe").remove();
        var closestIframe = $(this).parent().find("iframe");
        if (closestIframe.length > 0){
            var clonedIframe = closestIframe.clone()
            clonedIframe.appendTo("#fixPopup");
            clonedIframe.css({'width': '800px', 'max-height':maxWidthPop + 'px'});
        }
        else{
            var imgSrc = $(this).parent().find("img").attr("src");
            $('<img src="'+imgSrc+'" alt="image3" />').appendTo("#fixPopup");
        }

        setTimeout(() => {document.addEventListener("click", fadeOutThePicture);}, 100);
        e.stopPropagation();
        e.preventDefault();
        e.cancelBubble = true;
        e.stopImmediatePropagation();
        return false
    });
    attachObserver();
    attachCustomFeed();

    function callback() {
        if (originalBehavior == "true")
            return;
        if (holdTopicsInMemory == "true")
            AddMenu();
        var st = $(document).scrollTop();
        if (st > maxOffset)
        {
            lastScrollTop = st;
            maxOffset = 0;
        }
    }
    $("body").append('<div class="fixmodal"> <div class="fixmodalWrap"><div id="fixPopup"></div> </div></div>');

    //#####Custom menu for unbluring
    GM_addStyle(`
.container__menu {
                /* Absolute position */
                position: absolute;

                /* Reset */
                list-style: none;
                margin: 0;
                padding: 0;
                display: none;

                /* Misc */
                border: 1px solid #cbd5e0;
                border-radius: 0.25rem;
                background-color: #f7fafc;
            }
`);


    GM_addStyle(`
    .open {
    display: block;
    z-index: 9999;
}
`);

    GM_addStyle(`
.container__item {
                padding: 0.5rem 1rem;
                white-space: nowrap;
                cursor: pointer;
    color: black;
            }
`);

    GM_addStyle(`
 .container__item:hover {
                background-color: #bee3f8;
            }
`);

    GM_addStyle(`
.container__divider {
                border-bottom: 1px solid #cbd5e0;
                height: 1px;
            }
`);
    $("body").append(`
    <ul id="redditfixShowImage" class="container__menu">
                    <li class="container__item">Show Image</li>
                </ul>
                `);

    var cntxtMn = $("#redditfixShowImage");
    var mouseX;
    var mouseY;
    var currentTarget = null;

    $(document).mousemove(function(e) {
        mouseX = e.pageX;
        mouseY = e.pageY;
    });
    $(document).on("mousedown", function(e){
        if ($(event.target).is('img')){

            $(this).on('contextmenu', displayContextMenu)
            function displayContextMenu(e) {
                (cntxtMn.hasClass("open")) ? cntxtMn.removeClass("open") : false;

                if ($(e.target).attr("src").toUpperCase().indexOf("BLUR=") >=0)
                {
                    cntxtMn.css({'top':mouseY,'left':mouseX}).addClass("open");
                    e.preventDefault();
                    currentTarget = e.target;
                    return;
                }

            }
            cntxtMn.click(function(e) {
                e.stopPropagation();
            });

            $(document).click(function() {
                (cntxtMn.hasClass("open")) ? cntxtMn.removeClass("open") : false;
            });

            $(".container__item").click(function(){
                var src =  $(currentTarget).attr('src');
                var myRegexp = /^.*\/(.*)\.?(.*)?\?/g;
                var match = myRegexp.exec(src);
                if (src.toUpperCase().indexOf("EXTERNAL") >= 0){

                    var closestOutBound = $(currentTarget).parents(".STit0dLageRsa2yR4te_b").parent().find(".styled-outbound-link");
                    $(currentTarget).attr("src",closestOutBound.attr("href"));
                }
                else{
                    $(currentTarget).attr("src","https://i.redd.it/" + match[1]);
                }
                $(currentTarget).attr("style","filter:none; width: auto; height: 100%;");
                cntxtMn.removeClass("open");
            });
        }
    });





    function AddTheMenu(){
        var menuButton = `
    <div class="Layout-sc-nxg1ff-0 jA-dUUY"><div class="Layout-sc-nxg1ff-0 dDnLci">
    <div class="Layout-sc-nxg1ff-0 bYXYej">
    <div class="InjectLayout-sc-588ddc-0 iETGeJ">
    <button class="ScCoreButton-sc-1qn4ixc-0 enhanceButton jGqsfG ScButtonIcon-sc-o7ndmn-0 fNzXyu"  style="
    background: url(https://i.imgur.com/kWu713g.png);
    background-size: 22px;
    z-index:999;
    background-repeat: no-repeat;
    background-position: center; width: 25px;
    height: 25px; top: 60px; right: 60px; position:fixed;" ></button>
  </div>
  </div>
  <div aria-label="Whispers" role="button" data-click-out-id="threads-box" data-a-target="threads-box-closed" class="Layout-sc-nxg1ff-0 emWtQg InjectLayout-sc-588ddc-0 kgrtoC whispers-threads-box__container"></div></div></div>

    `;

        var enhanceSettings = `
    <div class="enhancecontainer" style="display:none;">

    </div>
    `;




        $("body").append(enhanceSettings);
        $(".enhancecontainer").append('<div class="tw-border-t tw-mg-t-1 tw-mg-x-05 tw-pd-b-1 customEnhanceMenu"" ></div><div class="tw-mg-y-05 tw-pd-x-05" style="width: 100%;"><p class="tw-c-text-alt-2 tw-font-size-6 tw-strong tw-upcase" style="color: var(--color-text-alt-2)!important;    font-size: var(--font-size-6)!important;    font-weight: 600!important;    text-transform: uppercase!important;">Reddit enhance</p></div>');


        $(".enhancecontainer").append(getCheckBoxItem(commentEffects, "redditFixCheckBoxBackground", "Remove comment effects"));
        $("#redditFixCheckBoxBackground").click(function(){
            var btnBackgroundsChecked = $(this);
            if (btnBackgroundsChecked.prop('checked')){
                btnBackgroundsChecked.removeClass("_1L5kUnhRYhUJ4TkMbOTKkI");
                localStorage.setItem("commentEffects", false);
                commentEffects = "false";
            }
            else{
                btnBackgroundsChecked.addClass("_1L5kUnhRYhUJ4TkMbOTKkI");
                localStorage.setItem("commentEffects", true);
                commentEffects = "true";
            }
        });

        $(".enhancecontainer").append(getCheckBoxItem(holdTopicsInMemory, "fixRedditKeepTopicsInMemory", "Save topics in ram"));
        $("#fixRedditKeepTopicsInMemory").click(function(){
            var btnTopicsChecked = $(this);
            if (btnTopicsChecked.prop('checked')){
                localStorage.setItem("holdTopicsInMemory", true);
                holdTopicsInMemory = "true";
                AddMenu();
            }
            else{
                localStorage.setItem("holdTopicsInMemory", false);
                holdTopicsInMemory = "false";
                RemoveMenu();
            }
        });
        $(".enhancecontainer").append(getCheckBoxItem(originalBehavior, "fixRedditoriginalBehavior", "Original behavior"));
        $("#fixRedditoriginalBehavior").click(function(){
            var btnTopicsChecked = $(this);
            if (btnTopicsChecked.prop('checked')){
                localStorage.setItem("originalBehavior", true);
                originalBehavior = "true";
            }
            else{
                btnTopicsChecked.addClass("_1L5kUnhRYhUJ4TkMbOTKkI");
                localStorage.setItem("originalBehavior", false);
                originalBehavior = "false";
            }
        });

        $(".enhancecontainer").append(getCheckBoxItem(removeBorderRadius, "fixremoveBorderRadius", "Remove border radius"));
        $("#fixremoveBorderRadius").click(function(){
            var btnTopicsChecked = $(this);
            if (btnTopicsChecked.prop('checked')){
                localStorage.setItem("removeBorderRadius", true);
                fRemoveBorderRadius(true);
                removeBorderRadius = "true";
            }
            else{
                btnTopicsChecked.addClass("_1L5kUnhRYhUJ4TkMbOTKkI");
                localStorage.setItem("removeBorderRadius", false);
                fRemoveBorderRadius(false);
                removeBorderRadius = "false";
            }
        });


        $(".enhancecontainer").append(getCheckBoxItem(hideRecentSection, "fixHideRecentSection", "Hide recent section"));
        $("#fixHideRecentSection").click(function(){
            var btnTopicsChecked = $(this);
            if (btnTopicsChecked.prop('checked')){
                localStorage.setItem("hideRecentSection", true);
                fHideRecentSection(true);
            }
            else{
                localStorage.setItem("hideRecentSection", false);
                fHideRecentSection(false);
            }
        });


        $(".enhancecontainer").append('<span style="margin-top: 10px;">Hide subreddit from appearing in feed. If you remove subs you have to restart. If you add just click save, no need to restart.</span>');
        $(".enhancecontainer").append(`
        <textarea id="fixHideSubreddits" name="fixHideSubreddits" rows="3" cols="40" style = "flex:1">`+subsToHide+`</textarea>
        `);

        $(".enhancecontainer").append(" <button type='button' id='fixSaveSubredditsHidden' style = 'background:darkgreen; flex: 2'>Save</button> ");

        $(".enhancecontainer").append(`<div class="tw-border-t tw-mg-t-1 tw-mg-x-05 tw-pd-b-1 customEnhanceMenu"" ></div><div class="tw-mg-y-05 tw-pd-x-05" style="width: 100%;"><p class="tw-c-text-alt-2 tw-font-size-6 tw-strong tw-upcase"

style="color: var(--color-text-alt-2)!important;
    font-size: smaller;line-height: 1.4;
    margin-top: 6px;">Any subreddit containing this word will be hidden from your feed. This is Case Sensitive. Write the exact subreddit name if you only target that subreddit. Use ; to separate keywords. Example: funny;tiktok;celebrity</p></div>`);

        $("body").append(menuButton);

        $(".enhanceButton").click(function(){
            $(".enhancecontainer").toggle();
        });

        $("#fixSaveSubredditsHidden").click(function(){
            subsToHide = $("#fixHideSubreddits").val();
            localStorage.setItem("subsToHide", subsToHide);
            HideAllSubs();
        });
        //rgba(25, 25, 25, 0.75);




    }

    function fHideRecentSection(hide){
        if (hide == "true" || hide == true)
            GM_addStyle('reddit-recent-pages{display: none !important;}');
        else
            RemoveCssRule('reddit-recent-pages');
    }

    function fRemoveBorderRadius(remove){
        if (remove == "true" || remove == true)
            GM_addStyle('*:not(.shreddit-subreddit-icon__icon){border-radius: 0 !important;}');
        else
            RemoveCssRule(':not(.shreddit-subreddit-icon__icon)');
    }
    function HideAllSubs(){

        var subsToHideArray = subsToHide.split(";");
        let i = 0;
        while (i < subsToHideArray.length) {
            let tobeRemoved = $("a[href*='"+ subsToHideArray[i] + "']").closest("article");
            $(tobeRemoved).closest("hr").remove();
            $(tobeRemoved).remove();
            i++;
        }
        //   alert( );
    }

    AddTheMenu();
    GM_addStyle('.enhanceButton:hover{    background-color:var(--color-background-button-text-hover) !important;}');
    GM_addStyle(`
    .enhancecontainer {
display: flex;
    flex-wrap: wrap;
    justify-content: center;
    background: #393939;
    padding: 10px;
    width: 200px;
    position: fixed;
    right: 100px;
    z-index: 100;
    margin-top: 66px;
    width: 500px;
    height: auto;
    top: 0;
}
    `);

    GM_addStyle(`
    input.enhancCheck[type=checkbox] + label {
  display: block;
    cursor: pointer;
    height: fit-content;
    flex: 1 0 35%;
    margin-top: 5px;
}
`);
    GM_addStyle(`
    input.enhancCheck[type=checkbox] {
  display: none;
}`);
    GM_addStyle(`
    ._1L5kUnhRYhUJ4TkMbOTKkI{
    background: green !important;
    }

    `)

    GM_addStyle(`
    #redditFixCheckBoxBackground,#fixRedditKeepTopicsInMemory,#fixRedditoriginalBehavior{
    background: red;
    }

    `)
    GM_addStyle(` input.enhancCheck[type=checkbox] + label:before {
  content: "\\2714";
  border: 0.1em solid #fff;
  border-radius: 0.2em;
  display: inline-block;
  width: 1em;
  height: 1em;
  padding-left: 0.2em;
  padding-bottom: 0.3em;
  margin-right: 0.2em;
  vertical-align: bottom;
  color: transparent;
}`);
    GM_addStyle(`input.enhancCheck[type=checkbox]:checked + label:before {
  background-color: #ED820A;
  border-color:white;
  color: #fff;
}`);
})();