✨TvTime✨

Objectif TOUT VOUS simplifier: tvtime.com: (⟳) vérifie si les saisons sont completes, 🔍 pour trouver votre serie. En plus: Compatible JDownloader(voir images), et bien d'autre option(voir image). Pour plus d'information voir les Notes de version des l'Historique des des versions.

目前為 2023-08-01 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         ✨TvTime✨
// @namespace    http://tampermonkey.net/
// @version      1.5.1
// @description  Objectif TOUT VOUS simplifier:  tvtime.com: (⟳) vérifie si les saisons sont completes, 🔍 pour trouver votre serie. En plus: Compatible JDownloader(voir images), et bien d'autre option(voir image). Pour plus d'information voir les Notes de version des l'Historique des des versions.
// @license      MIT
// @author       DEV314R
// @match        https://www.tvtime.com/fr
// @match        https://www.tvtime.com/fr/*
// @match        https://www.tvtime.com/*/to-watch
// @match        https://dl-protect.link/*
// @match        https://www.zone-telechargement.homes/*
// @match        https://www.zone-telechargement.homes/?p=serie*
// @match        https://www.zone-telechargement.homes/?p=fimls*
// @match        https://www.zone-telechargement.homes/?p=manga*
// @match        https://www.zone-telechargement.homes/?p=autres-videos&search*
// @match        https://www.zone-telechargement.homes/?search=*
// @icon         https://external-content.duckduckgo.com/ip3/www.tvtime.com.ico
// @run-at       document-start
// @grant        GM_addStyle
// @grant        GM.setClipboard
// @grant        window.close
// ==/UserScript==

const juste=1//1=seulement les complètes | 0=toutes avec indications
const jour=0//jour en plus après la sortie de la serie avant vérification
let ConfirmerRecherche=0// 1=oui (expérimental) | 0=non
const Temp=8000//Temp en ms (1000ms=1seconde) entre chaque ouverture des liens de [TOUT DL]
const hébergeur= "uptobox";//écriver votre ébergeur préférer exemple: "uptobox" ou "1fichier"
const JDownloader=0 // 1 = copie automatiquement le lien dans le press-papier OU 0 = ouvre simplement le lien


