Kişisel, LAN-only bir **Stream Deck** alternatifi. Eski bir Android telefonu (örn. Samsung Note Edge) bilgisayara bağlı bir kontrol paneline çevirir: medya kontrolü, sistem sesi, Spotify kitaplığı, masaüstü uygulaması açma, makrolar.
%100 uygulama ilerlemesi
Diller
Kotlin, Python, PowerShell
Notlar
Mimari detayları düzenle
Ana dil
Kotlin
Mixer fix: slider snap-back bug + preset filter
Mixer fix: slider snap-back bug + preset filter Slider 0'a düşüp geri çıkma animasyonu fix'i + preset bottom sheet'te Özel/ Hazır toggle (game kanalında 317 hazır + 5 özel ayrımı yapılabilsin). Device write endpoint'i bu Sonar versiyonunda hala kapalı (Allow:GET). Server (PC): - sonar_api.py: set_volume/set_mute/set_config artık PUT response'unu değil full get_state()'i broadcast eder. Önceki kod PUT'un volume-only yanıtını kullanıyordu; bu telefonda preset/device/configs alanlarını sıfırlıyordu (tüm sliders'ın bir an "0'a snap" görünmesinin asıl nedeni) - _refresh_and_notify() helper'ı Android: - SonarChannelStrip: pendingValue pattern * Drag bitince localValue → pendingValue olarak set edilir * displayValue = isDragging ? localValue : pendingValue ?? volume * LaunchedEffect(volume): server pending'e yaklaşınca pendingValue temizlenir * Diğer kanalın server update'i bu kanalın slider'ını artık bozmaz - PresetPickerSheet: Özel/Hazır toggle (isPreset bayrağı) * Özel = kullanıcı kayıtları (default sekme) * Hazır = SteelSeries built-in preset'leri * Boş tab için empty state
Sonar mixer: preset switch + device display
Sonar mixer: preset switch + device display Mixer'a kanal başına EQ preset değiştirme + kanalın çıkış cihazı adı eklendi. Cihaz değiştirme (PUT) endpoint'i bu Sonar versiyonunda kapalı (Allow: GET); şimdilik read-only gösteriliyor. Preset switch çalışıyor. Sonar API: - PUT /configs/{configId}/select (200 OK) -> preset switch - GET /configs/selected -> her kanalda aktif preset - GET /classicRedirections -> kanal -> deviceId - GET /audioDevices -> deviceId -> friendlyName Server (PC): - SonarService.get_state() artik selectedConfig/configs/deviceId/deviceName de iceriyor (per channel) - SonarService.set_config(configId) eklendi - handlers: SonarSelectConfig komutu + TYPE_ALIASES Android: - SonarConfig modeli, SonarChannelState alanlari (selectedConfigId/Name, configs, deviceId, deviceName) - Command.SonarSelectConfig variant - Mixer kanal seritlerinde: - Baslik altinda tiklanabilir preset chip ('hyperx music' / 'Custom' vb.) - Slider altinda cihaz adi (read-only) - Preset secimi icin ModalBottomSheet (LazyColumn, 300+ preset destekli)
Add SteelSeries Sonar mixer panel (volume + mute)
Add SteelSeries Sonar mixer panel (volume + mute) Telefondan PC'nin Sonar mixer'ını kontrol et: 5 kanal (Game/Chat/Mic/Media/ Aux) + Master dikey slider'lar, mute butonları, gerçek zamanlı state senkron. Sonar API: - Resmi API yok; GG'nin Electron UI'sının kullandığı belgesiz HTTP endpoint'leri sarıldı (coreProps.json -> subApps -> sonar webServerAddress) - GET /mode, /volumeSettings/{mode}, /audioDevices, /configs - PUT /volumeSettings/{mode}/{channel}/Volume/{0..1} - PUT /volumeSettings/{mode}/{channel}/Mute/{true|false} Server (PC): - sonar_api.py: SonarService — discovery + GET/PUT + 2 sn polling thread, state degisince broadcast hook - handlers.py: SonarVolume / SonarMute / SonarRefresh + TYPE_ALIASES - server.py: SonarService injection, on_state_change -> broadcast, initial payload to new clients - server.spec: sonar_api.py hidden import Android: - SonarState (mode + master + 5 channels) modeli - Command.kt 3 yeni variant - WebSocketManager sonarState StateFlow + handler dali - ControlDeckScreen 7. "Mixer" sekmesi: master + 5 dikey kanal serit (rotate -90 ile yatay slider, accent renkli baslik, mute toggle) - beyondViewportPageCount = 6 (TV + Mixer WebView/state korunsun) - Mini player Mixer sekmesinde gizli
Add YouTube 3rd-screen feature
Add YouTube 3rd-screen feature PC seçici/master, telefon görüntü için 3. ekran (sessiz), ses PC kulaklığından çıkar. İki oynatıcı 500ms tick + drift-threshold seekTo ile senkron. Server (PC): - youtube_api.py: YouTube Data API v3 search + duration fetch - youtube_player.py: subprocess wrapper (pywebview MAIN thread kısıtı) - _youtube_player_child.py: görünmez offscreen webview + stdin/stdout IPC - assets/youtube_player.html: IFrame Player + JS bridge - 3 yeni handler (SearchYouTube/YouTubePlay/YouTubeControl), TYPE_ALIASES - config v3 migration, server.spec pywebview hidden imports + assets - ui.py: yeni YouTube sekmesi (arama + tablo + Telefonda Oynat) + Status'a API key formu Android: - YouTubePayload (play + sync) + Command.kt 3 yeni variant - WebSocketManager: youtubePlay + youtubeSync StateFlow'lari - ControlDeckScreen: 6. TV sekmesi, WebView slave player, drift>0.3s seekTo, beyondViewportPageCount=5 (sekme geçişinde WebView reset olmasin) - assets/youtube_player.html (sessiz YouTube IFrame)
Initial commit: EdgeDeck2 monorepo
Initial commit: EdgeDeck2 monorepo Desktop (Python/Tkinter WebSocket sunucusu) ve Android (Kotlin/Compose) istemcisini iki klasor halinde birlestir. Hicbir build artifact'i veya local secret commit edilmiyor. - desktop/: server.py, edgedeck/ paket, build.ps1, server.spec, requirements.txt - android/: Jetpack Compose istemcisi (Spotify kitaplik, masaustu app kisayollari, AMOLED tema, USB+WiFi bag.lanti modlari) - Root README + .gitignore