JAVLibrary - Highlight Owned Movies

Highlight owned movies on JAVLibrary

このスクリプトの質問や評価の投稿はこちら通報はこちらへお寄せください。
// ==UserScript==
// @author      jvlflame
// @name        JAVLibrary - Highlight Owned Movies
// @version     0.0.4

// @include     https://*javlibrary.com/*/
// @include     *://*/movie/*
// @include     *://*/cn*
// @include     *://*/tw*
// @include     *://*/ja*
// @include     *://*/en*

// @description Highlight owned movies on JAVLibrary

// @namespace https://greasyfork.org/users/63118
// ==/UserScript==

let styles = `
    .owned {
      background: cornflowerblue;
      color: black;
    }
`;
let styleSheet = document.createElement("style");
styleSheet.type = "text/css";
styleSheet.innerText = styles;
document.head.appendChild(styleSheet);

var buttonDiv = document.createElement("div");
buttonDiv.innerHTML =
  '<button id="refresh-owned-btn" type="button">' +
  "Refresh Owned Movies</button>";
buttonDiv.setAttribute("class", "refreshowned category");
document.querySelector(".menul1").appendChild(buttonDiv);

//--- Activate the newly added button.
document
  .getElementById("refresh-owned-btn")
  .addEventListener("click", ButtonClickAction, false);

function ButtonClickAction(zEvent) {
  // Write owned movie list to localstorage so we don't have to
  // fetch the list on every page
  aggregateMovieList();
}

function sleep(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

function updateDOM() {
  //const moviesOnCurrentPage = [];
  const moviesOnCurrentPage = document.querySelectorAll(".video");

  // We can parse the list more easily as an array
  if (localStorage.getItem("ownedMovies")) {
    const ownedMovies = localStorage.getItem("ownedMovies").split(",");
    try {
      for (let i = 0; i < moviesOnCurrentPage.length; i++) {
        if (
          ownedMovies.includes(
            moviesOnCurrentPage[i].children[0].attributes[0].value.split(
              "?v="
            )[1]
          )
        ) {
          moviesOnCurrentPage[i].children[0].children[0].classList.add("owned");
        }
      }
    } catch (err) {
      console.log(err);
    }
  }
}

const movieList = [];

function setMoviesToLocalStorage(ownedMovies) {
  const ownedMovieList = ownedMovies.join(",");
  ownedMovies.forEach((movie) => {
    movieList.push(movie);
  });
  localStorage.setItem("ownedMovies", ownedMovieList);
}

function getOwnedMovieCount() {
  const movieCount = fetch(
    `https://www.javlibrary.com/en/userowned.php?list&mode=&u=${getCookie(
      "userid"
    )}&page=0`,
    {
      headers: {
        accept:
          "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        "accept-language": "en-US,en;q=0.9",
        "cache-control": "no-cache",
        pragma: "no-cache",
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin",
        "sec-gpc": "1",
        "upgrade-insecure-requests": "1",
      },
      referrer: `https://www.javlibrary.com/en/userowned.php?list&mode=&u=${getCookie(
        "userid"
      )}`,
      referrerPolicy: "strict-origin-when-cross-origin",
      body: null,
      method: "GET",
      mode: "cors",
      credentials: "include",
    }
  )
    .then((res) => res.text())
    .then((html) => {
      // Initialize the DOM parser
      var parser = new DOMParser();

      // Parse the text
      var doc = parser.parseFromString(html, "text/html");

      return doc.querySelector(".boxtitle").innerHTML.split(": ")[1];
    });

  return movieCount;
}

function getOwnedMoviesByPage(pageNum) {
  const data = fetch(
    `https://www.javlibrary.com/en/userowned.php?list&mode=&u=${getCookie(
      "userid"
    )}&page=${pageNum}`,
    {
      headers: {
        accept:
          "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
        "accept-language": "en-US,en;q=0.9",
        "cache-control": "no-cache",
        pragma: "no-cache",
        "sec-fetch-dest": "document",
        "sec-fetch-mode": "navigate",
        "sec-fetch-site": "same-origin",
        "sec-fetch-user": "?1",
        "sec-gpc": "1",
        "upgrade-insecure-requests": "1",
        cookie: `${document.cookie}`,
      },
      referrer: `https://www.javlibrary.com/en/userowned.php?list&mode=&u=${getCookie(
        "userid"
      )}`,
      referrerPolicy: "strict-origin-when-cross-origin",
      body: null,
      method: "GET",
      mode: "cors",
    }
  )
    .then((res) => res.text())
    .then((html) => {
      // Initialize the DOM parser
      var parser = new DOMParser();

      // Parse the text
      var doc = parser.parseFromString(html, "text/html");

      const vidsOnPage = doc.querySelectorAll(".video");
      const ownedMovies = [];
      for (let i = 0; i < vidsOnPage.length; i++) {
        const movieId = ownedMovies.push(
          vidsOnPage[i].children[1].attributes[0].value.split("?v=")[1]
        );
      }
      return ownedMovies;
    });

  return data;
}

function getOwnedMovies() {
  // fetch owned movies from the javlibrary owned movies list
  fetch("https://www.javlibrary.com/en/mv_owned_print.php", {
    headers: {
      accept: "*/*",
      "accept-language": "en-US,en;q=0.9",
      "cache-control": "no-cache",
      pragma: "no-cache",
      "sec-fetch-dest": "empty",
      "sec-fetch-mode": "cors",
      "sec-fetch-site": "same-origin",
      "sec-gpc": "1",
    },
    referrer: "https://www.javlibrary.com/en/myaccount.php",
    referrerPolicy: "strict-origin-when-cross-origin",
    body: null,
    method: "GET",
    mode: "cors",
    credentials: "include",
  })
    .then((res) => {
      // return the raw text
      return res.text();
    })
    .then((html) => {
      // Initialize the DOM parser
      var parser = new DOMParser();

      // Parse the text
      var doc = parser.parseFromString(html, "text/html");

      const ownedMovies = [];
      const titles = doc.querySelectorAll(".title");
      titles.forEach((title) => {
        if (title.innerHTML !== "Title") {
          ownedMovies.push(title.innerHTML.split(" ")[0].replace("\n", ""));
        }
      });
      return ownedMovies;
    })
    .then((movies) => {
      setMoviesToLocalStorage(movies);
    })
    .catch((err) =>
      window.alert(`Failed to fetch and/or set owned movie list ${err}`)
    );
}

async function aggregateMovieList() {
  console.time("Get owned movies");
  const movieList = [];
  const movieCount = await getOwnedMovieCount();
  const pageCount = await Math.ceil(movieCount / 20);

  for (let i = 0; i <= pageCount; i++) {
    document.getElementById(
      "refresh-owned-btn"
    ).innerHTML = `Please wait ${i} / ${pageCount} (Do not close this page)`;
    const movies = await getOwnedMoviesByPage(i);
    for (let j = 0; j < movies.length; j++) {
      if (movies[j] !== "") {
        movieList.push(movies[j]);
      }
    }
    await sleep(100);
  }

  setMoviesToLocalStorage(movieList);
  document.getElementById("refresh-owned-btn").innerHTML = "Completed!";
  console.timeEnd("Get owned movies");
}

updateDOM();