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; o script também ativa o botão direito (que era bloqueado pelo rede canais)

当前为 2024-03-31 提交的版本,查看 最新版本

// ==UserScript==
// @name         Rede Canais modo simplificado
// @name:pt      Rede Canais modo simplificado
// @name:pt-BR   Rede Canais modo simplificado
// @name:pt-PT   Rede Canais modo simplificado
// @name:en      Rede Canais simplified mode
// @namespace    http://tampermonkey.net/
// @version      1.1
// @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; o script também ativa o botão direito (que era bloqueado pelo rede canais)
// @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; o script também ativa o botão direito (que era bloqueado pelo rede canais)
// @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; o script também ativa o botão direito (que era bloqueado pelo rede canais)
// @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; o script também ativa o botão direito (que era bloqueado pelo rede canais)
// @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; the script also activates the right button (which was blocked by Rede Canais)
// @author       Pedro Henrique
// @match        https://redecanais.*
// @match        *://redecanais.la/*
// @match        *://redecanais.zip/*
// @match        *://redecanais.dad/*
// @match        *://redecanaistv.dad/*
// @match        *://xn--90afacv0ct3a1ct.xn--p1ai*/*
// @icon         https://redecanais.la/templates/echo/img/favicon.ico
// @grant        GM_registerMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// @license      MIT
// @run-at       document-start
// ==/UserScript==