if(location.href.search(/www.tvtime.com/gi)>-1){csstime()}
if(location.href.search(/\.zone-telechargement\./gi)>-1){cssZ()}
document.addEventListener('DOMContentLoaded',()=>{
 if(location.href.search(/((serie|manga)(s)?)(&(id|s))?/gi)>-1){extractContent();}
 if(location.href.search(/www.tvtime.com/gi)>-1){


const site="www.zone-telechargement.homes/?p=series&search="


  const a = document.querySelectorAll(".episode-details.poster-details > a[href],#all-shows > section > ul> li > div > div > h2 >a");
  let k = 0;

  const cl=document.querySelectorAll('.episode-details.poster-details > a');
  for(let g=0;g<cl.length;g++) {
   const s=cl[g];
   const ed=s.innerText.replace(/ 🔍|\(.+\)/gi, '+')//.replace(/[,:].*[^.,:]+/g, "").replace(/[,:!]/g, "")
   s.parentNode.parentNode.querySelector(":not(.show-all)").innerHTML+=`<a style="border: 0.2em ridge #ffd700; border-radius: 20%; z-index:99999;" target="_blank" href="https://${site}${ed}">🔍</a>`;
  }

  function re() {
   const i = document.querySelector("#rech");
   const cl = a.length;
   if (k < cl) {
    setTimeout(async()=>{
     await recherche(k);
     k++;
     re();
    }, 10);
    i.value = "⌛";
    i.style.background = "#000";
   } else if (k === cl) {
    i.value = "👌";
    i.removeAttribute("id");
   }}

  if(location.href.search(/www.tvtime.com\/.+\/show\//gi)>-1){
   const d1 = new Date().valueOf();
   const d2 = new Date(document.querySelector(".season-content.active > ul > li:last-child > div > div > a>.episode-air-date").textContent.match(/\d\d\d\d-\d\d-\d\d/gi)[0]).valueOf();
   if (d1 >= d2) {
    document.title = "✅" + document.title.replace(/TV Time - /gi, "");
   } else {
    document.title = "❌" + document.title.replace(/TV Time - /gi, "");
    document.querySelector('.col-sm-2.actions > .row > .active.watched-btn.col-sm-offset-4.col-sm-6 > .icon-tvst-watch').scrollIntoView();
   }
   if(location.href.search(/www.tvtime.com\/.+\/show\/\d+/gi) > -1) {
    const dn=document.querySelector("#top-banner > div > div.info-zone > div > div > h1");
    dn.innerHTML += ('<a style="outline:0.1em ridge #ffd700;outline-radius:20%;" href="https://'+site+dn.innerText.replace(/ 🔍|\(.+\)/gi, "")+'" target="_blank">🔍</a>');
   }
  }else{
   document.querySelector("#home-link").insertAdjacentHTML('beforebegin', '<input id="rech" type="button" value="⟳" style="color:#000;background:#ffd700;border: 0.1em solid #ffd700; border-radius:50%;width:2.3em;height:2.3em;"></input><br>');
  }

  ////
  const OnEvent=(doc)=>{
   return{
    on:(type,selector,callback)=>{
     doc.addEventListener(type,(event)=>{
      if(!event.target.matches(selector))return;
      callback.call(event.target,event);
     },false);
    }}};
  OnEvent(document).on('click','#rech',()=>{
   re()

  })

  async function recherche(num) {
   var s = a[num];
   var url = s.href;
   var dd = s;
   var da = new Date().valueOf();
   var xhr = new XMLHttpRequest();
   xhr.open("GET", url, true);
   xhr.responseType = "document";
   xhr.onload = function() {
    if (xhr.readyState == 4 && xhr.status == 200) {
     var response = xhr.responseXML.querySelector('.season-content.active > ul > li:last-child > div > div > a > .episode-air-date');
     var db = new Date(response.textContent.match(/\d\d\d\d-\d\d-\d\d/gi)[0]).valueOf();
     if (da >= (db + (jour * 86400000))) {
      dd.innerText += '✅';
     } else {
      if (juste == 1) {
       dd.parentNode.parentNode.parentNode.removeChild(dd.parentNode.parentNode);
      }
      dd.innerText+='❌';
      dd.innerHTML+=('<br> '+((db-da)/86400000).toFixed(0)+' jours restants avant sortie complète');
     }
     dd.innerText+=response.innerText;
     var EpisodeMax=xhr.responseXML.querySelectorAll('[itemprop="season"].season-content.active > ul > li').length;
     dd.innerHTML+=('<br>nombre d\'épisode: ' + EpisodeMax);
    }
   }
   xhr.send();
  }


 }else if(location.href.search(/dl-protect.+\//gi)>-1){

  GM_addStyle(`body,.urls{color:#ddd;background:#000!important;}
#subButton{color:#000;transform: scale(1.5);}
.navbar,.amigo,footer{display:none!important;}`)
if (JDownloader==1){
	setTimeout(()=>{
if (document.querySelector('iframe[src*="https://challenges.cloudflare.com"]')){
 document.title="⏳"+document.title
 document.querySelector("#subButton").click()
                 document.title="🖱️"+document.title
 setTimeout(()=>{document.querySelector('[rel="external nofollow"]').click()},100)
 document.addEventListener("visibilitychange", fcliq);
	document.querySelector('html,iframe').addEventListener("mouseenter", fcliq);
 function fcliq(){
  document.title="🤖"+document.title
  setTimeout(()=>{document.querySelector("#subButton").click()},100)}
 var erreur=document.querySelector("#protected-container > div:nth-child(2) > div > ul > li > a");if(erreur.innerText.search(/invalide/gi)>-1){erreur.click()}
}},3000)
if (!document.querySelector('iframe[src*="https://challenges.cloudflare.com"]')){
var lien=document.querySelector("#protected-container > div > div > ul > li > a[href]").href
GM.setClipboard(lien)
document.title="🧠"+document.title
setTimeout(function f(){window.close(document.URL)},2500)
}
}else{
 document.title="⏳"+document.title
 setTimeout(()=>{document.querySelector("#subButton").click()
                 document.title="🖱️"+document.title
                },3000)
 setTimeout(()=>{document.querySelector('[rel="external nofollow"]').click()},100)
 document.addEventListener("visibilitychange", fcliq);
	document.querySelector('html,iframe').addEventListener("mouseenter", fcliq);//document.addEventListener("mouseenter", fcliq);
 function fcliq(){
  document.title="🤖"+document.title
  setTimeout(()=>{document.querySelector("#subButton").click()},100)}
 var erreur=document.querySelector("#protected-container > div:nth-child(2) > div > ul > li > a");if(erreur.innerText.search(/invalide/gi)>-1){erreur.click()}

}

}

 if(location.href.search(/(serie|manga)&id/gi)>-1){
  var t= document.querySelector("#dle-content > div.base > div > div.corps > div:nth-child(1) > div:nth-child(3)")
  var d1=document.querySelector("#dle-content > div.base > div > div.corps > div:nth-child(1) > div:nth-child(4)").textContent.match(/\d+(?=\sEpisode)/gi)[0]
  var dm=document.querySelector("center > .postinfo").innerText.match(/\d+/gi)
  let match= dm.includes(d1)
  t.textContent=(match?"✅":"❌")+t.textContent;
  if (t.textContent.startsWith("✅")){ajouterBoutonTelechargement();}
 }
///////////////////////////////////////////

function ajouterBoutonTelechargement() {
  var elements = document.querySelectorAll('.postinfo div[style*="font-weight:bold;"]');
  for (var i = 0; i < elements.length; i++) {
    var element = elements[i];
    var nom = element.innerText.trim();
    element.insertAdjacentHTML('afterbegin', '<a class="tdl-button" style="border: 0.2em ridge #ffd700;padding:0.2em;margin:0.2em;cursor:pointer;"> TOUT DL ' + nom + '</a>');
    element.addEventListener('click', openLink.bind(i));
  }

var result = document.querySelector("#dle-content > div.base > div > div.corps > div:nth-child(1) > div:nth-child(4)").textContent.match(/\d+(?=\sEpisode)/gi);
var nombretotalepisode = result ? parseInt(result[0]) : 0;
function openLink(i) {
  var links = document.querySelectorAll('.postinfo > b > a[href]');
  var index = this * nombretotalepisode;

var count = 0;
let t=document.title.replace(/Télécharger/gi,'').replace(/ - Saison /gi,' S')
  function openNextLink() {
    if (index < links.length && count < nombretotalepisode) {
      links[index].click();
      index++;
      count++;
      document.title=count+'/'+nombretotalepisode+t
      setTimeout(openNextLink, Temp);
    }
  }
  openNextLink();
}
}
///////////////////////////////////////////

 if(location.href.search(/(serie|manga)&id/gi)>-1){
  var siteT="https://www.tvtime.com/fr/"
  var nom=document.querySelector("#dle-content > div.base > div > div.corps > div:nth-child(1) > div:nth-child(3)").innerText
  document.querySelector("#dle-content > div.base > div > div.corps > div:nth-child(1) > div:nth-child(3)").insertAdjacentHTML('beforeend', '<a style="border: 0.2em ridge #ffd700; color:ffd700; background:#000; margin-left:0.6em;" target="_blank" href="'+siteT+'##'+nom.replace(/✅|❌/gi,'')+'">TV Time</a><br>')
 }else if (location.href.match(/www.tvtime.com\/fr\/##/gi)>-1){
  var recherche=document.querySelector("#global-search-input")
  if (location.href.match(/##.+/gi)){
   var decodedText = decodeURIComponent(location.href.split("##")[1]);
   recherche.value = decodedText;
  }
  //recherche en cours...
 }




function extractContent() {
  // Référence pour les URL
  var urlElements = document.querySelectorAll("#dle-content > div:nth-child(n+4) > div:nth-child(4) div div a[href]");
  // Référence pour le contenu à afficher
  var targetElements = document.querySelectorAll("#dle-content > div:nth-child(n+4) > div:nth-child(4) div div a[href]");

  // Conversion de la référence NodeList en un tableau
  urlElements = Array.from(urlElements);
  targetElements = Array.from(targetElements);

  // Génération d'un tableau de promesses qui exécutent la récupération du contenu à partir de l'URL
  var promises = urlElements.map(function(urlElement, i) {
   var url = urlElement.href;

   return fetch(url)
    .then(function(response) {
    return response.text();
   })
    .then(function(html) {
    // Extraction du contenu
    var parser = new DOMParser();
    var doc = parser.parseFromString(html, "text/html");
    var sourceElement = doc.querySelector("#dle-content > div.base > div > div.corps > div:nth-child(1) > div:nth-child(4)");
    // Extraction du numéro de l'épisode le plus récent
    var dernierepisodeP2 = Math.max(...(doc.querySelector("center > .postinfo").innerText.match(/\d+/gi)));
    // Renvoi du contenu extrait
    var innerText = sourceElement.innerText.match(/\d+ Episodes/gi);
    if (innerText !== null && parseInt(innerText[0].match(/\d+/gi)[0]) === parseInt(dernierepisodeP2)) {
     // L'épisode est le plus récent, on ajoute un message de mise à jour
     innerText = "✅Complet " + innerText;
    }else if(innerText == null){innerText = "❗␀ " + innerText;}
    else {
     // L'épisode est incomplet, on retire l'élément parent de targetElements
     targetElements[i].parentElement.parentElement.parentElement.parentElement.remove();

    }
    return {
     targetElement: targetElements[i],
     innerText: innerText
    };
   });
  });

  // Attente de la résolution de toutes les promesses avant de mettre à jour les éléments cibles
  Promise.all(promises).then(function(results) {
   results.forEach(function(result) {
    result.targetElement.innerHTML += "<br>" + result.innerText;
   });
  });
 }


function site(href){return location.href.search(href)>-1}

if (ConfirmerRecherche===1){
if(location.href.search(/zone-telechargement.+(&search|search=)/gi)>-1){retirerNonConformes("#story",".cover_infos_title",3).then(function2);

setTimeout(()=>{
   document.title="⏳"+document.title
   if((document.querySelector("#dle-content > div:nth-child(4)").innerText.match(/Aucune fiches trouvées/gi)/*||!document.querySelector("#dle-content > div:nth-child(5) > div:nth-child(4) > div > div > a")*/) && location.href.search(/mangas/gi)>-1){
    window.open(location.href.replace(/series&search/gi,"mangas&search"), "_self");
   }else if((document.querySelector("#dle-content > div:nth-child(4)").innerText.match(/Aucune fiches trouvé/gi)/*||!document.querySelector("#dle-content > div:nth-child(5) > div:nth-child(4) > div > div > a")*/) && location.href.search(/mangas/gi)>-1){
    window.open(location.href.replace(/mangas&search/gi,"autres-videos&search"), "_self");
   }else if((document.querySelector("#dle-content > div:nth-child(4)").innerText.match(/Aucune fiches trouvé/gi)/*||!document.querySelector("#dle-content > div:nth-child(5) > div:nth-child(4) > div > div > a")*/) && location.href.search(/autres-videos/gi)>-1){
  /*  document.title="🙅"+document.title
document.querySelector("body").innerText="Pas trouver fermeture dans 5 Seconde"
setTimeout(function f(){window.close(document.URL)},5000)*/

   }},3000)
}

function retirerNonConformes(element,tableau,profondeur) {
return new Promise(resolve=>{
var ele =document.querySelector(element)
var text=ele.value
var eleconvertiregex=new RegExp(text,"gi");
var tableaux=document.querySelectorAll(tableau)
for(var j=0;j<tableaux.length;j++){
if((tableaux[j].innerText.search(eleconvertiregex))>-1){
}else{
var s=tableaux[j];
for(var i=0;i<profondeur;i++){
s=s.parentNode;
}
s.parentNode.removeChild(s);
}}
resolve();
});
}

function function2(){
var elem4=document.querySelectorAll("#dle-content > div.cover_global:nth-child(n+5)")
if(elem4.length===1){document.querySelector("#dle-content > div.cover_global:nth-child(5) a").click()
}
}

if(location.href.search(/zone-telechargement.+(series&search|(serie|manga)&id=|search=)/gi)>-1){removeLessImportant("#dle-content > div:nth-child(n+5) > div:nth-child(4) > div > div > span > span > b");}
function removeLessImportant(arre) {
  var arr = document.querySelectorAll(arre);
  let best;
  for (let i = 0; i < arr.length; i++) {
   if (arr[i].textContent.includes("4K")) {
    best = arr[i];
    break;
   } else if (arr[i].textContent.includes("(VF HD)")) {
    if (!best || best.textContent.includes("(VF)")) {
     best = arr[i];
    }
   } else if (arr[i].textContent.includes("(VF)")) {
    if (!best) {
     best = arr[i];
    }
   }
  }
  for (let i = 0; i < arr.length; i++) {
   if (arr[i] !== best) {
    var s=arr[i].parentNode.parentNode.parentNode.parentNode.parentNode.parentNode
    s.parentNode.removeChild(s);
   }}}

if(location.href.search(/(serie|film)&id/gi)>-1){clickOnElement2("#dle-content > div.base > div > div.corps > div:nth-child(1) > div:nth-child(4)",/vf|720p|HDRIP|BDRIP/gi,"#dle-content > div.base > div > div.corps > div:nth-child(1) > div.otherversions > a > span > span > b",/\(VF HD\)|1080p/gi)}
function clickOnElement2(element1,txt1, element2,txt2) {
if(document.querySelector(element1).innerText.search(txt1)>-1 && document.querySelector(element2).innerText.search(txt2)>-1) {
document.querySelector(element2).click();}
}

}
if(site(/&search|\?search=|mangas&(page|genre)/gi)){retirer(4,/ VOSTFR |\(VOSTFR HD\)|\(VOSTFR\)|\(Coréen\)|\(Polonais\)|\(Espagnol\)|\(Anglais\)|\(Japonais\)|HDCAM|\(VO\)|^(HDRiP MD|TS( MD)?)$/gi,"span,a,b");}
function retirer(profondeur,filtre,cible){
var ref=filtre;
var cl=document.querySelectorAll(cible);
for(var k=0;k<cl.length;k++){
var match=false;
if(Array.isArray(ref)){
for(var u=0;u<ref.length;u++){
if(cl[k].innerText.match(ref[u])){
match=true;
break;
}}
}else{
match=cl[k].innerText.match(ref);
}
if(match){
var s=cl[k];
for(var i=0;i<profondeur;i++){
s=s.parentNode;}
s.parentNode.removeChild(s);
}}}



const heb = new RegExp(hébergeur, "gi");
if(location.href.search(/.zone-telechargement.+p=(films|ebooks)/gi)>-1){

async function getExternalLinkFromInternalLink() {
  try {
    const internalLinks = document.querySelectorAll("div.cover_infos_title > a");
    const externalLinks = [];

    // Loop through each internal link
    for (const internalLink of internalLinks) {
      const href = internalLink.href;
      let externalLink = null;

      // Ajout du bouton et de l'événement de clic pour ouvrir le lien externe dans un nouvel onglet
      const button = document.createElement('nav');
      button.textContent = '🔗'+hébergeur;
      button.style.position = 'absolute';
      button.style.left = '58%';
      button.style.top = '8%';
      button.style.transform = 'scale(1.25)'
      button.style.opacity = '0.75';
      button.style.cursor = 'pointer';
      button.style.background = '#ffd700';
      button.style.color = '#000';
      button.style.outline = '0.1em solid #000';
      button.style.zIndex = '9999';
      internalLink.parentNode.parentNode.parentNode.appendChild(button);

      button.addEventListener('click', async () => {
        if (!externalLink) {
          const response = await fetch(href);
          if (!response.ok) {
            throw new Error('Erreur lors de la récupération du contenu du lien interne.');
          }

          const textContent = await response.text();
          const elements = new DOMParser().parseFromString(textContent, 'text/html').querySelectorAll("center > div.postinfo > b > div");
          const regex = heb;

          // Loop through elements to find the external link matching the regex
          for (let i = 0; i < elements.length; i++) {
            const element = elements[i];
            if (element.innerText.match(regex)) {
              externalLink = element.parentElement.nextElementSibling.firstChild.href;
              break;
            }
          }
        }

        if (externalLink) {
          window.open(externalLink, '_blank');
        } else {
          console.log('Impossible de récupérer le lien externe.');
        }
      });

      externalLinks.push(button);
    }

    return externalLinks; // Returning an array of external link buttons
  } catch (error) {
    console.error('Une erreur est survenue :', error);
    return null;
  }
}

// Appel de la fonction et récupération du tableau de boutons de liens externes
getExternalLinkFromInternalLink()
  .then((externalLinks) => {
    if (externalLinks) {
      console.log('Boutons de liens externes créés :', externalLinks);
    } else {
      console.log('Impossible de récupérer les liens externes.');
    }
  });


}

})

function csstime(){GM_addStyle(`
section{padding:0;margin:0}
html,.alt-block,#content,section,.row,.body-inner,ul.dropdown-menu,.scrollable,.right{color:#ddd!important;background:#000!important;}
.credits > p,.social,#get-the-app{display:none;}
#home {color:#ddd;background:#fbd737;}
h3,.label,.expand-icon{color:#fbd737!important;}
.label :hover,[data-toggle] :hover{color:#000!important;background:#fbd737;}
.rank-sticker{color:#000!important;}
span,h2{color:#fff!important;}
#profile,#to-watch,.main-block{color:#ddd;background:#222;}
h1,h2 a{color:#ddd!important;}
.posters-list>li .poster-details .secondary-link{color:#888}
.dropdown{background:#1a1a1a!important;}
#episode-details.episode.episode-header.banner.change-episode-link{
	width: 43%;
border: 0.1vw solid #fbd737!important;}
#actor-discussion .filters, #profile-discussion .filters, #profile-shows #favorite-shows .progress, #profile-shows #favorite-shows h3, #profile-shows .labels h4, #profile-shows .posters-list>li .poster-details h3 {
display: block;color: #7cdb62!important;}
.odd *{background:#212121!important;}

`)}

function cssZ(){GM_addStyle(`
body,#header,b,.top-title,[class*="content"],.blockbox,ul li,[style] a,div.message_box.berrors,.container,.s_mid,.s_left,.top-year,.imdbRating,.cover_global,.maincont,.blocks{color:#dfdfdf!important;background:#000!important;border-color:#000;}
button,img,[src]{color:#000!important;background:#eee!important;}
.quote,[name="search"]{color:#bbb!important;background:#333!important;}
div,p,table,td,blockquote,li,ul{padding-top:0!important;margin-top:0!important;margin-bottom: 0!important;}
#header,#sidebar-right > div:last-child,#dle-content > div.blockbox > div.blockcontent > div:not(.upload-infos){display: none!important;}
a[href*='-vostfr-720p.html'],a[href*='-vostfr-1080p.html'],a[href*='/vostfr/'],a[href*='-vostfr.html'],[class*="prez"],[title*="Télécharger "],[title*="Regarder "]{display:none!important}

`)}