$ id turicas
Turicas, prazer! =)
Álvaro Justen
Software Livre & Python
(desde 2004/2005)
16ª PythonBrasil
$ id aninhasalesp
Ana Paula, prazer! =)

- [Brasil.IO](https://brasil.io/)
- [CruzaGrafos](https://cruzagrafos.abraji.org./br), com [Abraji](https://abraji.org.br/)
- [VacinaBR](https://vacinabr.org.br/), com [IQC](https://iqc.org.br/)
- [LupaScan](https://scan.lupa.news/), com [Agência Lupa](https://lupa.news/)
- [Monitor da Fiscalização do Desmatamento](https://plataforma.alerta.mapbiomas.org/monitor-da-fiscalizacao), com [Mapbiomas](https://mapbiomas.org/)
- [pythonic.cafe](https://pythonic.cafe)
## Agenda
- Investigações jornalísticas
- Aplicações dos dados
- YouTool: funções básicas
- YouTool pela linha de comando
## [bit.ly/youtool-pybr2024](http://bit.ly/youtool-pybr2024)
## Jornalismo investigativo
- Monitoramento de vídeos deletados do YouTube, por Guilherme Felitti
- [Disarming Disinformation](https://www.icfj.org/our-work/disarming-disinformation-empowering-truth), do [ICFJ](https://www.icfj.org/) em parceria com [Instituto Serrapilheira](https://serrapilheira.org/)
- Trabalhos resultaram em 9 matérias em veículos brasileiros e internacionais
- Análise de milhares de horas de vídeos e podcasts
- Fevereiro a julho de 2023
- Conteúdos publicados por pessoas eleitas, no LupaScan
## Projetos
- Médicos Negacionistas
- Liderado por **Fabiana Cambricoli** ([Estadão](https://estadao.com.br/))
- Em conjunto com [Ciência Suja](https://www.cienciasuja.com.br/)
- Venda de curas milagrosas pela Internet
- Liderado por **Jaqueline Sordi** ([Instituto Questão de Ciência](https://iqc.org.br/))
- Em conjunto com [Veja Saúde](https://saude.abril.com.br/)
- Agronegócio e a negação do aquecimento global
- Liderado por **Giovana Girardi** ([Agência Pública](https://apublica.org/))
- Em conjunto com [Climainfo](https://climainfo.org.br/)
## Matérias
- [Associação de médicos condenada por propaganda pró-cloroquina agora aposta em discurso antivacina (Estadão)](https://www.estadao.com.br/saude/associacao-de-medicos-condenada-por-propaganda-pro-cloroquina-agora-aposta-em-discurso-antivacina/)
- [O Rei Lair (Ciência Suja)](https://www.cienciasuja.com.br/temporada-3/o-rei-lair)
- [Jolivi: o lucrativo e obscuro mercado das falsas curas (Revista Questão de Ciência)](https://revistaquestaodeciencia.com.br/dossie-questao/2023/06/30/jolivi-o-lucrativo-e-obscuro-mercado-das-falsas-curas)
- [Empresas lucram vendendo falsas curas naturais na internet (Veja)](https://veja.abril.com.br/saude/empresas-lucram-vendendo-falsas-curas-naturais-na-internet)
- [Mercadores da cura (Veja Saúde)](https://saude.abril.com.br/medicina/mercadores-da-cura)
- [Jolivi: The shady and highly profitable online market for false cures in Brazil (The Skeptic)](https://www.skeptic.org.uk/2023/11/jolivi-the-shady-and-highly-profitable-online-market-for-false-cures-in-brazil/)
- [Agronegócio e extrema direita impulsionam máquina de fake news sobre aquecimento global (Agência Pública)](https://apublica.org/2023/06/agronegocio-e-extrema-direita-impulsionam-maquina-de-fake-news-sobre-aquecimento-global/)
- [Máquina da desinformação climática é patrocinada pelo agronegócio e a extrema-direita (Climainfo)](https://climainfo.org.br/2023/07/02/maquina-da-desinformacao-climatica-e-patrocinada-pelo-agronegocio-e-a-extrema-direita/)
- [In Brazil, Agribusiness Lobby and Far-Right Politicians Sow Climate Disinformation (Nacla)](https://nacla.org/brazil-agribusiness-lobby-and-far-right-politicians-sow-climate-disinformation)
## Técnicas utilizadas
- Coleta de dados ([youtool](https://github.com/PythonicCafe/youtool))
- **Encontrar vídeos a serem baixados**
- **Baixar transcrições automáticas do YouTube (se o vídeo estiver no YouTube)**
- **Baixar áudios dos vídeos**
- Uso de modelo de IA para transcrição de áudio ([OpenAI Whisper](https://github.com/openai/whisper))
- [Veja notebook de exemplo](https://gist.github.com/turicas/da12b3c8e67a27e088d12d9c41be65d9)
- Técnicas de LLM para resumo de transcrições (usando o GPT 3.5 Turbo)
- [Veja *prompts*](https://colab.research.google.com/drive/1BTbW1ttT6_R2n0SrQDoNRLgktUtDoB2w?usp=sharing#scrollTo=BCTi4Br5z9jA)
- Banco de dados para sistema de busca ([postgres *full-text search*](https://www.postgresql.org/docs/current/textsearch.html))
- [Veja palestra na PythonBrasil 2022](https://www.youtube.com/watch?v=tS5f7Mo6lTA)
## youtool
- Facilita acesso a API e scraping do YouTube:
- Requisições em lote
- Utilização de diversas chaves de API
- Informações de canais, playlists e vídeos
- Baixar vídeo, áudio e transcrições automáticas
- Comentários e live chat
- API de Busca e top vídeos
- *Command-line interface* (CLI):
- Desfaio técnico
- Subcomandos: `youtool --help`
- Lançaremos hoje!
- [github.com/PythonicCafe/youtool](https://github.com/PythonicCafe/youtool)
- `pip install youtool`
## Descobrindo IDs de canais
```python
# Não precisa de chave da API!
import os
from youtool import YouTube
# Você pode passar mais de uma chave
yt = YouTube(api_keys=[os.environ.get("YOUTUBE_API_KEY")])
url = "https://www.youtube.com/@pythonbrasiloficial"
channel_id = yt.channel_id_from_url(url) # Scraping
print(f"ID do canal: {channel_id}")
```
## Descobrindo IDs de canais (CLI)
```shell
# Não precisa de chave da API!
youtool channel-id \
https://www.youtube.com/@pythonbrasiloficial \
https://www.youtube.com/c/PythonicCafe
# Outros parâmetros:
# - Especificar o caminho para salvar como CSV
```
## Listando playlists de um canal
```python
# Necessita de uma chave de API do YouTube (gratuita)
from pprint import pprint
info = list(yt.channels_infos([channel_id]))[0]
print("Channel info:")
pprint(info)
playlist_id = info["playlist_id"]
print(f"Playlist ID: {playlist_id}")
```
## Listando playlists de um canal (CLI)
```shell
export YOUTUBE_API_KEY=...
youtool channel-info \
UCiCQrFh8ckR_LXQyOAsOZiw \
UC9rtYzWLlYRfbYjDUDsVmUg
# Outros parâmetros:
# --api-key
# --output-file-path
```
## Listando vídeos de uma playlist
```python
import datetime
video_ids = []
total_videos = 0
momento_inicial = datetime.datetime(2024, 1, 1, 3, 0, 0, tzinfo=datetime.timezone.utc)
for video in yt.playlist_videos(playlist_id):
if video["published_at"] >= momento_inicial:
video_ids.append(video["id"])
total_videos += 1
print(f"Identificados {len(video_ids)} vídeos de um total de {total_videos} nessa playlist")
```
## Detalhes de um vídeo
```python
# O método `playlist_videos` não nos fornece todas as informações sobre o vídeo
videos = list(yt.videos_infos(video_ids))
print("Informações do primeiro vídeo:")
pprint(videos[0])
```
## Detalhes de um vídeo (CLI)
```shell
export YOUTUBE_API_KEY=...
youtool video-info NtZY3AmsBSk
```
## Baixando transcrição/áudio/vídeo
```python
video_ids = ["NtZY3AmsBSk"]
for status in yt.download_transcriptions(
videos_ids=video_ids, language_code="pt", path="transcricoes", batch_size=3,
):
print(status)
# Troque por `download_audios` ou `download_videos`
```
## Trabalhando com as transcrições
```python
from youtool.utils import simplify_vtt
filename = f"transcricoes/{video_ids[0]}.pt.vtt"
with open(filename) as fobj:
vtt = fobj.read()
simplified = simplify_vtt(vtt)
for index, line in enumerate(simplified.splitlines()):
print(index, line.strip())
if index == 20:
break
```
## Baixando transcrição/áudio/vídeo (CLI)
```shell
# Não precisa de chave de API
youtool video-transcription pt --ids NtZY3AmsBSk
```
## Colabore!

[github.com/PythonicCafe/youtool](https://github.com/PythonicCafe/youtool)
Dúvidas?
*/turicas
*/aninhasalesp