173 lines
4.5 KiB
Markdown
173 lines
4.5 KiB
Markdown
# Netflix Scraper API
|
||
|
||
Netflix içerik sayfalarından film/dizi bilgilerini çeken yüksek performanslı bir backend API servisi.
|
||
|
||
## Özellikler
|
||
|
||
- **Scraping**: Netflix URL'lerinden otomatik içerik bilgisi çekme
|
||
- **Cache**: Redis ile 7 günlük önbellek (yapılandırılabilir)
|
||
- **Kalıcılık**: PostgreSQL ile verilerin kalıcı saklanması
|
||
- **Real-time**: Socket.IO ile canlı ilerleme bildirimleri
|
||
- **Güvenlik**: API Key authentication ve rate limiting
|
||
- **Docker**: Tek komut ile ayağa kalkma
|
||
|
||
## Hızlı Başlangıç
|
||
|
||
```bash
|
||
# .env dosyasını oluştur
|
||
cp .env.example .env
|
||
|
||
# API key'leri düzenle
|
||
nano .env
|
||
|
||
# Başlat (tek komut!)
|
||
docker compose -f docker-compose.dev.yml up --build
|
||
```
|
||
|
||
API şu adreste çalışacak: `http://localhost:3000`
|
||
Frontend şu adreste çalışacak: `http://localhost:5173`
|
||
|
||
## API Kullanımı
|
||
|
||
### İstek Örneği
|
||
|
||
```bash
|
||
curl -X POST http://localhost:3000/api/getinfo \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-API-Key: web-dev-key-change-me" \
|
||
-d '{"url": "https://www.netflix.com/tr/title/81616256"}'
|
||
```
|
||
|
||
### Yanıt Örneği
|
||
|
||
```json
|
||
{
|
||
"success": true,
|
||
"data": {
|
||
"title": "Hayata Röveşata Çeken Adam",
|
||
"year": 2022,
|
||
"plot": "Dünyaya karşı duyduğu öfke...",
|
||
"genres": ["18+", "Komedi"],
|
||
"cast": ["Tom Hanks", "Mariana Treviño", "Rachel Keller"],
|
||
"backdrop": "https://occ-0-7335-..."
|
||
}
|
||
}
|
||
```
|
||
|
||
## Endpoints
|
||
|
||
| Method | Endpoint | Açıklama |
|
||
|--------|----------|----------|
|
||
| `GET` | `/health` | Sağlık kontrolü |
|
||
| `GET` | `/ready` | Bağımlılık kontrolü |
|
||
| `POST` | `/api/getinfo` | İçerik bilgisi getir |
|
||
| `POST` | `/api/getinfo/async` | Asenkron job oluştur |
|
||
| `GET` | `/api/jobs/:jobId` | Job durumu sorgula |
|
||
|
||
## Socket.IO Events
|
||
|
||
| Event | Yön | Açıklama |
|
||
|-------|-----|----------|
|
||
| `job:subscribe` | Client → Server | Job'a abone ol |
|
||
| `job:progress` | Server → Client | İlerleme güncellemesi |
|
||
| `job:completed` | Server → Client | İşlem tamamlandı |
|
||
| `job:error` | Server → Client | Hata oluştu |
|
||
|
||
## Environment Değişkenleri
|
||
|
||
| Değişken | Açıklama | Varsayılan |
|
||
|----------|----------|------------|
|
||
| `PORT` | Sunucu portu | `3000` |
|
||
| `NODE_ENV` | Ortam | `development` |
|
||
| `POSTGRES_*` | PostgreSQL ayarları | - |
|
||
| `REDIS_*` | Redis ayarları | - |
|
||
| `REDIS_TTL_SECONDS` | Cache süresi | `604800` (7 gün) |
|
||
| `RATE_LIMIT_*` | Rate limit ayarları | - |
|
||
| `API_KEY_*` | API anahtarları | - |
|
||
|
||
## Migration
|
||
|
||
Migration'lar otomatik olarak container başlatılırken çalışır.
|
||
|
||
```bash
|
||
# Manuel migration
|
||
docker compose exec app npx prisma migrate deploy
|
||
```
|
||
|
||
## Teknoloji Yığını
|
||
|
||
| Katman | Teknoloji |
|
||
|--------|-----------|
|
||
| Runtime | Node.js 20+ |
|
||
| Framework | Express.js |
|
||
| Database | PostgreSQL 16 |
|
||
| Cache | Redis 7 |
|
||
| Real-time | Socket.IO 4 |
|
||
| Scraper | Cheerio |
|
||
| ORM | Prisma |
|
||
|
||
## Proje Yapısı
|
||
|
||
```
|
||
.
|
||
├── src/
|
||
│ ├── config/ # Yapılandırma (env, database, redis, socket)
|
||
│ ├── middleware/ # Express middleware (auth, rate-limit, validation)
|
||
│ ├── routes/ # API rotaları
|
||
│ ├── services/ # İş mantığı (scraper, cache, content, job)
|
||
│ ├── types/ # TypeScript tipleri
|
||
│ └── utils/ # Yardımcı fonksiyonlar
|
||
├── prisma/
|
||
│ ├── schema.prisma # Veritabanı şeması
|
||
│ └── seed.ts # Başlangıç verileri
|
||
├── doc/
|
||
│ ├── overview.md # Proje özeti
|
||
│ ├── api.md # API dokümantasyonu
|
||
│ ├── ops.md # Operasyon notları
|
||
│ └── socket-events.md # Socket.IO events
|
||
├── docker-compose.dev.yml
|
||
├── docker-compose.yml
|
||
├── Dockerfile
|
||
└── package.json
|
||
```
|
||
|
||
## Dokümantasyon
|
||
|
||
- **Proje Özeti**: [`doc/overview.md`](doc/overview.md)
|
||
- **API Dokümantasyonu**: [`doc/api.md`](doc/api.md)
|
||
- **Operasyon**: [`doc/ops.md`](doc/ops.md)
|
||
- **Socket Events**: [`doc/socket-events.md`](doc/socket-events.md)
|
||
|
||
## Geliştirme
|
||
|
||
### Local Development
|
||
|
||
```bash
|
||
# Bağımlılıkları yükle
|
||
npm install
|
||
|
||
# Prisma client oluştur
|
||
npx prisma generate
|
||
|
||
# Development modda çalıştır
|
||
npm run dev
|
||
```
|
||
|
||
### Production Build
|
||
|
||
```bash
|
||
npm run build
|
||
npm start
|
||
```
|
||
|
||
## Güvenlik
|
||
|
||
- **API Key Authentication**: Tüm istekler API key gerektirir
|
||
- **Rate Limiting**: Dakikada max 30 istek (yapılandırılabilir)
|
||
- **Non-root Container**: Production container'ları root olmayan kullanıcı ile çalışır
|
||
- **Input Validation**: Tüm girdiler Zod ile doğrulanır
|
||
|
||
## Lisans
|
||
|
||
MIT
|