crowncode-backend / README.md
Rthur2003's picture
docs: update README with model hub deployment steps and new env vars
a676b27
---
title: CrownCode Backend
emoji: 👑
colorFrom: yellow
colorTo: red
sdk: docker
pinned: false
---
# CrownCode Backend
YouTube-first backend service for AI music detection workflows.
---
## Hugging Face Spaces Deployment
### Adım 0 — Model Dosyalarını HF Hub'a Yükle (tek seferlik)
Model dosyaları `.gitignore`'da — Space'e gönderilmez. Bunun yerine container
başlangıcında `startup.py` onları `Rtur2003/auris-models` hub reposundan indirir.
```bash
# Lokal makinede bir kere çalıştır:
huggingface-cli login # HF token ister (write izni gerekli)
python upload_models_to_hub.py # ~415 MB yükler (RF 47MB + wav2vec2 360MB dahil)
```
Upload sonrası `https://huggingface.co/Rtur2003/auris-models` adresinde
tüm model dosyaları görünmeli.
### Adım 1 — Space Oluştur
- [huggingface.co/new-space](https://huggingface.co/new-space) adresine git
- Space Name: `crowncode-backend`
- SDK: **Docker** (önemli!)
- Hardware: **CPU Basic (Free)**
### Adım 2 — Kodu Push Et
```bash
cd hf-crowncode-backend
git remote add space https://huggingface.co/spaces/Rtur2003/crowncode-backend
git push space main
```
Veya Space sayfasında "Files" > "Add file" ile `Dockerfile`, `requirements.txt`,
`startup.py`, `app/` klasörünü yükle.
### Adım 3 — HF_TOKEN Secret Ekle (isteğe bağlı)
Eğer `auris-models` reposu **private** ise:
- Space > Settings > Repository secrets
- `HF_TOKEN` = HuggingFace read token
### Adım 4 — Deploy
- "Commit changes" butonuna bas
- Build ~5-8 dk sürer (PyTorch + model download)
- `startup.py` tüm model dosyalarını `/app/models/` altına indirir
- API ayağa kalkar, "Önizleme Modu" biter
### URL Format
```
https://KULLANICI_ADI-crowncode-backend.hf.space
```
### Test Endpoints
```
GET /api/health -> {"status": "healthy"}
GET /docs -> Swagger UI
POST /api/youtube/analyze
```
---
## What This Service Does
- Accepts a YouTube URL
- Downloads audio via `yt-dlp`
- Optionally forwards the audio to external services:
- Music-AIDetector (`/predict`)
- Ses-Analizi (`/analyze`)
- Produces a deterministic preview decision if no model is available
---
## Structure
```
hf-crowncode-backend/
Dockerfile <- Hugging Face Spaces icin
requirements.txt <- CPU-compatible dependencies
app/
main.py
schemas.py
routes/
health.py
analyze.py
data_processing.py
commend/
router.py
youtube_service.py
services/
external_clients.py
url_parser.py
youtube_analysis.py
youtube_downloader.py
audio_processor.py
validation.py
logging_config.py
preview_model.py
```
---
## API Endpoints
| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/api/health` | Health check |
| POST | `/api/analyze` | Analyze YouTube URL or uploaded file |
| POST | `/api/process/audio` | Audio augmentation |
| GET | `/api/commend/health` | Crown Commend health check |
| POST | `/api/commend/generate` | Generate AI comment for YouTube |
| POST | `/api/commend/post` | Post comment to YouTube (feature-flagged) |
| GET | `/api/commend/styles` | Get available comment styles |
### POST /api/analyze
Request (multipart form):
- `sourceType`: `youtube` | `file` | `spotify` | `apple`
- `url`: YouTube URL (when sourceType=youtube)
- `file`: Audio file upload (when sourceType=file)
Response:
```json
{
"result": {
"isAIGenerated": true,
"confidence": 0.85,
"processingTime": 2.1,
"modelVersion": "preview-v2-enhanced",
"decisionSource": "preview",
"analysisMode": "preview",
"source": { "kind": "youtube", "videoId": "..." },
"features": { ... },
"audioInfo": { ... }
},
"warnings": [],
"errors": []
}
```
---
## Environment Variables
| Variable | Default | Description |
|----------|---------|-------------|
| `AURIS_MODELS_REPO` | `Rtur2003/auris-models` | HuggingFace model repo to download artifacts from at startup |
| `MODELS_DIR` | `/app/models` | Local directory where model files are stored |
| `HF_TOKEN` | - | HuggingFace token (required if `auris-models` repo is private) |
| `SKIP_MODEL_DOWNLOAD` | `0` | Set to `1` to skip startup download (local dev with models already present) |
| `CROWNCODE_CORS_ORIGINS` | `http://localhost:3000` | Allowed CORS origins (comma-separated). **Do not use `*` in production.** |
| `MUSIC_AI_API_URL` | - | Music-AIDetector service URL |
| `SES_ANALIZI_API_URL` | - | Ses-Analizi service URL |
| `CROWNCODE_API_TIMEOUT_SEC` | `30` | External service timeout |
| `SES_ANALIZI_THRESHOLD` | `0.5` | Authenticity score threshold |
| `LOG_LEVEL` | `INFO` | Logging level |
| `YOUTUBE_COOKIES_FROM_BROWSER` | - | Optional `yt-dlp` browser cookie source, e.g. `edge` or `chrome:Default` |
| `YOUTUBE_COOKIES_FILE` | - | Optional Netscape `cookies.txt` path for YouTube-authenticated downloads |
| `YOUTUBE_COOKIES_BASE64` | - | Optional base64-encoded `cookies.txt` content for secret managers |
| `COMMEND_GEMINI_API_KEY` | - | Gemini API key for Crown Commend (also used as YouTube API Key fallback) |
| `COMMEND_YOUTUBE_API_KEY` | - | YouTube Data API key for read operations (optional if Gemini key is set) |
| `COMMEND_TOKEN_JSON` | - | YouTube OAuth token JSON for posting comments (optional) |
| `COMMEND_API_KEY` | - | API key for commend endpoint auth (**required in production**) |
| `COMMEND_REQUIRE_AUTH` | `true` | Fail-closed auth gate. Set to `false` only for local development. |
| `COMMEND_ENABLE_POSTING` | `false` | Enable YouTube comment posting (`true`/`false`) |
---
## Frontend Configuration
Backend deploy edildikten sonra frontend `.env` dosyasini guncelle:
```env
NEXT_PUBLIC_API_URL=https://kullaniciadi-crowncode-backend.hf.space
```
---
## Local Development
```bash
# Install dependencies
pip install -r requirements.txt
# Install PyTorch CPU
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
# Run server
uvicorn app.main:app --reload --port 8000
```
---
## Docker Local Build
```bash
docker build -t crowncode-backend .
docker run -p 7860:7860 crowncode-backend
```
---
## Notes
- `yt-dlp` requires network access and works best with `ffmpeg` installed
- If YouTube returns a bot-check/sign-in challenge, configure `YOUTUBE_COOKIES_FROM_BROWSER=edge` or pass a `cookies.txt` file via `YOUTUBE_COOKIES_FILE`
- When external services are not configured, returns preview decision
- Hugging Face free tier has 16GB RAM and 2 vCPU
- Build may take 5-10 minutes due to PyTorch installation