diff --git a/src/client/channel.rs b/src/client/channel.rs index 4673c55..6094270 100644 --- a/src/client/channel.rs +++ b/src/client/channel.rs @@ -41,12 +41,13 @@ enum Params { } impl RustyPipeQuery { - async fn _channel_videos( + async fn _channel_videos>( &self, - channel_id: &str, + channel_id: S, params: Params, operation: &str, ) -> Result>, Error> { + let channel_id = channel_id.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QChannel { context, @@ -57,41 +58,42 @@ impl RustyPipeQuery { self.execute_request::( ClientType::Desktop, operation, - channel_id, + channel_id.as_ref(), "browse", &request_body, ) .await } - pub async fn channel_videos( + pub async fn channel_videos>( &self, - channel_id: &str, + channel_id: S, ) -> Result>, Error> { self._channel_videos(channel_id, Params::Videos, "channel_videos") .await } - pub async fn channel_shorts( + pub async fn channel_shorts>( &self, - channel_id: &str, + channel_id: S, ) -> Result>, Error> { self._channel_videos(channel_id, Params::Shorts, "channel_shorts") .await } - pub async fn channel_livestreams( + pub async fn channel_livestreams>( &self, - channel_id: &str, + channel_id: S, ) -> Result>, Error> { self._channel_videos(channel_id, Params::Live, "channel_livestreams") .await } - pub async fn channel_playlists( + pub async fn channel_playlists>( &self, - channel_id: &str, + channel_id: S, ) -> Result>, Error> { + let channel_id = channel_id.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QChannel { context, @@ -109,7 +111,11 @@ impl RustyPipeQuery { .await } - pub async fn channel_info(&self, channel_id: &str) -> Result, Error> { + pub async fn channel_info>( + &self, + channel_id: S, + ) -> Result, Error> { + let channel_id = channel_id.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QChannel { context, diff --git a/src/client/channel_rss.rs b/src/client/channel_rss.rs index 8ce758d..3e5f615 100644 --- a/src/client/channel_rss.rs +++ b/src/client/channel_rss.rs @@ -9,10 +9,10 @@ use crate::{ use super::{response, RustyPipeQuery}; impl RustyPipeQuery { - pub async fn channel_rss(&self, channel_id: &str) -> Result { + pub async fn channel_rss>(&self, channel_id: S) -> Result { let url = format!( "https://www.youtube.com/feeds/videos.xml?channel_id={}", - channel_id + channel_id.as_ref() ); let xml = self .client diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index de79cd9..8170881 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -26,11 +26,13 @@ struct QBrowseParams<'a> { } impl RustyPipeQuery { - pub async fn music_artist( + pub async fn music_artist>( &self, - artist_id: &str, + artist_id: S, all_albums: bool, ) -> Result { + let artist_id = artist_id.as_ref(); + if all_albums { let visitor_data = self.get_ytm_visitor_data().await?; let context = self diff --git a/src/client/music_details.rs b/src/client/music_details.rs index 69bcf58..1a48e67 100644 --- a/src/client/music_details.rs +++ b/src/client/music_details.rs @@ -37,7 +37,8 @@ struct QRadio<'a> { } impl RustyPipeQuery { - pub async fn music_details(&self, video_id: &str) -> Result { + pub async fn music_details>(&self, video_id: S) -> Result { + let video_id = video_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QMusicDetails { context, @@ -57,7 +58,8 @@ impl RustyPipeQuery { .await } - pub async fn music_lyrics(&self, lyrics_id: &str) -> Result { + pub async fn music_lyrics>(&self, lyrics_id: S) -> Result { + let lyrics_id = lyrics_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { context, @@ -74,7 +76,8 @@ impl RustyPipeQuery { .await } - pub async fn music_related(&self, related_id: &str) -> Result { + pub async fn music_related>(&self, related_id: S) -> Result { + let related_id = related_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { context, @@ -91,7 +94,11 @@ impl RustyPipeQuery { .await } - pub async fn music_radio(&self, radio_id: &str) -> Result, Error> { + pub async fn music_radio>( + &self, + radio_id: S, + ) -> Result, Error> { + let radio_id = radio_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QRadio { context, @@ -112,15 +119,20 @@ impl RustyPipeQuery { .await } - pub async fn music_radio_track(&self, video_id: &str) -> Result, Error> { - self.music_radio(&format!("RDAMVM{}", video_id)).await + pub async fn music_radio_track>( + &self, + video_id: S, + ) -> Result, Error> { + self.music_radio(&format!("RDAMVM{}", video_id.as_ref())) + .await } - pub async fn music_radio_playlist( + pub async fn music_radio_playlist>( &self, - playlist_id: &str, + playlist_id: S, ) -> Result, Error> { - self.music_radio(&format!("RDAMPL{}", playlist_id)).await + self.music_radio(&format!("RDAMPL{}", playlist_id.as_ref())) + .await } } diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index 1e4f2cf..e672975 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -16,7 +16,11 @@ use super::{ }; impl RustyPipeQuery { - pub async fn music_playlist(&self, playlist_id: &str) -> Result { + pub async fn music_playlist>( + &self, + playlist_id: S, + ) -> Result { + let playlist_id = playlist_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { context, @@ -33,7 +37,8 @@ impl RustyPipeQuery { .await } - pub async fn music_album(&self, album_id: &str) -> Result { + pub async fn music_album>(&self, album_id: S) -> Result { + let album_id = album_id.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QBrowse { context, diff --git a/src/client/music_search.rs b/src/client/music_search.rs index dcdaf6a..6981a10 100644 --- a/src/client/music_search.rs +++ b/src/client/music_search.rs @@ -50,7 +50,8 @@ enum Params { } impl RustyPipeQuery { - pub async fn music_search(&self, query: &str) -> Result { + pub async fn music_search>(&self, query: S) -> Result { + let query = query.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QSearch { context, @@ -68,25 +69,26 @@ impl RustyPipeQuery { .await } - pub async fn music_search_tracks( + pub async fn music_search_tracks>( &self, - query: &str, + query: S, ) -> Result, Error> { self._music_search_tracks(query, Params::Tracks).await } - pub async fn music_search_videos( + pub async fn music_search_videos>( &self, - query: &str, + query: S, ) -> Result, Error> { self._music_search_tracks(query, Params::Videos).await } - async fn _music_search_tracks( + async fn _music_search_tracks>( &self, - query: &str, + query: S, params: Params, ) -> Result, Error> { + let query = query.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QSearch { context, @@ -104,10 +106,11 @@ impl RustyPipeQuery { .await } - pub async fn music_search_albums( + pub async fn music_search_albums>( &self, - query: &str, + query: S, ) -> Result, Error> { + let query = query.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QSearch { context, @@ -146,16 +149,16 @@ impl RustyPipeQuery { .await } - pub async fn music_search_playlists( + pub async fn music_search_playlists>( &self, - query: &str, + query: S, ) -> Result, Error> { self._music_search_playlists(query, Params::Playlists).await } - pub async fn music_search_playlists_filter( + pub async fn music_search_playlists_filter>( &self, - query: &str, + query: S, community: bool, ) -> Result, Error> { self._music_search_playlists( @@ -168,11 +171,12 @@ impl RustyPipeQuery { .await } - async fn _music_search_playlists( + async fn _music_search_playlists>( &self, - query: &str, + query: S, params: Params, ) -> Result, Error> { + let query = query.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QSearch { context, @@ -190,7 +194,11 @@ impl RustyPipeQuery { .await } - pub async fn music_search_suggestion(&self, query: &str) -> Result, Error> { + pub async fn music_search_suggestion>( + &self, + query: S, + ) -> Result, Error> { + let query = query.as_ref(); let context = self.get_context(ClientType::DesktopMusic, true, None).await; let request_body = QSearchSuggestion { context, diff --git a/src/client/pagination.rs b/src/client/pagination.rs index 702b7a6..331faf5 100644 --- a/src/client/pagination.rs +++ b/src/client/pagination.rs @@ -10,12 +10,13 @@ use super::response::music_item::{map_queue_item, MusicListMapper, PlaylistPanel use super::{response, ClientType, MapResponse, QContinuation, RustyPipeQuery}; impl RustyPipeQuery { - pub async fn continuation( + pub async fn continuation>( &self, - ctoken: &str, + ctoken: S, endpoint: ContinuationEndpoint, visitor_data: Option<&str>, ) -> Result, Error> { + let ctoken = ctoken.as_ref(); if endpoint.is_music() { let context = self .get_context(ClientType::DesktopMusic, true, visitor_data) diff --git a/src/client/player.rs b/src/client/player.rs index ac0abcf..8262b5d 100644 --- a/src/client/player.rs +++ b/src/client/player.rs @@ -58,7 +58,8 @@ struct QContentPlaybackContext { } impl RustyPipeQuery { - pub async fn player(&self, video_id: &str) -> Result { + pub async fn player>(&self, video_id: S) -> Result { + let video_id = video_id.as_ref(); let q1 = self.clone(); let android_res = q1.player_from_client(video_id, ClientType::Android).await; @@ -85,11 +86,12 @@ impl RustyPipeQuery { } } - pub async fn player_from_client( + pub async fn player_from_client>( &self, - video_id: &str, + video_id: S, client_type: ClientType, ) -> Result { + let video_id = video_id.as_ref(); let (context, deobf) = tokio::join!( self.get_context(client_type, false, None), self.client.get_deobf() diff --git a/src/client/playlist.rs b/src/client/playlist.rs index 2c54c5d..98b417b 100644 --- a/src/client/playlist.rs +++ b/src/client/playlist.rs @@ -14,7 +14,8 @@ use crate::{ use super::{response, ClientType, MapResponse, MapResult, QBrowse, QContinuation, RustyPipeQuery}; impl RustyPipeQuery { - pub async fn playlist(&self, playlist_id: &str) -> Result { + pub async fn playlist>(&self, playlist_id: S) -> Result { + let playlist_id = playlist_id.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QBrowse { context, @@ -31,10 +32,11 @@ impl RustyPipeQuery { .await } - pub async fn playlist_continuation( + pub async fn playlist_continuation>( &self, - ctoken: &str, + ctoken: S, ) -> Result, Error> { + let ctoken = ctoken.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QContinuation { context, diff --git a/src/client/search.rs b/src/client/search.rs index 2e7baae..acee756 100644 --- a/src/client/search.rs +++ b/src/client/search.rs @@ -21,7 +21,8 @@ struct QSearch<'a> { } impl RustyPipeQuery { - pub async fn search(&self, query: &str) -> Result { + pub async fn search>(&self, query: S) -> Result { + let query = query.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QSearch { context, @@ -39,11 +40,12 @@ impl RustyPipeQuery { .await } - pub async fn search_filter( + pub async fn search_filter>( &self, - query: &str, + query: S, filter: &SearchFilter, ) -> Result { + let query = query.as_ref(); let context = self.get_context(ClientType::Desktop, true, None).await; let request_body = QSearch { context, @@ -61,9 +63,9 @@ impl RustyPipeQuery { .await } - pub async fn search_suggestion(&self, query: &str) -> Result, Error> { + pub async fn search_suggestion>(&self, query: S) -> Result, Error> { let url = url::Url::parse_with_params("https://suggestqueries-clients6.youtube.com/complete/search?client=youtube&gs_rn=64&gs_ri=youtube&ds=yt&cp=1&gs_id=4&xhr=t&xssi=t", - &[("hl", self.opts.lang.to_string()), ("gl", self.opts.country.to_string()), ("q", query.to_string())] + &[("hl", self.opts.lang.to_string()), ("gl", self.opts.country.to_string()), ("q", query.as_ref().to_owned())] ).map_err(|_| Error::Other("could not build url".into()))?; let response = self diff --git a/src/client/url_resolver.rs b/src/client/url_resolver.rs index 4446eb1..aa604d3 100644 --- a/src/client/url_resolver.rs +++ b/src/client/url_resolver.rs @@ -20,8 +20,12 @@ struct QResolveUrl<'a> { } impl RustyPipeQuery { - pub async fn resolve_url(self, url: &str, resolve_albums: bool) -> Result { - let (url, params) = util::url_to_params(url)?; + pub async fn resolve_url>( + self, + url: S, + resolve_albums: bool, + ) -> Result { + let (url, params) = util::url_to_params(url.as_ref())?; let mut is_shortlink = url.domain().and_then(|d| match d { "youtu.be" => Some(true), diff --git a/tests/youtube.rs b/tests/youtube.rs index 9052c7e..bd48b4a 100644 --- a/tests/youtube.rs +++ b/tests/youtube.rs @@ -1609,8 +1609,15 @@ async fn music_search_episode() { .await .unwrap(); - let track = &res.items.items[0]; - assert_eq!(track.id, "Zq_-LDy7AgE"); + let (i, track) = &res + .items + .items + .iter() + .enumerate() + .find(|(_, a)| a.id == "Zq_-LDy7AgE") + .unwrap(); + assert!(*i < 3); + assert_eq!( track.title, "Blond - Da muss man dabei gewesen sein: Das Hörspiel - Fall #1"