Chaturbate Animate Thumbnail & Re-Layout

Make custom grid thumbnails & Animated rooms on mouse hover (Using Chaturbate Animate Thumbnail by iXXX94)

// ==UserScript==
// @name            Chaturbate Animate Thumbnail & Re-Layout
// @author          nima-rahbar
// @namespace       https://greasyfork.org/en/users/846327-nima-rahbar
// @icon            https://www.google.com/s2/favicons?sz=64&domain=chaturbate.org
// @description     Make custom grid thumbnails & Animated rooms on mouse hover (Using Chaturbate Animate Thumbnail by iXXX94)
// @copyright       2022, nima-rahbar (https://greasyfork.org/en/users/846327-nima-rahbar)
// @license         MIT
// @version         1.2.4
// @homepageURL     https://greasyfork.org/en/scripts/437111-chaturbate-animate-thumbnail-re-layout
// @homepage        https://greasyfork.org/en/scripts/437111-chaturbate-animate-thumbnail-re-layout
// @supportURL      https://greasyfork.org/en/scripts/437111-chaturbate-animate-thumbnail-re-layout/feedback
// @require         https://cdn.jsdelivr.net/npm/jquery@3.6.0
// @require         https://cdn.jsdelivr.net/npm/@violentmonkey/dom@1.0.9
// @match           *://*.chaturbate.com/*
// @run-at          document-idle
// ==/UserScript==

/* global $, VM */

