[GM] Vivo.sx Tools (listed) 05.05.2021 15:42:44 (219 lines) [Edit] [Raw] [View]

// ==UserScript== // @name Vivo.sx Tools (add hash to url, show link) // @version 1.1 // @grant none // @include https://vivo.sx/ // @include https://bs.to/ // ==/UserScript==

if (document.location.host == "vivo.sx") { initVivoScript(); } else if (document.location.host == "bs.to") { initBsScript(); }

function initVivoScript() {

if(!document.location.href.match("#")){ document.location.href = document.location.href + "#123456789"; }

let videoContainer = Q(".stream-content video"); let videoFooter = Q(".stream-share");

if (!videoContainer) console.warn("[VSXTools] Video container not found");

if (!videoFooter) console.warn("[VSXTools] Video footer not found");

if (videoContainer && videoFooter) { console.info("[VSXTools] Adding link text box");

let toolContainer = document.createElement("DIV");
toolContainer.style = "display: flex; padding: 4px;";

let inputVideoTitle = document.createElement("INPUT");
inputVideoTitle.setAttribute("readonly", "readonly");
inputVideoTitle.classList.add("form-control");
inputVideoTitle.style = "margin-right: 4px; width: 60%;";
inputVideoTitle.value = "...";
inputVideoTitle.style.display = "none";
inputVideoTitle.style.cursor = "unset";

let inputVideoUrl = document.createElement("INPUT");
inputVideoUrl.setAttribute("readonly", "readonly");
inputVideoUrl.classList.add("form-control");
inputVideoUrl.value = "...";;

let buttonCopyTitle = document.createElement("BUTTON");
buttonCopyTitle.classList.add("btn");
buttonCopyTitle.classList.add("btn-primary");
buttonCopyTitle.style = "margin-left: 4px;";
buttonCopyTitle.innerText = "Copy Title";
buttonCopyTitle.style.display = "none";
buttonCopyTitle.onclick = function() {
    inputVideoTitle.select();
  document.execCommand("copy");
};

let buttonVideoNewTab = document.createElement("BUTTON");
buttonVideoNewTab.classList.add("btn");
buttonVideoNewTab.classList.add("btn-primary");
buttonVideoNewTab.style = "margin-left: 4px;";
buttonVideoNewTab.innerText = "Open";
buttonVideoNewTab.setAttribute("disabled", "disabled");
buttonVideoNewTab.onclick = function() {
  window.open(inputVideoUrl.value);
};

let buttonDownload = document.createElement("BUTTON");
buttonDownload.classList.add("btn");
buttonDownload.classList.add("btn-primary");
buttonDownload.style = "margin-left: 4px;";
buttonDownload.innerText = "Download";
buttonDownload.setAttribute("disabled", "disabled")

toolContainer.appendChild(inputVideoTitle);
toolContainer.appendChild(inputVideoUrl);
toolContainer.appendChild(buttonCopyTitle);
toolContainer.appendChild(buttonVideoNewTab);
//toolContainer.appendChild(buttonDownload); //does not work with popup blocker

videoFooter.parentElement.insertBefore(toolContainer, videoFooter);

let videoTitle = null;
try {
  let titleQuery = new URLSearchParams(window.location.search).get('title');
  if (titleQuery) {
    videoTitle = titleQuery;
    inputVideoTitle.value = videoTitle;
    inputVideoTitle.style.display = "";
    buttonCopyTitle.style.display = "";
  }
} catch(e) {}

setTimeout(function(){
  //videoContainer needs to be refreshed

  let videoData = getVideoData();
  let url = videoData.url;

  if (videoData.name != null) {
    let querySeparator = "?";
    if (videoData.url.includes("?"))
      querySeparator = "&";
    videoData.url += querySeparator + "filename=" + videoData.name;

    if (videoTitle) {
      videoData.url += "&title=" + encodeURIComponent(videoTitle);
    } else {
      videoTitle = videoData.name;
      inputVideoTitle.value = videoTitle;
      inputVideoTitle.style.display = "";
      buttonCopyTitle.style.display = "";
    }

  }

  //buttonDownload.setAttribute("download", "test");
  buttonDownload.onclick = function() {
    document.location.href = videoData.url;
    console.info(videoData.url);
  };

  inputVideoUrl.value = videoData.url;
  inputVideoUrl.style = "cursor: unset;";

  if (videoData.url != "null") {
    buttonVideoNewTab.removeAttribute("disabled");
    buttonDownload.removeAttribute("disabled");
  }
}, 1000);

}

function getVideoData() {

let url = Q(".stream-content video").getAttribute("src") || Q(".stream-content video source").getAttribute("src") || "null";
let name = null;

if (url != "null") {
  let videoFrame = Q(".stream-content");
  if (videoFrame) {
    let titleAttr = videoFrame.getAttribute("data-name");
    if (titleAttr) {
      name = titleAttr;
    }
  }
}

return {
  url: url,
  name: name
};

}

}

function initBsScript() {

let lastTitle = null;

setInterval(function(){
let titleHeading = Q("#root h2:first-of-type");
if (titleHeading && titleHeading.childNodes.length > 0) {
  let title = titleHeading.childNodes[0].textContent.trim();

  let seasonButton = Q("#seasons .active a");
  let season = null;
  if (seasonButton) {
    season = seasonButton.textContent.trim();
  }

  let episodeButton = Q("#episodes .active a");
  let episode = null;
  if (episodeButton) {
    episode = episodeButton.textContent.trim();
  }

  let episodeTitleHeading = Q("#root .episode h2:first-of-type");
  if (episodeTitleHeading) {
    let episodeTitle = episodeTitleHeading.textContent.trim();

    if (season != null && episode != null) {
      title += " S" + season.padStart(2, "0") + "EP" + episode.padStart(2, "0") + " " + episodeTitle;
    } else {
        title += " - " + episodeTitle;
    }


  }

  let videoLink = Q(".hoster-player a");
  if (videoLink) {

    if (title != lastTitle){
        console.log(title + " - " + videoLink.href);
      videoLink.href += (videoLink.href.includes("?") ? "&" : "?") + "title=" + encodeURIComponent(title);
      videoLink.style.color = "#10C070";
      let titleDiv = document.createElement("div");
      titleDiv.style["font-size"] = "0.75em";
      titleDiv.innerText = title;
      videoLink.appendChild(titleDiv);
    }

    lastTitle = title;


  }
}

}, 500); }

function Q(selector){ return document.querySelector(selector); }