fix: prevent direct playback of single-item playlists
Update `isNavigable` to explicitly validate `item.is_container` and disable navigation for playlists with only one item. This forces users to enter the playlist container, preserving metadata update benefits.
This commit is contained in:
@@ -289,8 +289,12 @@ function isPlayable(item: ContainerEntry): boolean {
|
|||||||
|
|
||||||
// Détermine si un container est navigable
|
// Détermine si un container est navigable
|
||||||
function isNavigable(item: ContainerEntry): boolean {
|
function isNavigable(item: ContainerEntry): boolean {
|
||||||
// Tous les containers sont navigables (on laisse le serveur décider si vide)
|
if (!item.is_container) return false;
|
||||||
return item.is_container;
|
// Une playlist avec un seul item : on garde le caractère jouable mais on retire
|
||||||
|
// la navigation pour éviter que l'utilisateur joue l'item directement et perde
|
||||||
|
// le bénéfice des mises à jour de métadonnées de la playlist.
|
||||||
|
if (isPlayable(item) && item.child_count === 1) return false;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleItemClick(item: ContainerEntry) {
|
function handleItemClick(item: ContainerEntry) {
|
||||||
|
|||||||
@@ -373,6 +373,7 @@ pub struct MediaEntry {
|
|||||||
pub is_container: bool,
|
pub is_container: bool,
|
||||||
pub class: String,
|
pub class: String,
|
||||||
pub resources: Vec<MediaResource>,
|
pub resources: Vec<MediaResource>,
|
||||||
|
pub child_count: Option<u32>,
|
||||||
pub artist: Option<String>,
|
pub artist: Option<String>,
|
||||||
pub album: Option<String>,
|
pub album: Option<String>,
|
||||||
pub genre: Option<String>,
|
pub genre: Option<String>,
|
||||||
@@ -709,6 +710,7 @@ fn map_didl_entries(xml: &str) -> Result<Vec<MediaEntry>, ControlPointError> {
|
|||||||
is_container: true,
|
is_container: true,
|
||||||
class: container.class,
|
class: container.class,
|
||||||
resources: Vec::new(),
|
resources: Vec::new(),
|
||||||
|
child_count: container.child_count.as_deref().and_then(|s| s.parse().ok()),
|
||||||
artist: container.artist,
|
artist: container.artist,
|
||||||
album: None,
|
album: None,
|
||||||
genre: None,
|
genre: None,
|
||||||
@@ -742,6 +744,7 @@ fn map_didl_entries(xml: &str) -> Result<Vec<MediaEntry>, ControlPointError> {
|
|||||||
is_container: false,
|
is_container: false,
|
||||||
class: item.class,
|
class: item.class,
|
||||||
resources,
|
resources,
|
||||||
|
child_count: None,
|
||||||
artist: item.artist,
|
artist: item.artist,
|
||||||
album: item.album,
|
album: item.album,
|
||||||
genre: item.genre,
|
genre: item.genre,
|
||||||
|
|||||||
@@ -2211,7 +2211,7 @@ async fn browse_container(
|
|||||||
title: e.title,
|
title: e.title,
|
||||||
class: e.class,
|
class: e.class,
|
||||||
is_container: e.is_container,
|
is_container: e.is_container,
|
||||||
child_count: None,
|
child_count: e.child_count,
|
||||||
artist: e.artist,
|
artist: e.artist,
|
||||||
album: e.album,
|
album: e.album,
|
||||||
album_art_uri,
|
album_art_uri,
|
||||||
@@ -2496,7 +2496,7 @@ async fn search_server(
|
|||||||
title: e.title,
|
title: e.title,
|
||||||
class: e.class,
|
class: e.class,
|
||||||
is_container: e.is_container,
|
is_container: e.is_container,
|
||||||
child_count: None,
|
child_count: e.child_count,
|
||||||
artist: e.artist,
|
artist: e.artist,
|
||||||
album: e.album,
|
album: e.album,
|
||||||
album_art_uri: e.album_art_uri,
|
album_art_uri: e.album_art_uri,
|
||||||
|
|||||||
Reference in New Issue
Block a user