(() => {
  $("#nav").append(
    '<li><a href="#" class="reset-grids" style="display: flex; align-items: center; column-gap: 5px;"><img style="height:17px;" alt="Reset Grid Count" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADBElEQVR4nO1bMWsUQRh9sxyHoklODRIwWARBUUklUQTFxkZbiwiCWCsoiiBoZyFoIYhNOgsr/0EEc2ClFimCWAjGIAFBUgQRlOO8Z+FeWGe+uf0gkA9v5sE07+7tvP32229ndmccyQaA+wBmkRYWAFx3JB8AuGPtxggvCgAnrF0YYqawdmCNRoTvVdogNAWuo+i3EPruAegqtI1SX0UXoVf/P4XAhUSJIwBGyrYDwHahHRR0y5H/+u2WoH2q1C4I2rOlzxGvjQHYVbY9EC6OlAE9AGvOuV/CbxsgKWaHc64ua2La3ia1tdlDsgMva2MZUGtkWJBaAIIsSf4pkFoAcgb4yAGwNrDFCIp7bCR4mOSPmoNNCFyT5LTCyD6BG1dqRwVuiuS6QhucryPZBnBGIR5GrKR2CwTIAbA2YI1YEVxC/dS0CeCox3UAvFf0uxfApMd9A7Cq0B5AWAg/Aqgr2gAwDf+cSbb5L36TbNUdieR+hvikMAGS1wTtY6V2XtCeVmq/errPyd8COQDWBqyRA2BtwBo5ANYGrJF8AGIjwdskf9ZoxwSuRfKeot/jAjej1E4J3GXlYGinT+TpsLUDa+QAWBuwRuzb4EPUf+UdBXDD49YBPFH0ewzAOY97A+ClQnsJYSF8BuCLQnsTfiHM0+HEkQNgbcAaOQDWBqyRA2BtwBrJB0AaCRYAXpGs+zCyTeAmSb5V9Ct9WZ4leVKhPSRwcyS/K7TjPpGnw9YOrJEDYG3AGrHp8CnUf22dADDvcasAziv6vYhwj8JzAI8U2jmES/yvAFhUaNsAdleJ2EvRD865gWtuKK/J6TjnlupcRKava0qtVO2XlVr1OsFhvTXUy+WTQQ5AhI/Vhv8dwXlJAUgqK1IrgqoMSAqxe71Ved72n50bu8g0e3ssQLJ6QfvnVlSaeq1wdcAgblIqDyhtmxu42apizjfThW7bXBNh5nYqnnxIQeljJZYBm3kKSO8JNJCCooV0IVRIvgYUAN5ZmzDEYgPAXfwNxAVjM1uN1wCu/gFdn51EBIXtygAAAABJRU5ErkJggg==" /> Reset Grid Count</a></li>'
  );
  $("body").on("click", ".reset-grids", function () {
    var grids = prompt(
      "Enter layout grids count (between 4 and 10):",
      localStorage.getItem('grid-count')
    );
    if (grids) {
      if( grids > 10 ) grids = 10;
      if( grids < 4 ) grids = 4;
      localStorage.setItem('grid-count', grids);
    }
    location.reload();
  });
  VM.observe(document.body, () => {
    // Change Layout
    function custom_layout(grid_count) {
      $("body .list.endless_page_template").css({
        gridTemplateColumns: "repeat("+grid_count+", 1fr)",
        margin: "0 auto",
      });
      $("body").find(".list.endless_page_template img").css({
        width: "100%",
        height: "auto",
      });
    }

    var oldXHR = window.XMLHttpRequest;
    function newXHR() {
      var realXHR = new oldXHR();
      realXHR.addEventListener(
        "readystatechange",
        function () {
          if (realXHR.readyState == 4) {
            setTimeout(custom_layout, 400);
          }
        },
        false
      );
      return realXHR;
    }
    window.XMLHttpRequest = newXHR;

    const rooms = $(
      ".list.endless_page_template .roomCard"
    );

    if (rooms.length > 0) {
      // if rooms exists
      var grids = 11;
      if (!localStorage.getItem("grid-count")) {
        grids = prompt("Enter layout grids count:", "11");
        if (grids) {
          localStorage.setItem('grid-count', grids);
        }
      } else {
        grids = localStorage.getItem('grid-count');
      }
      custom_layout(grids);
      var grid_template_columns = "repeat(" + grids + ", 1fr)";
      $(".list.endless_page_template").css({
        "grid-template-columns": grid_template_columns,
        "grid-template-rows": "auto",
        "grid-column-gap": "5px",
        "grid-row-gap": "15px",
        position: "relative",
        left: 0,
      }); // to be able to scale, on room list
      $(".list.endless_page_template .roomCard").css(
        "transition",
        "transform .1s ease-in-out"
      );
      $(".isIpad .list.endless_page_template *")
        .css("user-select", "none")
        .css("-webkit-touch-callout", "none");

      $(rooms).each((index, element) => {
        // for each room
        let timer;
        const name = $(element).find("> a").data("room")
          ? $(element).find("> a").data("room")
          : $(element)
              .find("> .user-info > .username > a")
              .text()
              .replace(/^\s/g, "");
        const thumbnail = $(element).find("> a img");

        $(element)
          .bind("pointerdown", (event) => {
            element.releasePointerCapture(event.pointerId);
          })
          .bind("pointerenter", (event) => {
            // start
            var firstQ = $("body .list.endless_page_template").innerWidth() / 5,
              lastQ = firstQ * 4,
              origin = "center center",
              originX = "center",
              originY = "center";
            if (event.pageX < firstQ) {
              originX = "left";
            } else if (event.pageX > lastQ) {
              originX = "right";
            }
            if (event.pageY < $(document).innerHeight() / 4) {
              originY = "top";
            } else if (event.pageY > $(document).innerHeight() / 4) {
              originY = "bottom";
            }
            origin = originX + " " + originY;

            if ($(element).parent(".list.endless_page_template").length > 0) {
              // scale only on room list
              $(element)
                .css("transform-origin", origin)
                .css("transform", "translateX(0px) scale(1.5)")
                .css("z-index", "999");
            }

            timer = setInterval(
              () => {
                // animate thumbnail
                $(thumbnail).attr(
                  "src",
                  //`https://roomimg.stream.highwebmedia.com/riw/${name}.jpg?f=${Date.getTime().now()}`
                  `https://cbjpeg.stream.highwebmedia.com/minifwap/${name}.jpg?f=${Date.now()}`
                );
              }, 660
            );
          })
          .bind("pointerup pointerleave", (event) => {
            // stop
            if ($(element).parent(".list.endless_page_template").length > 0) {
              // scale only on room list
              $(element)
                .css("transform-origin", "center center")
                .css("transform", "translateX(0px) scale(1)")
                .css("z-index", "0");
            }

            clearInterval(timer); // stop animate thumbnail
            timer = undefined;
          });
      });

      return false;
    }
  });
})();