69 lines
3.3 KiB
Markdown
69 lines
3.3 KiB
Markdown
# 🚀 FastWatcher
|
||
|
||
FastWatcher, mobil cihazlardaki video içeriklerini akıllı televizyonlara (Android TV vb.) en hızlı ve stabil şekilde aktarmak için tasarlanmış, modern ve SOLID prensiplerine dayalı bir Flutter uygulamasıdır.
|
||
|
||
## 🧠 Çalışma Mantığı ve Mimari
|
||
|
||
Uygulamanın kalbinde, mobil cihazın bir **"Kumanda/Gönderici"** (Sender) ve televizyonun bir **"Alıcı"** (Receiver) olarak çalıştığı bir ekosistem yatar.
|
||
|
||
### 1. Cihaz Keşfi (mDNS / Zero-config)
|
||
FastWatcher, cihazların birbirini bulması için karmaşık IP girişleri gerektirmez. **mDNS (Multicast DNS)** protokolünü kullanır:
|
||
- **TV (Receiver):** Uygulama açıldığında arka planda `_http._tcp` tipinde bir servis yayınlamaya başlar.
|
||
- **Mobil (Sender):** "Eşleş" butonuna basıldığında ağı tarar ve FastWatcher servisi yayınlayan TV'leri anında listeler.
|
||
|
||
### 2. İletişim Protokolü (Local HTTP Server)
|
||
Cihazlar arası veri aktarımı raw socket yerine daha güvenli ve yönetilebilir olan **HTTP** üzerinden gerçekleşir:
|
||
- TV tarafında küçük bir **Shelf HTTP Server** çalışır.
|
||
- Mobil cihaz, TV'ye bir `POST /play` isteği gönderir.
|
||
- **Payload Yapısı:**
|
||
```json
|
||
{
|
||
"url": "https://video-kaynagi.com/stream.m3u8",
|
||
"title": "Video Başlığı",
|
||
"timestamp": 1714415045
|
||
}
|
||
```
|
||
|
||
### 3. Video Linki Ayrıştırma (Headless Extraction)
|
||
Modern web siteleri video linklerini doğrudan paylaşmaz. FastWatcher bu sorunu **Headless WebView** ile çözer:
|
||
- Kullanıcı bir web sayfasını paylaştığında, uygulama arka planda gizli bir tarayıcı açar.
|
||
- Sayfa yüklenirken ağ trafiği dinlenir (`onLoadResource`).
|
||
- `.m3u8`, `.mp4` veya `.mkv` gibi video stream linkleri yakalandığı an sayfa kapatılır ve link TV'ye fırlatılır.
|
||
|
||
### 4. Video Oynatma (MediaKit Engine)
|
||
TV tarafında en geniş codec desteği için standart oynatıcılar yerine **MediaKit (libmpv tabanlı)** kullanılır:
|
||
- **Yüksek Performans:** 4K videolar ve HLS streamleri donmadan oynatılır.
|
||
- **Esneklik:** MKV, MP4, TS ve özel şifreli stream formatlarını destekler.
|
||
|
||
## 🏗 Mimari Yapı (Clean Architecture)
|
||
|
||
Proje, **Feature-First Clean Architecture** yapısını takip eder:
|
||
|
||
```mermaid
|
||
graph TD
|
||
UI[Presentation / UI] --> Riverpod[State Management / Riverpod]
|
||
Riverpod --> Repo[Data / Repository]
|
||
Repo --> Service[External Services / nsd, shelf, media_kit]
|
||
```
|
||
|
||
- **lib/core:** Tema, sabitler ve ortak kullanılan yardımcı sınıflar.
|
||
- **lib/features/setup:** Cihaz rolü (TV/Telefon) seçimi ve ayarların kalıcılığı.
|
||
- **lib/features/discovery:** mDNS ağ tarama ve servis kayıt işlemleri.
|
||
- **lib/features/sender:** Link yakalama, headless parsing ve HTTP POST gönderim mantığı.
|
||
- **lib/features/receiver:** HTTP Server yönetimi ve video oynatıcı entegrasyonu.
|
||
|
||
## 🛠 Kullanılan Teknolojiler
|
||
|
||
| Teknoloji | Amaç |
|
||
| :--- | :--- |
|
||
| **Flutter Riverpod** | Reactive State Management ve Dependency Injection. |
|
||
| **NSD** | Ağ üzerindeki cihazları otomatik keşfetme (mDNS). |
|
||
| **Shelf** | TV tarafında REST API sunucusu kurma. |
|
||
| **MediaKit** | Profesyonel seviyede video oynatma motoru. |
|
||
| **InAppWebView** | Sayfa içindeki gizli video linklerini yakalama. |
|
||
|
||
---
|
||
> [!IMPORTANT]
|
||
> Bu uygulama, televizyon ve mobil cihazın **aynı Wi-Fi ağında** olmasını gerektirir.
|
||
|