Python na prática: Projeto Video Creator – #Parte 2: Idéias de conteúdo

Bom dia, boa tarde, boa noite!

Este é o segundo post da série sobre o projeto Video Creator, onde mostrarei o consumo de RSS do Google trends e a busca pelos Trending topics do Twitter para sugerir conteúdos para o video.

Se você entrou direto nesse post, te aconselho a começar por aqui, para entender exatamente do que se trata essa série.

Sobre essa parte

Para esse projeto, resolvi mostrar apenas o primeiro colocado do Google e do Twitter, porém os serviços retornam bem mais informações que vocês podem consumir e utilizar para personalizar o robô de vocês.

Lembrem-se, esse projeto é apenas uma POC… um start pra coisas maiores.

Requisitos

Essa parte é bastante simples, pois o Google possui um serviço de RSS aberto onde você consegue ver os assuntos mais buscados do dia. E o Twitter possui uma API bastante simples de consumir, onde também faremos uso do de uma requisição simples a uma URL, a diferença é que para o Twitter, precisaremos de uma API KEY.

Para o Google, utilizei a seguinte URL:

https://trends.google.com.br/trends/trendingsearches/daily/rss?geo=BR

Ao consultar a URL, temos o documento XML seguinte:

Isso é muito legal! 😀

Para o Twitter, utilizei URL padrão da api, passando como parâmetro o id referente ao Brasil, assim, o resultado será apenas os trending topics do Brasil:

https://api.twitter.com/1.1/trends/place.json?id=23424768

Então basicamente o que precisei fazer, foi bater nessas URLs e fazer o parser para dentro do meu código para extrair os dados que eu queria, que nesse caso, foi apenas o atributo title do Google Trends, e o atributo name do Trending Topics do primeiro colocado.

Pra isso utilizei as libs requests e xmltodict:

import requests
import xmltodict

Para o Google trends, encapsulei a requisição e o parser na função abaixo:

def get_google_trends():

    def parser_xml(v_xml):
        key_words = []
        # parser
        content_xml = xmltodict.parse(v_xml)

        for i in content_xml['rss']['channel']['item']:
            
            rel_news = []

            for j in i['ht:news_item']:
                
                if not isinstance(j, str):
                    rel_news.append(j['ht:news_item_title'])

            obj = {
                "title": "{}".format(i['title']), 
                "traffic": "{}".format(i['ht:approx_traffic']),
                "pubDate": "{}".format(i['pubDate']),
                "description": "{}".format(i['description']),
                "related_news": rel_news,
                "dateInsert": datetime.datetime.now()
                }
            key_words.append(obj)
        
        return key_words

    logging.info("--- Getting GOOGLE TRENDS ---")
    # URL do trending topics do Google
    url = "https://trends.google.com.br/trends/trendingsearches/daily/rss?geo=BR"

    content = requests.get(url)
    return parser_xml(content.text)

E para o trending topics do Twitter:

def get_twitter_trends():
    logging.info("--- Getting TWITTER TRENDS ---")
    
    headers = {"Authorization": "Bearer {}".format(credentials['api_bearer_token'])}
    url = "https://api.twitter.com/1.1/trends/place.json?id=23424768"
    response = requests.get(url, headers=headers)
    
    content = []
    
    for i in response.json():
        for j in i['trends']:
            content.append({
                "at": datetime.datetime.now(),
                "as_of": i['as_of'],
                "location": i['locations'][0]['name'],
                "name": j['name'],
                "tweet_volume": j['tweet_volume']
            })
    return content

Essas 2 funções são chamadas dentro de uma outra função que detalharei no próximo post onde falarei sobre a busca pelo conteúdo desejado na wikipedia.

Até o próximo post!

Abraços!

Python na prática: Projeto Video Creator – #Parte 1: Arquitetura da aplicação

Bom dia, boa tarde, boa noite!

Este é o primeiro post da série sobre o projeto Video Creator, onde mostrarei a arquitetura que utilizei no projeto, organização das pastas e dos códigos.

Se você entrou direto nesse post, te aconselho a começar por aqui, para entender exatamente do que se trata essa série.

Sobre essa parte

Sempre que vou começar um novo projeto, gosto de começar a pensar como vou estruturar as pastas e os códigos.

Para esse projeto eu usei a seguinte estrutura:

videocreator # Na raíz fica o “orquestrador” dos robôs
├── content # aqui fica todo o conteúdo para o video
│   ├── default # arquivos default
│   ├── images # imagens para o video
│   └── music # musicas para o video
├── credentials # aqui ficam todas as credenciais dos serviços
└── robots # aqui ficam os “robôs”

Organização do código

Na hora de codificar cada uma das features, tentei agrupá-las por “assunto”, afim de que cada robô pudesse ser executado por completo e de forma independente.

São eles:

rcontent.py

O rcontent é responsável por todo o conteúdo textual do vídeo. É ele quem busca os trending topics para nos dar idéias de conteúdo e nos pergunta qual o assunto a ser buscado.

Após a busca pelo assunto escolhido, é ele o responsável por limpar o texto e quebrá-lo em sentenças, além de identificar todas as palavras-chaves de cada sentença.

