filipedeschamps / video-maker

Projeto open source para fazer vídeos automatizados
MIT License
2.44k stars 630 forks source link

Robô de imagens - TypeError: "listener" argument must be a function #296

Closed icapetti closed 10 months ago

icapetti commented 4 years ago

Estou na última parte do robô de imagens, para salvar a imagem no diretório criado. Porém ele não salva (o downloadedImages fica vazio e ocorre o erro mencionado: TypeError: "listener" argument must be a function

Na última linha o downloadedImages vazio: img1

O erro:

img2

Robô de imagens:

/* Importa os módulos node.js do googleapis */
const imageDownloader = require('image-downloader') /* npm i image-downloader */
const google = require('googleapis').google
const customSearch = google.customsearch('v1')

/* Importa as credenciais salvas para utilizar a API do google */
const googleSearchCredentials = require('../credentials/google-search.json')

/* Importa o robô state que salva e carrega a estrutura de dados */
const state = require('./state.js')

/* Necessário instalar o módulo oficial do googleapis para node.js: npm install googleapis para utilizar a API Custom Search.
 * Necessário ativar a API Custom Search no "https://console.developers.google.com/apis". Também deve-se gerar uma apikey.
 * No Search Engine criado em "https://cse.google.com/cse/create/new" deve ativar os parâmetros: Image search e Search the entire web.
 * Os resultados aparecem na propriedade "items."
 */

async function robot(){
    /* Carrega o estado da estrutura de dados */
    const content = state.load()

    await fetchImagesOfAllSentences(content)
    await downloadAllImages(content)
    state.save(content)

    async function fetchImagesOfAllSentences(content){
        for(const sentence of content.sentences){
            /* Monta a query com o termo de busca e as keywords que constam no objeto content 
             * é feita uma concatenação do termo da busca e da keyword para que a query fique sempre contextualizada
             */
            const query = `${content.searchTerm} ${sentence.keywords[0]}`

            /* Salva busca as imagens e salva na estrutura de dados */
            sentence.images = await fetchGoogleAndReturnImagesLinks(query)

            /* Salva a query na estrutura de dados */
            sentence.googleSearchQuery = query
        }
    }

    /* Função que faz a busca de imagens no google */
    async function fetchGoogleAndReturnImagesLinks(query){

        /* Realiza a busca de acordo com os parâmetros definidos */
        const response = await customSearch.cse.list({
            auth: googleSearchCredentials.apikey, // apikey
            cx: googleSearchCredentials.searchEngineId, // Contexto de busca
            q: query, //q = query
            searchType: 'image', // Define o tipo de busca
            //imgSize: 'huge', // Resolução da imagem
            num: 2 // Número de resultados desejados
        })

        /* Extrai dos resultados da busca (items) apenas a url da imagem e salva num array */
        const imagesUrl = response.data.items.map((item) => {
            return item.link
        })
        return imagesUrl
    }

    async function downloadAllImages(content){

        /* Propriedade para salvar a url das imagens que já foram baixadas, para evitar que o robô baixe 2x a mesma imagem. */
        content.downloadedImages = []

        /* Looping nas sentenças para localizar o array de imagens (images) */
        for (let sentenceIndex = 0; sentenceIndex < content.sentences.length; sentenceIndex++){
            const images = content.sentences[sentenceIndex].images

            /* Looping dentro do array de imagens  */
            for(let imageIndex = 0; imageIndex < images.length; imageIndex++){
                const imageURL = images[imageIndex]

                try{
                    if(content.downloadedImages.includes(imageURL)){
                        throw new Error('Imagem já foi baixada')
                    }
                    /* Baixa a imagem */
                    await downloadAndSave(imageURL, `${sentenceIndex}-original.png`)
                    content.downloadedImages.push(imageURL)
                    console.log(`> [${sentenceIndex}][${imageIndex}] Baixou imagem com sucesso: ${imageURL}`)
                    break
                }catch(error){
                    console.log(`> [${sentenceIndex}][${imageIndex}] Erro ao baixar (${imageURL}): ${error}`)
                }
            }
        }
    }
    async function downloadAndSave(url, fileName){

        return imageDownloader.image({
            url: url,
            dest: `./content/${fileName}`
          })
    }
}
module.exports = robot
matbrgz commented 10 months ago

Conseguiu resolver? Espero que tenha conseguido. Irei fechar o issue, caso necessário posso abrir novamente.