first commit

This commit is contained in:
2026-02-28 02:44:41 +03:00
commit 97fb289fe7
70 changed files with 11928 additions and 0 deletions

256
doc/socket-events.md Normal file
View File

@@ -0,0 +1,256 @@
# Netflix Scraper API - Socket.IO Events
## Bağlantı
### URL
```
ws://localhost:3000
```
### Transport
- WebSocket
- Polling (fallback)
---
## Client → Server Events
### `job:subscribe`
Bir job'ın güncellemelerine abone ol.
**Payload:**
```typescript
jobId: string
```
**Örnek:**
```javascript
socket.emit('job:subscribe', '550e8400-e29b-41d4-a716-446655440000');
```
---
### `job:unsubscribe`
Job aboneliğini iptal et.
**Payload:**
```typescript
jobId: string
```
**Örnek:**
```javascript
socket.emit('job:unsubscribe', '550e8400-e29b-41d4-a716-446655440000');
```
---
## Server → Client Events
### `job:progress`
Job ilerleme durumu güncellendiğinde gönderilir.
**Payload:**
```typescript
{
jobId: string;
progress: number; // 0-100 arası
status: string; // "pending" | "processing" | "completed" | "failed"
step: string; // Mevcut adım açıklaması
}
```
**Örnek:**
```json
{
"jobId": "550e8400-e29b-41d4-a716-446655440000",
"progress": 50,
"status": "processing",
"step": "Scraping Netflix"
}
```
**Adımlar:**
| Step | Progress | Açıklama |
|------|----------|----------|
| `created` | 0 | Job oluşturuldu |
| `checking_cache` | 10 | Cache kontrol ediliyor |
| `checking_database` | 30 | Database kontrol ediliyor |
| `scraping_netflix` | 50 | Netflix'ten veri çekiliyor |
| `saving_to_database` | 80 | Veritabanına kaydediliyor |
| `completed` | 100 | İşlem tamamlandı |
---
### `job:completed`
Job başarıyla tamamlandığında gönderilir.
**Payload:**
```typescript
{
jobId: string;
data: GetInfoResponse;
source: "cache" | "database" | "netflix";
}
```
**Örnek:**
```json
{
"jobId": "550e8400-e29b-41d4-a716-446655440000",
"data": {
"title": "Hayata Röveşata Çeken Adam",
"year": 2022,
"plot": "...",
"genres": ["18+", "Komedi"],
"cast": ["Tom Hanks", "Mariana Treviño", "Rachel Keller"],
"backdrop": "https://..."
},
"source": "netflix"
}
```
---
### `job:error`
Job sırasında hata oluştuğunda gönderilir.
**Payload:**
```typescript
{
jobId: string;
error: {
code: string;
message: string;
}
}
```
**Örnek:**
```json
{
"jobId": "550e8400-e29b-41d4-a716-446655440000",
"error": {
"code": "SCRAPE_ERROR",
"message": "Failed to fetch Netflix page: 403"
}
}
```
---
## Kullanım Örneği
### JavaScript (Browser)
```javascript
import { io } from 'socket.io-client';
// Bağlan
const socket = io('http://localhost:3000');
// Bağlantı başarılı
socket.on('connect', () => {
console.log('Connected:', socket.id);
});
// Job oluştur (API üzerinden)
const response = await fetch('http://localhost:3000/api/getinfo/async', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'your-api-key'
},
body: JSON.stringify({
url: 'https://www.netflix.com/tr/title/81616256'
})
});
const { data: { jobId } } = await response.json();
// Job'a abone ol
socket.emit('job:subscribe', jobId);
// İlerleme dinle
socket.on('job:progress', (data) => {
console.log(`Progress: ${data.progress}% - ${data.step}`);
});
// Tamamlanma dinle
socket.on('job:completed', (data) => {
console.log('Completed:', data.data);
socket.emit('job:unsubscribe', jobId);
});
// Hata dinle
socket.on('job:error', (data) => {
console.error('Error:', data.error);
});
```
### React Hook
```typescript
import { useEffect, useState } from 'react';
import { io, Socket } from 'socket.io-client';
interface JobProgress {
jobId: string;
progress: number;
status: string;
step: string;
}
export function useJobProgress(jobId: string | null) {
const [progress, setProgress] = useState<JobProgress | null>(null);
const [data, setData] = useState<any>(null);
const [error, setError] = useState<any>(null);
useEffect(() => {
if (!jobId) return;
const socket = io('http://localhost:3000');
socket.emit('job:subscribe', jobId);
socket.on('job:progress', setProgress);
socket.on('job:completed', (result) => {
setData(result.data);
socket.emit('job:unsubscribe', jobId);
});
socket.on('job:error', (err) => {
setError(err.error);
socket.emit('job:unsubscribe', jobId);
});
return () => {
socket.emit('job:unsubscribe', jobId);
socket.disconnect();
};
}, [jobId]);
return { progress, data, error };
}
```
---
## CORS Yapılandırması
Production'da CORS ayarlarını yapılandırın:
```typescript
// src/config/socket.ts
io = new Server(httpServer, {
cors: {
origin: ['https://yourdomain.com', 'https://admin.yourdomain.com'],
methods: ['GET', 'POST'],
credentials: true,
},
});
```