Basit Anlatım (Herkes İçin)
🎯 Ne İstiyoruz?
Muzibu'daki müzik kategorilerini (genre, sektör, tür) başka sitelerin veya uygulamaların çekebilmesini istiyoruz. Ama herkes değil - sadece şifreyi/anahtarı bilen kişiler erişebilsin.
🔑 Şifreleme Ne Demek?
- API Key: Her müşteriye özel bir anahtar (şifre) veriyoruz
- Token: Bu anahtar olmadan feed'e erişilemiyor
- Süre Sınırı: İstersek anahtarın geçerlilik süresi olabilir
📻 Kullanım Senaryoları
Senaryo 1: İş Yeri Radyosu
Bir kafe zinciri kendi uygulamasında Muzibu'dan "Cafe Jazz" kategorisini çekip çalıyor.
Senaryo 2: Podcast Uygulaması
Spotify/Apple Podcast benzeri bir uygulama, Muzibu feed'ini podcast gibi listeliyor.
Senaryo 3: Entegrasyon
Bir otel zinciri kendi sistemine Muzibu'dan "Lounge" kategorisini entegre ediyor.
Senaryo 4: Beyaz Etiket
Bir marka kendi adıyla Muzibu içeriklerini sunuyor (white-label).
Teknoloji Seçenekleri Karşılaştırması
| Teknoloji | Uyumluluk | Şifreleme | Geliştirme | Öneri |
|---|---|---|---|---|
|
RSS 2.0 + Enclosure
Podcast Standardı
|
⭐⭐⭐⭐⭐ Tüm cihazlar |
⭐⭐⭐⭐ Token/Basic Auth |
⭐⭐⭐⭐⭐ Kolay |
ÖNERİLEN |
|
JSON Feed + API Key
Modern REST API
|
⭐⭐⭐ Yazılımcılar |
⭐⭐⭐⭐⭐ Tam kontrol |
⭐⭐⭐⭐ Mevcut API var |
ALTERNATİF |
|
Atom Feed + OAuth
XML Standardı
|
⭐⭐⭐⭐ Modern sistemler |
⭐⭐⭐⭐⭐ OAuth 2.0 |
⭐⭐⭐ Orta zorluk |
KARMAŞIK |
|
GraphQL Subscription
Real-time
|
⭐⭐ Sadece geliştiriciler |
⭐⭐⭐⭐⭐ JWT + WebSocket |
⭐⭐ Zor |
AŞIRI |
Önerilen Çözüm: Podcast RSS + API Token
Neden Bu?
- Evrensel Uyumluluk: Spotify, Apple Podcasts, VLC, her podcast uygulaması RSS'i destekler
- Basit Şifreleme: URL'de token = şifreyi bilmeyen erişemez
- Mevcut Altyapı: Laravel Sanctum token sistemi zaten var
- Kolay Yönetim: Admin panelden token oluştur/iptal et
Örnek URL Yapısı
https://muzibu.com/feed/genre/jazz
?token=abc123xyz789
https://muzibu.com/feed/sector/cafe
?token=abc123xyz789
https://muzibu.com/feed/playlist/123
?token=abc123xyz789
Teknik Detaylar (Geliştiriciler İçin)
RSS 2.0 Podcast Feed Yapısı
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Muzibu - Jazz Kategorisi</title>
<link>https://muzibu.com/genres/jazz</link>
<description>En iyi jazz parçaları</description>
<language>tr</language>
<itunes:category text="Music"/>
<itunes:image href="https://muzibu.com/covers/jazz.jpg"/>
<!-- Her şarkı bir item -->
<item>
<title>Take Five - Dave Brubeck</title>
<description>Classic jazz piece from 1959</description>
<pubDate>Mon, 20 Mar 2026 10:00:00 +0300</pubDate>
<itunes:duration>5:24</itunes:duration>
<itunes:image href="https://muzibu.com/covers/take-five.jpg"/>
<!-- MP3 URL - Signed URL ile korunuyor -->
<enclosure
url="https://muzibu.com/stream/12345?sig=xyz&exp=1711000000"
length="5242880"
type="audio/mpeg"/>
<guid isPermaLink="false">song-12345</guid>
</item>
<!-- Daha fazla şarkı... -->
</channel>
</rss>
Oluşturulacak Dosyalar
Modules/Muzibu/ ├── app/ │ ├── Http/ │ │ ├── Controllers/ │ │ │ └── Api/ │ │ │ └── FeedController.php # RSS generator │ │ └── Middleware/ │ │ └── ValidateFeedToken.php # Token doğrulama │ ├── Models/ │ │ └── FeedToken.php # Token model │ └── Services/ │ └── RssFeedService.php # Feed oluşturma servisi ├── database/ │ └── migrations/ │ └── tenant/ │ └── xxxx_create_feed_tokens_table.php ├── routes/ │ └── api.php # + Feed routes └── resources/ └── views/ └── feed/ └── rss.blade.php # RSS template
Token Tablosu Yapısı
| Kolon | Tip | Açıklama |
|---|---|---|
| id | bigint | Primary key |
| token | varchar(64) | Benzersiz token (hash) |
| name | varchar | Token adı (örn: "Starbucks TR") |
| user_id | bigint nullable | İlişkili kullanıcı (opsiyonel) |
| feedable_type | varchar | Genre, Sector, Playlist |
| feedable_id | bigint | İlgili kayıt ID |
| permissions | json | İzinler (stream, download, vs) |
| rate_limit | int | Dakikada max istek |
| expires_at | timestamp nullable | Son kullanma tarihi |
| last_used_at | timestamp nullable | Son kullanım |
| is_active | boolean | Aktif/Pasif |
API Route Yapısı
// routes/api.php Route::prefix('feed')->middleware('feed.token')->group(function () { // RSS Feeds Route::get('/genre/{slug}', [FeedController::class, 'genre']); Route::get('/sector/{slug}', [FeedController::class, 'sector']); Route::get('/playlist/{id}', [FeedController::class, 'playlist']); Route::get('/artist/{slug}', [FeedController::class, 'artist']); // JSON Feeds (alternatif) Route::get('/genre/{slug}/json', [FeedController::class, 'genreJson']); Route::get('/sector/{slug}/json', [FeedController::class, 'sectorJson']); }); // Stream endpoint - signed URL ile Route::get('/stream/{songId}', [FeedController::class, 'stream']) ->middleware('signed');
Güvenlik Katmanları
1. Feed Token
Her müşteriye özel token. Token olmadan feed'e erişim yok. Admin panelden yönetim.
2. Signed Stream URL
MP3 linkleri imzalı ve süreli. 30 dakika sonra geçersiz olur. Direkt paylaşılamaz.
3. Rate Limiting
Token başına dakikada max istek limiti. Abuse durumunda otomatik engelleme.
Ek Güvenlik Seçenekleri
Admin Panel Yönetimi
Token Yönetimi Ekranı
Token Oluşturma
Alternatif: JSON Feed API
RSS'e ek olarak, yazılımcılar için JSON formatında da feed sunulabilir:
{
"feed": {
"title": "Muzibu - Jazz Kategorisi",
"home_page_url": "https://muzibu.com/genres/jazz",
"feed_url": "https://muzibu.com/feed/genre/jazz/json?token=abc123",
"description": "En iyi jazz parçaları",
"icon": "https://muzibu.com/covers/jazz.jpg",
"items": [
{
"id": "song-12345",
"title": "Take Five",
"artist": "Dave Brubeck",
"album": "Time Out",
"duration": 324,
"duration_formatted": "5:24",
"cover_url": "https://muzibu.com/covers/take-five.jpg",
"stream_url": "https://muzibu.com/stream/12345?sig=xyz&exp=...",
"published_at": "2026-03-20T10:00:00+03:00"
}
],
"next_page": "https://muzibu.com/feed/genre/jazz/json?token=abc123&page=2"
}
}
Sonraki Adımlar
Onay
Bu yaklaşımı onaylarsanız, önce feed_tokens migration'ı için izin alacağım.
Migration Oluşturma
feed_tokens tablosu için 3 aşamalı onay süreci başlatılacak.
Feed Controller & Service
RSS generator, token middleware, stream endpoint.
Admin Panel
Token yönetimi için Livewire component.
Test & Dökümantasyon
Farklı podcast uygulamalarında test, müşteri dökümantasyonu.