2025-11-13 03:40:05 +03:00
# API Dokümantasyonu
YouTube Transcript RSS Feed API'si, YouTube kanalları nı n video transcript'lerini RSS/Atom feed formatı nda sunar.
## Base URL
```
http://localhost:5000
```
Production için base URL değişebilir.
## Authentication
**Tüm endpoint'ler API key gerektirir.**
API key'i iki şekilde gönderebilirsiniz:
2025-11-13 08:51:55 +03:00
### 1. HTTP Header (Programatik kullanı m için önerilen)
2025-11-13 03:40:05 +03:00
```http
X-API-Key: your_api_key_here
```
2025-11-13 08:51:55 +03:00
**Not:** RSS okuyucular HTTP header gönderemediği için bu yöntem sadece programatik kullanı m için uygundur.
### 2. Query Parameter (RSS okuyucular ve tarayı cı lar için zorunlu)
2025-11-13 03:40:05 +03:00
```
?api_key=your_api_key_here
```
2025-11-13 08:51:55 +03:00
**Önemli:** RSS okuyucular, tarayı cı lar ve feed aggregator'lar için **mutlaka query parameter** kullanı lmalı dı r çünkü bu uygulamalar HTTP header gönderemez.
**Güvenlik Notu:** API key'i URL'de kullanmak güvenlik açı sı ndan ideal değildir çünkü:
- URL'ler log dosyaları nda, tarayı cı geçmişinde ve referrer header'ları nda görünebilir
- Ancak RSS okuyucular için bu tek seçenektir
- Production'da farklı API key'ler kullanarak riski azaltabilirsiniz
- API key'lerinizi düzenli olarak rotate edin
2025-11-13 03:40:05 +03:00
### API Key Alma
API key'ler `config/security.yaml` dosyası ndan yönetilir. Yeni bir API key eklemek için:
```yaml
security:
api_keys:
your_api_key_here:
name: "Your API Key Name"
rate_limit: 100 # Dakikada maksimum istek
enabled: true
```
### Hata Yanı tları
**401 Unauthorized** - API key eksik veya geçersiz:
```json
{
"error": "Geçersiz veya eksik API key",
"message": "X-API-Key header veya api_key query parametresi gerekli"
}
```
**429 Too Many Requests** - Rate limit aşı ldı :
```json
{
"error": "Rate limit aşı ldı ",
"message": "Dakikada 100 istek limiti",
"retry_after": 60
}
```
## Rate Limiting
Her API key için dakikada maksimum istek sayı sı tanı mlanı r. Rate limit bilgisi response header'ı nda döner:
```
X-RateLimit-Remaining: 45
```
Rate limit aşı ldı ğı nda `429 Too Many Requests` hatası döner.
## Endpoints
### 1. RSS/Atom Feed Oluştur
YouTube kanalı için transcript feed'i oluşturur.
**Endpoint:** `GET /`
**Query Parameters:**
| Parametre | Tip | Zorunlu | Açı klama |
|-----------|-----|---------|----------|
| `api_key` | string | ✅ | API key (header ile de gönderilebilir) |
| `channel_id` | string | ⚠️* | YouTube Channel ID (UC ile başlar, 24 karakter) |
| `channel` | string | ⚠️* | Channel handle (@username veya username) |
| `channel_url` | string | ⚠️* | Full YouTube channel URL |
| `format` | string | ❌ | Feed formatı : `Atom` (varsayı lan) veya `Rss` |
2025-11-13 04:19:56 +03:00
| `max_items` | integer | ❌ | Maksimum transcript sayı sı (varsayı lan: 10, max: 100, 20'şer batch'ler halinde işlenir) |
2025-11-13 03:40:05 +03:00
\* `channel_id` , `channel` veya `channel_url` parametrelerinden biri zorunludur.
**Örnek İstekler:**
2025-11-13 08:51:55 +03:00
**URL-Based Sorgular (RSS Okuyucular ve Tarayı cı lar için):**
2025-11-13 03:40:05 +03:00
```bash
2025-11-13 08:51:55 +03:00
# Channel ID ile (API key URL'de)
http://localhost:5000/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA& api_key=demo_key_12345& format=Atom
# Channel handle ile (API key URL'de)
http://localhost:5000/?channel=@tavakfi & api_key=demo_key_12345& format=Atom& max_items=10
# Channel URL ile (API key URL'de) - ÖNERİLEN
http://localhost:5000/?channel_url=https://www.youtube.com/@tavakfi & api_key=demo_key_12345& format=Atom& max_items=50
# RSS format ile
http://localhost:5000/?channel_url=https://www.youtube.com/@politicalfronts & api_key=demo_key_12345& format=Rss& max_items=20
```
**Programatik Kullanı m (HTTP Header ile):**
```bash
# Channel ID ile (Header'da API key)
2025-11-13 03:40:05 +03:00
curl -H "X-API-Key: demo_key_12345" \
"http://localhost:5000/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA& format=Atom"
2025-11-13 08:51:55 +03:00
# Channel handle ile (Header'da API key)
2025-11-13 03:40:05 +03:00
curl -H "X-API-Key: demo_key_12345" \
"http://localhost:5000/?channel=@tavakfi & format=Atom"
2025-11-13 08:51:55 +03:00
# Channel URL ile (Header'da API key)
2025-11-13 03:40:05 +03:00
curl -H "X-API-Key: demo_key_12345" \
2025-11-13 04:19:56 +03:00
"http://localhost:5000/?channel_url=https://www.youtube.com/@tavakfi & format=Atom& max_items=50"
2025-11-13 08:51:55 +03:00
```
2025-11-13 03:40:05 +03:00
2025-11-13 08:51:55 +03:00
**Production URL Örnekleri:**
```
# Production URL ile Channel URL kullanı mı
https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/@politicalfronts & api_key=your_api_key& format=Atom
# Production URL ile Channel ID kullanı mı
https://yt2feed.aligundogar.com.tr/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA& api_key=your_api_key& format=Rss& max_items=50
2025-11-13 03:40:05 +03:00
```
**Başarı lı Yanı t:**
**Atom Format:**
```xml
<?xml version='1.0' encoding='UTF-8'?>
< feed xmlns = "http://www.w3.org/2005/Atom" xml:lang = "en" >
< id > UC9h8BDcXwkhZtnqoQJ7PggA< / id >
< title > YouTube Transcript Feed - UC9h8BDcXwkhZtnqoQJ7PggA< / title >
< updated > 2025-01-13T00:30:36+00:00< / updated >
< link href = "https://www.youtube.com/channel/UC9h8BDcXwkhZtnqoQJ7PggA" / >
< entry >
< id > r5KfWUv6wqQ< / id >
< title > Video Title< / title >
< content type = "html" >
< p > Transcript content...< / p >
< / content >
< link href = "https://www.youtube.com/watch?v=r5KfWUv6wqQ" / >
< published > 2025-01-06T14:13:57+00:00< / published >
< / entry >
< / feed >
```
**RSS Format:**
```xml
<?xml version='1.0' encoding='UTF-8'?>
< rss version = "2.0" xmlns:content = "http://purl.org/rss/1.0/modules/content/" >
< channel >
< title > YouTube Transcript Feed - UC9h8BDcXwkhZtnqoQJ7PggA< / title >
< link > https://www.youtube.com/channel/UC9h8BDcXwkhZtnqoQJ7PggA< / link >
< item >
< title > Video Title< / title >
< content:encoded > <![CDATA[<p>Transcript content...</p>]]> < / content:encoded >
< link > https://www.youtube.com/watch?v=r5KfWUv6wqQ< / link >
< pubDate > Mon, 06 Jan 2025 14:13:57 +0000< / pubDate >
< / item >
< / channel >
< / rss >
```
**Hata Yanı tları :**
**400 Bad Request** - Geçersiz parametreler:
```json
{
"error": "Channel ID bulunamadı ",
"usage": {
"channel_id": "UC... (YouTube Channel ID)",
"channel": "@username veya username",
"channel_url": "https://www.youtube.com/@username veya https://www.youtube.com/channel/UC...",
"format": "Atom veya Rss (varsayı lan: Atom)",
2025-11-13 04:19:56 +03:00
"max_items": "Maksimum transcript sayı sı (varsayı lan: 10, maksimum: 100, 20'şer batch'ler halinde işlenir)"
2025-11-13 03:40:05 +03:00
}
}
```
**400 Bad Request** - Geçersiz format:
```json
{
"error": "Geçersiz channel_id formatı ",
"message": "Channel ID UC ile başlayan 24 karakter olmalı "
}
```
**404 Not Found** - Henüz işlenmiş video yok:
```json
{
"error": "Henüz işlenmiş video yok",
"channel_id": "UC9h8BDcXwkhZtnqoQJ7PggA",
"message": "Lütfen birkaç dakika sonra tekrar deneyin"
}
```
**500 Internal Server Error** - Sunucu hatası :
```json
{
"error": "RSS-Bridge hatası : ...",
"channel_id": "UC9h8BDcXwkhZtnqoQJ7PggA"
}
```
---
### 2. Health Check
Servisin durumunu kontrol eder. **API key gerektirmez.**
**Endpoint:** `GET /health`
**Örnek İstek:**
```bash
curl "http://localhost:5000/health"
```
**Başarı lı Yanı t:**
```json
{
"status": "ok",
"service": "YouTube Transcript RSS Feed"
}
```
**HTTP Status:** `200 OK`
---
### 3. API Bilgileri
API hakkı nda bilgi döner.
**Endpoint:** `GET /info`
**Örnek İstek:**
```bash
curl -H "X-API-Key: demo_key_12345" "http://localhost:5000/info"
```
**Başarı lı Yanı t:**
```json
{
"service": "YouTube Transcript RSS Feed Generator",
"version": "1.0.0",
"endpoints": {
"/": "RSS Feed Generator",
"/health": "Health Check",
"/info": "API Info"
},
"usage": {
"channel_id": "UC... (YouTube Channel ID)",
"channel": "@username veya username",
"channel_url": "Full YouTube channel URL",
"format": "Atom veya Rss (varsayı lan: Atom)",
2025-11-13 04:19:56 +03:00
"max_items": "Maksimum transcript sayı sı (varsayı lan: 10, maksimum: 100, 20'şer batch'ler halinde işlenir)"
2025-11-13 03:40:05 +03:00
},
"examples": [
"/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA& format=Atom",
"/?channel=@tavakfi & format=Rss",
2025-11-13 04:19:56 +03:00
"/?channel_url=https://www.youtube.com/@tavakfi & format=Atom& max_items=50"
2025-11-13 03:40:05 +03:00
]
}
```
**HTTP Status:** `200 OK`
---
## Response Headers
Tüm başarı lı response'larda aşağı daki header'lar bulunur:
| Header | Açı klama |
|--------|----------|
| `X-RateLimit-Remaining` | Kalan istek sayı sı |
| `X-Content-Type-Options` | `nosniff` |
| `X-Frame-Options` | `DENY` |
| `X-XSS-Protection` | `1; mode=block` |
| `Content-Type` | `application/atom+xml` veya `application/rss+xml` |
## Hata Kodları
| HTTP Status | Açı klama |
|-------------|----------|
| `200 OK` | İstek başarı lı |
| `400 Bad Request` | Geçersiz parametreler |
| `401 Unauthorized` | API key eksik veya geçersiz |
| `404 Not Found` | Kaynak bulunamadı |
| `429 Too Many Requests` | Rate limit aşı ldı |
| `500 Internal Server Error` | Sunucu hatası |
## Input Validation
### Channel ID Formatı
- `UC` ile başlamalı
- Toplam 24 karakter
- Alfanumerik karakterler + `_` ve `-`
**Örnek:** `UC9h8BDcXwkhZtnqoQJ7PggA`
### Channel Handle Formatı
- `@` ile başlayabilir veya başlamayabilir
- Maksimum 30 karakter
- Alfanumerik karakterler + `_` ve `-`
**Örnekler:** `@tavakfi` , `tavakfi`
### Channel URL Formatı
Sadece aşağı daki formatlar kabul edilir:
- `https://www.youtube.com/channel/UC...`
- `https://www.youtube.com/@username`
- `https://youtube.com/channel/UC...`
- `https://youtube.com/@username`
### max_items
- Tip: Integer
- Minimum: 1
2025-11-13 04:19:56 +03:00
- Maksimum: 100
- Varsayı lan: 10
- **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, böylece sonraki sorgularda görülebilir
2025-11-13 03:40:05 +03:00
## CORS
API CORS desteği sağlar. Preflight request'ler için `OPTIONS` metodu kullanı lı r.
**İzin Verilen Methodlar:** `GET` , `OPTIONS`
**İzin Verilen Header'lar:** `Content-Type` , `X-API-Key`
## Örnek Kullanı m Senaryoları
### 1. RSS Reader ile Kullanı m
RSS reader uygulamanı zda feed URL'si olarak kullanı n:
2025-11-13 08:51:55 +03:00
**Önemli:** RSS okuyucular HTTP header gönderemediği için API key'i **mutlaka query parametresi** olarak eklemeniz gerekir.
**URL Formatı :**
2025-11-13 03:40:05 +03:00
```
2025-11-13 08:51:55 +03:00
BASE_URL/?channel_url=YOUTUBE_CHANNEL_URL& api_key=YOUR_API_KEY& format=Atom& max_items=10
2025-11-13 03:40:05 +03:00
```
2025-11-13 08:51:55 +03:00
**Örnek URL'ler (Production):**
```
# Channel URL ile (ÖNERİLEN - En kolay ve güvenilir)
https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/@politicalfronts & api_key=your_api_key& format=Atom
# Channel URL ile RSS format
https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/@politicalfronts & api_key=your_api_key& format=Rss& max_items=50
# Channel ID ile
https://yt2feed.aligundogar.com.tr/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA& api_key=your_api_key& format=Atom& max_items=20
# Channel Handle ile
https://yt2feed.aligundogar.com.tr/?channel=@tavakfi & api_key=your_api_key& format=Atom& max_items=50
# Channel URL ile (Channel ID formatı nda)
https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/channel/UC9h8BDcXwkhZtnqoQJ7PggA& api_key=your_api_key& format=Rss
```
**Örnek URL'ler (Localhost - Test için):**
```
# Localhost test URL'i
http://localhost:5000/?channel_url=https://www.youtube.com/@politicalfronts & api_key=demo_key_12345& format=Atom
# Localhost ile Channel ID
http://localhost:5000/?channel_id=UC9h8BDcXwkhZtnqoQJ7PggA& api_key=demo_key_12345& format=Rss& max_items=10
```
**RSS Okuyucu Adı mları :**
1. RSS okuyucunuzda "Feed Ekle", "Subscribe" veya "Add Feed" seçeneğini açı n
2. Feed URL alanı na yukarı daki formatlardan birini yapı ştı rı n
3. `your_api_key` kı smı nı kendi API key'inizle değiştirin
4. Feed'i ekleyin ve kaydedin
**Popüler RSS Okuyucular:**
- **Feedly**: Feed URL'sini direkt yapı ştı rı n
- **Inoreader**: "Add New" > "Feed" > URL yapı ştı rı n
- **NewsBlur**: "Add Site" > URL yapı ştı rı n
- **The Old Reader**: "Add Subscription" > URL yapı ştı rı n
- **NetNewsWire**: "File" > "Add Feed" > URL yapı ştı rı n
**Not:**
- İlk istekte transcript'ler henüz işlenmemiş olabilir. Birkaç dakika bekleyip tekrar deneyin.
- API key'inizi URL'de paylaşmayı n, sadece kendi RSS okuyucunuzda kullanı n.
2025-11-13 03:40:05 +03:00
### 2. Programatik Kullanı m (Python)
```python
import requests
api_key = "your_api_key_here"
channel_id = "UC9h8BDcXwkhZtnqoQJ7PggA"
headers = {
"X-API-Key": api_key
}
response = requests.get(
f"http://localhost:5000/?channel_id={channel_id}& format=Atom",
headers=headers
)
if response.status_code == 200:
feed_content = response.text
print(feed_content)
else:
print(f"Error: {response.status_code}")
print(response.json())
```
### 3. Programatik Kullanı m (JavaScript)
2025-11-13 08:51:55 +03:00
**URL-Based (Tarayı cı için):**
```javascript
// Tarayı cı dan kullanı m - API key URL'de
const apiKey = "your_api_key_here";
const channelUrl = "https://www.youtube.com/@politicalfronts ";
const feedUrl = `https://yt2feed.aligundogar.com.tr/?channel_url=${encodeURIComponent(channelUrl)}&api_key=${apiKey}&format=Atom` ;
fetch(feedUrl)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}` );
}
return response.text();
})
.then(feedContent => {
console.log(feedContent);
})
.catch(error => {
console.error("Error:", error);
});
```
**Header-Based (Node.js/Backend için):**
2025-11-13 03:40:05 +03:00
```javascript
const apiKey = "your_api_key_here";
const channelId = "UC9h8BDcXwkhZtnqoQJ7PggA";
fetch(`http://localhost:5000/?channel_id=${channelId}&format=Atom` , {
headers: {
"X-API-Key": apiKey
}
})
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}` );
}
return response.text();
})
.then(feedContent => {
console.log(feedContent);
})
.catch(error => {
console.error("Error:", error);
});
```
### 4. cURL ile Test
2025-11-13 08:51:55 +03:00
**URL-Based Sorgular (RSS Okuyucular ve Tarayı cı lar için):**
```bash
# API key URL'de - Channel URL ile (ÖNERİLEN)
API_KEY="demo_key_12345"
CHANNEL_URL="https://www.youtube.com/@politicalfronts "
curl "http://localhost:5000/?channel_url=${CHANNEL_URL}& api_key=${API_KEY}& format=Atom& max_items=50"
# API key URL'de - Channel ID ile
CHANNEL_ID="UC9h8BDcXwkhZtnqoQJ7PggA"
curl "http://localhost:5000/?channel_id=${CHANNEL_ID}& api_key=${API_KEY}& format=Rss& max_items=20"
# Production URL ile
curl "https://yt2feed.aligundogar.com.tr/?channel_url=https://www.youtube.com/@politicalfronts & api_key=${API_KEY}& format=Atom"
```
**Header-Based Sorgular (Programatik Kullanı m için):**
2025-11-13 03:40:05 +03:00
```bash
2025-11-13 08:51:55 +03:00
# API key header'da - Channel ID ile
2025-11-13 03:40:05 +03:00
API_KEY="demo_key_12345"
CHANNEL_ID="UC9h8BDcXwkhZtnqoQJ7PggA"
curl -H "X-API-Key: $API_KEY" \
2025-11-13 04:19:56 +03:00
"http://localhost:5000/?channel_id=$CHANNEL_ID& format=Atom& max_items=50"
2025-11-13 08:51:55 +03:00
# API key header'da - Channel URL ile
CHANNEL_URL="https://www.youtube.com/@tavakfi "
curl -H "X-API-Key: $API_KEY" \
"http://localhost:5000/?channel_url=${CHANNEL_URL}& format=Atom& max_items=50"
2025-11-13 03:40:05 +03:00
```
## Notlar
1. **İlk İstek** : İlk istekte transcript'ler henüz işlenmemiş olabilir. Birkaç dakika bekleyip tekrar deneyin.
2. **Rate Limiting** : Her API key için farklı rate limit tanı mlanabilir. Limit aşı ldı ğı nda 60 saniye beklemeniz gerekir.
2025-11-13 04:19:56 +03:00
3. **Transcript İşleme** :
- Transcript'ler 20'şer batch'ler halinde işlenir (YouTube IP blocking önleme için)
- Her batch işlendikten sonra veritabanı na kaydedilir
- `max_items` parametresi ile her istekte işlenecek transcript sayı sı nı kontrol edebilirsiniz (maksimum 100)
- Batch'ler arası 2 saniye bekleme süresi vardı r
- Yeni videolar için birkaç dakika gecikme olabilir
2025-11-13 03:40:05 +03:00
4. **Format Seçimi** : Atom formatı daha modern ve önerilir. RSS formatı eski RSS reader'lar için uygundur.
5. **API Key Güvenliği** : API key'lerinizi güvenli tutun ve asla public repository'lere commit etmeyin.
2025-11-13 04:19:56 +03:00
6. **Batch İşleme Örneği** :
- `max_items=50` isteği: 20+20+10 batch'ler halinde işlenir
- Her batch tamamlandı ğı nda veritabanı na kaydedilir
- Sonraki sorgularda tüm işlenmiş transcript'ler görülebilir
2025-11-13 03:40:05 +03:00
## Destek
Soruları nı z için GitHub Issues kullanabilirsiniz.