Sleazy Fork is available in English.

Rule34Hentai Improved

Fixes stuff, adds like and favorite under images, highlights animated, makes the site more compact, etc.

Verzia zo dňa 20.01.2020. Pozri najnovšiu verziu.

// ==UserScript==
// @name         Rule34Hentai Improved
// @namespace    http://tampermonkey.net/
// @author       Hentiedup
// @version      0.6.4
// @icon         https://i.imgur.com/Aea35p5.png
// @description  Fixes stuff, adds like and favorite under images, highlights animated, makes the site more compact, etc.
// @include      https://rule34hentai.net*
// @require      https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_listValues
// ==/UserScript==

(function() {
    'use strict';

    /*============================================*/
    /*============================================*/
    /*=*|      The settings are now found      |*=*/
    /*=*|          on the actual site          |*=*/
    /*=*|      in the "My Profile" section     |*=*/
    /*============================================*/
    /*============================================*/





    /* Don't edit anything below */
    /*===========================*/
	/*       video/image       */
    var HighlightVideos = GM_getValue("HighlightVideos", true);
    var AutoplayVideos = GM_getValue("AutoplayVideos", true);;
    var StopHidingMyCursorOnVideo = GM_getValue("StopHidingMyCursorOnVideo", true);
    var PauseVideoOnClick = GM_getValue("PauseVideoOnClick", true);
    var DownsizeToFit = GM_getValue("DownsizeToFit", true);
    var NextPrevWithArrowKeys = GM_getValue("NextPrevWithArrowKeys", true);
    var AllowContextMenuOnImages = GM_getValue("AllowContextMenuOnImages", true);

	/*      Compact site       */
    var CompactHeader = GM_getValue("CompactHeader", true);
    var MinimizeHeaderFurtherAndShowOnHover = GM_getValue("MinimizeHeaderFurtherAndShowOnHover", false);
    var HideEmptySections = GM_getValue("HideEmptySections", true);
    var HideLog = GM_getValue("HideLog", true);
    var HideImageVideoHeader = GM_getValue("HideImageVideoHeader", true);
    var RemoveSomeSneakyAds = GM_getValue("RemoveSomeSneakyAds", true);

	/*      like/favorite      */
    var EnableLikeFavoriteButtonsBelowImage = GM_getValue("EnableLikeFavoriteButtonsBelowImage", true);
    var HideLikesInSidePanel = GM_getValue("HideLikesInSidePanel", true);

    if(true) {
		addGlobalStyle(`
			a.shm-thumb-link > img {
				padding: 0;
			}
			a.tagit-close {
				display: inline;
				padding: 0;
			}
			.custom-button {
				cursor: pointer;
				width: 35px;
				padding: 3px;
				margin: 0;
				border-radius: 20px;
			}
			.custom-button:hover {
				background-color: rgba(255,255,255,.75);
			}
			.customButtonText {
				position: relative;
				top: -5px;
				width: auto;
				display: block;
				text-align: center;
			}
			.customButtonDiv {
				display: inline-block;
				margin: 0;
				padding: 0;
				width: auto;
				float: left;
			}
			.customButtonDiv:nth-of-type(1) { margin-right: 10px; }
			.customButtonDiv:nth-of-type(2) { margin-left: 10px; }

			#Uploadhead > .blockbody > .mini_upload > form > ul {
				width: 100%;
				margin: 0;
				resize: vertical;
			}

			#r34hi_settings label
			{
				display: block;
			}
			#r34hi_settings input[type="checkbox"]
			{
				transform: scale(1.2);
			}
			#r34hi_settings > .blockbody
			{
				padding-bottom: 30px;
			}
			#r34hi_settings h4
			{
				margin: 23px 0 15px 0;
			}
		`);

		if(RemoveSomeSneakyAds)
			addGlobalStyle(`
				/*The site only uses iframes for ads, so might as well hide all of them*/
				iframe { display: none; }
				#header td:nth-of-type(1) center:nth-of-type(2) > div { display: none; }

				/*As far as I can tell the "Recommended" div is only for ads*/
				#Recommended_for_youleft { display: none; }

				/*Hiding some links from the header that are pretty much just ads*/
				#header td ul > li a:not([href^="https://rule34hentai.net"]):not([href^="#"]) { display: none; }
			`);

		if(HideLikesInSidePanel)
			addGlobalStyle(`#Image_Scoreleft { display: none !important; }`);

		if(StopHidingMyCursorOnVideo)
			addGlobalStyle(`#video-id { cursor: auto !important; }`);

		if(HideImageVideoHeader)
			addGlobalStyle(`#Imagemain > h3, #Videomain > h3 { display: none; }`);

		if(MinimizeHeaderFurtherAndShowOnHover) {
			addGlobalStyle(`
				header {
					overflow-y: hidden; height: 55px;
				}
				header:hover {height: auto;}
			`);

			if(DownsizeToFit) {
				addGlobalStyle(`
					header + nav + article #fluid_video_wrapper_video-id,
					header + nav + article #main_image {
						max-height: calc(90vh - 130px` + (HideImageVideoHeader ? ` + 41px` : ``) + `) !important; max-width: 100% !important;
					}

					header:hover + nav + article #fluid_video_wrapper_video-id,
					header:hover + nav + article #main_image {
						max-height: calc(90vh - 220px` + (HideImageVideoHeader ? ` + 41px` : ``) + `) !important; max-width: 100% !important;
					}
				`);
			}
		}

		if(!MinimizeHeaderFurtherAndShowOnHover && DownsizeToFit) {
			addGlobalStyle(`
			#fluid_video_wrapper_video-id, #main_image {
				max-height: calc(90vh - 220px` + (HideImageVideoHeader ? ` + 41px` : ``) + `) !important; max-width: 100% !important;
			}
			`);
		}

		if(CompactHeader)
			addGlobalStyle(`
				header {margin: 0; padding: 0;}
				header p {display: none;}
				header ul.ui-widget {
					margin: 5px;
					display: inline-block;
					vertical-align: middle;
					box-sizing: border-box;
					width: calc(100% - 100px);
				}
				header form > input[value=Search],
				header form > input[value=Search]:visited {
					vertical-align: middle;
					height: 36px;
					border-radius: 8px;
					background-color: #dec4a0;
					border-color: #725327;
					font-weight: 700;
					cursor: pointer;
				}
				header form > input[value=Search]:hover,
				header form > input[value=Search]:active {
					background-color: #dabc92;
				}
				#header h1 {font-size: 14px;}
				#header img.wp-image-67962 {
					height: 50px;
					width: auto;
				}
				#header img.wp-image-69454 {
					display: none;
				}
				#header td > center > ul {margin: 2px 0 0 0;}

				#Uploadhead > .blockbody > .mini_upload > small,
				#Uploadhead > .blockbody > .mini_upload > form > ul,
				#Uploadhead > .blockbody > .mini_upload > form > input[type=submit]
				{
					display: none;
				}

				#Loginhead > .blockbody {
					display: none;
				}
				#Loginhead > h3 {
					cursor: pointer;
				}
			`);

		if(HideLog)
			addGlobalStyle(`b#flash { display: none; }`);
    }

    setTimeout(function(){

        if(CompactHeader) {
            $("#Uploadhead #data0").change(function(){
                $("#Uploadhead > .blockbody > .mini_upload > small, #Uploadhead > .blockbody > .mini_upload > form > ul, #Uploadhead > .blockbody > .mini_upload > form > input[type=submit]").show(100);
            });

            $("#Loginhead > h3").click(function(){
                $(this).next(".blockbody").toggle(100);
            });
        }

        if(window.location.pathname == "/user")
        {
            $("#Optionsmain").after(`<section id="r34hi_settings"><h3 data-toggle-sel="#Optionsmain">R34H Improved Settings</h3><div class="blockbody"><form action="#">` +
                                    `<h4>Video/Image</h4>` +
                                    `<label><input type="checkbox" name="HighlightVideos" `+(HighlightVideos ? "checked" : "")+`> Highlight videos</label>` +
                                    `<label><input type="checkbox" name="AutoplayVideos" `+(AutoplayVideos ? "checked" : "")+`> Autoplay videos</label>` +
                                    `<label><input type="checkbox" name="StopHidingMyCursorOnVideo" `+(StopHidingMyCursorOnVideo ? "checked" : "")+`> Show cursor on videos</label>` +
                                    `<label><input type="checkbox" name="PauseVideoOnClick" `+(PauseVideoOnClick ? "checked" : "")+`> Pause videos on click</label>` +
                                    `<label><input type="checkbox" name="DownsizeToFit" `+(DownsizeToFit ? "checked" : "")+`> Downsize images/videos to fit on screen</label>` +
                                    `<label><input type="checkbox" name="NextPrevWithArrowKeys" `+(NextPrevWithArrowKeys ? "checked" : "")+`> Go to next/previous image/video with left/right arrow</label>` +
                                    `<label><input type="checkbox" name="AllowContextMenuOnImages" `+(AllowContextMenuOnImages ? "checked" : "")+`> Allow context-menu/right-click on images</label>` +
                                    `<h4>Compact Site</h4>` +
                                    `<label><input type="checkbox" name="CompactHeader" `+(CompactHeader ? "checked" : "")+`> Make the header more compact</label>` +
                                    `<label><input type="checkbox" name="MinimizeHeaderFurtherAndShowOnHover" `+(MinimizeHeaderFurtherAndShowOnHover ? "checked" : "")+`> Minimize the header even more and show more on hover</label>` +
                                    `<label><input type="checkbox" name="HideEmptySections" `+(HideEmptySections ? "checked" : "")+`> Hide Empty site sections</label>` +
                                    `<label><input type="checkbox" name="HideLog" `+(HideLog ? "checked" : "")+`> Hide the yellow log</label>` +
                                    `<label><input type="checkbox" name="HideImageVideoHeader" `+(HideImageVideoHeader ? "checked" : "")+`> Hide the image/video header</label>` +
                                    `<label><input type="checkbox" name="RemoveSomeSneakyAds" `+(RemoveSomeSneakyAds ? "checked" : "")+`> Remove some sneaky ads</label>` +
                                    `<h4>Like/Favorite</h4>` +
                                    `<label><input type="checkbox" name="EnableLikeFavoriteButtonsBelowImage" `+(EnableLikeFavoriteButtonsBelowImage ? "checked" : "")+`> Enable like/dislike/favorite/unfavorite buttons below images/videos</label>` +
                                    `<label><input type="checkbox" name="HideLikesInSidePanel" `+(HideLikesInSidePanel ? "checked" : "")+`> Hide the likes section in the site sidepanel</label>` +
                                    `</form></div></section>`);

            $("#r34hi_settings input").change(function(){
                GM_setValue($(this).attr("name"), $(this).is(':checked'));
            });
        }
        else
        {
            if(NextPrevWithArrowKeys) {
                var currentImage = window.location.href;
                if(currentImage.includes("/post/view/"))
                    currentImage = parseInt(currentImage.split("/post/view/")[1], 10);
                else
                    currentImage = null;
            }

            if(AutoplayVideos) {
                $("#video-id_fluid_state_button").click();
                $("body").click(); //remove focus from player
            }

            if(!PauseVideoOnClick) {
                $("#video-id_fluid_initial_play_button").remove();
                $("#video-id").click(function(e){
                    $("#video-id_fluid_control_playpause").click();
                });
            }

            if(HighlightVideos)
                $("a.shm-thumb-link > img[title*='// webm'], a.shm-thumb-link > img[title*='// mp4'], a.shm-thumb-link > img[title*='// gif']").attr("style", "border: solid 2px #fb2ccc !important; box-shadow: 0 0 5px 1px red;");

            //if logged in
            if($("#Loginhead").length == 0 && EnableLikeFavoriteButtonsBelowImage)
            {
                let insertHTML = `<div class="customButtonDiv"><img id="like-butt" class="custom-button" src="https://i.imgur.com/Kh1HzGr.png" alt="like" title="like">` +
                    `<img id="dislike-butt" class="custom-button" src="https://i.imgur.com/b4syBNK.png" alt="dislike" title="dislike"><span id="customLikeButtonText" class="customButtonText">` +
                    $("#Image_Scoreleft > .blockbody").text().trim().replace(/[^0-9]/g, "") +
                    `</span></div><div class="customButtonDiv"><img id="favorite-butt" class="custom-button` +
                    ($("#Image_Controlsleft form input[value='Un-Favorite']").length > 0 ? " unfavorite" : "") + `" src="` +
                    ($("#Image_Controlsleft form input[value='Un-Favorite']").length > 0 ? "https://i.imgur.com/wAB0t48.png" : "https://i.imgur.com/dTpBrIj.png") +
                    `" alt="` + ($("#Image_Controlsleft form input[value='Un-Favorite']").length > 0 ? "unfavorite" : "favorite") +
                    `" title="` + ($("#Image_Controlsleft form input[value='Un-Favorite']").length > 0 ? "unfavorite" : "favorite") +
                    `"><span id="customFavButtonText" class="customButtonText">` +
                    $("#Favorited_Byleft > .blockbody").text().split(":")[0].trim().replace(/[^0-9]/g, "") + `</span></div>`;

                $(".image_info").parent().parent().prepend(insertHTML);

                $("#like-butt").click(function() {
                    let auth = $("#Image_Scoreleft form input[value='Vote Up']").parent().find("input[name='auth_token']").prop("value");
                    let id = $("#Image_Scoreleft form input[value='Vote Up']").parent().find("input[name='image_id']").prop("value");
                    $("#customLikeButtonText").text("...");
                    $.post( "/numeric_score_vote", { auth_token: auth, image_id: id, vote: "up" }, function(data){
                        $("#customLikeButtonText").text($(data).find("#Image_Scoreleft > .blockbody").text().trim().replace(/[^0-9]/g, ""));
                    }).fail(function(){
                        $("#customLikeButtonText").text("error");
                    });
                });
                $("#dislike-butt").click(function() {
                    let auth = $("#Image_Scoreleft form input[value='Remove Vote']").parent().find("input[name='auth_token']").prop("value");
                    let id = $("#Image_Scoreleft form input[value='Remove Vote']").parent().find("input[name='image_id']").prop("value");
                    $("#customLikeButtonText").text("...");
                    $.post( "/numeric_score_vote", { auth_token: auth, image_id: id, vote: "down" }, function(data){
                        $("#customLikeButtonText").text($(data).find("#Image_Scoreleft > .blockbody").text().trim().replace(/[^0-9]/g, ""));
                    }).fail(function(){
                        $("#customLikeButtonText").text("error");
                    });
                });

                $("#favorite-butt").click(function() {
                    if($(this).hasClass("unfavorite"))
                    {
                        let auth = $("#Image_Controlsleft form input[value='Un-Favorite']").parent().find("input[name='auth_token']").prop("value");
                        let id = $("#Image_Controlsleft form input[value='Un-Favorite']").parent().find("input[name='image_id']").prop("value");
                        $("#customFavButtonText").text("...");
                        $.post( "/change_favorite", { auth_token: auth, image_id: id, favorite_action: "unset" }, function(data){
                            $("#customFavButtonText").text($(data).find("#Favorited_Byleft > .blockbody").text().split(":")[0].trim().replace(/[^0-9]/g, ""));
                            $("#favorite-butt").attr("src", "https://i.imgur.com/dTpBrIj.png");
                            $("#favorite-butt").attr("alt", "favorite");
                            $("#favorite-butt").attr("title", "favorite");
                            $("#Image_Controlsleft form input[value='Un-Favorite']").attr("value", "Favorite");
                            $("#Image_Controlsleft form input[name='favorite_action']").attr("value", "set");
                            $("#favorite-butt").removeClass("unfavorite");
                        }).fail(function(){
                            $("#customFavButtonText").text("error");
                        });
                    }
                    else
                    {
                        let auth = $("#Image_Controlsleft form input[value='Favorite']").parent().find("input[name='auth_token']").prop("value");
                        let id = $("#Image_Controlsleft form input[value='Favorite']").parent().find("input[name='image_id']").prop("value");
                        $("#customFavButtonText").text("...");
                        $.post( "/change_favorite", { auth_token: auth, image_id: id, favorite_action: "set" }, function(data){
                            $("#customFavButtonText").text($(data).find("#Favorited_Byleft > .blockbody").text().split(":")[0].trim().replace(/[^0-9]/g, ""));
                            $("#favorite-butt").attr("src", "https://i.imgur.com/wAB0t48.png");
                            $("#favorite-butt").attr("alt", "unfavorite");
                            $("#favorite-butt").attr("title", "unfavorite");
                            $("#Image_Controlsleft form input[value='Favorite']").attr("value", "Un-Favorite");
                            $("#Image_Controlsleft form input[name='favorite_action']").attr("value", "unset");
                            $("#favorite-butt").addClass("unfavorite");
                        }).fail(function(){
                            $("#customFavButtonText").text("error");
                        });
                    }
                });
            }

            if(NextPrevWithArrowKeys && currentImage) {
                $("body").keyup(function(event){
                    if($("textarea:focus, input[type=text]:focus").length == 0)
                    {
                        console.log("keypress");
                        if(event.which == 39) {
                            ChangeImage(currentImage);
                        }
                        else if(event.which == 37) {
                            ChangeImage(currentImage, false);
                        }
                    }
                });
            }

            if(AllowContextMenuOnImages)
                $("#main_image").replaceWith($("#main_image").clone());

            if(HideEmptySections) {
                $("article > section > .blockbody").each(function(){
                    if($(this).find("*:visible").not("p:empty").length == 0)
                        $(this).parent().hide();
                });
            }
        }

    }, 200);

    function addGlobalStyle(css) {
        var head, style;
        head = document.getElementsByTagName('head')[0];
        if (!head) { return; }
        style = document.createElement('style');
        style.type = 'text/css';
        style.innerHTML = css;
        head.appendChild(style);
    }
    function ChangeImage(currentImg, next = true) {
        window.open("https://rule34hentai.net/post/view/" + (currentImg+(next ? 1 : -1)) + "","_self");
    }
})();