API para criar clips de vídeos do YouTube feito em Golang.
- Go 1.25+
- yt-dlp instalado no sistema
- ffmpeg instalado no sistema (usado pelo yt-dlp e para conversão de áudio)
- SQLite3
# Instalar dependências
go mod tidy
# Compilar (opcional)
go build -o bin/api ./cmd/api# Usar configurações padrão
./bin/api
# se quiser rodar sem compilar
go run cmd/api/main.go
# Ou configurar via variáveis de ambiente
DB_PATH=./data/app.db STORAGE_DIR=./data/clips ./bin/apiObtém metadados de um vídeo do YouTube (título e duração).
Request:
{
"url": "https://youtube.com/watch?v=..."
}Response:
{
"title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
"duration": 213
}Notas:
durationestá em segundos- Usado pelo frontend para exibir informações antes de criar o clip
- Valida se a URL é válida e acessível
Cria um novo clip.
Request:
Video:
{
"url": "https://youtube.com/watch?v=...",
"start_time": 10,
"end_time": 30,
"format": "video"
}Audio
{
"url": "https://youtube.com/watch?v=...",
"start_time": 10,
"end_time": 30,
"format": "audio"
}Response:
{
"id": 1,
"status": "processing"
}Obtém informações de um clip.
Response:
{
"id": 1,
"status": "completed",
"title": "Video Title",
"duration": 20,
"size": 1234567,
"download_url": "/clips/1/download"
}Baixa o arquivo do clip.
Lista clips com paginação.
Parâmetros query:
page(opcional): Número da página (padrão: 1)limit(opcional): Itens por página (padrão: 20, máx: 100)
Response:
{
"clips": [
{
"id": 1,
"status": "completed",
"title": "Video Title",
"duration": 20,
"size": 1234567,
"download_url": "/clips/1/download"
}
],
"total": 50,
"page": 1
}Apaga um clip permanentemente (remove arquivo do disco e registro do banco).
Response:
{
"deleted": true
}Notas:
- Remove o arquivo físico do disco (storage/clips/)
- Remove o registro do banco de dados
- Operação irreversível
- Retorna 404 se o clip não existir
Os clips podem ter os seguintes status:
processing- Clip sendo processado pelo yt-dlpcompleted- Clip pronto para downloadfailed- Erro no processamento
-
Buscar metadados (opcional, mas recomendado):
POST /metadata
Retorna título e duração do vídeo
-
Criar clip:
POST /clips
Inicia processamento assíncrono, retorna ID e status
-
Monitorar status:
GET /clips/{id}Verificar se status mudou para
completed -
Baixar arquivo:
GET /clips/{id}/downloadDownload direto do arquivo MP4 ou MP3
O frontend foi desenvolvido com SvelteKit e está na pasta web/.
cd web
npm run devO frontend estará disponível em http://localhost:5173 e fará proxy das requisições /api/* para a API em localhost:8080.
Rotas disponíveis:
/- Criar novo clip/clips- Listar todos os clips/clips/[id]- Detalhes de um clip específico
Funcionalidades:
- Buscar metadados do vídeo antes de criar clip
- Criar clips de vídeo ou áudio
- Proteção contra duplicação de clips (botão desabilitado durante criação)
- Listar clips com auto-refresh para clips em processamento
- Download de clips concluídos
- Apagar clips com confirmação
Ver web/ESTRUTURA.md para documentação completa do frontend.
curl -X POST http://localhost:8080/metadata \
-H "Content-Type: application/json" \
-d '{"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"}'curl -X POST http://localhost:8080/clips \
-H "Content-Type: application/json" \
-d '{
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"start_time": 0,
"end_time": 30,
"format": "video"
}'curl http://localhost:8080/clips/1curl http://localhost:8080/clips?page=1&limit=10curl -X DELETE http://localhost:8080/clips/1curl -o meu-clip.mp4 http://localhost:8080/clips/1/download.
├── cmd/api/ # Aplicação principal
├── internal/
│ ├── controller/ # Handlers HTTP
│ ├── entities/ # Modelos de dados
│ ├── repository/ # Acesso ao banco
│ └── service/ # Lógica de negócio
├── storage/clips/ # Clips salvos
├── web/ # Frontend SvelteKit
└── youclips.db # Banco SQLite