feat(cast): add multi-protocol support for Chromecast, DLNA, and AirPlay

- Update CastPicker to show protocol tabs with device counts
- Register DLNA and AirPlay state and commands in lib.rs
- Add Deserialize derive to DlnaMetadata and AirPlayMetadata
- Fix capabilities file (remove unavailable fs permissions)
- Remove unused IpAddr import in media_server.rs
This commit is contained in:
vicrodh committed 2026-01-10 03:41:11 -06:00
1 parent 762df3e122
commit fbfa067b94
7 files changed
+199 -39

No files matched your search

+1 -1
View File
@@ -14,7 +14,7 @@ tauri-build = { version = "2", features = [] }
[dependencies]
# Tauri
tauri = { version = "2", features = [] }
tauri = { version = "2", features = ["protocol-asset"] }
tauri-plugin-opener = "2"
# Serialization
+1 -11
View File
@@ -8,16 +8,6 @@
"opener:default",
"dialog:default",
"clipboard-manager:default",
"clipboard-manager:allow-write-text",
"fs:default",
{
"identifier": "fs:allow-read",
"allow": [
{ "path": "$HOME/**" },
{ "path": "$CACHE/**" },
{ "path": "$CONFIG/**" },
{ "path": "/**" }
]
}
"clipboard-manager:allow-write-text"
]
}
+2 -2
View File
@@ -1,11 +1,11 @@
//! AirPlay device connection and streaming (placeholder)
use serde::Serialize;
use serde::{Deserialize, Serialize};
use crate::cast::airplay::{AirPlayError, DiscoveredAirPlayDevice};
/// Metadata for AirPlay playback
#[derive(Debug, Clone, Serialize)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AirPlayMetadata {
pub title: String,
pub artist: String,
+2 -2
View File
@@ -1,11 +1,11 @@
//! DLNA device connection and playback (placeholder)
use serde::Serialize;
use serde::{Deserialize, Serialize};
use crate::cast::dlna::{DiscoveredDlnaDevice, DlnaError};
/// Metadata for DLNA playback
#[derive(Debug, Clone, Serialize)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DlnaMetadata {
pub title: String,
pub artist: String,
+1 -1
View File
@@ -3,7 +3,7 @@
use std::collections::HashMap;
use std::fs::File;
use std::io::{Read, Seek, SeekFrom};
use std::net::{IpAddr, SocketAddr, UdpSocket};
use std::net::{SocketAddr, UdpSocket};
use std::path::{Path, PathBuf};
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Mutex};
+32 -2
View File
@@ -96,9 +96,13 @@ pub fn run() {
let library_state = library::init_library_state()
.expect("Failed to initialize library database");
// Initialize casting state
// Initialize casting state (Chromecast, DLNA, AirPlay)
let cast_state = cast::CastState::new()
.expect("Failed to initialize casting state");
.expect("Failed to initialize Chromecast state");
let dlna_state = cast::dlna::commands::DlnaState::new()
.expect("Failed to initialize DLNA state");
let airplay_state = cast::airplay::commands::AirPlayState::new()
.expect("Failed to initialize AirPlay state");
// Initialize download cache state
let download_cache_state = download_cache::DownloadCacheState::new()
@@ -111,6 +115,8 @@ pub fn run() {
.manage(AppState::new())
.manage(library_state)
.manage(cast_state)
.manage(dlna_state)
.manage(airplay_state)
.manage(download_cache_state)
.invoke_handler(tauri::generate_handler![
// Auth commands
@@ -236,6 +242,30 @@ pub fn run() {
cast::commands::cast_stop,
cast::commands::cast_seek,
cast::commands::cast_set_volume,
// DLNA casting commands
cast::dlna::commands::dlna_start_discovery,
cast::dlna::commands::dlna_stop_discovery,
cast::dlna::commands::dlna_get_devices,
cast::dlna::commands::dlna_connect,
cast::dlna::commands::dlna_disconnect,
cast::dlna::commands::dlna_get_status,
cast::dlna::commands::dlna_load_media,
cast::dlna::commands::dlna_play,
cast::dlna::commands::dlna_pause,
cast::dlna::commands::dlna_stop,
cast::dlna::commands::dlna_set_volume,
// AirPlay casting commands
cast::airplay::commands::airplay_start_discovery,
cast::airplay::commands::airplay_stop_discovery,
cast::airplay::commands::airplay_get_devices,
cast::airplay::commands::airplay_connect,
cast::airplay::commands::airplay_disconnect,
cast::airplay::commands::airplay_get_status,
cast::airplay::commands::airplay_load_media,
cast::airplay::commands::airplay_play,
cast::airplay::commands::airplay_pause,
cast::airplay::commands::airplay_stop,
cast::airplay::commands::airplay_set_volume,
// Download cache commands
download_cache::commands::download_track,
download_cache::commands::is_track_downloaded,