26 KiB
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:
Not: SQLite Python'da built-in (
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çinsqlite3modülü), ekstra kurulum gerekmez. SpaCy Model:python -m spacy download en_core_web_sm(veyatr_core_news_smTü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-apiile video ID'den transcript çıkarma- Çoklu dil desteği (fallback mekanizması)
- Örnek:
languages=['tr', 'en']- önce Türkçe, yoksa İngilizce
- Örnek:
- Hata yönetimi:
- Transcript bulunamama durumları
- API rate limiting
- Geçersiz video ID'ler
- Raw transcript formatını anlama:
# 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-Afterheader'ı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
- Artifact Removal:
- Sentence Boundary Detection (SBD) - SpaCy Entegrasyonu:
- SpaCy Model Kullanımı:
en_core_web_smveyatr_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ı
- SpaCy Model Kullanımı:
- HTML Wrapping:
- Temizlenmiş metni
<p>...</p>tag'leri ile sarmalama - Paragraf yapısını koruma
- Minimal HTML (sadece gerekli tag'ler)
- Temizlenmiş metni
- 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
- Zorunlu karakter dönüşümleri:
Algoritma Özeti:
- Artifact'ları kaldır ve normalize et
- SpaCy ile fragment'ları birleştir ve cümle sınırlarını tespit et
- Paragraflara böl (anlamsal veya cümle sayısına göre)
- HTML tag'leri ekle (
<p>...</p>) - 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
- Base URL:
- 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
- Public (Channel ID):
- Önemli parametreler:
bridge=YoutubeBridge(Youtube değil!)context=By+channel+idveyacontext=By+usernamec=CHANNEL_ID(channel ID için) veyau=USERNAME(handle için)format=Atomveyaformat=Rss(feed için, Html değil)duration_minveduration_max(opsiyonel filtreleme)
- Public RSS-Bridge instance kullanımı (Önerilen):
- Feed Parsing (
feedparserkullanarak):- 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ı:
UCile 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-dlpentegrasyonu (opsiyonel, gelişmiş metadata için)
RSS-Bridge Kullanım Örneği:
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):
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ı:
-- 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 PLANile sorgu performansını doğrula - DATE() fonksiyonu kullanma: Index kullanımını engeller, direkt timestamp karşılaştırması yap
- Zaman Formatı: UTC ISO 8601 (
-
Database helper fonksiyonları:
init_database()- Veritabanı ve tablo oluşturmais_video_processed(video_id)- Duplicate kontrolüget_pending_videos()-transcript_status = 0olan videoları getiradd_video(video_data)- Yeni video kaydı (status=0 olarak)update_video_transcript(video_id, raw, clean, status, language)- Transcript güncellemeget_processed_videos(limit=None, channel_id=None)- İşlenmiş videoları getirmark_video_failed(video_id, reason)- Kalıcı hata işaretleme (status=2)is_transcript_cached(video_id, cache_days=3)- Transcript cache kontrolü (3 günlük)get_cached_transcript(video_id)- Cache'den transcript getirme- Query Performance:
EXPLAIN QUERY PLANile index kullanımını doğrula
-
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_utctarihine göre 3 gün kontrolü - Otomatik Yenileme: 3 gün sonra cache geçersiz olur, yeni transcript çekilir
-
Yeni video tespiti algoritması:
- RSS-Bridge feed'den son videoları çek
- SQLite veritabanında
video_idile sorgula - Sadece yeni videoları (veritabanında olmayan) işle
- 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
-
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-feedgenile FeedGenerator oluşturma- Content Namespace Extension ekleme:
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"> - Channel metadata ayarlama:
fg.id()- Channel IDfg.title()- Kanal başlığıfg.link()- Kanal URL'ifg.language('tr')- Dilfg.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 linkife.published(datetime_with_timezone)- Yayın tarihi (timezone-aware)fe.description(summary)- Kısa özetfe.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:
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ışı:
- SQLite veritabanını başlat (
init_database()) - 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
- Eğer handle (@username) verildiyse,
- RSS-Bridge feed'den yeni videoları tespit et (
video_fetcher.py) - SQLite veritabanında
video_idile duplicate kontrolü yap - 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)
- RSS feed'i güncelle (veritabanından tüm işlenmiş videoları çek)
- XML dosyasını kaydet
- SQLite veritabanını başlat (
- 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:
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
- 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:
- GitHub Pages (Önerilen)
- Ücretsiz
- CI/CD entegrasyonu
- Version control
- 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:
- GitHub Actions (Önerilen)
- Cron job: Her 12-24 saatte bir
- Ücretsiz tier yeterli
- Cron Job (VPS/Server)
- Tam kontrol
- Sunucu gereksinimi
- Cloud Functions (AWS Lambda, Google Cloud Functions)
- Serverless
- Kullanım bazlı maliyet
GitHub Actions Workflow Örneği (Optimize Edilmiş):
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/cachekullan (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:
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.phpayarlarıCACHE_TIMEOUTayarlama (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.phpdosyası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:
-- 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
- API Stabilitesi:
youtube-transcript-apikullanımı (scraping değil) - XML Compliance: Content Namespace Extension ve entity escaping
- Timezone Handling: Tüm tarihler timezone-aware olmalı
- Duplicate Prevention: Video ID GUID olarak kullanılmalı
- 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
- Hemen Başla: Faz 1 - Proje altyapısı kurulumu
- MVP Hedefi: Faz 1-6 tamamlanarak çalışan bir sistem
- Production Ready: Faz 7 deployment ile canlıya alma
- Optimizasyon: Faz 8 ile gelişmiş özellikler
Referanslar ve Kaynaklar
youtube-transcript-api: https://github.com/jdepoix/youtube-transcript-apipython-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