diff --git a/src/client/url_resolver.rs b/src/client/url_resolver.rs index 40b1b66..3626505 100644 --- a/src/client/url_resolver.rs +++ b/src/client/url_resolver.rs @@ -260,7 +260,7 @@ impl RustyPipeQuery { }) } else if util::CHANNEL_ID_REGEX.is_match(s) { Ok(UrlTarget::Channel { id: s.to_owned() }) - } else if util::PLAYLIST_ID_REGEX.is_match(s) { + } else if util::PLAYLIST_ID_REGEX.is_match(s) || util::USER_PLAYLIST_IDS.contains(&s) { if resolve_albums && s.starts_with(util::PLAYLIST_ID_ALBUM_PREFIX) { self._navigation_resolve_url( &format!("/playlist?list={s}"), diff --git a/src/util/mod.rs b/src/util/mod.rs index 5e53ba7..edebaf9 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -43,6 +43,8 @@ pub const PLAYLIST_ID_ALBUM_PREFIX: &str = "OLAK"; pub const ARTIST_DISCOGRAPHY_PREFIX: &str = "MPAD"; pub const PODCAST_PLAYLIST_PREFIX: &str = "MPSP"; pub const PODCAST_EPISODE_PREFIX: &str = "MPED"; +/// Builtin user-specific playlists (Watch later, Liked videos, Liked tracks, Episodes for later) +pub static USER_PLAYLIST_IDS: [&str; 4] = ["WL", "LL", "LM", "SE"]; const CONTENT_PLAYBACK_NONCE_ALPHABET: &[u8; 64] = b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; diff --git a/src/validate.rs b/src/validate.rs index 7c43a61..0b3bce5 100644 --- a/src/validate.rs +++ b/src/validate.rs @@ -71,8 +71,9 @@ pub fn channel_id>(channel_id: S) -> Result<(), Error> { /// assert!(validate::playlist_id("Abcd").is_err()); /// ``` pub fn playlist_id>(playlist_id: S) -> Result<(), Error> { + let id = playlist_id.as_ref(); check( - util::PLAYLIST_ID_REGEX.is_match(playlist_id.as_ref()), + util::PLAYLIST_ID_REGEX.is_match(id) || util::USER_PLAYLIST_IDS.contains(&id), "invalid playlist id", ) }