Por último, ele gera o arquivo content.json e salva na pasta content.

# Estrutura do arquivo content.json

{
    "search_term": "Assunto pesquisado",
    "youtube_details": {
        "category_id": "id da categoria",
        "title": "Título do video",
    "original_content": "Texto original",
    "cleaned_content": "Texto limpo",
    "sentences": [
        {
            "text": "Sentença",
            "keywords": [],
            "images": [],
            "image_search_query": "string usada na pesquisa"
        }
    ],
    "images_used": [],
    "video_filename": "nome_video.mp4"
}

rimage.py

O rimage é responsável pelas imagens que serão utilizadas no video. Ele busca as imagens com base nas keywords de cada sentença, e armazena o link das 5 primeiras no atributo images de cada sentença.

Após a busca pelas imagens, ele inica o processo de download, que funciona da seguinte forma:

É feito uma tentativa de download da primeira imagem, se ele conseguir, ótimo, ele vai para a próxima sentença, senão, ele tenta a segunda imagem e assim sucessivamente.

As imagens que são baixadas são guardadas no atributo images_used.

Por último, ele atualiza o arquivo content.json com esses novos dados.

rvideo.py

Talvez o mais desafiador entre os 4, pois até o momento era a única coisa no projeto que eu ainda não havia feito com programação… a compilação de um video. O rvideo é responsável por editar as imagens baixadas e compilar o video.

E por que a edição das imagens ficou no rvideo ? Porque as imagens da forma que foram editadas, foram feitas para o vídeo, então fazia mais sentido deixar que ele msmo trate as imagens que ele ira utilizar.

Por último, após o video compilado, ele insere o nome do arquivo de video no atributo video_filename, salva o titulo do video no atributo youtube_details:title e atualiza o arquivo content.json.

ryoutube.py

O último robô a ser desenvolvido tem uma tarefa muito simples: fazer o upload do video no youtube.

Ele é reponsável por gerar o título, descrição, setar as tags e todas as configurações necessárias para o youtube, além é claro, de realizar o upload do video.

Iniciando a execução dos robôs

Para orquestrar a execução dos robôs, foi criado um arquivo index.py, onde ele é responsável por chamar a função start() de cada robô.

Por ser o mais simples de todos, deixarei esse por último.

So far So good?

Ainda ficou muito questão a ser melhorada, mas isso será assunto para a segunda versão do robô, onde tratarei da evolução dele, e o que mais podemos fazer.

Nos próximos posts começarei a mostrar como ficou o código

Um abraço, e até o próximo post!

Gerando videos para o Youtube com linguagem Python

Navegando pelo Youtube a mais ou menos 2 anos atrás, me deparei com uma playlist do canal Filipe Deschamps onde ele mostrava como havia programado 4 robôs para automatizar a criação de videos para o Youtube fornecendo apenas o assunto para o robô.

Para quem quiser conferir, esse é o link do primeiro video da série:

Programei 4 robôs que criam vídeos para mim no YouTube

Bom, na época havia começado minha jornada de aprendizado em Python, e resolvi que faria um projeto similar, utilizando Python, e ferramentas alternativas as utilizadas no projeto original.

Pelos meses seguinte, a idéia não saiu do papel, por diversas razões que não precisam ser citadas aqui.

Até que no final de 2021, resolvi que tiraria esse projeto do papel, apenas por diversão e para praticar um pouco de Python… foi bem divertido :D.

O projeto ficou pronto e pode ser conferido no repositório que postarei mais abaixo. Porém não foi fácil concluí-lo. Diversas coisas no projeto segui o exatamente o que ele fez, outras nem tanto. Também utilizei muito do conhecimento passado nos videos do Filipe Deschamps, porém ele usou Node.js e como resolvi fazer em Python, muitas coisas precisei pesquisar como poderia fazer, quais libs poderia usar, etc.

Então para registrar o conhecimento que adquiri com esse pequeno projeto, resolvi escrever uma série de posts, cada qual abordando um pedaço do projeto, assim como o Filipe fez em video.

O objetivo principal é para reforçar, por meio do repasse, o aprendizado adquirido. Espero que estes posts possam ajudar vocês de alguma forma, seja com o conteúdo técnico ou simplesmente motivando-os a iniciarem seus projetos pessoais. É a melhor forma de aprender, e como o Filipe falou nos videos, são nesses projetos, que podemos usar toda e qualquer tecnologia que temos vontade, sem nos preocupar se é viável ou não.

Repositório com o projeto concluído:
https://github.com/thmlima87/videocreator

O que foi usado no projeto?

Apesar de parecer simples, o projeto envolveu bastante coisa legal:

Bora começar!

Abaixo os links de todos os posts para facilitar a navegação.

Parte 1: Arquitetura da aplicação
Parte 2: Idéias de conteúdo!
Parte 3: Buscando o assunto escolhido na Wikipedia
Parte 4: Limpeza e interpretação do texto
Parte 5: Persistência do conteúdo
Parte 6: Bing Custom Search
Parte 7: Busca e download de imagens
Parte 8: Tratamento das imagens
Parte 9: Renderização do video
Parte 10: Upload para o Youtube

Exit mobile version