2025-11-13 03:25:21 +03:00
|
|
|
|
# YouTube Transcript RSS Feed Generator
|
|
|
|
|
|
|
|
|
|
|
|
YouTube video transkriptlerini otomatik olarak çıkarıp, tam metin içeren RSS feed'ine dönüştüren Docker tabanlı sistem.
|
|
|
|
|
|
|
|
|
|
|
|
## Özellikler
|
|
|
|
|
|
|
|
|
|
|
|
- ✅ **RSS-Bridge benzeri URL template** - Kanal adı/linki ile direkt feed
|
|
|
|
|
|
- ✅ **Web Server Modu** - Flask ile RESTful API
|
2025-11-13 03:40:05 +03:00
|
|
|
|
- ✅ **API Key Authentication** - Tüm endpoint'ler API key gerektirir
|
|
|
|
|
|
- ✅ **Güvenlik Önlemleri** - SQL injection, XSS, rate limiting koruması
|
2025-11-13 03:52:26 +03:00
|
|
|
|
- ✅ **Transcript Cache** - 3 günlük cache ile YouTube IP blocking önleme
|
2025-11-13 05:43:02 +03:00
|
|
|
|
- ✅ **FlareSolverr Desteği** - Bot korumasını aşmak için FlareSolverr entegrasyonu
|
|
|
|
|
|
- ✅ **Gerçek Tarayıcı Header'ları** - User-Agent rotasyonu ve tam tarayıcı header seti
|
|
|
|
|
|
- ✅ **Detaylı Loglama** - Timestamp'li, kategorize edilmiş log sistemi
|
2025-11-13 03:25:21 +03:00
|
|
|
|
- ✅ RSS-Bridge entegrasyonu (100+ video desteği)
|
|
|
|
|
|
- ✅ Async rate limiting (AIOLimiter)
|
|
|
|
|
|
- ✅ SpaCy ile Sentence Boundary Detection
|
|
|
|
|
|
- ✅ SQLite veritabanı (durum yönetimi)
|
|
|
|
|
|
- ✅ Full-text RSS feed (`<content:encoded>`)
|
|
|
|
|
|
- ✅ Channel handle → Channel ID otomatik dönüştürme
|
|
|
|
|
|
- ✅ Atom ve RSS format desteği
|
|
|
|
|
|
|
|
|
|
|
|
## Hızlı Başlangıç
|
|
|
|
|
|
|
|
|
|
|
|
### Docker ile Web Server Modu (Önerilen)
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Build
|
|
|
|
|
|
docker-compose build
|
|
|
|
|
|
|
|
|
|
|
|
# Web server'ı başlat (port 5000)
|
|
|
|
|
|
docker-compose up -d
|
|
|
|
|
|
|
|
|
|
|
|
# Logları izle
|
|
|
|
|
|
docker-compose logs -f
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
### API Key Yapılandırması
|
2025-11-13 03:25:21 +03:00
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
**ÖNEMLİ:** Tüm endpoint'ler API key gerektirir!
|
|
|
|
|
|
|
|
|
|
|
|
API key'leri `config/security.yaml` dosyasından yönetin:
|
2025-11-13 03:25:21 +03:00
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
```yaml
|
|
|
|
|
|
security:
|
|
|
|
|
|
require_api_key: true
|
|
|
|
|
|
api_keys:
|
|
|
|
|
|
demo_key_12345:
|
|
|
|
|
|
name: "Demo API Key"
|
|
|
|
|
|
rate_limit: 100
|
|
|
|
|
|
enabled: true
|
2025-11-13 03:25:21 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
### URL Template Kullanımı
|
2025-11-13 03:25:21 +03:00
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
RSS-Bridge benzeri URL template sistemi:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Channel ID ile (API key header'da)
|
|
|
|
|
|
curl -H "X-API-Key: demo_key_12345" \
|
|
|
|
|
|
"http://localhost:5000/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&format=Atom"
|
2025-11-13 03:25:21 +03:00
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
# Channel Handle ile (API key query parametresi)
|
|
|
|
|
|
curl "http://localhost:5000/?channel=@tavakfi&format=Atom&api_key=demo_key_12345"
|
2025-11-13 03:25:21 +03:00
|
|
|
|
|
2025-11-13 05:43:02 +03:00
|
|
|
|
# Channel URL ile (max_items: her istekte işlenecek transcript sayısı, default: 10, max: 100, 5'şer batch'ler)
|
2025-11-13 03:40:05 +03:00
|
|
|
|
curl -H "X-API-Key: demo_key_12345" \
|
2025-11-13 04:12:05 +03:00
|
|
|
|
"http://localhost:5000/?channel_url=https://www.youtube.com/@tavakfi&format=Atom&max_items=50"
|
2025-11-13 03:25:21 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
**Detaylı API dokümantasyonu için:** [API.md](API.md)
|
|
|
|
|
|
|
2025-11-13 03:25:21 +03:00
|
|
|
|
### Batch Mode (Manuel Çalıştırma)
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Tek seferlik çalıştırma
|
|
|
|
|
|
docker-compose run --rm yttranscriptrss python main.py
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Yerel Geliştirme
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Virtual environment oluştur
|
|
|
|
|
|
python -m venv venv
|
|
|
|
|
|
source venv/bin/activate # Linux/Mac
|
|
|
|
|
|
# veya
|
|
|
|
|
|
venv\Scripts\activate # Windows
|
|
|
|
|
|
|
|
|
|
|
|
# Bağımlılıkları kur
|
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
|
|
|
|
|
|
# SpaCy modelini indir
|
|
|
|
|
|
python -m spacy download en_core_web_sm
|
|
|
|
|
|
|
|
|
|
|
|
# Çalıştır
|
|
|
|
|
|
python main.py
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Yapılandırma
|
|
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
### Ana Yapılandırma
|
|
|
|
|
|
|
2025-11-13 03:25:21 +03:00
|
|
|
|
`config/config.yaml` dosyasını düzenleyin:
|
|
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
channel:
|
|
|
|
|
|
id: "UC9h8BDcXwkhZtnqoQJ7PggA" # veya handle: "@username"
|
|
|
|
|
|
name: "Channel Name"
|
|
|
|
|
|
language: "tr"
|
|
|
|
|
|
|
|
|
|
|
|
rss_bridge:
|
|
|
|
|
|
base_url: "https://rss-bridge.org/bridge01"
|
|
|
|
|
|
format: "Atom"
|
2025-11-13 04:12:05 +03:00
|
|
|
|
max_items: 100 # RSS-Bridge'den çekilecek video sayısı (web server'da max_items parametresi farklı)
|
2025-11-13 05:43:02 +03:00
|
|
|
|
|
|
|
|
|
|
# FlareSolverr ayarları (YouTube IP blocking önleme için)
|
|
|
|
|
|
flaresolverr:
|
|
|
|
|
|
url: "http://192.168.1.27:8191/v1" # FlareSolverr API URL'i (devre dışı için null)
|
2025-11-13 03:25:21 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
### Güvenlik Yapılandırması
|
|
|
|
|
|
|
|
|
|
|
|
`config/security.yaml` dosyasından API key'leri ve güvenlik ayarlarını yönetin:
|
|
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
security:
|
|
|
|
|
|
require_api_key: true
|
|
|
|
|
|
api_keys:
|
|
|
|
|
|
your_api_key_here:
|
|
|
|
|
|
name: "Your API Key"
|
|
|
|
|
|
rate_limit: 100
|
|
|
|
|
|
enabled: true
|
|
|
|
|
|
default_rate_limit: 60
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Detaylı güvenlik dokümantasyonu için:** [SECURITY.md](SECURITY.md)
|
|
|
|
|
|
|
2025-11-13 03:52:26 +03:00
|
|
|
|
### Transcript Cache
|
|
|
|
|
|
|
|
|
|
|
|
Sistem, işlenmiş transcript'leri **3 gün boyunca cache'de tutar**. Bu özellik:
|
|
|
|
|
|
|
|
|
|
|
|
- **YouTube IP blocking'i önler**: Aynı videoların transcript'ini tekrar çekmez
|
|
|
|
|
|
- **Performans artışı**: Cache'den hızlı yanıt
|
|
|
|
|
|
- **Rate limiting azaltır**: Gereksiz API isteklerini önler
|
|
|
|
|
|
- **Otomatik yenileme**: 3 gün sonra cache geçersiz olur, yeni transcript çekilir
|
|
|
|
|
|
|
|
|
|
|
|
Cache kontrolü otomatik yapılır ve kullanıcı müdahalesi gerektirmez.
|
|
|
|
|
|
|
2025-11-13 04:12:05 +03:00
|
|
|
|
### max_items Parametresi
|
|
|
|
|
|
|
|
|
|
|
|
Her API isteğinde kaç video transcript'inin işleneceğini kontrol eder:
|
|
|
|
|
|
|
|
|
|
|
|
- **Varsayılan**: 10 transcript
|
|
|
|
|
|
- **Maksimum**: 100 transcript
|
|
|
|
|
|
- **Kullanım**: `?max_items=50` query parametresi ile belirtilir
|
2025-11-13 05:43:02 +03:00
|
|
|
|
- **Batch İşleme**: 5'şer batch'ler halinde işlenir (YouTube IP blocking önleme için)
|
2025-11-13 04:12:05 +03:00
|
|
|
|
|
|
|
|
|
|
**Önemli Notlar:**
|
|
|
|
|
|
- `max_items` parametresi **her istekte işlenecek transcript sayısını** belirler
|
|
|
|
|
|
- RSS-Bridge'den daha fazla video çekilir (max_items × 2, minimum 50) çünkü bazı videolar transcript'siz olabilir
|
2025-11-13 05:43:02 +03:00
|
|
|
|
- **Batch İşleme**: YouTube IP blocking'i önlemek için 5'şer batch'ler halinde işlenir
|
|
|
|
|
|
- **Batch'ler Arası Bekleme**: 60-90 saniye random bekleme (human-like behavior)
|
2025-11-13 04:12:05 +03:00
|
|
|
|
- **Veritabanı Kaydı**: Her batch işlendikten sonra hemen veritabanına kaydedilir, böylece sonraki sorgularda görülebilir
|
|
|
|
|
|
- İlk isteklerde daha az transcript görebilirsiniz; sonraki isteklerde cache'den daha fazla transcript döner
|
|
|
|
|
|
|
|
|
|
|
|
**Örnek:**
|
|
|
|
|
|
```bash
|
2025-11-13 05:43:02 +03:00
|
|
|
|
# 50 transcript işle (5+5+5+5+5+5+5+5+5+5 batch'ler halinde)
|
2025-11-13 04:12:05 +03:00
|
|
|
|
curl -H "X-API-Key: demo_key_12345" \
|
|
|
|
|
|
"http://localhost:5000/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA&max_items=50&format=Atom"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-13 05:43:02 +03:00
|
|
|
|
### FlareSolverr Yapılandırması
|
|
|
|
|
|
|
|
|
|
|
|
FlareSolverr, YouTube'un bot korumasını aşmak için gerçek tarayıcı kullanır:
|
|
|
|
|
|
|
|
|
|
|
|
```yaml
|
|
|
|
|
|
# config/config.yaml
|
|
|
|
|
|
flaresolverr:
|
|
|
|
|
|
url: "http://192.168.1.27:8191/v1" # FlareSolverr API URL'i
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
veya environment variable:
|
|
|
|
|
|
```bash
|
|
|
|
|
|
export FLARESOLVERR_URL=http://192.168.1.27:8191/v1
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**FlareSolverr Avantajları:**
|
|
|
|
|
|
- Gerçek tarayıcı kullanımı (headless browser)
|
|
|
|
|
|
- Bot algılamasını aşma
|
|
|
|
|
|
- Cloudflare ve DDoS-GUARD korumasını bypass etme
|
|
|
|
|
|
- Otomatik fallback: FlareSolverr erişilemezse normal istek yapılır
|
|
|
|
|
|
|
|
|
|
|
|
### Gerçek Tarayıcı Header'ları
|
|
|
|
|
|
|
|
|
|
|
|
Sistem, gerçek tarayıcı gibi görünmek için:
|
|
|
|
|
|
- **User-Agent Rotasyonu**: 7 farklı tarayıcı User-Agent'ı (Chrome, Firefox, Safari, Edge)
|
|
|
|
|
|
- **Tam Header Seti**: Accept, Accept-Language, Sec-Fetch-*, Referer, vb.
|
|
|
|
|
|
- **Her İstekte Random**: Her istekte farklı User-Agent seçilir
|
|
|
|
|
|
|
|
|
|
|
|
### Detaylı Loglama
|
|
|
|
|
|
|
|
|
|
|
|
Sistem, tüm işlemleri kategorize edilmiş loglarla takip eder:
|
|
|
|
|
|
|
|
|
|
|
|
- **`[RATE_LIMIT]`**: Rate limiting ve bekleme süreleri
|
|
|
|
|
|
- **`[TRANSCRIPT]`**: Transcript çıkarım işlemleri
|
|
|
|
|
|
- **`[PROCESS]`**: Genel işlem akışı
|
|
|
|
|
|
- **`[BATCH]`**: Batch işleme bilgileri
|
|
|
|
|
|
- **`[VIDEO]`**: Video seviyesi işlemler
|
|
|
|
|
|
- **`[CACHE]`**: Cache kontrolleri
|
|
|
|
|
|
- **`[FLARESOLVERR]`**: FlareSolverr istekleri
|
|
|
|
|
|
- **`[HEADERS]`**: Header yönetimi
|
|
|
|
|
|
|
|
|
|
|
|
Log formatı: `YYYY-MM-DD HH:MM:SS | LEVEL | MODULE | MESSAGE`
|
|
|
|
|
|
|
2025-11-13 03:25:21 +03:00
|
|
|
|
## Proje Yapısı
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
yttranscriptrss/
|
|
|
|
|
|
├── src/
|
|
|
|
|
|
│ ├── database.py # SQLite yönetimi
|
|
|
|
|
|
│ ├── video_fetcher.py # RSS-Bridge entegrasyonu
|
|
|
|
|
|
│ ├── transcript_extractor.py # Transcript çıkarımı
|
|
|
|
|
|
│ ├── transcript_cleaner.py # NLP ve temizleme
|
|
|
|
|
|
│ └── rss_generator.py # RSS feed oluşturma
|
|
|
|
|
|
├── config/
|
|
|
|
|
|
│ └── config.yaml # Yapılandırma
|
|
|
|
|
|
├── data/
|
|
|
|
|
|
│ └── videos.db # SQLite veritabanı
|
|
|
|
|
|
├── output/
|
|
|
|
|
|
│ └── transcript_feed.xml # RSS feed çıktısı
|
|
|
|
|
|
├── Dockerfile
|
|
|
|
|
|
├── docker-compose.yml
|
|
|
|
|
|
└── main.py
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-11-13 03:40:05 +03:00
|
|
|
|
## Dokümantasyon
|
|
|
|
|
|
|
|
|
|
|
|
- **[API.md](API.md)** - Detaylı API dokümantasyonu, endpoint'ler, örnekler
|
|
|
|
|
|
- **[SECURITY.md](SECURITY.md)** - Güvenlik önlemleri, best practices
|
|
|
|
|
|
- **[development_plan.md](development_plan.md)** - Geliştirme planı ve roadmap
|
|
|
|
|
|
|
|
|
|
|
|
## Endpoints
|
|
|
|
|
|
|
|
|
|
|
|
- `GET /` - RSS/Atom feed oluştur (API key gerekli)
|
|
|
|
|
|
- `GET /health` - Health check (API key gerekmez)
|
|
|
|
|
|
- `GET /info` - API bilgileri (API key gerekli)
|
|
|
|
|
|
|
2025-11-13 03:25:21 +03:00
|
|
|
|
## Geliştirme Planı
|
|
|
|
|
|
|
|
|
|
|
|
Detaylı geliştirme planı için `development_plan.md` dosyasına bakın.
|
|
|
|
|
|
|
|
|
|
|
|
## Lisans
|
|
|
|
|
|
|
|
|
|
|
|
MIT
|
|
|
|
|
|
|