İnternet Kesintisinde Kesintisiz Müzik Deneyimi
Ne İstiyoruz?
Kullanıcılar Muzibu'da müzik dinlerken internet bağlantısı kesilirse,
bir gün boyunca kesintisiz dinlemeye devam edebilsin.
Nasıl Çalışacak?
Kullanıcı müzik dinlerken, şarkılar arka planda bilgisayarına indirilecek
(şifreli olarak). İnternet kesildiğinde, sistem otomatik olarak bilgisayardaki kopyadan çalmaya devam edecek.
Kullanıcı Fark Eder Mi?
Hayır! Kullanıcı hiçbir şey yapmayacak. Sistem tamamen arka planda çalışacak.
İnternet varken online, yokken offline çalacak - otomatik geçiş.
Müzikler bilgisayara şifreli olarak kaydedilir. Kullanıcı dosyaları bulamaz, kopyalayamaz. Premium üyelik bitince otomatik silinir. Sistem tamamen güvenli ve telif haklarını korur.
/api/muzibu/songs/{id}/key endpoint çalışıyor
Mevcut web uygulamasına Service Worker ekleyerek offline cache sistemi kuruyoruz. En hızlı, en kolay ve en uyumlu çözüm.
public/sw.js
public/manifest.json
Ayrı bir masaüstü uygulaması geliştiriyoruz (Windows/Mac/Linux). Native kontrol ve güvenlik için en iyi çözüm.
Chrome Web Store veya Firefox Add-ons'a extension yayınlıyoruz. Kullanıcı tarayıcıya kuruyor, arka planda çalışıyor.
PWA olarak başlayıp, Capacitor ile native iOS/Android/Desktop uygulamasına dönüştürüyoruz. Her platforma dağıtım için en iyi çözüm.
| Kriter | PWA + SW (ÖNERİLEN) |
Electron Desktop |
Browser Extension |
Hybrid Capacitor |
|---|---|---|---|---|
| Geliştirme Süresi | 1-2 gün | 4-6 hafta | 2-3 hafta | 3-4 hafta |
| Kullanıcı Deneyimi | Mükemmel | Mükemmel | İyi | Mükemmel |
| Platform Desteği | Web/Mobile/Desktop | Sadece Desktop | Sadece Browser | Tümü |
| Kurulum Gerekli Mi? | İsteğe bağlı | Evet (zorunlu) | Evet (zorunlu) | Store'dan |
| Depolama Limiti | 10-50GB | Sınırsız | ~10GB | Yüksek |
| Güvenlik | Yüksek | Çok Yüksek | Orta | Yüksek |
| Maliyet | Düşük | Yüksek | Orta | Orta-Yüksek |
| TOPLAM PUAN | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ |
PWA + Service Worker ile başlayın. Hızlı implement edilir, tüm platformlarda çalışır, kullanıcı deneyimi mükemmel. İlerde ihtiyaç olursa Electron veya Capacitor'a geçiş yapabilirsiniz (aynı kod tabanını kullanarak).
AES-128-CBC
songs.encryption_key
songs.encryption_iv
/api/muzibu/songs/{id}/key
Web Crypto API
PBKDF2 (user_id + device_id)
IndexedDB (encrypted blobs)
isPremiumOrTrial() check
Web Crypto API ile tekrar şifrelenir (double encryption)
IndexedDB'ye kaydedilir (binary blob)
public/sw.js dosyası oluşturpublic/manifest.json oluştur (PWA metadata)muzibu_cache database oluştursongs object store (metadata)segments object store (binary blobs)keys object store (encryption keys)isPremiumOrTrial() kontrolüexpires_at = now() + 24h ekleclearAllCache() event listener~22 saat (yaklaşık 3 iş günü - tek developer)
public/
├── sw.js # Service Worker (cache logic)
├── manifest.json # PWA manifest
└── js/
└── sw-register.js # SW registration script
resources/views/themes/muzibu/layouts/
└── app.blade.php # SW registration eklenecek
Modules/Muzibu/app/Services/
└── CacheService.php # Backend cache management (yeni)
database/migrations/
└── muzibu_cache_analytics.php # Cache analytics table (isteğe bağlı)
// Database: muzibu_cache
// Version: 1
// Object Store: songs
{
song_id: number (keyPath),
title: string,
artist: string,
album_id: number,
cached_at: timestamp,
expires_at: timestamp,
size_bytes: number,
segment_count: number
}
// Object Store: segments
{
id: string (keyPath, format: "songId_segmentIndex"),
song_id: number (index),
segment_index: number,
encrypted_blob: ArrayBuffer,
cached_at: timestamp
}
// Object Store: keys
{
song_id: number (keyPath),
encryption_key: string (base64),
iv: string (base64),
cached_at: timestamp
}
Cache-First
→ Önce cache'e bak, yoksa network'ten çek ve cache'le
Network-First
→ Network'ten çek, offline ise cache'ten döndür
Cache-First
→ Key'ler değişmez, aggressive cache
Network-First + Stale-While-Revalidate
→ Cache'ten döndür ama arka planda güncelle
// Encryption key generation (user + device specific)
const keyMaterial = await crypto.subtle.importKey(
'raw',
new TextEncoder().encode(userId + deviceId + salt),
{ name: 'PBKDF2' },
false,
['deriveBits', 'deriveKey']
);
const encryptionKey = await crypto.subtle.deriveKey(
{ name: 'PBKDF2', salt: saltBuffer, iterations: 100000, hash: 'SHA-256' },
keyMaterial,
{ name: 'AES-GCM', length: 256 },
false,
['encrypt', 'decrypt']
);
// Segment encryption
const encryptedSegment = await crypto.subtle.encrypt(
{ name: 'AES-GCM', iv: ivBuffer },
encryptionKey,
segmentArrayBuffer
);
// Segment decryption (offline playback)
const decryptedSegment = await crypto.subtle.decrypt(
{ name: 'AES-GCM', iv: ivBuffer },
encryptionKey,
encryptedSegmentArrayBuffer
);
Modules/Muzibu/app/Http/Controllers/Api/SongStreamController.php
→ stream(), serveKey() fonksiyonları
Modules/Muzibu/app/Models/Song.php
→ encryption_key, encryption_iv fields
public/themes/muzibu/js/player/core/player-core.js
→ HLS.js implementation (44KB, büyük dosya)
App/Services/SignedUrlService.php
→ generateHlsUrl(), generateStreamUrl() (60 dk TTL)
Bu raporda 4 farklı yaklaşım analiz ettik. Şimdi hangi yaklaşımla ilerleyeceğimize karar verme zamanı:
PWA + Service Worker ile başlayın. 1-2 gün içinde çalışır hale gelir, tüm platformlarda kullanılabilir.
Electron Desktop App geliştirin. Native kontrol, sınırsız depolama, gelişmiş güvenlik.
Hybrid (Capacitor) ile başlayın. Web + iOS + Android + Desktop tek kod tabanı.
Browser Extension geliştirin. Chrome/Firefox için hızlı çözüm.
Karar verdiğinizde, hemen Implementation Plan hazırlayıp geliştirmeye başlayabiliriz! 🚀
🤖 Generated with Claude AI - Muzibu Offline Playback Analysis
Rapor Versiyonu: v1 | Tarih: 17 Aralık 2025