(function () {
    'use strict';
    function getElementByXpath(path, elem = undefined) {
        let e = elem;
        if (e == undefined)
            e = document
        return document.evaluate(path, e, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    }
    function getElementsByXpath(path, elem = undefined) {
        let e = elem;
        if (e == undefined)
            e = document
        var nodes = document.evaluate(path, e, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
        var result = [];
        for (var i = 0; i < nodes.snapshotLength; i++) {
            result.push(nodes.snapshotItem(i));
        }
        return result;
    }
    var Config = {
        UI_barra_comentarios: true,
    }
    var u = window.document.URL;
    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
    if (debug == true) {
        const window = unsafeWindow;
        GM_registerMenuCommand("Abrir Console", () => { // ABRIR CONSOLE
            window.prompt(`Aperte F12, clique en "Network" e bloqueie a solicitação "console-ban.min.js" do rede canais\r\n- Clique Ctrl+F8 para desativar o loop do debugger infinito`);
        });
        // DESATIVA FUNÇÃO DE FECHAR A PAGINA E DESATIVA O HISTÓRICO DE VOLTAR
        void (window.ConsoleBan = undefined);
        void (window.closeWindow = undefined);
        void (window.close = undefined);
        void (history.go = undefined);
        void (history.back = undefined);
        void (history.forward = undefined);
        void (window.history.go = undefined);
        void (window.history.back = undefined);
        void (window.history.forward = undefined);
        void (window.open = undefined);
        // EVITAR SAIR DA PAGINA
        /*
        function internalHandler(e) {
            e.preventDefault(); // required in some browsers
            e.returnValue = ""; // required in some browsers
            return "Custom message to show to the user"; // only works in old browsers
        }
        if (window.addEventListener) {
            window.addEventListener('beforeunload', internalHandler, true);
        } else if (window.attachEvent) {
            window.attachEvent('onbeforeunload', internalHandler);
        }
        window.onbeforeunload = internalHandler;
        window.close = function () {
            alert("rede canais forçou a fechar a pagina");
        }*/
    }
    function IniciarScript() {
        GM_registerMenuCommand("📚Abrir Mapa do Site📚", () => {
            window.open("https://redecanais.zip/mapa.html");
        });
        GM_registerMenuCommand("🎥Abrir Mapa dos filmes🎥", () => {
            window.open("https://redecanais.zip/mapafilmes.html");
        });
        const _bc = Config.UI_barra_comentarios ? "✔️" : "❌"
        GM_registerMenuCommand(_bc + "Barra de comentários", () => {
            if (Config.UI_barra_comentarios == true) {
                Save_Config("UI_barra_comentarios", false);
                window.location.reload();
            }
            else {
                Save_Config("UI_barra_comentarios", true);
                window.location.reload();
            }

        });
        let link = new URL(u)
        if (link.pathname == "/mapafilmes.html" || link.pathname == "/mapa.html") { // ADICIONA UM SISTEMA DE BUSCA MELHOR NO MAPA DE FILMES
            let search = "";
            if (link.search != "") { // APLICA PARAMETROS DE PESQUISA
                search = link.searchParams.get('search');
            }
            document.getElementById("cool_find_div").remove(); // Deleta aquele botão de procurar que fica no inferior direito
            let mainspan = getElementByXpath("//span[@style='color: rgb(255, 255, 255);']/span/span").parentNode;
            let clonemainspan = mainspan.cloneNode(true);
            let maindiv = document.createElement("div");
            maindiv.style = "margin: 20px;color:white;background-color:rgb(20,20,20)";
            maindiv.id = "divprincipal";
            maindiv.append(clonemainspan);
            document.body.append(maindiv);
            mainspan.remove();
            let listadefilmes = DM.Construir_Array_Lista_FilmesSeries();
            maindiv.childNodes[0].childNodes[1].childNodes[0].remove();

            // ADICIONA UMA NOVA BARRA DE PESQUISA
            let barra = maindiv.childNodes[0].childNodes[1];
            let div = document.createElement("div");
            // Avisar ao usuario que o site foi modificado
            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");
            div.append(document.createElement("br"));
            addbutton(div, "Ver lista completa", "", () => {
                maindiv.childNodes[1].style.display = "block";
            }, "150;30");
            div.append(document.createElement("br"));
            addlabel(div, "Nome do Filme : ");
            let _nomefilmeinput = addinput(div, search, "Digite o nome do filme", "text", "inputnome");
            _nomefilmeinput.style.width = "50%";
            _nomefilmeinput.placeholder = "Ex: Vingadores, Bob Esponja, One piece..."
            div.append(document.createElement("br"));
            addlabel(div, "Ano : ");
            let anoinput = addinput(div, "", "Ano do filme\r\nDeixe vazio para ignorar", "text", "anoinput");
            anoinput.placeholder = "2012";
            div.append(document.createElement("br"));
            addlabel(div, "Tipo de pesquisa : ");
            let typesearch = [
                "Contém texto",
                "Pesquisa Linear",
            ]
            var dropdowntypesearch = document.createElement("select");
            dropdowntypesearch.id = "typesearch";
            dropdowntypesearch.style = "font-size:16px";
            createOptions(dropdowntypesearch, typesearch);
            div.append(dropdowntypesearch);

            div.append(document.createElement("br"));
            let _resnone = addinput(div, "Nenhum", "", "checkbox", "resnone")
            _resnone.onclick = () => {
                document.getElementById("resnone").checked = true;
                document.getElementById("res1080p").checked = false;
                document.getElementById("res720p").checked = false; 
                document.getElementById("res480p").checked = false;
            };
            addinput(div, "1080p", "", "checkbox", "res1080p").onclick = () => {
                document.getElementById("resnone").checked = false;
                document.getElementById("res1080p").checked = true;
                document.getElementById("res720p").checked = false; 
                document.getElementById("res480p").checked = false;
            };
            addinput(div, "720p", "", "checkbox", "res720p").onclick = () => {
                document.getElementById("resnone").checked = false;
                document.getElementById("res1080p").checked = false;
                document.getElementById("res720p").checked = true; 
                document.getElementById("res480p").checked = false;
            };
            addinput(div, "480p", "", "checkbox", "res480p").onclick = () => {
                document.getElementById("resnone").checked = false;
                document.getElementById("res1080p").checked = false;
                document.getElementById("res720p").checked = false; 
                document.getElementById("res480p").checked = true;
            };
            div.append(document.createElement("br"));
            addinput(div, "Dublado", "", "checkbox", "dubinput");
            div.append(document.createElement("br"));
            addinput(div, "Legendado", "", "checkbox", "leginput");
            div.append(document.createElement("br"));
            addinput(div, "Nacional", "", "checkbox", "nacinput");
            div.append(document.createElement("br"));
            /* Categorias seriam adicionadas futuramente, esse é apenas um teste que eu estou fazendo
            addlabel(div, "Categoria :");
            let categoriadiv = getElementsByXpath("(//div[@id='divprincipal'])[1]//div[@style='text-align: center;']/span/b/text()");
            categoriadiv.unshift("Nenhum");
            var dropdowncategoria = document.createElement("select");
            dropdowncategoria.id = "categorias";
            createOptions(dropdowncategoria, categoriadiv);
            div.append(dropdowncategoria);
            div.append(document.createElement("br"));*/
            let resultados = document.createElement("div");
            resultados.id = "results";
            resultados.style = "padding:20px;background-color: rgb(10, 10, 10); border: solid rgb(50, 50, 50);";

            addbutton(div, "Pesquisar", "Faz uma pesquisa com os dados que você forneceu acima", () => {
                resultados.innerHTML = "";
                getResults(listadefilmes);
            });
            div.append(resultados);
            maindiv.append(div)
            maindiv.insertBefore(div, maindiv.childNodes[0])
            maindiv.childNodes[1].style.display = "none";
            if (link.search != "") {
                getResults(listadefilmes);
            }

        } else {
            let inputgroup = getElementByXpath("//div[@class='input-group']");
            if (inputgroup.parentNode.className != "search-channel") {
                // Cria botão de procurar site
                let sitesearchspan = document.createElement("span");
                sitesearchspan.className = "input-group-btn";
                let sitesearchspanbutton = document.createElement("span");
                sitesearchspanbutton.innerHTML = "🔎📚";
                sitesearchspanbutton.title = "Pesquisar no Mapa do Site";
                sitesearchspanbutton.onclick = () => {
                    let input = document.getElementById("pm-search").value;
                    window.location.href = `https://redecanais.zip/mapa.html?search=${input}`
                }
                sitesearchspanbutton.className = "btn btn-default";
                sitesearchspan.append(sitesearchspanbutton);

                let filmesearchspan = document.createElement("span");
                filmesearchspan.className = "input-group-btn";
                let filmesearchspanbutton = document.createElement("span");
                filmesearchspanbutton.innerHTML = "🔎🎥";
                filmesearchspanbutton.title = "Pesquisar no Mapa de Filmes";
                filmesearchspanbutton.onclick = () => {
                    let input = document.getElementById("pm-search").value;
                    window.location.href = `https://redecanais.zip/mapafilmes.html?search=${input}`
                }
                filmesearchspanbutton.className = "btn btn-default";
                filmesearchspan.append(filmesearchspanbutton);
                inputgroup.append(sitesearchspan);
                inputgroup.append(filmesearchspan);
            }
            let barra = document.getElementById("content-main");
            let div = document.createElement("div");
            if (barra != null) {
                // ADICIONA BOTÕES
                let b2 = document.createElement("button");
                b2.setAttribute("class", "btn btn-default");
                b2.innerText = "📚Mapa do Site📚";
                div.append(b2);
                b2.onclick = () => {
                    window.open("/mapa.html");
                };
                let b3 = document.createElement("button");
                b3.setAttribute("class", "btn btn-default");
                b3.innerText = "🎥Mapa de Filmes🎥";
                div.append(b3);
                b3.onclick = () => {
                    window.open("/mapafilmes.html");
                };
                barra.append(div);
                barra.insertBefore(div, barra.childNodes[0])
                if (document.getElementsByName("Player")[0] != null) { // Se houver um player de video, adicione esse botão
                    let b = document.createElement("button");
                    b.setAttribute("class", "btn btn-default");
                    b.innerText = "💿Redirecionar ao Url do Filme💿";
                    div.append(b);
                    b.onclick = () => {
                        window.location.href = document.getElementsByName("Player")[0].src;
                    };
                    CarregarProximoEpisodio();
                }
            }

            // Apaga aquela barra de comentarios
            if (Config.UI_barra_comentarios == false) {
                getElementByXpath("//div[contains(@class,'pm-video-watch-sidebar')]")?.remove();
            }

            // Apaga aquela barra vermelha onde aparece todos contato do Rede Canais
            document.getElementsByClassName("alert alert-danger")[0]?.remove()
            // Remove a barra vermelha da transmição
            document.getElementsByClassName("alert")[0]?.remove()
            // Apaga anuncio para apps da Rede Canais
            document.getElementsByClassName("row pm-video-heading")[0]?.childNodes[5]?.remove()

            // Apaga aquele texto em baixo
            document.getElementsByClassName("col-xs-12 col-sm-12 col-md-10")[1]?.remove()
            // Remove links abaixos
            document.getElementsByClassName("col-xs-4 col-sm-2 col-md-2")[0]?.remove()

            function CarregarProximoEpisodio() { // INSERE O BOTÃO DE PULAR PRO PROXIMO EPISÓDIO
                /*
                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
                - 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
                    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)
                - 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
                */
                u = window.document.URL;
                let link, temporadaatual, episodioatual;
                if (DM.Get_Nome_Serie_Completo(2) != null)
                    link = DM.Construir_link(DM.Get_Apenas_Nome(DM.Get_Nome_Serie_Completo(2)));
                else if (DM.Get_Nome_Serie_Completo(1) != null)
                    link = DM.Construir_link(DM.Get_Apenas_Nome(DM.Get_Nome_Serie_Completo(1)));
                else
                    link = DM.Construir_link(DM.Get_Nome_Serie_Completo(0));
                temporadaatual = parseInt(DM.Get_Num_Season(DM.Construir_Nome_Serie_Cru(DM.Get_Nome_Serie_Completo(2)))) - 1;
                episodioatual = parseInt(DM.Get_Num_Episode(DM.Construir_Nome_Serie_Cru(DM.Get_Nome_Serie_Completo(2)))) - 1;
                console.log(link, temporadaatual, episodioatual);
                obter_pagina_lista_episodios(link, false);
                function obter_pagina_lista_episodios(url, cancelar = true) {
                    fetch(url)
                        .then(function (response) {
                            // When the page is loaded convert it to text
                            return response.text()
                        })
                        .then(function (html) {
                            console.log("Serie encontrada");
                            // Initialize the DOM parser
                            var parser = new DOMParser();
                            // Parse the text
                            var doc = parser.parseFromString(html, "text/html");
                            // Obtem o elemento da lista de episodios e insere na pagina atual
                            let episodiosdiv = getElementByXpath(`//div[@class='pm-category-description']`, doc);
                            if (document.getElementById("episodiodiv") == null) {
                                episodiosdiv.id = "episodiodiv";
                                episodiosdiv.style.display = "none";
                                episodiosdiv.children[0].children[0].remove();
                                episodiosdiv.children[0].children[0].remove();
                                div.append(episodiosdiv);
                                div.insertBefore(episodiosdiv, div.childNodes[div.childNodes.length - 1]);
                            }
                            if (document.getElementById("btnlistaepisodios") == null) {
                                let listepisodios = document.createElement("button");
                                listepisodios.setAttribute("class", "btn btn-default");
                                listepisodios.innerText = "🔢Lista de Episódios";
                                listepisodios.id = "btnlistaepisodios";
                                listepisodios.title = "Disponibiliza a lista de eposódios na pagina atual";
                                listepisodios.onclick = () => {
                                    if (episodiosdiv.style.display == "none")
                                        episodiosdiv.style.display = "block";
                                    else
                                        episodiosdiv.style.display = "none";
                                };
                                div.append(listepisodios);
                                div.insertBefore(listepisodios, div.childNodes[0]);
                            }

                            let ListaEpisódios = DM.Construir_Array_Episodios(temporadaatual, episodioatual);

                            let nextepisode = document.createElement("button");
                            nextepisode.setAttribute("class", "btn btn-default");
                            nextepisode.innerText = "▶️Proximo Episódio";
                            nextepisode.onclick = () => {
                                if (ListaEpisódios[temporadaatual][episodioatual + 1] != null)
                                    window.location.href = ListaEpisódios[temporadaatual][episodioatual + 1][0];
                                else
                                    window.location.href = ListaEpisódios[temporadaatual + 1][0][0];
                            };
                            div.append(nextepisode);
                            div.insertBefore(nextepisode, div.childNodes[0]);
                        })
                        .catch(function (err) {
                            console.error('Essa função ainda tem suas limitações, Error :', err);
                            console.log(url);
                            if (cancelar == false) {
                                link = DM.Construir_link(DM.Get_Apenas_Nome(DM.Get_Nome_Serie_Completo(2)), 1);
                                obter_pagina_lista_episodios(link, true);
                            }
                        });
                }

            }
        }
    }
    window.onload = () => {
        if (u.includes("contador.php?static=true") || u.startsWith("https://sinalpublico")) // IGNORAR A EXECUÇÃO DO SCRIPT NESSES URL
            return;
        // ATIVA O BOTÃO DIREITO DA PAGINA
        function enableContextMenu(aggressive = false) {
            void (document.ondragstart = null);
            void (document.onselectstart = null);
            void (document.onclick = null);
            void (document.onmousedown = null);
            void (document.onmouseup = null);
            void (document.body.oncontextmenu = null);
            enableRightClickLight(document);
            if (aggressive) {
                enableRightClick(document);
                removeContextMenuOnAll("body");
                removeContextMenuOnAll("img");
                removeContextMenuOnAll("td");
            }
        }

        function removeContextMenuOnAll(tagName) {
            var elements = document.getElementsByTagName(tagName);
            for (var i = 0; i < elements.length; i++) {
                enableRightClick(elements[i]);
            }
        }

        function enableRightClickLight(el) {
            el || (el = document);
            el.addEventListener("contextmenu", bringBackDefault, true);
        }

        function enableRightClick(el) {
            el || (el = document);
            el.addEventListener("contextmenu", bringBackDefault, true);
            el.addEventListener("dragstart", bringBackDefault, true);
            el.addEventListener("selectstart", bringBackDefault, true);
            el.addEventListener("click", bringBackDefault, true);
            el.addEventListener("mousedown", bringBackDefault, true);
            el.addEventListener("mouseup", bringBackDefault, true);
        }

        function restoreRightClick(el) {
            el || (el = document);
            el.removeEventListener("contextmenu", bringBackDefault, true);
            el.removeEventListener("dragstart", bringBackDefault, true);
            el.removeEventListener("selectstart", bringBackDefault, true);
            el.removeEventListener("click", bringBackDefault, true);
            el.removeEventListener("mousedown", bringBackDefault, true);
            el.removeEventListener("mouseup", bringBackDefault, true);
        }
        function bringBackDefault(event) {
            event.returnValue = true;
            (typeof event.stopPropagation === 'function') &&
                event.stopPropagation();
            (typeof event.cancelBubble === 'function') &&
                event.cancelBubble();
        }
        enableContextMenu();
        Load_Config();
    }

    var DM = { // Funções para decifrar link e construir arrays
        Get_Num_Season(e) {
            return e.match(/(\d+)a-temporada/)[1];
        },
        Get_Num_Episode(e) {
            return e.match(/episodio-(\d+)/)[1];
        },
        Get_Nome_Serie_Completo(e) { // Obtem o nome da serie ou filme
            switch (e) {
                case 0:
                    return window.document.URL; // Exemplo : https://redecanais.dad/loki-1a-temporada-episodio-01-proposito-glorioso_fb7c023db.html
                case 1:
                    return pm_video_data.url; // Exemplo : '/loki-1a-temporada-episodio-01-proposito-glorioso_fb7c023db.html'
                case 2:
                    return getElementByXpath("//h1[@itemprop='name']").innerText.toLowerCase(); // Exemplo : Loki - 1ª Temporada - Episódio 01 - Propósito Glorioso
                default:
                    return ""
            }
        },
        Get_Apenas_Nome(nome) {
            if (nome.includes(" - ")) // converte em link cru
                nome = DM.Construir_Nome_Serie_Cru(nome);
            nome = nome.match(/([^\/]+)-\d+a-temporada-/)[1];
            return nome;
        },
        Construir_Nome_Serie_Cru(nome) {
            // Exemplo : "Os Simpsons - 1ª Temporada - Episodio 01 - O prêmio de Natal"
            nome = nome.toLowerCase().replaceAll(".", "").normalize("NFD").replace(/[\u0300-\u036f]/g, ""); // deixa minusculo e remove acéntos
            nome = nome.replaceAll("ª", "a");
            nome = nome.split(" ").join("-")
            nome = nome.replaceAll("---", "-")
            return nome; // Deve retornar : 'os-simpsons-1a-temporada-episodio-01-o-prêmio-de-natal'
        },
        Construir_link(nome, type = 0) {
            switch (type) {
                case 0:
                    return new URL(window.document.URL).origin + "/browse-" + nome.replaceAll("&", "and") + "-videos-1-date.html";
                case 1:
                    return new URL(window.document.URL).origin + "/browse-" + nome.replaceAll("&", "e") + "-videos-1-date.html";
                default:
                    return ""
            }
        },
        Construir_Array_Episodios(t, e) {
            let _array = []; // Essa lista no formato array : [[TEMPORADA], ...] dentro de temporada haverá outro array que são os episódios [[EPISODIOS], ...]
            let tempelem = []; // variavel temporaria
            let listelem = document.getElementById("episodiodiv").children[0].children;
            let _temporada = -1;
            let _episodios = -1;
            for (let i = 0; i < listelem.length; i++) { // ESSA PARTE É DIFICL, A UNICA INFORMAÇÃO DA LISTA DE FILMES FICA NOS ELEMENTOS HTML, MAS A ESTRUTURA HTML DO SITE É MUITO MAL ORGANIZADO, POR ISSO ESSE FILTRO CHEIO DE IF E ELSES. APENAS PARA RETORNAR O ARRAY [NOME DO FILME, LINK]
                const node = listelem[i];
                if ((node.nodeName.toLowerCase() == "strong" && node.children.length != 0 && node.children[0].innerHTML.toLowerCase().endsWith("temporada")) || (node.nodeName.toLowerCase() == "span" && node.children.length != 0 && node.children[0].innerHTML.toLowerCase().endsWith("temporada"))) {
                    _array.push([]);
                    _temporada++;
                    _episodios = -1;
                }
                else if (node.nodeName.toLowerCase() == "strong" && node.innerHTML.toLowerCase().startsWith("episódio")) {
                    _array[_temporada].push([]);
                    _episodios++;
                    if (t != undefined && e != undefined && _temporada == t && _episodios == e) // Marca em amaralo o episodio atual
                        node.style.color = "yellow";

                } else if (node.nodeName.toLowerCase() == "a") {
                    _array[_temporada][_episodios].push(node.href);
                }
            }
            console.log("Lista de episódios : ", _array);
            return _array;
        },
        Construir_Array_Lista_FilmesSeries() {
            let _array = []; // Essa lista é no formato array : [[NOME DO FILME, LINK], ...]
            let tempelem = []; // variavel temporaria
            let listelem = document.getElementById("divprincipal").childNodes[0].childNodes;
            for (let i = 11; i < listelem.length; i++) {
                const node = listelem[i];
                if (node.nodeName.toLowerCase() == "#text") { // elemento de texto
                    tempelem.push(node.textContent);
                }
                else if (node.nodeName.toLowerCase() == "a") { // elemento link
                    let finaltext = "";
                    for (let v = 0; v < tempelem.length; v++) {
                        const element = tempelem[v];
                        finaltext += element;
                    }
                    _array.push([finaltext.replaceAll("\n", ""), node]);
                    tempelem = [];

                } else if (node.nodeName.toLowerCase() == "b") { // elemento negrito
                    if (node.hasChildNodes()) {
                        if (node.childNodes[0].nodeName.toLowerCase() == "a") { // se dentro houver link do filme dentro do elemento negrito
                            let finaltext = "";
                            for (let v = 0; v < tempelem.length; v++) {
                                const element = tempelem[v];
                                finaltext += element;
                            }
                            _array.push([finaltext.replaceAll("\n", ""), node.childNodes[0]]);
                            tempelem = [];
                        }
                        else { // caso for outra coisa no negrito
                            if (node.innerHTML == 'Números &amp; Símbolos') // ignorar esse elemento
                                continue;
                            tempelem.push(node.innerHTML);
                        }
                    } else {
                        tempelem.push(node.innerHTML);
                    }
                }
            }
            console.log("Lista de filmes/series : ", _array);
            return _array;
        }
    }
    window.document.dm = DM;
    function Save_Config(name, value) {
        // SALVA O VALOR DE UMA VARIAVEL E MANTEM OS OUTROS
        if (name != undefined) {
            Config[name] = value;
            GM.setValue("Config", Config);
            return;
        }
        // SALVA TUDO
        GM.setValue("Config", Config);

    };
    async function Load_Config() {// OBTEM OS VALORES DA CONFIGURAÇÃO
        let _config = await GM.getValue("Config");
        if (_config != undefined) {
            for (var k in _config) {
                Config[k] = _config[k]
            }
        }
        console.log("Script Settings", _config);
        // COMEÇA A MODIFICAÇÃO DA PAGINA DO REDE CANAIS
        IniciarScript();
    };
    function getResults(_array, index = 0) { // Obtem os resultado da procura
        let divresults = document.getElementById("results");
        const _originalinput = document.getElementById("inputnome").value;
        const _input = document.getElementById("inputnome").value.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, ""); // deixa minusculo e remove acentos;
        let anoinput = document.getElementById("anoinput");
        var find = 0;
        for (index; index < _array.length; index++) {
            let filme = _array[index];
            function _othersvalues() {
                if (anoinput != "")
                    if (!filme[0].toLowerCase().includes(anoinput.value.toLowerCase()))
                        return true;
                if (document.getElementById("dubinput").checked == true)
                    if (!filme[0].toLowerCase().includes("(dublado)"))
                        return true;
                if (document.getElementById("leginput").checked == true)
                    if (!filme[0].toLowerCase().includes("(legendado)"))
                        return true;
                if (document.getElementById("nacinput").checked == true)
                    if (!filme[0].toLowerCase().includes("(nacional)"))
                        return true;
                if (document.getElementById("res1080p").checked == true)
                    if (!filme[0].toLowerCase().includes("1080p"))
                        return true;
                if (document.getElementById("res720p").checked == true)
                    if (!filme[0].toLowerCase().includes("720p"))
                        return true;
                if (document.getElementById("res480p").checked == true)
                    if (!filme[0].toLowerCase().includes("480p"))
                        return true;
                return false;
            }
            if (document.getElementById("typesearch").selectedIndex == 0) { // PESQUISA USANDO "INCLUDES"
                if (!filme[0].toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").includes(_input)) {
                    continue;
                }
                if (_othersvalues()) continue;

            } else { // PESQUISA LINEAR
                if (_input.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "") !== filme[0].toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").slice(0, _input.length)) {
                    continue;
                }
                if (_othersvalues()) continue;
            }
            let _label = addlabel(divresults, filme[0], 0);
            if (document.getElementById("typesearch").selectedIndex == 0) {
                const regEx = new RegExp(_originalinput, "ig");
                _label.innerHTML = _label.innerHTML.replaceAll(regEx, "<span style='color:yellow'>" + _originalinput + "</span>");
            } else {
                let strarray = (_label.innerHTML.substring(0, _originalinput.length) + "|" + _label.innerHTML.substring(_originalinput.length)).split("|");
                _label.innerHTML = "<span style='color:yellow'>" + strarray[0] + "</span>" + strarray[1];
            }

            divresults.append(filme[1].cloneNode(true)) // URL
            divresults.append(document.createElement("br"));
            find++;
            if (find > 20) // Esse é o comprimento da lista, caso chege ao limite, aparecera o botão de "Mostrar mais"
            {
                addbutton(divresults, "Mostrar Mais", "Mostra mais filmes", (e) => {
                    e.target.remove();
                    getResults(_array, index + 1);
                }, "150;30");
                break;
            }

        }
    }
    function addlabel(elem, text, type = 0) {
        const _elementotipo = type == 0 ? "span" : "p"
        const l = document.createElement(_elementotipo);
        l.innerHTML = text;
        elem.append(l)
        return l;
    }
    function addinput(elem, text = "", title = "", type = "text", id = "") {
        const _input = document.createElement("input");
        _input.type = type;
        _input.innerHTML = text;
        _input.value = text;
        _input.title = title;
        _input.style = "font-size:16px";
        _input.setAttribute("id", id);
        elem.append(_input);
        if (type == "checkbox") {
            addlabel(elem, text, 0);
        }
        return _input;
    }
    function addbutton(elem, text, title, func, width = "100;30") {
        const b = document.createElement("button");
        b.innerHTML = text
        b.title = title;
        b.onclick = func;
        let w = width.split(";")[0];
        let h = width.split(";")[1];
        b.style = ` display: flex;
        justify-content: center;
        align-items: center;
        position: relative;
        width: ${w}px;
        height: ${h}px;
        margin: 5px;
        border: 10px solid var(--base-color);
        font-size: 16px;
        cursor: pointer;`;
        elem.append(b);
    }
    function createOptions(selectelem, list) { // CRIA OPÇÕES
        list.forEach((a, i) => {
            let _op = document.createElement("option");
            _op.value = i;
            if (a.textContent != undefined)
                _op.innerHTML = a.textContent;
            else
                _op.innerHTML = a;
            selectelem.append(_op);
        });
    }
    function capitalizeFirstLetter(string) {
        return string.charAt(0).toUpperCase() + string.slice(1);
    }
})();