Greasy Fork is available in English.

Rede Canais modo simplificado

Simplifica a pagina Rede Canais removendo elementos de contato, comentarios e outros. Além de adicionar alguns botões para ajudar a encontrar mais filmes

  1. // ==UserScript==
  2. // @name Rede Canais modo simplificado
  3. // @name:pt Rede Canais modo simplificado
  4. // @name:pt-BR Rede Canais modo simplificado
  5. // @name:pt-PT Rede Canais modo simplificado
  6. // @name:en Rede Canais simplified mode
  7. // @namespace http://tampermonkey.net/
  8. // @version 1.2.2
  9. // @description Simplifica a pagina Rede Canais removendo elementos de contato, comentarios e outros. Além de adicionar alguns botões para ajudar a encontrar mais filmes
  10. // @description:pt Simplifica a pagina Rede Canais removendo elementos de contato, comentarios e outros. Além de adicionar alguns botões para ajudar a encontrar mais filmes
  11. // @description:pt-BR Simplifica a pagina Rede Canais removendo elementos de contato, comentarios e outros. Além de adicionar alguns botões para ajudar a encontrar mais filmes
  12. // @description:pt-PT Simplifica a pagina Rede Canais removendo elementos de contato, comentarios e outros. Além de adicionar alguns botões para ajudar a encontrar mais filmes
  13. // @description:en Simplifies the Rede Canais page by removing contact elements, comments and others. As well as adding some buttons to help you find more movies
  14. // @author Pedro Henrique
  15. // @match *://redecanais.la/*
  16. // @match *://redecanaistv.la/*
  17. // @match *://redecanais.zip/*
  18. // @match *://redecanaistv.zip/*
  19. // @match *://redecanais.dad/*
  20. // @match *://redecanaistv.dad/*
  21. // @match *://redecanais.mov/*
  22. // @match *://redecanaistv.mov/*
  23. // @match *://redecanais.dev/*
  24. // @match *://redecanaistv.dev/*
  25. // @match *://redecanais.ps/*
  26. // @match *://redecanaistv.ps/*
  27. // @match *://redecanais.ms/*
  28. // @match *://redecanaistv.ms/*
  29. // @match *://redecanais.ac/*
  30. // @match *://redecanaistv.ac/*
  31. // @match *://xn--90afacv0ct3a1ct.xn--p1ai/*
  32. // @match *://xn--90afacaz8cml9ac9f.xn--p1ai/*
  33. // @match *://xn--90afacv0cu2a3cr.xn--p1ai/*
  34. // @match *://xn--90afacv0clj6ac0dxa.xn--p1ai/*
  35. // @icon https://redecanais.la/templates/echo/img/favicon.ico
  36. // @grant GM_registerMenuCommand
  37. // @grant GM_setValue
  38. // @grant GM_getValue
  39. // @license MIT
  40. // @run-at document-start
  41. // ==/UserScript==
  42.  
  43. (function () {
  44. 'use strict';
  45. function getElementByXpath(path, elem = undefined) {
  46. let e = elem;
  47. if (e == undefined)
  48. e = document
  49. return document.evaluate(path, e, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  50. }
  51. function getElementsByXpath(path, elem = undefined) {
  52. let e = elem;
  53. if (e == undefined)
  54. e = document
  55. var nodes = document.evaluate(path, e, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  56. var result = [];
  57. for (var i = 0; i < nodes.snapshotLength; i++) {
  58. result.push(nodes.snapshotItem(i));
  59. }
  60. return result;
  61. }
  62. var Config = {
  63. UI_barra_comentarios: true,
  64. }
  65. var u = window.document.URL;
  66. function IniciarScript() {
  67. GM_registerMenuCommand("📚Abrir Mapa do Site📚", () => {
  68. window.open("https://redecanais.zip/mapa.html");
  69. });
  70. GM_registerMenuCommand("🎥Abrir Mapa dos filmes🎥", () => {
  71. window.open("https://redecanais.zip/mapafilmes.html");
  72. });
  73. const _bc = Config.UI_barra_comentarios ? "✔️" : "❌"
  74. GM_registerMenuCommand(_bc + "Barra de comentários", () => {
  75. if (Config.UI_barra_comentarios == true) {
  76. Save_Config("UI_barra_comentarios", false);
  77. window.location.reload();
  78. }
  79. else {
  80. Save_Config("UI_barra_comentarios", true);
  81. window.location.reload();
  82. }
  83.  
  84. });
  85. // CRIA INTERFACES
  86. let link = new URL(u)
  87. if (link.pathname == "/mapafilmes.html" || link.pathname == "/mapa.html") { // ADICIONA UM SISTEMA DE BUSCA MELHOR NO MAPA DE FILMES
  88. Build_UI_Search(link);
  89. } else {
  90. Build_UI_Main();
  91. }
  92. }
  93. function Build_UI_Search(link) {
  94. let search = "";
  95. if (link.search != "") { // APLICA PARAMETROS DE PESQUISA
  96. search = link.searchParams.get('search');
  97. }
  98. document.getElementById("cool_find_div").remove(); // Deleta aquele botão de procurar que fica no inferior direito
  99. let mainspan = getElementByXpath("//span[@style='color: rgb(255, 255, 255);']/span");
  100. let clonemainspan = mainspan.cloneNode(true);
  101. let maindiv = document.createElement("div");
  102. maindiv.style = "margin: 20px;color:white;background-color:rgb(20,20,20)";
  103. maindiv.id = "divprincipal";
  104. maindiv.append(clonemainspan);
  105. document.body.append(maindiv);
  106. mainspan.remove();
  107. let listadefilmes = DM.Construir_Array_Lista_FilmesSeries();
  108. maindiv.childNodes[0].childNodes[1].childNodes[0].remove();
  109.  
  110. // ADICIONA UMA NOVA BARRA DE PESQUISA
  111. let barra = maindiv.childNodes[0].childNodes[1];
  112. let div = document.createElement("div");
  113. // Avisar ao usuario que o site foi modificado
  114. addlabel(div, "A pagina foi modificado pelo script, removendo o botão de pesquisar e adicionando um sistema de busca melhor. Os resutado da pesquisa aparecerão abaixo. A pesquisa é com base na lista disponivel abaixo");
  115. div.append(document.createElement("br"));
  116. addbutton(div, "Ver lista completa", "", () => {
  117. maindiv.childNodes[1].style.display = "block";
  118. }, "150;30");
  119. div.append(document.createElement("hr"));
  120. addlabel(div, "Nome do Filme : ");
  121. let _nomefilmeinput = addinput(div, search, "Digite o nome do filme", "text", "inputnome");
  122. _nomefilmeinput.style.width = "100%";
  123. _nomefilmeinput.placeholder = "Ex:. Vingadores, Bob Esponja, One piece..."
  124. _nomefilmeinput.oninput = () => { getResults(listadefilmes) };
  125. div.append(document.createElement("hr"));
  126. addlabel(div, "Ano : ");
  127. div.append(document.createElement("br"));
  128. let anoinput = addinput(div, "", "Ano do filme\r\nDeixe vazio para ignorar", "text", "anoinput");
  129. anoinput.placeholder = "Ex:. 2012";
  130. anoinput.oninput = () => { getResults(listadefilmes) };
  131. div.append(document.createElement("hr"));
  132. addlabel(div, "Tipo de pesquisa : ");
  133. div.append(document.createElement("br"));
  134. let typesearch = [
  135. "Contém texto",
  136. "Pesquisa Linear",
  137. ]
  138. var dropdowntypesearch = document.createElement("select");
  139. dropdowntypesearch.id = "typesearch";
  140. dropdowntypesearch.style = "font-size:16px";
  141. dropdowntypesearch.oninput = () => { getResults(listadefilmes) };
  142. createOptions(dropdowntypesearch, typesearch);
  143. div.append(dropdowntypesearch);
  144.  
  145. div.append(document.createElement("hr"));
  146. addlabel(div, "Resolução : ");
  147. div.append(document.createElement("br"));
  148. let _resnone = addinput(div, "Nenhum", "", "checkbox", "resnone");
  149. _resnone.onclick = () => {
  150. document.getElementById("resnone").checked = true;
  151. document.getElementById("res1080p").checked = false;
  152. document.getElementById("res720p").checked = false;
  153. document.getElementById("res480p").checked = false;
  154. getResults(listadefilmes);
  155. };
  156. addinput(div, "1080p", "", "checkbox", "res1080p").onclick = () => {
  157. document.getElementById("resnone").checked = false;
  158. document.getElementById("res1080p").checked = true;
  159. document.getElementById("res720p").checked = false;
  160. document.getElementById("res480p").checked = false;
  161. getResults(listadefilmes);
  162. };
  163. addinput(div, "720p", "", "checkbox", "res720p").onclick = () => {
  164. document.getElementById("resnone").checked = false;
  165. document.getElementById("res1080p").checked = false;
  166. document.getElementById("res720p").checked = true;
  167. document.getElementById("res480p").checked = false;
  168. getResults(listadefilmes);
  169. };
  170. addinput(div, "480p", "", "checkbox", "res480p").onclick = () => {
  171. document.getElementById("resnone").checked = false;
  172. document.getElementById("res1080p").checked = false;
  173. document.getElementById("res720p").checked = false;
  174. document.getElementById("res480p").checked = true;
  175. getResults(listadefilmes);
  176. };
  177. _resnone.checked = true;
  178. div.append(document.createElement("hr"));
  179. addlabel(div, "Outros : ");
  180. div.append(document.createElement("br"));
  181. addinput(div, "Dublado", "", "checkbox", "dubinput").onclick = () => { getResults(listadefilmes) };
  182. div.append(document.createElement("br"));
  183. addinput(div, "Legendado", "", "checkbox", "leginput").onclick = () => { getResults(listadefilmes) };;
  184. div.append(document.createElement("br"));
  185. addinput(div, "Nacional", "", "checkbox", "nacinput").onclick = () => { getResults(listadefilmes) };;
  186. div.append(document.createElement("hr"));
  187. addlabel(div, "Resultado : ");
  188. div.append(document.createElement("br"));
  189. let resultados = document.createElement("div");
  190. resultados.id = "results";
  191. resultados.style = "padding:20px;background-color: rgb(10, 10, 10); border: solid rgb(50, 50, 50);";
  192. div.append(resultados);
  193. maindiv.append(div)
  194. maindiv.insertBefore(div, maindiv.childNodes[0])
  195. maindiv.childNodes[1].style.display = "none";
  196. if (link.search != "") {
  197. getResults(listadefilmes);
  198. }
  199. }
  200. function Build_UI_Main() {
  201. let inputgroup = getElementByXpath("//div[@class='input-group']");
  202. if (inputgroup.parentNode.className != "search-channel") {
  203. // Cria botão de procurar site
  204. let sitesearchspan = document.createElement("span");
  205. sitesearchspan.className = "input-group-btn";
  206. let sitesearchspanbutton = document.createElement("span");
  207. sitesearchspanbutton.innerHTML = "🔎📚";
  208. sitesearchspanbutton.title = "Pesquisar no Mapa do Site";
  209. sitesearchspanbutton.onclick = () => {
  210. let input = document.getElementById("pm-search").value;
  211. window.location.href = `https://redecanais.zip/mapa.html?search=${input}`
  212. }
  213. sitesearchspanbutton.className = "btn btn-default";
  214. sitesearchspan.append(sitesearchspanbutton);
  215.  
  216. let filmesearchspan = document.createElement("span");
  217. filmesearchspan.className = "input-group-btn";
  218. let filmesearchspanbutton = document.createElement("span");
  219. filmesearchspanbutton.innerHTML = "🔎🎥";
  220. filmesearchspanbutton.title = "Pesquisar no Mapa de Filmes";
  221. filmesearchspanbutton.onclick = () => {
  222. let input = document.getElementById("pm-search").value;
  223. window.location.href = `https://redecanais.zip/mapafilmes.html?search=${input}`
  224. }
  225. filmesearchspanbutton.className = "btn btn-default";
  226. filmesearchspan.append(filmesearchspanbutton);
  227. inputgroup.append(sitesearchspan);
  228. inputgroup.append(filmesearchspan);
  229. }
  230. let barra = document.getElementById("content-main");
  231. let div = document.createElement("div");
  232. div.id = "BARRA";
  233. if (barra != null) {
  234. // ADICIONA BOTÕES
  235. let b2 = document.createElement("button");
  236. b2.setAttribute("class", "btn btn-default");
  237. b2.innerText = "📚Mapa do Site📚";
  238. div.append(b2);
  239. b2.onclick = () => {
  240. window.open("/mapa.html");
  241. };
  242. let b3 = document.createElement("button");
  243. b3.setAttribute("class", "btn btn-default");
  244. b3.innerText = "🎥Mapa de Filmes🎥";
  245. div.append(b3);
  246. b3.onclick = () => {
  247. window.open("/mapafilmes.html");
  248. };
  249. barra.append(div);
  250. barra.insertBefore(div, barra.childNodes[0])
  251. if (document.getElementsByName("Player")[0] != null) { // Se houver um player de video, adicione esse botão
  252. let b = document.createElement("button");
  253. b.setAttribute("class", "btn btn-default");
  254. b.innerText = "💿Redirecionar ao Url do Filme💿";
  255. div.append(b);
  256. b.onclick = () => {
  257. window.location.href = document.getElementsByName("Player")[0].src;
  258. };
  259. CarregarListaDeEpisódios();
  260. }
  261. }
  262.  
  263. // Apaga aquela barra de comentarios
  264. if (Config.UI_barra_comentarios == false) {
  265. getElementByXpath("//div[contains(@class,'pm-video-watch-sidebar')]")?.remove();
  266. }
  267.  
  268. // Apaga aquela barra vermelha onde aparece todos contato do Rede Canais
  269. document.getElementsByClassName("alert alert-danger")[0]?.remove();
  270. // Remove a barra vermelha do Rede Canais TV
  271. document.getElementsByClassName("alert")[0]?.remove();
  272. // Remove Anuncio do rede Cansi TV
  273. const ad = document.getElementsByTagName("center");
  274. if (ad.length != 0) {
  275. ad[ad.length - 1].remove();
  276. }
  277. // Apaga anuncio para apps da Rede Canais
  278. getElementByXpath("//div/a[@href='./android/']").parentNode.remove()
  279. // Apaga aquele texto em baixo
  280. document.getElementsByClassName("col-xs-12 col-sm-12 col-md-10")[1]?.remove();
  281. // Remove links abaixos
  282. document.getElementsByClassName("col-xs-4 col-sm-2 col-md-2")[0]?.remove();
  283. }
  284. function CarregarListaDeEpisódios() { // INSERE O BOTÃO DE PULAR PRO PROXIMO EPISÓDIO
  285. /*
  286. Quando você estiver assistindo uma serie, nesta pagina não amazena nenhum link que leva ao proximo episodio, ou seja, o usuário teria que procurar sozinho o proximo episódio saindo da propria pagina e eu terei que usar fetch para solucionar isso
  287. - O que eu fiz: fiz um codigo que pega nome da serie a partir do nome disponivel que tem no site e cria um link, nesse link é onde fica a lista de episodios
  288. Ex : "https://redecanais.dad/loki-1a-temporada-episodio-01-proposito-glorioso_fb7c023db.html" >>> "https://redecanais.dad/browse-loki-videos-1-date.html" (Acredito eu que todas as series seguem esse formato de url)
  289. - Como nos temos a temporada atual e o eposodio atual, apenas pegaremos o proximo episodio e criarmos o botão, esté e o funcionamento dessa função
  290. */
  291. if (DM.Get_Nome_Serie_Completo(2) != null && !DM.Get_Nome_Serie_Completo(2).toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").includes("episodio")) {
  292. return;
  293. }
  294. u = window.document.URL;
  295. let link, nomeepisodio;
  296. if (DM.Get_Nome_Serie_Completo(2) != null)
  297. link = DM.Construir_link(DM.Get_Apenas_Nome(DM.Get_Nome_Serie_Completo(2)));
  298. else if (DM.Get_Nome_Serie_Completo(1) != null)
  299. link = DM.Construir_link(DM.Get_Apenas_Nome(DM.Get_Nome_Serie_Completo(1)));
  300. else
  301. link = DM.Construir_link(DM.Get_Nome_Serie_Completo(0));
  302. nomeepisodio = DM.Get_Eposide_Name(DM.Get_Nome_Serie_Completo(2));
  303.  
  304. console.log(link);
  305. obter_pagina_lista_episodios(link);
  306. function obter_pagina_lista_episodios(url, tentativa = 0) {
  307. fetch(url)
  308. .then(function (response) {
  309. // When the page is loaded convert it to text
  310. return response.text()
  311. })
  312. .then(function (html) {
  313.  
  314. // Initialize the DOM parser
  315. var parser = new DOMParser();
  316. // Parse the text
  317. var doc = parser.parseFromString(html, "text/html");
  318. // Obtem o elemento da lista de episodios e insere na pagina atual
  319. let episodiosdiv = doc.querySelector(".pm-category-description");
  320. let div = document.getElementById("BARRA");
  321. if (document.getElementById("episodiodiv") == null) {
  322. episodiosdiv.id = "episodiodiv";
  323. episodiosdiv.style.display = "none";
  324. episodiosdiv.children[0].children[0].remove();
  325. episodiosdiv.children[0].children[0].remove();
  326. div.append(episodiosdiv);
  327. div.insertBefore(episodiosdiv, div.childNodes[div.childNodes.length - 1]);
  328. }
  329. if (document.getElementById("btnlistaepisodios") == null) {
  330. let listepisodios = document.createElement("button");
  331. listepisodios.setAttribute("class", "btn btn-default");
  332. listepisodios.innerText = "🔢Lista de Episódios";
  333. listepisodios.id = "btnlistaepisodios";
  334. listepisodios.title = "Disponibiliza a lista de eposódios na pagina atual";
  335. listepisodios.onclick = () => {
  336. if (episodiosdiv.style.display == "none")
  337. episodiosdiv.style.display = "block";
  338. else
  339. episodiosdiv.style.display = "none";
  340. };
  341. div.append(listepisodios);
  342. div.insertBefore(listepisodios, div.childNodes[0]);
  343. }
  344.  
  345. let ListaEpisódios = DM.Construir_Array_Episodios(nomeepisodio);
  346.  
  347. let nextepisode = document.createElement("button");
  348. nextepisode.setAttribute("class", "btn btn-default");
  349. nextepisode.innerText = "▶️Proximo Episódio";
  350. nextepisode.onclick = () => {
  351. let episodioindex = ListaEpisódios.findIndex((e) => e[0] == nomeepisodio)
  352. window.location.href = ListaEpisódios[episodioindex + 1][2];
  353. };
  354. div.append(nextepisode);
  355. div.insertBefore(nextepisode, div.childNodes[0]);
  356. console.log("Serie encontrada");
  357. })
  358. .catch(function (err) {
  359. console.log(url);
  360. if (tentativa == 0) {
  361. console.error('Serie não encontrada, tentando novamente', err);
  362. link = DM.Construir_link(DM.Get_Apenas_Nome(DM.Get_Nome_Serie_Completo(2)), 1);
  363. obter_pagina_lista_episodios(link, 1);
  364. }
  365. else if (tentativa == 1) {
  366. console.error('Serie não encontrada. tentando novamente(2)', err);
  367. link = DM.Construir_link(DM.Get_Apenas_Nome(DM.Get_Nome_Serie_Completo(2), true));
  368. obter_pagina_lista_episodios(link, 2);
  369. } else if (tentativa == 2) {
  370. console.error('Serie não encontrada. tentando novamente(3)', err);
  371. link = DM.Construir_link(DM.Get_Apenas_Nome(DM.Get_Nome_Serie_Completo(2)), 3);
  372. obter_pagina_lista_episodios(link, 3);
  373. } else if (tentativa == 3) {
  374. console.error('Serie não encontrada. tentando novamente(4)', err);
  375. link = DM.Construir_link(DM.Get_Apenas_Nome(DM.Get_Nome_Serie_Completo(2)), 4);
  376. obter_pagina_lista_episodios(link, 4);
  377. }
  378. });
  379. }
  380.  
  381. }
  382. window.onload = () => {
  383. if (u.includes("contador.php?static=true") || u.startsWith("https://sinalpublico")) // IGNORAR A EXECUÇÃO DO SCRIPT NESSES URL
  384. return;
  385. Load_Config();
  386. }
  387. window.document._DM = function () { return DM };
  388. var DM = { // Funções para decifrar link e construir arrays
  389. Get_Num_Season(e) {
  390. let m = e.toLowerCase().match(/(\d+)a-temporada/);
  391. if (m != null) {
  392. let int = parseInt(m[1]);
  393. if (int == 0)
  394. int++;
  395. return int;
  396. }
  397. else
  398. return undefined
  399. },
  400. Get_Num_Episode(e) {
  401. let a = e.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "");
  402. if (a.match(/episodio-(\d+)/) != null)
  403. a = a.match(/episodio-(\d+)/)[1];
  404. else
  405. a = a.match(/episodio:-(\d+)/)[1];
  406. return a;
  407. },
  408. Get_Eposide_Name(name) {
  409. let array = name.split("-");
  410. return array[array.length - 1].trim();
  411. },
  412. Get_Nome_Serie_Completo(e = 0) { // Obtem o nome da serie ou filme
  413. switch (e) {
  414. case 0:
  415. return window.document.URL; // Exemplo : https://redecanais.dad/loki-1a-temporada-episodio-01-proposito-glorioso_fb7c023db.html
  416. case 1:
  417. return pm_video_data.url; // Exemplo : '/loki-1a-temporada-episodio-01-proposito-glorioso_fb7c023db.html'
  418. case 2:
  419. return getElementByXpath("//h1[@itemprop='name']").innerText.toLowerCase(); // Exemplo : Loki - 1ª Temporada - Episódio 01 - Propósito Glorioso
  420. default:
  421. return ""
  422. }
  423. },
  424. Get_Apenas_Nome(nome, semespaços = false) {
  425. if (nome.includes(" - ")) // converte em link cru
  426. nome = DM.Construir_Nome_Serie_Cru(nome);
  427.  
  428. if (nome.includes("temporada"))
  429. nome = nome.match(/([^\/]+)-\d+a-temporada-/)[1];
  430. else
  431. nome = nome.match(/([^]+)-episodio-/)[1];
  432. nome = nome.replace(/-legendado/g, "");
  433. if (semespaços == true)
  434. nome = nome.replaceAll("-", "");
  435. return nome;
  436. },
  437. Construir_Nome_Serie_Cru(nome) {
  438. // Exemplo : "Os Simpsons - 1ª Temporada - Episodio 01 - O prêmio de Natal"
  439. nome = nome.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); // deixa minusculo e remove acéntos
  440. nome = nome.replace(/[\/\(\)\#\.\,]+/g, "")
  441. nome = nome.replaceAll("ª", "a");
  442. nome = nome.split(" ").join("-")
  443. nome = nome.replaceAll("---", "-")
  444. return nome; // Deve retornar : 'os-simpsons-1a-temporada-episodio-01-o-prêmio-de-natal'
  445. },
  446. Construir_link(nome, type = 0) {
  447. switch (type) {
  448. case 0:
  449. return new URL(window.document.URL).origin + "/browse-" + nome.replaceAll("&", "and") + "-videos-1-date.html";
  450. case 1:
  451. return new URL(window.document.URL).origin + "/browse-" + nome.replaceAll("&", "e") + "-videos-1-date.html";
  452. case 2:
  453. return new URL(window.document.URL).origin + "/browse-" + nome.replaceAll(" ", "") + "-videos-1-date.html";
  454. case 3:
  455. return new URL(window.document.URL).origin + "/browse-" + nome.replaceAll("&", "to") + "-videos-1-date.html";
  456. case 4:
  457. return new URL(window.document.URL).origin + "/browse-" + nome.replaceAll(" ", "to") + "-videos-1-date.html";
  458. default:
  459. return ""
  460. }
  461. },
  462. Construir_Array_Episodios(episodioatual) { // DECIFRAR OS ELEMENTOS DA LISTA DE ÉPISÓDIO
  463. let _array = [];
  464. try {
  465. let epdiv = document.getElementById("episodiodiv").children[0];
  466. for (let i = 0; i < epdiv.childNodes.length; i++) {
  467. const element = epdiv.childNodes[i];
  468. if (element.nodeName == "#text") {
  469. if (element.textContent == " / " || element.textContent == "" || element.textContent == " ")
  470. continue;
  471. let link, epnumber;
  472. let nomeep = element.textContent.split("-")[0].trim().toLocaleLowerCase();
  473. // ENCONTRA O LINK DO PROXIMO EPISÓDIO
  474. link = element.nextElementSibling.href || element.nextElementSibling.children[0].href;
  475. // PINTA DE AMARELO O EPISÓDIO ATUAL
  476. if (nomeep == episodioatual)
  477. element.previousSibling.style.color = "yellow";
  478. epnumber = element.previousSibling.textContent || element.previousSibling.innerHTML;
  479. epnumber = epnumber.split("-")[0].trim().toLocaleLowerCase()
  480. // FINALIZA
  481. _array.push([nomeep, epnumber, link]);
  482. }
  483.  
  484. }
  485. console.log(_array);
  486. return _array;
  487. } catch (error) {
  488. alert(`função encontrou um erro ao decifrar elementos da lista de episódios, essa função ainda não é perfeita, veja o console`);
  489. console.error("Erro na função : ", error, _array);
  490. }
  491. },
  492. Construir_Array_Lista_FilmesSeries() {
  493. let _array = []; // Essa lista é no formato array : [[NOME DO FILME, LINK], ...]
  494. let tempelem = []; // variavel temporaria
  495. let listelem = document.getElementById("divprincipal").childNodes[0].childNodes;
  496. for (let i = 11; i < listelem.length; i++) {
  497. const node = listelem[i];
  498. if (node.nodeName.toLowerCase() == "#text") { // elemento de texto
  499. tempelem.push(node.textContent);
  500. }
  501. else if (node.nodeName.toLowerCase() == "a") { // elemento link
  502. let finaltext = "";
  503. for (let v = 0; v < tempelem.length; v++) {
  504. const element = tempelem[v];
  505. finaltext += element;
  506. }
  507. _array.push([finaltext.replaceAll("\n", ""), node]);
  508. tempelem = [];
  509.  
  510. } else if (node.nodeName.toLowerCase() == "b") { // elemento negrito
  511. if (node.hasChildNodes()) {
  512. if (node.childNodes[0].nodeName.toLowerCase() == "a") { // se dentro houver link do filme dentro do elemento negrito
  513. let finaltext = "";
  514. for (let v = 0; v < tempelem.length; v++) {
  515. const element = tempelem[v];
  516. finaltext += element;
  517. }
  518. _array.push([finaltext.replaceAll("\n", ""), node.childNodes[0]]);
  519. tempelem = [];
  520. }
  521. else { // caso for outra coisa no negrito
  522. if (node.innerHTML == 'Números &amp; Símbolos') // ignorar esse elemento
  523. continue;
  524. tempelem.push(node.innerHTML);
  525. }
  526. } else {
  527. tempelem.push(node.innerHTML);
  528. }
  529. }
  530. }
  531. console.log("Lista de filmes/series : ", _array);
  532. return _array;
  533. }
  534. }
  535. window.document.dm = DM;
  536. function Save_Config(name, value) {
  537. // SALVA O VALOR DE UMA VARIAVEL E MANTEM OS OUTROS
  538. if (name != undefined) {
  539. Config[name] = value;
  540. GM.setValue("Config", Config);
  541. return;
  542. }
  543. // SALVA TUDO
  544. GM.setValue("Config", Config);
  545.  
  546. };
  547. async function Load_Config() {// OBTEM OS VALORES DA CONFIGURAÇÃO
  548. let _config = await GM.getValue("Config");
  549. if (_config != undefined) {
  550. for (var k in _config) {
  551. Config[k] = _config[k]
  552. }
  553. }
  554. console.log("Script Settings", _config);
  555. // COMEÇA A MODIFICAÇÃO DA PAGINA DO REDE CANAIS
  556. IniciarScript();
  557. };
  558. function getResults(_array, index = 0, clear = true) { // Obtem os resultado da procura
  559. let divresults = document.getElementById("results");
  560. if (clear == true)
  561. divresults.innerHTML = "";
  562. const _originalinput = document.getElementById("inputnome").value;
  563. const _input = document.getElementById("inputnome").value.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); // deixa minusculo e remove acentos;
  564. let anoinput = document.getElementById("anoinput");
  565. var find = 0;
  566. for (index; index < _array.length; index++) {
  567. let filme = _array[index];
  568. function _othersvalues() {
  569. if (anoinput != "")
  570. if (!filme[0].toLowerCase().includes(anoinput.value.toLowerCase()))
  571. return true;
  572. if (document.getElementById("dubinput").checked == true)
  573. if (!filme[0].toLowerCase().includes("dublado"))
  574. return true;
  575. if (document.getElementById("leginput").checked == true)
  576. if (!filme[0].toLowerCase().includes("legendado"))
  577. return true;
  578. if (document.getElementById("nacinput").checked == true)
  579. if (!filme[0].toLowerCase().includes("(nacional)"))
  580. return true;
  581. if (document.getElementById("res1080p").checked == true)
  582. if (!filme[0].toLowerCase().includes("1080p"))
  583. return true;
  584. if (document.getElementById("res720p").checked == true)
  585. if (!filme[0].toLowerCase().includes("720p"))
  586. return true;
  587. if (document.getElementById("res480p").checked == true)
  588. if (!filme[0].toLowerCase().includes("480p"))
  589. return true;
  590. return false;
  591. }
  592. if (document.getElementById("typesearch").selectedIndex == 0) { // PESQUISA USANDO "INCLUDES"
  593. if (!filme[0].toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").includes(_input)) {
  594. continue;
  595. }
  596. if (_othersvalues()) continue;
  597.  
  598. } else { // PESQUISA LINEAR
  599. if (_input.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "") !== filme[0].toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").slice(0, _input.length)) {
  600. continue;
  601. }
  602. if (_othersvalues()) continue;
  603. }
  604. let _label = addlabel(divresults, filme[0], 0);
  605. if (document.getElementById("typesearch").selectedIndex == 0) {
  606. const regEx = new RegExp(_originalinput, "ig");
  607. _label.innerHTML = _label.innerHTML.replaceAll(regEx, "<span style='color:yellow'>" + _originalinput + "</span>");
  608. } else {
  609. let strarray = (_label.innerHTML.substring(0, _originalinput.length) + "|" + _label.innerHTML.substring(_originalinput.length)).split("|");
  610. _label.innerHTML = "<span style='color:yellow'>" + strarray[0] + "</span>" + strarray[1];
  611. }
  612.  
  613. divresults.append(filme[1].cloneNode(true)) // URL
  614. divresults.append(document.createElement("br"));
  615. find++;
  616. if (find > 20) // Esse é o comprimento da lista, caso chege ao limite, aparecera o botão de "Mostrar mais"
  617. {
  618. addbutton(divresults, "Mostrar Mais", "Mostra mais filmes", (e) => {
  619. e.target.remove();
  620. getResults(_array, index + 1, false);
  621. }, "150;30");
  622. break;
  623. }
  624.  
  625. }
  626. }
  627. function addlabel(elem, text, type = 0) {
  628. const _elementotipo = type == 0 ? "span" : "p"
  629. const l = document.createElement(_elementotipo);
  630. l.innerHTML = text;
  631. elem.append(l)
  632. return l;
  633. }
  634. function addinput(elem, text = "", title = "", type = "text", id = "") {
  635. const _input = document.createElement("input");
  636. _input.type = type;
  637. _input.innerHTML = text;
  638. _input.value = text;
  639. _input.title = title;
  640. _input.style = "font-size:16px";
  641. _input.setAttribute("id", id);
  642. elem.append(_input);
  643. if (type == "checkbox") {
  644. addlabel(elem, text, 0);
  645. }
  646. return _input;
  647. }
  648. function addbutton(elem, text, title, func, width = "100;30") {
  649. const b = document.createElement("button");
  650. b.innerHTML = text
  651. b.title = title;
  652. b.onclick = func;
  653. let w = width.split(";")[0];
  654. let h = width.split(";")[1];
  655. b.style = ` display: flex;
  656. justify-content: center;
  657. align-items: center;
  658. position: relative;
  659. width: ${w}px;
  660. height: ${h}px;
  661. margin: 5px;
  662. border: 10px solid var(--base-color);
  663. font-size: 16px;
  664. cursor: pointer;`;
  665. elem.append(b);
  666. }
  667. function createOptions(selectelem, list) { // CRIA OPÇÕES
  668. list.forEach((a, i) => {
  669. let _op = document.createElement("option");
  670. _op.value = i;
  671. if (a.textContent != undefined)
  672. _op.innerHTML = a.textContent;
  673. else
  674. _op.innerHTML = a;
  675. selectelem.append(_op);
  676. });
  677. }
  678. function capitalizeFirstLetter(string) {
  679. return string.charAt(0).toUpperCase() + string.slice(1);
  680. }
  681. var debug = false; // TESTES NO MEU SCRIPT DEIXE "false" PARA NÃO USAR ESSA FUNÇÃO. ISSO FAZ COM QUE O REDE CANAIS NÃO BLOQUEIE A PÁGINA INTEIRA
  682. if (debug == true) {
  683. const window = unsafeWindow;
  684. GM_registerMenuCommand("(DEBUG) Abrir Console", () => { // ABRIR CONSOLE
  685. window.prompt(`Rede Canais automaticamente fecha a página quando usúarios tentam usar o console, para resolver isso :
  686.  
  687. Com essa caixa de alerta aberta, Aperte F12 para abrir o console, clique em "Network" e bloqueie a solicitação "cdn.jsdelivr.net/npm/console-ban@4.1.0/dist/console-ban.min.js"
  688.  
  689. - Clique Ctrl+F8 para desativar o loop do debugger infinito caso estiver sendo executado
  690.  
  691. - Já existe um script no greasyfork que desbloqueia o clique com o botão direito se você quiser usar`);
  692. });
  693. // DESATIVA FUNÇÃO DE FECHAR A PAGINA E DESATIVA O HISTÓRICO DE VOLTAR
  694. void (window.ConsoleBan = undefined);
  695. void (window.closeWindow = undefined);
  696. void (window.close = undefined);
  697. void (history.go = undefined);
  698. void (history.back = undefined);
  699. void (history.forward = undefined);
  700. void (window.history.go = undefined);
  701. void (window.history.back = undefined);
  702. void (window.history.forward = undefined);
  703. void (window.open = undefined);
  704. // EVITAR SAIR DA PAGINA
  705. /*
  706. function internalHandler(e) {
  707. e.preventDefault(); // required in some browsers
  708. e.returnValue = ""; // required in some browsers
  709. return "Custom message to show to the user"; // only works in old browsers
  710. }
  711. if (window.addEventListener) {
  712. window.addEventListener('beforeunload', internalHandler, true);
  713. } else if (window.attachEvent) {
  714. window.attachEvent('onbeforeunload', internalHandler);
  715. }
  716. window.onbeforeunload = internalHandler;
  717. window.close = function () {
  718. alert("rede canais forçou a fechar a pagina");
  719. }*/
  720. }
  721. })();