// ==UserScript== // @name ✨TvTime✨ // @namespace http://tampermonkey.net/ // @version 1.6 // @description Objectif TOUT VOUS simplifier: tvtime.com: (⟳) vérifie si les saisons sont completes, 🔍 pour trouver votre serie. Un Bouton [Réglage] sauvegardera vos préférence au file des mise à jours (voir images). // @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/* // @icon https://external-content.duckduckgo.com/ip3/www.tvtime.com.ico // @run-at document-start // @grant GM_addStyle // @grant GM.setClipboard // @grant window.close // @grant GM_getValue // @grant GM_setValue // @downloadURL none // ==/UserScript== const choixServeurOptions=['Uptobox','1fichier','Fikper','Rapidgator','Turbobit','Nitroflare','Netu','Vidoza','Doodstream']; const variables=[ { name: 'juste', label: 'Series complètes: ', defaultValue: 'activer' }, { name: 'jour', label: 'Jour après sortie: ', defaultValue: '0' }, { name: 'hébergeur', label: "Choix d'hébergeur: ", defaultValue: choixServeurOptions[0] }, { name: 'Temp', label: 'Temp (en ms) par ouverture de lien: ', defaultValue: '8000' }, { name: 'JDownloader', label: 'Liens vers JDownloader: ', defaultValue: 'désactiver' }, { name: 'ConfirmerRecherche', label: 'Recherche rapide (expérimental): ', defaultValue: 'désactiver' } ]; const juste = GM_getValue('juste', variables.find(v => v.name === 'juste').defaultValue); const jour = GM_getValue('jour', variables.find(v => v.name === 'jour').defaultValue); const hébergeur = GM_getValue('hébergeur', variables.find(v => v.name === 'hébergeur').defaultValue); const Temp = GM_getValue('Temp', variables.find(v => v.name === 'Temp').defaultValue); const JDownloader = GM_getValue('JDownloader', variables.find(v => v.name === 'JDownloader').defaultValue); const ConfirmerRecherche = GM_getValue('ConfirmerRecherche', variables.find(v => v.name === 'ConfirmerRecherche').defaultValue); 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=" function createInput(variable) { const container = document.createElement('div'); const label = document.createElement('label'); label.textContent = variable.label; let input; if (variable.name === 'jour' || variable.name === 'Temp') { input = document.createElement('input'); input.type = 'text'; input.value = GM_getValue(variable.name, variable.defaultValue); input.addEventListener('input', function() { input.value = input.value.replace(/\D/g, ''); // Retirer tous les caractères non numériques GM_setValue(variable.name, input.value); }); } else if (variable.name === 'hébergeur') { input = document.createElement('select'); for (const option of choixServeurOptions) { const optionElement = document.createElement('option'); optionElement.value = option; optionElement.textContent = option; input.appendChild(optionElement); } input.value = GM_getValue(variable.name, variable.defaultValue); input.addEventListener('change', function() { GM_setValue(variable.name, input.value); }); } else { input = document.createElement('select'); const options = ['activer', 'désactiver']; for (const option of options) { const optionElement = document.createElement('option'); optionElement.value = option; optionElement.textContent = option; input.appendChild(optionElement); } input.value = GM_getValue(variable.name, variable.defaultValue); input.addEventListener('change', function() { GM_setValue(variable.name, input.value); }); } container.appendChild(label); container.appendChild(input); return container; } function createSettingsButton() { const button = document.createElement('button'); button.textContent = 'Réglages'; button.style.position = 'fixed'; button.style.bottom = '0.1em'; button.style.left = '0.1em'; button.style.color = '#000'; button.style.backgroundColor = '#ffd700'; button.style.zIndex = "1000"; button.addEventListener('click', function() { const settingsPopup = document.createElement('div'); settingsPopup.style.position = 'fixed'; settingsPopup.style.bottom = '0'; settingsPopup.style.left = '0'; settingsPopup.style.padding = '0.4em'; settingsPopup.style.backgroundColor = '#ffd700'; settingsPopup.style.zIndex = "1000"; for (const variable of variables) { settingsPopup.appendChild(createInput(variable)); } const closeButton = document.createElement('span'); closeButton.textContent = '❌'; closeButton.style.position = 'absolute'; closeButton.style.bottom = '9.97em';//11.9em closeButton.style.left = '26.19em';//28.07em closeButton.style.cursor = 'pointer'; closeButton.style.padding = '0.2em'; closeButton.style.backgroundColor = '#000'; closeButton.addEventListener('click', function() { document.body.removeChild(settingsPopup); }); settingsPopup.appendChild(closeButton); document.body.appendChild(settingsPopup); }); document.body.appendChild(button); } createSettingsButton(); 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🔍`; } 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 += ('🔍'); } }else{ document.querySelector("#home-link").insertAdjacentHTML('beforebegin', '
'); } //// 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 == 'activer') { dd.parentNode.parentNode.parentNode.removeChild(dd.parentNode.parentNode); } dd.innerText+='❌'; dd.innerHTML+=('
'+((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+=('
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=='activer'){ 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()} }},4000) 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', ' TOUT DL ' + nom + ''); 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', 'TV Time
') }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 += "
" + result.innerText; }); }); } function site(href){return location.href.search(href)>-1} if (ConfirmerRecherche=='activer'){ 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-1){ }else{ var s=tableaux[j]; for(var i=0;i 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-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} `)}