2025-11-13 03:25:21 +03:00
# YouTube Transcript RSS Feed - Geliştirme Planı
## Proje Özeti
YouTube video transkriptlerini otomatik olarak çı karı p, tam metin içeren RSS feed'ine dönüştüren otomatik bir pipeline geliştirilmesi. Sistem, Python tabanlı transcript çı karı mı ve RSS feed oluşturma ile RSS-Bridge entegrasyonu seçeneklerini içerir.
---
## Faz 1: Proje Altyapı sı ve Ortam Kurulumu
### 1.1. Teknoloji Stack Seçimi
**Ana Yaklaşı m: Python Tabanlı (Önerilen)**
- **Transcript Çı karı mı **: `youtube-transcript-api`
- **RSS Oluşturma**: `python-feedgen`
- **Video Listesi**: RSS-Bridge (RSS feed parser)
- **Dil**: Python 3.8+
### 1.2. Geliştirme Ortamı Kurulumu
**Görevler:**
- [ ] Python 3.8+ kurulumu doğrulama
- [ ] Virtual environment oluşturma (`python -m venv venv` )
- [ ] Gerekli paketlerin kurulumu:
```bash
pip install youtube-transcript-api
pip install feedgen
pip install python-dateutil
pip install feedparser # RSS-Bridge feed'lerini parse etmek için
pip install requests # HTTP istekleri için
pip install aiolimiter # Async rate limiting için
pip install httpx # Async HTTP client
pip install spacy # NLP ve Sentence Boundary Detection için
```
**Not** : SQLite Python'da built-in (`sqlite3` modülü), ekstra kurulum gerekmez.
**SpaCy Model** : `python -m spacy download en_core_web_sm` (veya `tr_core_news_sm` Türkçe için)
- [ ] Proje dizin yapı sı oluşturma:
```
yttranscriptrss/
├── src/
│ ├── transcript_extractor.py
│ ├── transcript_cleaner.py
│ ├── rss_generator.py
│ ├── video_fetcher.py
│ └── database.py
├── config/
│ └── config.yaml
├── data/
│ └── videos.db
├── output/
│ └── transcript_feed.xml
├── tests/
├── requirements.txt
└── main.py
```
**Süre Tahmini**: 1-2 gün
---
## Faz 2: Transcript Çı karı mı ve Temizleme Modülü
### 2.1. Transcript Çı karı mı (`transcript_extractor.py`)
**Görevler:**
- [ ] `youtube-transcript-api` ile video ID'den transcript çı karma
- [ ] Çoklu dil desteği (fallback mekanizması )
- Örnek: `languages=['tr', 'en']` - önce Türkçe, yoksa İngilizce
- [ ] Hata yönetimi:
- Transcript bulunamama durumları
- API rate limiting
- Geçersiz video ID'ler
- [ ] Raw transcript formatı nı anlama:
```python
# Format: [{"text": "...", "start": 0.0, "duration": 2.5}, ...]
```
**Kritik Gereksinimler:**
- Headless browser kullanmama (API tabanlı yaklaşı m)
- Otomatik ve manuel transkriptleri destekleme
- **Async Rate Limiting**: AIOLimiter ile eş zamanlı istek yönetimi
- API limiti: 10 saniyede 5 istek
- Async batching ile paralel işleme
- **Retry-After Header**: 429 hataları nda `Retry-After` header'ı nı kullanma
- Dinamik bekleme süresi (statik delay yerine)
- Exponential backoff mekanizması
- Timeout ve retry mekanizmaları
**Süre Tahmini**: 3-4 gün
### 2.2. Transcript Temizleme ve Dönüştürme (`transcript_cleaner.py`)
**Görevler:**
- [ ] **Veri Temizleme Pipeline** :
- **Artifact Removal**:
- Zaman tabanlı işaretçileri kaldı rma
- Konuşma dı şı etiketler: `[Music]` , `[Applause]` , vb.
- Aşı rı boşlukları temizleme
- **Normalizasyon**:
- Unicode karakter normalleştirme
- Metin standardizasyonu
- [ ] **Sentence Boundary Detection (SBD) - SpaCy Entegrasyonu** :
- **SpaCy Model Kullanı mı **: `en_core_web_sm` veya `tr_core_news_sm`
- Noktalama işaretlerinin ötesine geçme:
- Doğal duraklama noktaları nı tespit
- Anlamsal sı nı rları belirleme
- Konuşmacı değişikliklerini algı lama
- Fragment'ları birleştirme ve cümle sı nı rları nı tespit etme
- Paragraf yapı sı oluşturma (cümle sayı sı veya anlamsal değişikliklere göre)
- **Özelleştirme**: Özel içerik için kural tabanlı SBD uzantı ları
- [ ] **HTML Wrapping** :
- Temizlenmiş metni `<p>...</p>` tag'leri ile sarmalama
- Paragraf yapı sı nı koruma
- Minimal HTML (sadece gerekli tag'ler)
- [ ] **XML Entity Escaping** (Kritik!):
- **Zorunlu karakter dönüşümleri**:
- `&` → `&` (özellikle URL'lerde kritik!)
- `<` → `<`
- `>` → `>`
- `"` → `"`
- `'` → `'`
- **CDATA kullanı mı **: İsteğe bağlı ama entity escaping hala gerekli
- URL'lerdeki ampersand'ları n kaçı şı özellikle önemli
**Algoritma Özeti:**
1. Artifact'ları kaldı r ve normalize et
2. SpaCy ile fragment'ları birleştir ve cümle sı nı rları nı tespit et
3. Paragraflara böl (anlamsal veya cümle sayı sı na göre)
4. HTML tag'leri ekle (`<p>...</p>` )
5. XML entity escaping uygula (özellikle `&` karakterleri)
**Süre Tahmini**: 4-5 gün
---
## Faz 3: Video Metadata Çı karı mı ve Yönetimi
### 3.1. Video Metadata Fetcher (`video_fetcher.py`) - RSS-Bridge Entegrasyonu
**Görevler:**
- [ ] **RSS-Bridge Feed Parser** :
- **Public RSS-Bridge instance kullanı mı (Önerilen)**:
- Base URL: `https://rss-bridge.org/bridge01/`
- Ücretsiz ve hazı r kullanı labilir
- Rate limiting riski var ama başlangı ç için yeterli
- RSS-Bridge YouTube Bridge endpoint'ini kullanma
- **Doğru URL formatı **:
- Public (Channel ID): `https://rss-bridge.org/bridge01/?action=display&bridge=YoutubeBridge&context=By+channel+id&c=CHANNEL_ID&format=Atom`
- Public (Channel Handle): `https://rss-bridge.org/bridge01/?action=display&bridge=YoutubeBridge&context=By+username&u=USERNAME&format=Atom`
- Self-hosted (opsiyonel): `http://localhost:3000/?action=display&bridge=YoutubeBridge&context=By+channel+id&c=CHANNEL_ID&format=Atom`
- **Önemli parametreler**:
- `bridge=YoutubeBridge` (Youtube değil!)
- `context=By+channel+id` veya `context=By+username`
- `c=CHANNEL_ID` (channel ID için) veya `u=USERNAME` (handle için)
- `format=Atom` veya `format=Rss` (feed için, Html değil)
- `duration_min` ve `duration_max` (opsiyonel filtreleme)
- [ ] **Feed Parsing** (`feedparser` kullanarak):
- RSS/Atom feed'ini parse etme
- Video entry'lerini çı karma
- Metadata çı karı mı :
- Video ID (YouTube URL'den parse)
- Video başlı ğı (`entry.title` )
- Yayı n tarihi (`entry.published` - timezone-aware)
- Video URL (`entry.link` )
- Video açı klaması (`entry.summary` - opsiyonel)
- Thumbnail URL (opsiyonel)
- [ ] **RSS-Bridge Avantajları ** :
- Native feed'den daha fazla video (10-15 yerine 100+)
- Channel Handle (@username ) desteği
- Filtreleme seçenekleri (duration, vb.)
- [ ] **Hata Yönetimi** :
- RSS-Bridge instance erişilemezse fallback (native RSS)
- Rate limiting handling
- Feed format validation
- [ ] **Channel ID Extraction (Handle'dan)** :
- Channel handle (@username ) verildiğinde Channel ID'yi bulma
- Web scraping ile HTML source'dan Channel ID çı karma
- Regex pattern: `"externalId":"(UC[a-zA-Z0-9_-]{22})"` veya `"channelId":"(UC[a-zA-Z0-9_-]{22})"`
- Channel ID formatı : `UC` ile başlar, 22 karakter
- Fallback mekanizması : İlk pattern bulunamazsa alternatif pattern dene
- Hata yönetimi: Request exception handling
- [ ] **Video ID Extraction** :
- YouTube URL'den video ID çı karma
- Regex pattern: `youtube.com/watch?v=([a-zA-Z0-9_-]+)`
- Short URL desteği: `youtu.be/([a-zA-Z0-9_-]+)`
- [ ] `yt-dlp` entegrasyonu (opsiyonel, gelişmiş metadata için)
**RSS-Bridge Kullanı m Örneği:**
```python
import feedparser
from urllib.parse import urlencode
# Public RSS-Bridge base URL
RSS_BRIDGE_BASE = "https://rss-bridge.org/bridge01"
# Channel ID ile feed URL'i oluştur
params = {
'action': 'display',
'bridge': 'YoutubeBridge',
'context': 'By channel id',
'c': 'UC9h8BDcXwkhZtnqoQJ7PggA', # Channel ID
'format': 'Atom' # veya 'Rss'
}
rss_bridge_url = f"{RSS_BRIDGE_BASE}/?{urlencode(params)}"
# Feed'i parse et
feed = feedparser.parse(rss_bridge_url)
# Video entry'lerini işle
for entry in feed.entries:
video_id = extract_video_id(entry.link)
video_title = entry.title
published_date = entry.published_parsed # timezone-aware
video_url = entry.link
```
**Gerçek Örnek URL:**
```
https://rss-bridge.org/bridge01/?action=display& bridge=YoutubeBridge& context=By+channel+id& c=UC9h8BDcXwkhZtnqoQJ7PggA& format=Atom
```
**Channel ID Bulma Fonksiyonu (Handle'dan):**
```python
import requests
import re
def get_channel_id_from_handle(handle_url):
"""
Channel handle URL'inden Channel ID'yi web scraping ile bulur.
Örnek: https://www.youtube.com/@tavakfi -> UC...
"""
try:
# HTML içeriğini çek
response = requests.get(handle_url)
response.raise_for_status()
html_content = response.text
# İlk pattern: "externalId":"UC..."
match = re.search(r'"externalId":"(UC[a-zA-Z0-9_-]{22})"', html_content)
if match:
return match.group(1)
# Alternatif pattern: "channelId":"UC..."
match_alt = re.search(r'"channelId":"(UC[a-zA-Z0-9_-]{22})"', html_content)
if match_alt:
return match_alt.group(1)
return None # Channel ID bulunamadı
except requests.exceptions.RequestException as e:
raise Exception(f"Error fetching channel page: {e}")
# Kullanı m örneği
handle_url = "https://www.youtube.com/@tavakfi "
channel_id = get_channel_id_from_handle(handle_url)
# Artı k channel_id ile RSS-Bridge feed'ini çekebiliriz
```
**Süre Tahmini**: 3 gün
### 3.2. İşlenmiş Video Takibi (`database.py` - SQLite)
**Görevler:**
- [ ] SQLite veritabanı modülü oluşturma (`database.py` )
- [ ] Veritabanı şeması tasarı mı :
```sql
-- Channels tablosu (kanal takibi için)
CREATE TABLE IF NOT EXISTS channels (
channel_id TEXT PRIMARY KEY, -- UC... formatı nda
channel_name TEXT,
channel_url TEXT,
last_checked_utc TEXT, -- ISO 8601 UTC format
created_at_utc TEXT DEFAULT (datetime('now'))
);
CREATE INDEX IF NOT EXISTS idx_channels_last_checked ON channels(last_checked_utc);
-- Videos tablosu (detaylı şema)
CREATE TABLE IF NOT EXISTS videos (
video_id TEXT PRIMARY KEY, -- 11 karakterli YouTube video ID
channel_id TEXT, -- UC... formatı nda (FK)
video_title TEXT,
video_url TEXT,
published_at_utc TEXT, -- ISO 8601 UTC format (YYYY-MM-DDTHH:MM:SSZ)
processed_at_utc TEXT, -- ISO 8601 UTC format
transcript_status INTEGER DEFAULT 0, -- 0: Beklemede, 1: Çı karı ldı , 2: Başarı sı z
transcript_language TEXT,
transcript_raw TEXT, -- Ham, bölümlenmemiş transcript
transcript_clean TEXT, -- SBD ile işlenmiş, RSS için hazı r HTML
last_updated_utc TEXT DEFAULT (datetime('now'))
);
-- Kritik index'ler (performans için)
CREATE INDEX IF NOT EXISTS idx_videos_channel_id ON videos(channel_id);
CREATE INDEX IF NOT EXISTS idx_videos_published_at_utc ON videos(published_at_utc);
CREATE INDEX IF NOT EXISTS idx_videos_transcript_status ON videos(transcript_status);
CREATE INDEX IF NOT EXISTS idx_videos_processed_at_utc ON videos(processed_at_utc);
```
**Önemli Notlar** :
- **Zaman Formatı **: UTC ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ` ) - SQLite'ı n timezone desteği yok
- **transcript_status**: INTEGER (0, 1, 2) - String değil, performans için
- **Index Optimizasyonu**: `EXPLAIN QUERY PLAN` ile sorgu performansı nı doğrula
- **DATE() fonksiyonu kullanma**: Index kullanı mı nı engeller, direkt timestamp karşı laştı rması yap
- [ ] Database helper fonksiyonları :
- `init_database()` - Veritabanı ve tablo oluşturma
- `is_video_processed(video_id)` - Duplicate kontrolü
- `get_pending_videos()` - `transcript_status = 0` olan videoları getir
- `add_video(video_data)` - Yeni video kaydı (status=0 olarak)
- `update_video_transcript(video_id, raw, clean, status, language)` - Transcript güncelleme
- `get_processed_videos(limit=None, channel_id=None)` - İşlenmiş videoları getir
- `mark_video_failed(video_id, reason)` - Kalı cı hata işaretleme (status=2)
2025-11-13 03:52:26 +03:00
- `is_transcript_cached(video_id, cache_days=3)` - Transcript cache kontrolü (3 günlük)
- `get_cached_transcript(video_id)` - Cache'den transcript getirme
2025-11-13 03:25:21 +03:00
- **Query Performance**: `EXPLAIN QUERY PLAN` ile index kullanı mı nı doğrula
2025-11-13 03:52:26 +03:00
- [ ] **Transcript Cache Mekanizması ** :
- **3 Günlük Cache**: İşlenmiş transcript'ler 3 gün boyunca cache'de tutulur
- **Cache Kontrolü**: Transcript çı karı mı ndan önce cache kontrolü yapı lı r
- **Avantajlar**:
- YouTube IP blocking riskini azaltı r
- Performans artı şı (tekrar isteklerde hı zlı yanı t)
- API rate limiting'i azaltı r
- Aynı videoları n transcript'ini tekrar çekmez
- **Cache Süresi**: `processed_at_utc` tarihine göre 3 gün kontrolü
- **Otomatik Yenileme**: 3 gün sonra cache geçersiz olur, yeni transcript çekilir
2025-11-13 03:25:21 +03:00
- [ ] Yeni video tespiti algoritması :
2025-11-13 04:12:05 +03:00
1. RSS-Bridge feed'den son videoları çek (max_items × 2, minimum 50 video)
2025-11-13 03:25:21 +03:00
2. SQLite veritabanı nda `video_id` ile sorgula
3. Sadece yeni videoları (veritabanı nda olmayan) işle
2025-11-13 03:52:26 +03:00
4. **Cache Kontrolü** : İşlenmiş videolar için 3 günlük cache kontrolü yap
- Eğer 3 gün içinde işlenmişse, transcript çı karma (cache'den kullan)
- 3 günden eskiyse, yeni transcript çek
2025-11-13 04:12:05 +03:00
5. **max_items Parametresi** : Her API isteğinde işlenecek transcript sayı sı
- **Varsayı lan**: 10 transcript
- **Maksimum**: 100 transcript
- **Kullanı m**: `?max_items=50` query parametresi ile belirtilir
- **Batch İşleme**: 20'şer batch'ler halinde işlenir (YouTube IP blocking önleme için)
- **Veritabanı Kaydı **: Her batch işlendikten sonra hemen veritabanı na kaydedilir
- **RSS-Bridge Limit**: max_items × 2 kadar video çekilir (bazı videolar transcript'siz olabilir)
2025-11-13 03:25:21 +03:00
- [ ] Transaction yönetimi (ACID compliance)
- [ ] Connection pooling ve error handling
**Avantajlar:**
- Daha hı zlı sorgulama (index'li)
- Transaction desteği
- İlişkisel veri yapı sı
- Daha iyi veri bütünlüğü
- İstatistik sorguları kolaylaşı r
**Süre Tahmini**: 2 gün
---
## Faz 4: RSS Feed Oluşturma
### 4.1. RSS Generator (`rss_generator.py`)
**Görevler:**
- [ ] `python-feedgen` ile FeedGenerator oluşturma
- [ ] **Content Namespace Extension** ekleme:
```xml
< rss version = "2.0" xmlns:content = "http://purl.org/rss/1.0/modules/content/" >
```
- [ ] Channel metadata ayarlama:
- `fg.id()` - Channel ID
- `fg.title()` - Kanal başlı ğı
- `fg.link()` - Kanal URL'i
- `fg.language('tr')` - Dil
- `fg.lastBuildDate()` - Son güncelleme tarihi
- [ ] Item oluşturma:
- `fe.id(video_id)` - GUID (YouTube Video ID)
- `fe.title(video_title)` - Video başlı ğı
- `fe.link(href=video_url)` - Video linki
- `fe.published(datetime_with_timezone)` - Yayı n tarihi (timezone-aware)
- `fe.description(summary)` - Kı sa özet
- `fe.content(content=cleaned_transcript_html)` - Tam transcript (`<content:encoded>` )
**Kritik Gereksinimler:**
- Timezone-aware tarih formatı (RFC 822 veya ISO 8601)
- Video ID'nin GUID olarak kullanı lması (immutable)
- Full-text için `<content:encoded>` tag'i
**Süre Tahmini**: 2-3 gün
### 4.2. RSS Output ve Serialization
**Görevler:**
- [ ] XML dosyası oluşturma:
```python
fg.rss_file('transcript_feed.xml', pretty=True, extensions=True)
```
- [ ] Pretty printing (okunabilirlik için)
- [ ] Extensions desteği (Content Namespace dahil)
**Süre Tahmini**: 1 gün
---
## Faz 5: Ana Pipeline ve Otomasyon
### 5.1. Main Pipeline (`main.py`)
**Görevler:**
- [ ] Tüm modüllerin entegrasyonu
- [ ] İş akı şı :
1. SQLite veritabanı nı başlat (`init_database()` )
2. Configuration'dan channel bilgisini oku:
- Eğer handle (@username ) verildiyse, `get_channel_id_from_handle()` ile Channel ID'ye çevir
- Channel ID zaten varsa direkt kullan
3. RSS-Bridge feed'den yeni videoları tespit et (`video_fetcher.py` )
4. SQLite veritabanı nda `video_id` ile duplicate kontrolü yap
5. Yeni videolar için:
a. Transcript çı kar
b. Transcript'i temizle
c. RSS feed'e ekle
d. SQLite'a kaydet (video metadata + işlenme durumu)
6. RSS feed'i güncelle (veritabanı ndan tüm işlenmiş videoları çek)
7. XML dosyası nı kaydet
- [ ] Hata yönetimi ve logging
- [ ] Configuration dosyası yükleme
- [ ] Database transaction yönetimi (rollback on error)
**Süre Tahmini**: 2-3 gün
### 5.2. Configuration Management (`config.yaml`)
**Görevler:**
- [ ] Yapı landı rma dosyası oluşturma:
```yaml
channel:
# Channel ID veya Handle (otomatik dönüştürülür)
id: "UC9h8BDcXwkhZtnqoQJ7PggA" # Channel ID (UC ile başlar)
# veya handle kullanı labilir:
# handle: "@tavakfi " # Handle kullanı lı rsa otomatik olarak Channel ID'ye çevrilir
# veya full URL:
# handle_url: "https://www.youtube.com/@tavakfi "
name: "Channel Name"
url: "https://youtube.com/channel/..."
language: "tr"
rss_bridge:
# Public RSS-Bridge instance (varsayı lan - önerilen)
base_url: "https://rss-bridge.org/bridge01"
# Self-hosted instance (opsiyonel - rate limiting sorunları için)
# base_url: "http://localhost:3000"
bridge_name: "YoutubeBridge" # Önemli: "YoutubeBridge" olmalı
context: "By channel id" # veya "By username"
format: "Atom" # veya "Rss" (feed için)
max_items: 100 # RSS-Bridge'den çekilecek maksimum video sayı sı
use_fallback: true # RSS-Bridge erişilemezse native RSS kullan
# Opsiyonel filtreleme
duration_min: null # dakika cinsinden minimum süre
duration_max: null # dakika cinsinden maksimum süre
transcript:
languages: ["tr", "en"]
enable_sbd: true
paragraph_length: 3
rss:
title: "Channel Transcript Feed"
description: "Full-text transcript RSS feed"
output_file: "transcript_feed.xml"
automation:
check_interval_hours: 12
max_items: 100
```
**Süre Tahmini**: 1 gün
---
## Faz 6: Test ve Validasyon
### 6.1. Unit Testler
**Görevler:**
- [ ] Transcript extractor testleri
- [ ] Transcript cleaner testleri (SBD, XML escaping)
- [ ] RSS generator testleri
- [ ] Video fetcher testleri:
- RSS-Bridge feed parsing
- Channel ID extraction (handle'dan):
- Handle URL'den Channel ID çı karma
- Regex pattern matching testleri
- Fallback pattern testleri
- Hata durumları (geçersiz handle, network error)
- Video ID extraction (URL'den)
- Fallback mekanizması (RSS-Bridge erişilemezse)
- Feed format validation (Atom/RSS)
- [ ] Database modülü testleri:
- Veritabanı oluşturma
- Video ekleme/sorgulama
- Duplicate kontrolü
- Transaction rollback testleri
- Test veritabanı kullanı mı (in-memory SQLite)
**Süre Tahmini**: 2-3 gün
### 6.2. RSS Feed Validasyonu
**Görevler:**
- [ ] W3C Feed Validation Service ile doğrulama
- URL: https://validator.w3.org/feed/
- [ ] Validasyon checklist:
- [ ] XML entity escaping doğru mu?
- [ ] Zorunlu RSS 2.0 tag'leri mevcut mu? (`<title>` , `<link>` , `<description>` )
- [ ] Content Namespace doğru tanı mlanmı ş mı ?
- [ ] Timezone-aware tarih formatı doğru mu?
- [ ] GUID'ler unique ve immutable mi?
- [ ] Farklı RSS reader'larda test (Feedly, Tiny Tiny RSS, vb.)
**Süre Tahmini**: 1-2 gün
---
## Faz 7: Deployment ve Hosting
### 7.1. Static Hosting Seçimi
**Seçenekler:**
1. **GitHub Pages** (Önerilen)
- Ücretsiz
- CI/CD entegrasyonu
- Version control
2. **Static.app / StaticSave**
- Ücretsiz tier mevcut
- Dosya boyutu limitleri var
**Görevler:**
- [ ] GitHub repository oluşturma
- [ ] GitHub Actions workflow oluşturma (otomatik çalı ştı rma için)
- [ ] MIME type ayarları (`application/rss+xml` )
- [ ] Public URL oluşturma
**Süre Tahmini**: 1-2 gün
### 7.2. Otomasyon ve Scheduling
**Seçenekler:**
1. **GitHub Actions** (Önerilen)
- Cron job: Her 12-24 saatte bir
- Ücretsiz tier yeterli
2. **Cron Job** (VPS/Server)
- Tam kontrol
- Sunucu gereksinimi
3. **Cloud Functions** (AWS Lambda, Google Cloud Functions)
- Serverless
- Kullanı m bazlı maliyet
**GitHub Actions Workflow Örneği (Optimize Edilmiş):**
```yaml
name: Update RSS Feed
on:
schedule:
- cron: '0 */12 * * * ' # Her 12 saatte bir
workflow_dispatch: # Manuel tetikleme
jobs:
update-feed:
runs-on: ubuntu-latest
steps:
# 1. Checkout (commit SHA ile sabitlenmiş - güvenlik)
- uses: actions/checkout@8e5e7e5f366d5b8b75e3d67731b8b25a0a40a8a7 # v4 commit SHA
# 2. Python setup
- uses: actions/setup-python@0a5d62f8d0679a54b4c1a51b3c9c0e0e8e8e8e8e # v5 commit SHA
with:
python-version: '3.10'
# 3. Cache veritabanı (Git commit yerine - performans)
- name: Cache database
uses: actions/cache@v3
with:
path: data/videos.db
key: ${{ runner.os }}-videos-db-${{ hashFiles('data/videos.db') }}
restore-keys: |
${{ runner.os }}-videos-db-
# 4. Install dependencies
- run: pip install -r requirements.txt
- run: python -m spacy download en_core_web_sm
# 5. Run pipeline
- run: python main.py
# 6. Save database to cache
- name: Save database to cache
uses: actions/cache@v3
with:
path: data/videos.db
key: ${{ runner.os }}-videos-db-${{ hashFiles('data/videos.db') }}
# 7. Upload RSS feed as artifact
- name: Upload RSS feed
uses: actions/upload-artifact@v3
with:
name: transcript-feed
path: output/transcript_feed.xml
retention-days: 30
# 8. Deploy to GitHub Pages (opsiyonel)
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./output
```
**Önemli Notlar**:
- **Cache Kullanı mı **: Veritabanı için `actions/cache` kullan (Git commit yerine) - daha hı zlı
- **Action Pinning**: Tüm action'lar commit SHA ile sabitlenmiş (güvenlik)
- **Artifact**: RSS feed'i artifact olarak sakla (GitHub Pages'e deploy edilebilir)
- **SpaCy Model**: CI/CD'de model indirme adı mı eklendi
**Süre Tahmini**: 1-2 gün
---
## Faz 8: İleri Özellikler ve Optimizasyon
### 8.1. Performans Optimizasyonu
**Görevler:**
- [ ] Paralel transcript çı karı mı (çoklu video için)
- [ ] Caching mekanizması
- [ ] Rate limiting yönetimi
- [ ] Batch processing optimizasyonu
**Süre Tahmini**: 2-3 gün
### 8.2. Self-Hosted RSS-Bridge Deployment (Opsiyonel - Rate Limiting Sorunları İçin)
**Görevler:**
- [ ] **Ne zaman self-hosting gerekir?**
- Public instance rate limiting'e maruz kalı rsa
- Yüksek hacimli kullanı m gerekiyorsa
- Özelleştirilmiş bridge'ler (YoutubeEmbedBridge) gerekiyorsa
- [ ] RSS-Bridge Docker deployment:
```bash
docker create --name=rss-bridge --publish 3000:80 \
--volume $(pwd)/rss-bridge-config:/config \
rssbridge/rss-bridge
docker start rss-bridge
```
- [ ] RSS-Bridge konfigürasyonu:
- `config.ini.php` ayarları
- `CACHE_TIMEOUT` ayarlama (TTL kontrolü)
- Custom bridge'ler ekleme (YoutubeEmbedBridge)
- [ ] Self-hosting avantajları :
- Rate limiting'den kaçı nma (dedicated IP)
- Daha fazla video çekebilme (100+)
- Özelleştirilmiş bridge'ler
- Gizlilik ve kontrol
- [ ] Production deployment:
- Reverse proxy (Nginx) kurulumu
- SSL sertifikası (Let's Encrypt)
- Monitoring ve health checks
- [ ] YoutubeEmbedBridge entegrasyonu (ad-free playback):
- `YoutubeEmbedBridge.php` dosyası nı `/config/bridges/` klasörüne ekle
- Container'ı restart et
- Embed bridge'i test et
**Not**: Public RSS-Bridge (`https://rss-bridge.org/bridge01/` ) varsayı lan olarak kullanı lı r ve çoğu durumda yeterlidir. Self-hosting sadece rate limiting sorunları yaşandı ğı nda veya özel gereksinimler olduğunda önerilir.
**Süre Tahmini**: 2-3 gün (opsiyonel)
### 8.3. Monitoring ve Logging
**Görevler:**
- [ ] Detaylı logging sistemi
- [ ] Hata bildirimleri (email, webhook)
- [ ] Feed health monitoring
- [ ] İstatistikler (SQLite sorguları ile):
- Toplam işlenen video sayı sı
- Başarı /başarı sı zlı k oranları
- Son işlenme tarihleri
- Dil dağı lı mı
- Günlük/haftalı k istatistikler
**SQLite İstatistik Örnekleri:**
```sql
-- Toplam işlenen video sayı sı
SELECT COUNT(*) FROM processed_videos;
-- Başarı oranı
SELECT
transcript_status,
COUNT(*) as count,
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(* ) FROM processed_videos), 2) as percentage
FROM processed_videos
GROUP BY transcript_status;
-- Son 7 günde işlenen videolar
SELECT COUNT(*) FROM processed_videos
WHERE processed_at >= datetime('now', '-7 days');
```
**Süre Tahmini**: 2 gün
---
## Toplam Süre Tahmini
| Faz | Süre |
|-----|------|
| Faz 1: Altyapı | 1-2 gün |
| Faz 2: Transcript Modülü | 7-9 gün |
| Faz 3: Video Metadata | 6 gün |
| Faz 4: RSS Generation | 3-4 gün |
| Faz 5: Pipeline | 3-4 gün |
| Faz 6: Test & Validasyon | 3-5 gün |
| Faz 7: Deployment | 2-4 gün |
| Faz 8: İleri Özellikler | 4-9 gün (opsiyonel) |
| **TOPLAM (Temel)** | **25-35 gün** |
| **TOPLAM (Tam)** | **29-44 gün** |
---
## Kritik Başarı Faktörleri
1. **API Stabilitesi** : `youtube-transcript-api` kullanı mı (scraping değil)
2. **XML Compliance** : Content Namespace Extension ve entity escaping
3. **Timezone Handling** : Tüm tarihler timezone-aware olmalı
4. **Duplicate Prevention** : Video ID GUID olarak kullanı lmalı
5. **Efficient Processing** : Sadece yeni videolar işlenmeli
---
## Riskler ve Mitigasyon
| Risk | Etki | Mitigasyon |
|------|------|------------|
| YouTube API değişikliği | Yüksek | `youtube-transcript-api` güncellemelerini takip et |
| Transcript bulunamama | Orta | Fallback diller, hata yönetimi |
| Rate limiting | Orta | Exponential backoff, request throttling |
| XML validation hataları | Yüksek | Comprehensive testing, W3C validation |
| Hosting maliyeti | Düşük | GitHub Pages (ücretsiz) kullan |
---
## Sonraki Adı mlar
1. **Hemen Başla** : Faz 1 - Proje altyapı sı kurulumu
2. **MVP Hedefi** : Faz 1-6 tamamlanarak çalı şan bir sistem
3. **Production Ready** : Faz 7 deployment ile canlı ya alma
4. **Optimizasyon** : Faz 8 ile gelişmiş özellikler
---
## Referanslar ve Kaynaklar
- `youtube-transcript-api` : https://github.com/jdepoix/youtube-transcript-api
- `python-feedgen` : https://github.com/lkiesow/python-feedgen
- RSS 2.0 Specification: https://www.rssboard.org/rss-specification
- Content Namespace: http://purl.org/rss/1.0/modules/content/
- W3C Feed Validator: https://validator.w3.org/feed/
- RSS-Bridge: https://github.com/RSS-Bridge/rss-bridge