Skip to content

raffreitas/codeflix-video-encoder

Repository files navigation

Codeflix Video Encoder

Um sistema de codificação de vídeos em Go que processa vídeos MP4 para o formato DASH (Dynamic Adaptive Streaming over HTTP), utilizando arquitetura orientada a eventos com RabbitMQ.

✨ Características

  • Processamento assíncrono de vídeos com workers
  • Codificação DASH para streaming adaptativo
  • Upload/Download automático para AWS S3 (ou LocalStack)
  • Fila de mensagens com RabbitMQ
  • Persistência com PostgreSQL/SQLite
  • Containerização com Docker
  • Testes unitários com cobertura

🏗️ Arquitetura

O projeto segue uma arquitetura em camadas baseada em Clean Architecture:

├── domain/          # Entidades de negócio (Video, Job)
├── application/     # Casos de uso e serviços
│   ├── repositories/  # Contratos e implementações de repositórios
│   └── services/     # Lógica de negócio
└── framework/       # Infraestrutura (DB, Queue, Utils)
    ├── cmd/         # Ponto de entrada da aplicação
    ├── database/    # Configuração do banco de dados
    ├── queue/       # Configuração do RabbitMQ
    └── utils/       # Utilitários gerais

🛠️ Tecnologias

  • Go 1.24.2 - Linguagem principal
  • PostgreSQL/SQLite - Banco de dados
  • RabbitMQ - Fila de mensagens
  • AWS S3/LocalStack - Armazenamento de arquivos
  • GORM - ORM para Go
  • Bento4 - Ferramentas de processamento de vídeo
  • FFmpeg - Manipulação de mídia
  • Docker - Containerização

📋 Pré-requisitos

  • Docker e Docker Compose
  • Make (opcional)

⚙️ Configuração

  1. Clone o repositório:
git clone https://github.com/raffreitas/codeflix-video-encoder.git
cd codeflix-video-encoder
  1. Configure as variáveis de ambiente:
cp .env.example .env

Edite o arquivo .env conforme necessário:

# Banco de dados
DB_TYPE="postgres"
DSN="dbname=encoder sslmode=disable user=postgres password=root host=db"

# AWS/LocalStack
INPUT_BUCKET_NAME="codeflix-local"
OUTPUT_BUCKET_NAME="codeflix-local"

# RabbitMQ
RABBITMQ_DSN="amqp://rabbitmq:rabbitmq@rabbitmq:5672/"
RABBITMQ_CONSUMER_QUEUE_NAME="videos"

# Concorrência
CONCURRENCY_UPLOAD=10
CONCURRENCY_WORKERS=1

🚀 Execução

  1. Inicie todos os serviços:
docker-compose up -d
  1. Execute a aplicação:
docker-compose exec app go run framework/cmd/server/server.go

Os serviços estarão disponíveis em:

  • Aplicação: Container app
  • PostgreSQL: localhost:5432
  • RabbitMQ Management: http://localhost:15672 (rabbitmq/rabbitmq)
  • LocalStack S3: http://localhost:4566

📁 Estrutura do Projeto

Domain Layer

  • domain/video.go - Entidade Video com validações
  • domain/job.go - Entidade Job para controle de processamento

Application Layer

  • application/services/video_service.go - Serviços de processamento de vídeo
  • application/services/job_service.go - Orquestração do fluxo de jobs
  • application/services/job_worker.go - Workers para processamento assíncrono
  • application/services/job_manager.go - Gerenciamento de workers e filas
  • application/services/upload_manager.go - Upload concorrente para S3

Framework Layer

  • framework/database/db.go - Configuração do banco de dados
  • framework/queue/queue.go - Cliente RabbitMQ
  • framework/utils/utils.go - Utilitários gerais

🔄 Fluxo de Processamento

  1. Recebimento: Mensagem recebida via RabbitMQ
  2. Validação: Validação do JSON e criação do vídeo
  3. Download: Download do vídeo do bucket S3
  4. Fragmentação: Fragmentação com mp4fragment
  5. Codificação: Codificação DASH com mp4dash
  6. Upload: Upload concorrente dos arquivos processados
  7. Limpeza: Remoção dos arquivos temporários
  8. Notificação: Envio de notificação de conclusão

Exemplo de Mensagem

{
  "resource_id": "52d8ef70-e795-41ab-9846-2523bf34c30e",
  "file_path": "video.mp4",
  "status": "pending"
}

🧪 Testes

Execute os testes:

# Todos os testes
docker-compose exec app go test ./...

# Testes específicos
docker-compose exec app go test ./domain/...
docker-compose exec app go test ./application/services/...
docker-compose exec app go test ./application/repositories/...

Cobertura de Testes

  • domain/video_test.go - Validação de entidades
  • domain/job_test.go - Criação de jobs
  • application/repositories/video_repository_test.go - Persistência de vídeos
  • application/repositories/job_repository_test.go - Persistência de jobs
  • application/services/video_service_test.go - Processamento de vídeos
  • application/services/upload_manager_test.go - Upload para S3

🔧 Desenvolvimento

Comandos Úteis

# Logs da aplicação
docker-compose logs -f app

# Acesso ao container
docker-compose exec app sh

# Restart dos serviços
docker-compose restart

# Limpeza completa
docker-compose down -v

Estrutura de Banco

O sistema utiliza duas tabelas principais:

  • videos: Armazena informações dos vídeos
  • jobs: Controla o estado do processamento

📄 Licença

Este projeto está sob a licença MIT. Veja o arquivo LICENSE para detalhes.


Desenvolvido com ❤️ em Go

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published