Migration vers une forme unifiée des cargos

This commit is contained in:
2025-12-30 16:12:30 +01:00
parent 64450185c5
commit a4301140d8
45 changed files with 989 additions and 132 deletions

34
Cargo.lock generated
View File

@@ -3642,7 +3642,7 @@ dependencies = [
"pmoflac",
"pmometadata",
"pmoserver",
"quick-xml 0.37.5",
"quick-xml",
"rusqlite",
"serde",
"serde_json",
@@ -3721,7 +3721,7 @@ dependencies = [
"pmodidl",
"pmoserver",
"pmoupnp",
"quick-xml 0.38.4",
"quick-xml",
"ratatui",
"rust_cast",
"rustls",
@@ -3769,7 +3769,7 @@ dependencies = [
"bevy_reflect",
"bevy_reflect_derive",
"pmoutils",
"quick-xml 0.38.4",
"quick-xml",
"serde",
"utoipa",
"utoipa-swagger-ui",
@@ -3790,7 +3790,7 @@ dependencies = [
"opus",
"pmometadata",
"tempfile",
"thiserror 1.0.69",
"thiserror 2.0.17",
"tokio",
"tracing",
]
@@ -3804,7 +3804,7 @@ dependencies = [
"once_cell",
"pmodidl",
"pmoupnp",
"quick-xml 0.38.4",
"quick-xml",
]
[[package]]
@@ -3827,10 +3827,10 @@ dependencies = [
"pmosource",
"pmoupnp",
"pmoutils",
"quick-xml 0.38.4",
"quick-xml",
"serde",
"serde_json",
"thiserror 1.0.69",
"thiserror 2.0.17",
"tokio",
"tokio-util",
"tracing",
@@ -3909,7 +3909,7 @@ dependencies = [
"rusqlite",
"serde",
"serde_json",
"thiserror 1.0.69",
"thiserror 2.0.17",
"tokio",
"tokio-stream",
"tracing",
@@ -3946,7 +3946,7 @@ dependencies = [
"serde_yaml",
"sha1",
"tempfile",
"thiserror 1.0.69",
"thiserror 2.0.17",
"tokio",
"tokio-test",
"tracing",
@@ -3998,7 +3998,7 @@ dependencies = [
"pmoupnp",
"serde",
"serde_json",
"thiserror 1.0.69",
"thiserror 2.0.17",
"tokio",
"tokio-stream",
"tracing",
@@ -4030,7 +4030,7 @@ dependencies = [
"pmoplaylist",
"pmoserver",
"pmoutils",
"quick-xml 0.37.5",
"quick-xml",
"reqwest",
"serde",
"serde_json",
@@ -4053,7 +4053,7 @@ dependencies = [
"get_if_addrs",
"netstat2",
"os_info",
"quick-xml 0.38.4",
"quick-xml",
"sysinfo",
"users",
"xmltree 0.10.3",
@@ -4337,16 +4337,6 @@ version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3"
[[package]]
name = "quick-xml"
version = "0.37.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb"
dependencies = [
"memchr",
"serde",
]
[[package]]
name = "quick-xml"
version = "0.38.4"

View File

@@ -21,3 +21,35 @@ members = [
"pmoflac",
"pmometadata", "pmocontrol",
]
[workspace.dependencies]
# Core
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_yaml = "0.9"
# Async runtime
tokio = { version = "1.35", features = ["full"] }
tokio-util = { version = "0.7", features = ["io"] }
async-trait = "0.1"
# Error handling
anyhow = "1.0"
thiserror = "2.0" # ⚠️ Unifier sur 2.0 (vous avez 1.0 et 2.0)
# Logging
tracing = "0.1.41"
tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }
# HTTP/XML
reqwest = { version = "0.12", default-features = false }
ureq = "3.1"
quick-xml = { version = "0.38", features = ["serialize"] } # ⚠️ Unifier 0.37→0.38
# Utilities
chrono = { version = "0.4", features = ["serde"] }
uuid = { version = "1.18", features = ["v4"] }
crossbeam-channel = "0.5"
# Testing
tokio-test = "0.4"

View File

@@ -16,8 +16,8 @@ pmoaudio-ext = { path = "../pmoaudio-ext", features = ["all"] }
pmoapp = { path = "../pmoapp", features = ["pmoserver"] }
pmocontrol = { path = "../pmocontrol", features = ["pmoserver"] }
tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync", "time","signal"] }
tracing = "0.1.41"
tokio = { workspace = true, features = ["rt-multi-thread", "macros", "sync", "time", "signal"] }
tracing = { workspace = true }
tracing-subscriber = "0.3.20"
axum = "0.8.4"
serde_json = "1.0.145"

View File

@@ -0,0 +1,25 @@
[package]
name = "PMOMusic"
version = "0.1.0"
edition = "2024"
[dependencies]
pmoconfig = { path = "../pmoconfig" }
pmoupnp = { path = "../pmoupnp"}
pmomediarenderer = { path = "../pmomediarenderer" }
pmomediaserver = { path = "../pmomediaserver", features = ["qobuz", "paradise", "paradise-api", "api"] }
pmosource = { path = "../pmosource", features = ["server"] }
pmoserver = { path = "../pmoserver" }
pmocovers = { path = "../pmocovers", features = ["pmoserver"] }
pmoaudiocache = { path = "../pmoaudiocache", features = ["pmoserver"]}
pmoaudio-ext = { path = "../pmoaudio-ext", features = ["all"] }
pmoapp = { path = "../pmoapp", features = ["pmoserver"] }
pmocontrol = { path = "../pmocontrol", features = ["pmoserver"] }
tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync", "time","signal"] }
tracing = "0.1.41"
tracing-subscriber = "0.3.20"
axum = "0.8.4"
serde_json = "1.0.145"
utoipa = "5.4"
console-subscriber = "0.4.1"

15
pmoapp/Cargo.toml.backup Normal file
View File

@@ -0,0 +1,15 @@
[package]
name = "pmoapp"
version = "0.1.0"
edition = "2021"
[dependencies]
rust-embed = "8.5.0"
[dependencies.pmoserver]
path = "../pmoserver"
optional = true
[features]
default = []
pmoserver = ["dep:pmoserver"]

View File

@@ -18,7 +18,7 @@ pmoplaylist = { path = "../pmoplaylist", optional = true }
pmocache = { path = "../pmocache", optional = true }
# Async runtime
tokio = { version = "1.0", features = ["full"] }
tokio = { workspace = true }
tokio-util = { version = "0.7" }
async-trait = "0.1"
@@ -28,8 +28,8 @@ rand = "0.8"
# HTTP streaming dependencies
bytes = { version = "1.0", optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
serde = { workspace = true, optional = true }
serde_json = { workspace = true, optional = true }
[features]
default = []

View File

@@ -8,9 +8,9 @@ default = []
simd = []
[dependencies]
tokio = { version = "1.42", features = ["full"] }
tokio = { workspace = true }
tokio-util = { version = "0.7", features = ["io"] }
async-trait = "0.1"
async-trait = { workspace = true }
futures-util = "0.3"
pmoflac = { path = "../pmoflac" }
pmometadata = { path = "../pmometadata" }
@@ -18,7 +18,7 @@ paste = "1"
soxr = "0.6.0"
bytemuck = "1.24.0"
reqwest = { version = "0.12", features = ["stream"] }
tracing = "0.1"
tracing = { workspace = true }
cpal = "0.15"
once_cell = "1.20"
@@ -26,4 +26,4 @@ once_cell = "1.20"
tokio-test = "0.4"
tempfile = "3"
wiremock = "0.6"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tracing-subscriber = { workspace = true }

29
pmoaudio/Cargo.toml.backup Executable file
View File

@@ -0,0 +1,29 @@
[package]
name = "pmoaudio"
version = "0.1.0"
edition = "2021"
[features]
default = []
simd = []
[dependencies]
tokio = { version = "1.42", features = ["full"] }
tokio-util = { version = "0.7", features = ["io"] }
async-trait = "0.1"
futures-util = "0.3"
pmoflac = { path = "../pmoflac" }
pmometadata = { path = "../pmometadata" }
paste = "1"
soxr = "0.6.0"
bytemuck = "1.24.0"
reqwest = { version = "0.12", features = ["stream"] }
tracing = "0.1"
cpal = "0.15"
once_cell = "1.20"
[dev-dependencies]
tokio-test = "0.4"
tempfile = "3"
wiremock = "0.6"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }

View File

@@ -16,7 +16,7 @@ pmometadata = { path = "../pmometadata" }
# Base de données
rusqlite = { version = "0.37", features = ["bundled"] }
chrono = "0.4"
chrono = { workspace = true }
# Métadonnées audio
lofty = "0.22"
@@ -26,15 +26,15 @@ futures-util = "0.3"
bytes = "1.0"
# Utilitaires
anyhow = "1.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
quick-xml = { version = "0.37", features = ["serialize"] }
anyhow = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
quick-xml = { workspace = true }
paste = "1.0"
async-trait = "0.1"
async-trait = { workspace = true }
# Async
tokio = { version = "1.0", features = ["full"] }
tokio = { workspace = true }
# Singleton
once_cell = "1.20"
@@ -45,7 +45,7 @@ pmoconfig = { path = "../pmoconfig", optional = true }
axum = { version = "0.8", optional = true }
utoipa = { version = "5.3", features = ["axum_extras"], optional = true }
tracing = "0.1.41"
tracing = { workspace = true }
[dev-dependencies]
tracing-subscriber = "0.3"

View File

@@ -0,0 +1,57 @@
[package]
name = "pmoaudiocache"
version = "0.1.0"
edition = "2021"
[dependencies]
# Cache générique
pmocache = { path = "../pmocache" }
# DIDL-Lite pour UPnP
pmodidl = { path = "../pmodidl" }
# Streaming FLAC asynchrone
pmoflac = { path = "../pmoflac" }
pmometadata = { path = "../pmometadata" }
# Base de données
rusqlite = { version = "0.37", features = ["bundled"] }
chrono = "0.4"
# Métadonnées audio
lofty = "0.22"
# Outils de streaming
futures-util = "0.3"
bytes = "1.0"
# Utilitaires
anyhow = "1.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
quick-xml = { version = "0.38", features = ["serialize"] }
paste = "1.0"
async-trait = "0.1"
# Async
tokio = { version = "1.0", features = ["full"] }
# Singleton
once_cell = "1.20"
# Serveur HTTP (optionnel pour l'extension)
pmoserver = { path = "../pmoserver", optional = true }
pmoconfig = { path = "../pmoconfig", optional = true }
axum = { version = "0.8", optional = true }
utoipa = { version = "5.3", features = ["axum_extras"], optional = true }
tracing = "0.1.41"
[dev-dependencies]
tracing-subscriber = "0.3"
tempfile = "3"
[features]
default = ["pmoserver"]
pmoconfig = ["dep:pmoconfig", "pmocache/pmoconfig"]
pmoserver = ["pmoconfig", "dep:pmoserver", "dep:axum", "dep:utoipa", "pmocache/pmoserver", "pmocache/openapi"]

View File

@@ -394,7 +394,7 @@ impl TrackMetadata for AudioCacheTrackMetadata {
}
async fn touch(&mut self) -> MetadataResult<()> {
self.write_timestamp(Instant::now())?;
self.write_timestamp(SystemTime::now())?;
Ok(Some(()))
}
}

View File

@@ -17,21 +17,21 @@ sha2 = "0.10"
hex = "0.4"
# Utilitaires
anyhow = "1.0"
async-trait = "0.1"
chrono = "0.4"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
anyhow = { workspace = true }
async-trait = { workspace = true }
chrono = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
bytes = "1.6"
paste = "1.0"
pmoflac = { path = "../pmoflac" }
# Async
tokio = { version = "1.0", features = ["full"] }
tokio = { workspace = true }
tokio-util = { version = "0.7", features = ["io"] }
# Logging
tracing = "0.1"
tracing = { workspace = true }
# Feature pour OpenAPI
utoipa = { version = "5.3", optional = true }

View File

@@ -0,0 +1,53 @@
[package]
name = "pmocache"
version = "0.1.0"
edition = "2021"
[dependencies]
# Base de données
rusqlite = { version = "0.37.0", features = ["bundled"] }
# HTTP client
reqwest = { version = "0.12", features = ["blocking", "stream"] }
futures-util = "0.3"
# Cryptographie
sha1 = "0.10"
sha2 = "0.10"
hex = "0.4"
# Utilitaires
anyhow = "1.0"
async-trait = "0.1"
chrono = "0.4"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
bytes = "1.6"
paste = "1.0"
pmoflac = { path = "../pmoflac" }
# Async
tokio = { version = "1.0", features = ["full"] }
tokio-util = { version = "0.7", features = ["io"] }
# Logging
tracing = "0.1"
# Feature pour OpenAPI
utoipa = { version = "5.3", optional = true }
# Feature pour pmoserver (extension HTTP)
axum = { version = "0.8", optional = true }
# Feature pour pmoconfig (extension de configuration)
pmoconfig = { path = "../pmoconfig", optional = true }
serde_yaml = { version = "0.9", optional = true }
[dev-dependencies]
tempfile = "3"
[features]
default = []
openapi = ["dep:utoipa"]
pmoserver = ["dep:axum"]
pmoconfig = ["dep:pmoconfig", "dep:serde_yaml"]

View File

@@ -7,21 +7,21 @@ edition = "2021"
[dependencies]
pmoutils ={ path = "../pmoutils" }
serde = { version = "1.0", features = ["derive"] }
serde_yaml = "0.9.33"
serde_json = "1.0"
serde = { workspace = true }
serde_yaml = { workspace = true }
serde_json = { workspace = true }
lazy_static = "1.4.0"
dirs = "6.0.0"
log = "0.4.20"
anyhow = "1.0.75"
uuid = { version = "1.18.1", features = ["v4"] }
tracing = "0.1.41"
uuid = { workspace = true }
tracing = { workspace = true }
aes-gcm = "0.10"
sha2 = "0.10"
base64 = "0.22"
# Async
tokio = { version = "1.0", features = ["full"], optional = true }
tokio = { workspace = true, optional = true }
# Serveur HTTP (pour l'API REST)
axum = { version = "0.8", optional = true }

View File

@@ -0,0 +1,32 @@
[package]
name = "pmoconfig"
version = "0.1.0"
edition = "2021"
[dependencies]
pmoutils ={ path = "../pmoutils" }
serde = { version = "1.0", features = ["derive"] }
serde_yaml = "0.9.33"
serde_json = "1.0"
lazy_static = "1.4.0"
dirs = "6.0.0"
log = "0.4.20"
anyhow = "1.0.75"
uuid = { version = "1.18.1", features = ["v4"] }
tracing = "0.1.41"
aes-gcm = "0.10"
sha2 = "0.10"
base64 = "0.22"
# Async
tokio = { version = "1.0", features = ["full"], optional = true }
# Serveur HTTP (pour l'API REST)
axum = { version = "0.8", optional = true }
utoipa = { version = "5.3", features = ["axum_extras"], optional = true }
[features]
default = []
api = ["dep:tokio", "dep:axum", "dep:utoipa"]

View File

@@ -6,13 +6,13 @@ edition = "2024"
[dependencies]
pmoupnp = { path = "../pmoupnp" }
pmodidl = { path = "../pmodidl" }
quick-xml = "0.38.4"
thiserror = "2.0.17"
quick-xml = { workspace = true }
thiserror = { workspace = true }
ureq = "3.1.4"
tracing = "0.1.41"
tracing = { workspace = true }
tracing-subscriber = "0.3"
tracing-log = "0.1"
anyhow = "1.0"
anyhow = { workspace = true }
xmltree = "0.11.0"
crossbeam-channel = "0.5"
ratatui = { version = "0.26", default-features = false, features = ["crossterm"] }
@@ -28,9 +28,9 @@ smol = "2.0"
pmoserver = { path = "../pmoserver", optional = true }
utoipa = { version = "5.4.0", optional = true }
axum = { version = "0.8.4", optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
tokio = { version = "1", features = ["sync", "rt"], optional = true }
serde = { workspace = true, optional = true }
serde_json = { workspace = true, optional = true }
tokio = { workspace = true, features = ["sync", "rt"], optional = true }
tokio-util = { version = "0.7", optional = true }
async-trait = { version = "0.1", optional = true }
tokio-stream = { version = "0.1", features = ["sync"], optional = true }
@@ -38,8 +38,8 @@ async-stream = { version = "0.3", optional = true }
chrono = { version = "0.4", features = ["serde"], optional = true }
[dev-dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde = { workspace = true }
serde_json = { workspace = true }
percent-encoding = "2.3"
[features]

View File

@@ -0,0 +1,48 @@
[package]
name = "pmocontrol"
version = "0.1.0"
edition = "2024"
[dependencies]
pmoupnp = { path = "../pmoupnp" }
pmodidl = { path = "../pmodidl" }
quick-xml = "0.38.4"
thiserror = "2.0.17"
ureq = "3.1.4"
tracing = "0.1.41"
tracing-subscriber = "0.3"
tracing-log = "0.1"
anyhow = "1.0"
xmltree = "0.11.0"
crossbeam-channel = "0.5"
ratatui = { version = "0.26", default-features = false, features = ["crossterm"] }
crossterm = "0.27"
rust_cast = "0.19"
rustls = { version = "0.23", features = ["aws-lc-rs"] }
mdns = "3.0"
async-std = "1.12"
futures-util = "0.3"
smol = "2.0"
# pmoserver extension support (optional)
pmoserver = { path = "../pmoserver", optional = true }
utoipa = { version = "5.4.0", optional = true }
axum = { version = "0.8.4", optional = true }
serde = { version = "1.0", features = ["derive"], optional = true }
serde_json = { version = "1.0", optional = true }
tokio = { version = "1", features = ["sync", "rt"], optional = true }
tokio-util = { version = "0.7", optional = true }
async-trait = { version = "0.1", optional = true }
tokio-stream = { version = "0.1", features = ["sync"], optional = true }
async-stream = { version = "0.3", optional = true }
chrono = { version = "0.4", features = ["serde"], optional = true }
[dev-dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
percent-encoding = "2.3"
[features]
default = []
# Active l'API REST pmoserver
pmoserver = ["dep:pmoserver", "dep:utoipa", "dep:axum", "dep:serde", "dep:serde_json", "dep:tokio", "dep:tokio-util", "dep:async-trait", "dep:tokio-stream", "dep:async-stream", "dep:chrono"]

View File

@@ -15,12 +15,12 @@ webp = "0.3"
reqwest = { version = "0.12", features = ["blocking"] }
# Utilitaires
anyhow = "1.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
anyhow = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
# Async
tokio = { version = "1.0", features = ["full"] }
tokio = { workspace = true }
# Singleton
once_cell = "1.20"
@@ -32,7 +32,7 @@ async-trait = { version = "0.1", optional = true }
axum = { version = "0.8", optional = true }
utoipa = { version = "5.3", features = ["axum_extras"], optional = true }
tracing = "0.1.41"
tracing = { workspace = true }
[dev-dependencies]
tempfile = "3"

View File

@@ -0,0 +1,51 @@
[package]
name = "pmocovers"
version = "0.1.0"
edition = "2021"
[dependencies]
# Cache générique
pmocache = { path = "../pmocache" }
# Gestion d'images
image = "0.25"
webp = "0.3"
# HTTP client
reqwest = { version = "0.12", features = ["blocking"] }
# Utilitaires
anyhow = "1.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
# Async
tokio = { version = "1.0", features = ["full"] }
# Singleton
once_cell = "1.20"
# Serveur HTTP (optionnel pour l'extension)
pmoserver = { path = "../pmoserver", optional = true }
pmoconfig = { path = "../pmoconfig", optional = true }
async-trait = { version = "0.1", optional = true }
axum = { version = "0.8", optional = true }
utoipa = { version = "5.3", features = ["axum_extras"], optional = true }
tracing = "0.1.41"
[dev-dependencies]
tempfile = "3"
[features]
default = ["pmoserver"]
pmoconfig = ["dep:pmoconfig", "pmocache/pmoconfig"]
pmoserver = [
"pmoconfig",
"dep:pmoserver",
"dep:axum",
"dep:utoipa",
"pmocache/openapi",
"pmocache/pmoserver",
"dep:async-trait",
]

View File

@@ -4,10 +4,10 @@ version = "0.1.0"
edition = "2024"
[dependencies]
serde = "1.0.228"
serde = { workspace = true }
utoipa = { version = "5.4.0", features = ["axum_extras"] }
utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] }
quick-xml = { version = "0.38.3", features = ["serialize"] }
quick-xml = { workspace = true }
bevy_reflect = "0.17.1"
bevy_reflect_derive = "0.17.1"
pmoutils = { path = "../pmoutils" }

14
pmodidl/Cargo.toml.backup Normal file
View File

@@ -0,0 +1,14 @@
[package]
name = "pmodidl"
version = "0.1.0"
edition = "2024"
[dependencies]
serde = "1.0.228"
utoipa = { version = "5.4.0", features = ["axum_extras"] }
utoipa-swagger-ui = { version = "9.0.2", features = ["axum"] }
quick-xml = { version = "0.38.3", features = ["serialize"] }
bevy_reflect = "0.17.1"
bevy_reflect_derive = "0.17.1"
pmoutils = { path = "../pmoutils" }
xmltree = "0.10"

View File

@@ -5,6 +5,7 @@
use bevy_reflect::Reflect;
use pmoutils::ToXmlElement;
use serde::{Deserialize, Serialize};
use std::time::SystemTime;
use std::{borrow::Cow, time::Instant};
use std::collections::HashSet;
use std::fmt::Write;
@@ -36,7 +37,7 @@ pub struct ParsedMetadata<T> {
/// Timestamp du parsing (exclu de la réflexion car SystemTime n'implémente pas Reflect)
#[reflect(ignore)]
#[serde(skip_serializing_if = "Option::is_none")]
pub parsed_at: Option<Instant>,
pub parsed_at: Option<SystemTime>,
}
impl<T> ParsedMetadata<T> {
@@ -44,7 +45,7 @@ impl<T> ParsedMetadata<T> {
Self {
format: format.into(),
data,
parsed_at: Some(Instant::now()),
parsed_at: Some(SystemTime::now()),
}
}

View File

@@ -20,10 +20,10 @@ lofty = "0.22"
minimp3 = "0.5"
opus = "0.3"
pmometadata = { path = "../pmometadata" }
thiserror = "1.0"
tokio = { version = "1.37", features = ["rt", "rt-multi-thread", "macros", "sync", "io-util", "fs"] }
tracing = "0.1"
thiserror = { workspace = true }
tokio = { workspace = true, features = ["rt", "rt-multi-thread", "macros", "sync", "io-util", "fs"] }
tracing = { workspace = true }
[dev-dependencies]
tempfile = "3.10"
tokio = { version = "1.37", features = ["rt", "rt-multi-thread", "macros", "sync", "io-util", "time", "fs"] }
tokio = { workspace = true, features = ["rt", "rt-multi-thread", "macros", "sync", "io-util", "time", "fs"] }

29
pmoflac/Cargo.toml.backup Executable file
View File

@@ -0,0 +1,29 @@
[package]
name = "pmoflac"
version = "0.1.0"
edition = "2021"
authors = ["PMOMusic"]
description = "Asynchronous FLAC <-> PCM streaming utilities"
license = "MIT"
[lib]
name = "pmoflac"
path = "src/lib.rs"
[dependencies]
bytes = "1.6"
claxon = "0.4"
lewton = "0.10"
libc = "0.2"
libflac-sys = { version = "0.3.3", default-features = false, features = ["build-flac"] }
lofty = "0.22"
minimp3 = "0.5"
opus = "0.3"
pmometadata = { path = "../pmometadata" }
thiserror = "2.0"
tokio = { version = "1.37", features = ["rt", "rt-multi-thread", "macros", "sync", "io-util", "fs"] }
tracing = "0.1"
[dev-dependencies]
tempfile = "3.10"
tokio = { version = "1.37", features = ["rt", "rt-multi-thread", "macros", "sync", "io-util", "time", "fs"] }

View File

@@ -10,4 +10,4 @@ pmodidl = { path = "../pmodidl" }
once_cell = "1.20"
bevy_reflect = "0.17.1"
htmlescape = "0.3"
quick-xml = "0.38.3"
quick-xml = { workspace = true }

View File

@@ -0,0 +1,13 @@
[package]
name = "pmomediarenderer"
version = "0.1.0"
edition = "2024"
[dependencies]
pmoupnp = { path = "../pmoupnp" }
pmodidl = { path = "../pmodidl" }
once_cell = "1.20"
bevy_reflect = "0.17.1"
htmlescape = "0.3"
quick-xml = "0.38.3"

View File

@@ -11,13 +11,13 @@ pmoserver = { path = "../pmoserver" }
once_cell = "1.20"
bevy_reflect = "0.17.1"
tokio = { version = "1", features = ["sync"] }
async-trait = "0.1"
tracing = "0.1"
quick-xml = { version = "0.38.3", features = ["serialize"] }
thiserror = "1.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { workspace = true, features = ["sync"] }
async-trait = { workspace = true }
tracing = { workspace = true }
quick-xml = { workspace = true }
thiserror = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
pmoutils = { path = "../pmoutils" }
# Optional dependencies

View File

@@ -0,0 +1,54 @@
[package]
name = "pmomediaserver"
version = "0.1.0"
edition = "2024"
[dependencies]
pmoupnp = { path = "../pmoupnp" }
pmodidl = { path = "../pmodidl" }
pmosource = { path = "../pmosource" }
pmoserver = { path = "../pmoserver" }
once_cell = "1.20"
bevy_reflect = "0.17.1"
tokio = { version = "1", features = ["sync"] }
async-trait = "0.1"
tracing = "0.1"
quick-xml = { version = "0.38.3", features = ["serialize"] }
thiserror = "2.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
pmoutils = { path = "../pmoutils" }
# Optional dependencies
axum = { version = "0.8", optional = true }
utoipa = { version = "5.3", optional = true }
pmoqobuz = { path = "../pmoqobuz", optional = true }
pmoparadise = { path = "../pmoparadise", optional = true }
pmoconfig = { path = "../pmoconfig", optional = true }
anyhow = { version = "1.0", optional = true }
pmoaudiocache = { path = "../pmoaudiocache", optional = true }
pmocovers = { path = "../pmocovers", optional = true, features = ["pmoserver"] }
pmoplaylist = { path = "../pmoplaylist", optional = true }
tokio-util = { version = "0.7", features = ["io"], optional = true }
[features]
default = ["pmosource/server"]
# Feature pour activer l'API REST de gestion des sources
api = ["dep:axum", "dep:utoipa", "pmosource/server"]
# Feature pour activer le support Qobuz configuré
qobuz = ["api", "dep:pmoqobuz", "dep:pmoconfig", "pmoqobuz/server"]
# Feature pour activer le support Radio Paradise
paradise = [
"api",
"dep:pmoparadise",
"pmoparadise/full",
"dep:anyhow",
"dep:pmoaudiocache",
"dep:pmocovers",
"pmocovers/pmoserver",
"dep:pmoplaylist",
"dep:tokio-util"
]
# Feature pour activer l'API REST de Radio Paradise (en plus de la source UPnP)
paradise-api = ["paradise", "pmoparadise/pmoserver"]

View File

@@ -6,8 +6,8 @@ edition = "2024"
[dependencies]
async-trait = "0.1.89"
paste = "1"
thiserror = "2.0.17"
tokio = { version = "1", features = ["full"] }
thiserror = { workspace = true }
tokio = { workspace = true }
[dev-dependencies]
tokio-test = "0.4"

View File

@@ -0,0 +1,13 @@
[package]
name = "pmometadata"
version = "0.1.0"
edition = "2024"
[dependencies]
async-trait = "0.1.89"
paste = "1"
thiserror = "2.0.17"
tokio = { version = "1", features = ["full"] }
[dev-dependencies]
tokio-test = "0.4"

View File

@@ -840,7 +840,7 @@ impl TrackMetadata for MemoryTrackMetadata {
}
async fn touch(&mut self) -> MetadataResult<()> {
self.updated_at = Some());
self.updated_at = Some(SystemTime::now());
Ok(Some(()))
}
}

View File

@@ -14,16 +14,16 @@ categories = ["multimedia", "api-bindings"]
reqwest = { version = "0.12", features = ["json", "stream"] }
# Gestion asynchrone
tokio = { version = "1", features = ["full"] }
tokio = { workspace = true }
# Sérialisation/Désérialisation JSON
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_yaml = "0.9.33"
serde = { workspace = true }
serde_json = { workspace = true }
serde_yaml = { workspace = true }
# Helpers
chrono = { version = "0.4", features = ["serde"] }
async-trait = "0.1"
chrono = { workspace = true }
async-trait = { workspace = true }
sha2 = "0.10"
hex = "0.4"
tokio-util = { version = "0.7", features = ["io"] }
@@ -32,8 +32,8 @@ rusqlite = { version = "0.37", features = ["bundled"] }
once_cell = "1.20"
# Gestion des erreurs
thiserror = "2.0.17"
anyhow = "1.0"
thiserror = { workspace = true }
anyhow = { workspace = true }
# Streaming de bytes
bytes = "1.5"
@@ -41,7 +41,7 @@ futures = "0.3"
flacenc = "0.5.0"
# Logging
tracing = "0.1"
tracing = { workspace = true }
# URL manipulation
url = "2.5"

View File

@@ -0,0 +1,121 @@
[package]
name = "pmoparadise"
version = "0.1.0"
edition = "2021"
authors = ["PMOMusic Contributors"]
description = "Rust client for Radio Paradise streaming service"
license = "MIT OR Apache-2.0"
repository = "https://github.com/yourusername/pmomusic"
keywords = ["radio", "paradise", "streaming", "music", "flac"]
categories = ["multimedia", "api-bindings"]
[dependencies]
# HTTP client pour les requêtes à l'API Radio Paradise
reqwest = { version = "0.12", features = ["json", "stream"] }
# Gestion asynchrone
tokio = { version = "1", features = ["full"] }
# Sérialisation/Désérialisation JSON
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_yaml = "0.9.33"
# Helpers
chrono = { version = "0.4", features = ["serde"] }
async-trait = "0.1"
sha2 = "0.10"
hex = "0.4"
tokio-util = { version = "0.7", features = ["io"] }
async-stream = "0.3"
rusqlite = { version = "0.37", features = ["bundled"] }
once_cell = "1.20"
# Gestion des erreurs
thiserror = "2.0.17"
anyhow = "1.0"
# Streaming de bytes
bytes = "1.5"
futures = "0.3"
flacenc = "0.5.0"
# Logging
tracing = "0.1"
# URL manipulation
url = "2.5"
# Audio decoding/encoding
symphonia = { version = "0.5", features = ["all"] }
# Audio decoding - claxon for FLAC streaming
claxon = "0.4"
# pmoaudio-ext with playlist support (optional for examples)
pmoaudio-ext = { path = "../pmoaudio-ext", optional = true, features = ["playlist", "http-stream", "cache-sink"] }
# Common music source traits
pmosource = { path = "../pmosource" }
# Playlist management for FIFO support
pmoplaylist = { path = "../pmoplaylist" }
pmoconfig = { path = "../pmoconfig", optional = true }
# Cache support (OBLIGATOIRE - architecture refactorisée)
pmocovers = { path = "../pmocovers" }
pmoaudiocache = { path = "../pmoaudiocache" }
# pmoserver extension support
pmoserver = { path = "../pmoserver", optional = true }
utoipa = { version = "5.4.0", optional = true }
axum = { version = "0.8.4", optional = true }
# pmoaudio node support
pmoaudio = { path = "../pmoaudio", optional = true }
pmoflac = { path = "../pmoflac", optional = true }
pmometadata = { path = "../pmometadata", optional = true }
futures-util = { version = "0.3", optional = true }
[features]
default = ["metadata-only", "pmoconfig", "playlist"]
# Mode métadonnées seules (pas de décodage FLAC)
metadata-only = []
# Active l'API REST pmoserver
pmoserver = ["dep:pmoserver", "dep:utoipa", "dep:axum", "server"]
# Feature pour activer le support serveur (cache registry)
server = ["pmosource/server", "pmoconfig"]
# Feature pour activer le support de pmoconfig
pmoconfig = ["dep:pmoconfig"]
# Feature pour activer le support des playlists d'historique
playlist = []
# Feature cache (deprecated - toujours actif maintenant)
cache = []
# Active le support pmoaudio node (RadioParadiseStreamSource)
pmoaudio = ["dep:pmoaudio", "dep:pmoflac", "dep:pmometadata", "dep:futures-util", "dep:pmoaudio-ext"]
# Active le support complet avec playlist (pour les exemples avancés)
full = ["pmoaudio", "dep:pmoaudio-ext", "pmoconfig", "pmoserver", "playlist"]
[dev-dependencies]
# Tests
tokio-test = "0.4"
wiremock = "0.6"
# Pour les exemples avec logging
tracing-subscriber = "0.3"
# Pour l'exemple with_cache
pmocovers = { path = "../pmocovers" }
pmoaudiocache = { path = "../pmoaudiocache" }
[[example]]
name = "now_playing"
path = "examples/now_playing.rs"
[[example]]
name = "stream_block"
path = "examples/stream_block.rs"
required-features = ["full"]
[[example]]
name = "single_channel_server"
path = "examples/single_channel_server.rs"
required-features = ["full"]

View File

@@ -21,20 +21,20 @@ pmoconfig = { path = "../pmoconfig", optional = true }
rusqlite = { version = "0.37", features = ["bundled"] }
# Utilitaires
anyhow = "1.0"
thiserror = "1.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
anyhow = { workspace = true }
thiserror = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
# Async
tokio = { version = "1.0", features = ["full"] }
tokio = { workspace = true }
# Singleton
once_cell = "1.20"
# Logging
tracing = "0.1"
chrono = { version = "0.4", features = ["serde"] }
tracing = { workspace = true }
chrono = { workspace = true }
axum = { version = "0.8", optional = true, features = ["macros", "json"] }
tokio-stream = { version = "0.1", optional = true, features = ["sync"] }
utoipa = { version = "5.4", optional = true, features = ["axum_extras", "chrono"] }

View File

@@ -0,0 +1,46 @@
[package]
name = "pmoplaylist"
version = "0.1.0"
edition = "2021"
[dependencies]
# Caches PMO
pmoaudiocache = { path = "../pmoaudiocache" }
pmocache = { path = "../pmocache" }
# Métadonnées
pmometadata = { path = "../pmometadata" }
# DIDL-Lite pour UPnP
pmodidl = { path = "../pmodidl" }
# Configuration (optionnelle)
pmoconfig = { path = "../pmoconfig", optional = true }
# Base de données
rusqlite = { version = "0.37", features = ["bundled"] }
# Utilitaires
anyhow = "1.0"
thiserror = "2.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
# Async
tokio = { version = "1.0", features = ["full"] }
# Singleton
once_cell = "1.20"
# Logging
tracing = "0.1"
chrono = { version = "0.4", features = ["serde"] }
axum = { version = "0.8", optional = true, features = ["macros", "json"] }
tokio-stream = { version = "0.1", optional = true, features = ["sync"] }
utoipa = { version = "5.4", optional = true, features = ["axum_extras", "chrono"] }
async-stream = { version = "0.3", optional = true }
[features]
default = ["pmoconfig"]
pmoconfig = ["dep:pmoconfig"]
pmoserver = ["dep:axum", "dep:tokio-stream", "dep:utoipa", "dep:async-stream"]

View File

@@ -13,16 +13,16 @@ async-trait = { version = "0.1", optional = true }
reqwest = { version = "0.12", features = ["json", "cookies"] }
# Gestion asynchrone
tokio = { version = "1", features = ["full"] }
tokio = { workspace = true }
# Sérialisation/Désérialisation JSON
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_yaml = "0.9"
serde = { workspace = true }
serde_json = { workspace = true }
serde_yaml = { workspace = true }
# Gestion des erreurs
anyhow = "1.0"
thiserror = "1.0"
anyhow = { workspace = true }
thiserror = { workspace = true }
# Hashing pour les clés de cache et signatures
sha1 = "0.10"
@@ -33,10 +33,10 @@ md-5 = "0.10"
moka = { version = "0.12", features = ["future"] }
# Logging
tracing = "0.1"
tracing = { workspace = true }
# Gestion du temps
chrono = { version = "0.4", features = ["serde"] }
chrono = { workspace = true }
# Configuration
pmoconfig = { path = "../pmoconfig" }

View File

@@ -0,0 +1,91 @@
[package]
name = "pmoqobuz"
version = "0.1.0"
edition = "2021"
[dependencies]
regex = "1.12"
base64 = "0.22"
indexmap = "2.0"
async-trait = { version = "0.1", optional = true }
# HTTP client pour les requêtes à l'API Qobuz
reqwest = { version = "0.12", features = ["json", "cookies"] }
# Gestion asynchrone
tokio = { version = "1", features = ["full"] }
# Sérialisation/Désérialisation JSON
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_yaml = "0.9"
# Gestion des erreurs
anyhow = "1.0"
thiserror = "2.0"
# Hashing pour les clés de cache et signatures
sha1 = "0.10"
hex = "0.4"
md-5 = "0.10"
# Cache en mémoire avec TTL
moka = { version = "0.12", features = ["future"] }
# Logging
tracing = "0.1"
# Gestion du temps
chrono = { version = "0.4", features = ["serde"] }
# Configuration
pmoconfig = { path = "../pmoconfig" }
# Intégration avec pmocovers pour le cache d'images (OBLIGATOIRE)
pmocovers = { path = "../pmocovers" }
# Intégration avec pmoaudiocache pour le cache audio (OBLIGATOIRE)
pmoaudiocache = { path = "../pmoaudiocache" }
# Intégration avec pmodidl pour l'export DIDL
pmodidl = { path = "../pmodidl" }
# Intégration avec pmoserver pour l'API HTTP
pmoserver = { path = "../pmoserver", optional = true }
axum = { version = "0.8", optional = true }
rusqlite = { version = "0.37", features = ["bundled"], optional = true }
# Documentation OpenAPI
utoipa = { version = "5.3", optional = true }
# Common music source traits
pmosource = { path = "../pmosource" }
# Playlist management
pmoplaylist = { path = "../pmoplaylist" }
pmocache = { path = "../pmocache" }
[features]
default = ["async-trait-support"]
# Feature pour activer les extensions pmoserver
pmoserver = ["dep:pmoserver", "dep:axum", "dep:utoipa"]
# Feature pour activer le support serveur (cache registry)
server = ["pmosource/server"]
# Feature cache (deprecated - toujours actif maintenant)
cache = []
async-trait-support = ["dep:async-trait"]
disk-cache = ["dep:rusqlite", "dep:async-trait"]
[dev-dependencies]
# Tests
tokio-test = "0.4"
mockito = "1.0"
tempfile = "3.0"
# Pour les exemples
tracing-subscriber = "0.3"
# Pour l'exemple spoofer
# Specify that the with_cache example requires the cache feature
[[example]]
name = "with_cache"
required-features = ["cache"]

View File

@@ -6,16 +6,16 @@ edition = "2024"
[dependencies]
pmoconfig = { path = "../pmoconfig", features = ["api"] }
anyhow = "1.0"
anyhow = { workspace = true }
axum = "0.8.4"
tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync", "time", "signal"] }
tokio = { workspace = true, features = ["rt-multi-thread", "macros", "sync", "time", "signal"] }
tokio-stream = "0.1"
tokio-util = "0.7"
futures-util = "0.3"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }
serde = { workspace = true }
serde_json = { workspace = true }
tracing = { workspace = true }
tracing-subscriber = { workspace = true }
futures = "0.3"
async-stream = "0.3.6"
axum-server = "0.7.2"

View File

@@ -0,0 +1,26 @@
[package]
name = "pmoserver"
version = "0.1.0"
edition = "2024"
[dependencies]
pmoconfig = { path = "../pmoconfig", features = ["api"] }
anyhow = "1.0"
axum = "0.8.4"
tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync", "time", "signal"] }
tokio-stream = "0.1"
tokio-util = "0.7"
futures-util = "0.3"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }
futures = "0.3"
async-stream = "0.3.6"
axum-server = "0.7.2"
axum-embed = "0.1.0"
rust-embed = "8.7.2"
utoipa = { version = "5.4.0", features = ["axum_extras"] }
utoipa-swagger-ui = { version = "9.0.2", features = ["axum", "vendored"] }
once_cell = "1.19"

View File

@@ -11,14 +11,14 @@ categories = ["multimedia"]
[dependencies]
# Gestion des erreurs
thiserror = "1.0"
anyhow = "1.0"
thiserror = { workspace = true }
anyhow = { workspace = true }
# Async traits
async-trait = "0.1"
async-trait = { workspace = true }
# Async runtime
tokio = { version = "1.0", features = ["sync", "time"] }
tokio = { workspace = true, features = ["sync", "time"] }
# DIDL-Lite support
pmodidl = { path = "../pmodidl" }
@@ -32,8 +32,8 @@ pmocovers = { path = "../pmocovers", optional = true }
pmocache = { path = "../pmocache", optional = true }
# Serialization (required for cache metadata)
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde = { workspace = true }
serde_json = { workspace = true }
# Server extension (optional)
pmoserver = { path = "../pmoserver", optional = true }

View File

@@ -0,0 +1,54 @@
[package]
name = "pmosource"
version = "0.1.0"
edition = "2021"
authors = ["PMOMusic Contributors"]
description = "Common traits and types for PMOMusic sources"
license = "MIT OR Apache-2.0"
repository = "https://github.com/yourusername/pmomusic"
keywords = ["music", "source", "streaming"]
categories = ["multimedia"]
[dependencies]
# Gestion des erreurs
thiserror = "2.0"
anyhow = "1.0"
# Async traits
async-trait = "0.1"
# Async runtime
tokio = { version = "1.0", features = ["sync", "time"] }
# DIDL-Lite support
pmodidl = { path = "../pmodidl" }
# Playlist/FIFO support
pmoplaylist = { path = "../pmoplaylist" }
# Optional cache integrations
pmoaudiocache = { path = "../pmoaudiocache", optional = true }
pmocovers = { path = "../pmocovers", optional = true }
pmocache = { path = "../pmocache", optional = true }
# Serialization (required for cache metadata)
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
# Server extension (optional)
pmoserver = { path = "../pmoserver", optional = true }
pmoconfig = { path = "../pmoconfig", optional = true }
pmoupnp = { path = "../pmoupnp", optional = true }
# Web framework for API (optional)
axum = { version = "0.8", optional = true }
utoipa = { version = "5.3", optional = true }
tracing = { version = "0.1", optional = true }
lazy_static = { version = "1.4", optional = true }
tokio-stream = { version = "0.1", optional = true, features = ["time"] }
futures = { version = "0.3", optional = true }
[features]
default = ["cache"]
cache = ["pmoaudiocache", "pmocovers", "pmocache"]
server = ["pmoserver", "pmoconfig", "pmoupnp", "axum", "utoipa", "tracing", "lazy_static", "tokio-stream", "futures"]

View File

@@ -13,24 +13,24 @@ pmoaudiocache = { path = "../pmoaudiocache", features = ["pmoserver"] }
pmoplaylist = { path = "../pmoplaylist", optional = true, features = ["pmoserver"] }
pmocache = { path = "../pmocache" }
async-trait = "0.1"
async-trait = { workspace = true }
async-recursion = "1.1"
url = "2.5.7"
uuid = "1.18.1"
hex = "0.4.3"
base64 = "0.22.1"
thiserror = "2.0.16"
anyhow = "1.0"
thiserror = { workspace = true }
anyhow = { workspace = true }
xmltree = "0.11.0"
axum = "0.8.4"
tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
quick-xml = { version = "0.37.5", features = ["serialize"] }
tokio = { workspace = true, features = ["rt-multi-thread", "macros", "sync"] }
serde = { workspace = true }
serde_json = { workspace = true }
quick-xml = { workspace = true }
chrono = { version = "0.4.42", features = ["serde"] }
once_cell = "1.20"
parking_lot = "0.12"
tracing = "0.1"
tracing = { workspace = true }
tracing-subscriber = "0.3"
bevy_reflect = "0.17.1"
bevy_reflect_derive = "0.17.1"
@@ -38,7 +38,7 @@ reqwest = "0.12.23"
utoipa = { version = "5.3", features = ["axum_extras"] }
socket2 = "0.5"
get_if_addrs = "0.5"
serde_yaml = "0.9"
serde_yaml = { workspace = true }
[features]
default = ["server"]

50
pmoupnp/Cargo.toml.backup Normal file
View File

@@ -0,0 +1,50 @@
[package]
name = "pmoupnp"
version = "0.1.0"
edition = "2024"
[dependencies]
pmoconfig = { path = "../pmoconfig" }
pmodidl = { path = "../pmodidl"}
pmoutils = { path = "../pmoutils" }
pmoserver = { path = "../pmoserver" }
pmocovers = { path = "../pmocovers", features = ["pmoserver"] }
pmoaudiocache = { path = "../pmoaudiocache", features = ["pmoserver"] }
pmoplaylist = { path = "../pmoplaylist", optional = true, features = ["pmoserver"] }
pmocache = { path = "../pmocache" }
async-trait = "0.1"
async-recursion = "1.1"
url = "2.5.7"
uuid = "1.18.1"
hex = "0.4.3"
base64 = "0.22.1"
thiserror = "2.0.16"
anyhow = "1.0"
xmltree = "0.11.0"
axum = "0.8.4"
tokio = { version = "1.35", features = ["rt-multi-thread", "macros", "sync"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
quick-xml = { version = "0.38.3", features = ["serialize"] }
chrono = { version = "0.4.42", features = ["serde"] }
once_cell = "1.20"
parking_lot = "0.12"
tracing = "0.1"
tracing-subscriber = "0.3"
bevy_reflect = "0.17.1"
bevy_reflect_derive = "0.17.1"
reqwest = "0.12.23"
utoipa = { version = "5.3", features = ["axum_extras"] }
socket2 = "0.5"
get_if_addrs = "0.5"
serde_yaml = "0.9"
[features]
default = ["server"]
server = ["pmoplaylist"]
paradise = []
qobuz = []
[target.'cfg(unix)'.dependencies]
libc = "0.2"

View File

@@ -9,5 +9,5 @@ os_info = "3.8"
netstat2 = "0.11"
sysinfo = "0.30"
users = "0.11"
quick-xml = "0.38.3"
quick-xml = { workspace = true }
xmltree = "0.10"

View File

@@ -0,0 +1,13 @@
[package]
name = "pmoutils"
version = "0.1.0"
edition = "2024"
[dependencies]
get_if_addrs = "0.5.3"
os_info = "3.8"
netstat2 = "0.11"
sysinfo = "0.30"
users = "0.11"
quick-xml = "0.38.3"
xmltree = "0.10"