diff --git a/src/client/music_artist.rs b/src/client/music_artist.rs index e9d2eae..2c8ae8a 100644 --- a/src/client/music_artist.rs +++ b/src/client/music_artist.rs @@ -8,7 +8,7 @@ use crate::{ error::{Error, ExtractionError}, model::{AlbumItem, ArtistId, MusicArtist}, serializer::MapResult, - util::{self, TryRemove}, + util, }; use super::{ @@ -331,9 +331,12 @@ impl MapResponse> for response::MusicArtistAlbums { ) -> Result>, ExtractionError> { // dbg!(&self); - let mut content = self.contents.single_column_browse_results_renderer.contents; - let grids = content - .try_swap_remove(0) + let grids = self + .contents + .single_column_browse_results_renderer + .contents + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no content")))? .tab_renderer .content diff --git a/src/client/music_playlist.rs b/src/client/music_playlist.rs index 5369e42..953a569 100644 --- a/src/client/music_playlist.rs +++ b/src/client/music_playlist.rs @@ -125,14 +125,17 @@ impl MapResponse for response::MusicPlaylist { ) -> Result, ExtractionError> { // dbg!(&self); - let mut content = self.contents.single_column_browse_results_renderer.contents; - let mut music_contents = content - .try_swap_remove(0) + let music_contents = self + .contents + .single_column_browse_results_renderer + .contents + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no content")))? .tab_renderer .content .section_list_renderer; - let mut shelf = music_contents + let shelf = music_contents .contents .into_iter() .find_map(|section| match section { @@ -157,7 +160,8 @@ impl MapResponse for response::MusicPlaylist { let ctoken = shelf .continuations - .try_swap_remove(0) + .into_iter() + .next() .map(|cont| cont.next_continuation_data.continuation); let track_count = if ctoken.is_some() { @@ -177,7 +181,8 @@ impl MapResponse for response::MusicPlaylist { let related_ctoken = music_contents .continuations - .try_swap_remove(0) + .into_iter() + .next() .map(|c| c.next_continuation_data.continuation); let (from_ytm, channel, name, thumbnail, description) = match self.header { @@ -269,9 +274,12 @@ impl MapResponse for response::MusicPlaylist { .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no header")))? .music_detail_header_renderer; - let mut content = self.contents.single_column_browse_results_renderer.contents; - let sections = content - .try_swap_remove(0) + let sections = self + .contents + .single_column_browse_results_renderer + .contents + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no content")))? .tab_renderer .content @@ -320,7 +328,8 @@ impl MapResponse for response::MusicPlaylist { let (artists, by_va) = map_artists(artists_p); let album_type_txt = subtitle_split - .try_swap_remove(0) + .into_iter() + .next() .map(|part| part.to_string()) .unwrap_or_default(); @@ -329,12 +338,13 @@ impl MapResponse for response::MusicPlaylist { let (artist_id, playlist_id) = header .menu - .map(|mut menu| { + .map(|menu| { ( map_artist_id(menu.menu_renderer.items), menu.menu_renderer .top_level_buttons - .try_swap_remove(0) + .into_iter() + .next() .map(|btn| { btn.button_renderer .navigation_endpoint diff --git a/src/client/music_search.rs b/src/client/music_search.rs index aeb98ba..be55c12 100644 --- a/src/client/music_search.rs +++ b/src/client/music_search.rs @@ -10,7 +10,6 @@ use crate::{ MusicSearchFiltered, MusicSearchResult, MusicSearchSuggestion, TrackItem, }, serializer::MapResult, - util::TryRemove, }; use super::{response, ClientType, MapResponse, RustyPipeQuery, YTContext}; @@ -234,9 +233,12 @@ impl MapResponse for response::MusicSearch { ) -> Result, crate::error::ExtractionError> { // dbg!(&self); - let mut tabs = self.contents.tabbed_search_results_renderer.contents; - let sections = tabs - .try_swap_remove(0) + let sections = self + .contents + .tabbed_search_results_renderer + .contents + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no tab")))? .tab_renderer .content @@ -262,8 +264,8 @@ impl MapResponse for response::MusicSearch { } } } - response::music_search::ItemSection::ItemSectionRenderer { mut contents } => { - if let Some(corrected) = contents.try_swap_remove(0) { + response::music_search::ItemSection::ItemSectionRenderer { contents } => { + if let Some(corrected) = contents.into_iter().next() { corrected_query = Some(corrected.showing_results_for_renderer.corrected_query) } } @@ -295,9 +297,10 @@ impl MapResponse> for response::MusicSearc ) -> Result>, ExtractionError> { // dbg!(&self); - let mut tabs = self.contents.tabbed_search_results_renderer.contents; + let tabs = self.contents.tabbed_search_results_renderer.contents; let sections = tabs - .try_swap_remove(0) + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no tab")))? .tab_renderer .content @@ -309,17 +312,17 @@ impl MapResponse> for response::MusicSearc let mut mapper = MusicListMapper::new(lang); sections.into_iter().for_each(|section| match section { - response::music_search::ItemSection::MusicShelfRenderer(mut shelf) => { + response::music_search::ItemSection::MusicShelfRenderer(shelf) => { mapper.map_response(shelf.contents); - if let Some(cont) = shelf.continuations.try_swap_remove(0) { + if let Some(cont) = shelf.continuations.into_iter().next() { ctoken = Some(cont.next_continuation_data.continuation); } } response::music_search::ItemSection::MusicCardShelfRenderer(card) => { mapper.map_card(card); } - response::music_search::ItemSection::ItemSectionRenderer { mut contents } => { - if let Some(corrected) = contents.try_swap_remove(0) { + response::music_search::ItemSection::ItemSectionRenderer { contents } => { + if let Some(corrected) = contents.into_iter().next() { corrected_query = Some(corrected.showing_results_for_renderer.corrected_query) } } diff --git a/src/client/pagination.rs b/src/client/pagination.rs index 42ee8d9..bfb07cd 100644 --- a/src/client/pagination.rs +++ b/src/client/pagination.rs @@ -5,7 +5,6 @@ use crate::model::{ Comment, MusicItem, PlaylistVideo, YouTubeItem, }; use crate::serializer::MapResult; -use crate::util::TryRemove; use super::response::music_item::{map_queue_item, MusicListMapper, PlaylistPanelVideo}; use super::{response, ClientType, MapResponse, QContinuation, RustyPipeQuery}; @@ -100,9 +99,10 @@ impl MapResponse> for response::Continuation { ) -> Result>, ExtractionError> { let items = self .on_response_received_actions - .and_then(|mut actions| { + .and_then(|actions| { actions - .try_swap_remove(0) + .into_iter() + .next() .map(|action| action.append_continuation_items_action.continuation_items) }) .or_else(|| { @@ -168,7 +168,8 @@ impl MapResponse> for response::MusicContinuation { let map_res = mapper.items(); let ctoken = continuations - .try_swap_remove(0) + .into_iter() + .next() .map(|cont| cont.next_continuation_data.continuation); Ok(MapResult { diff --git a/src/client/playlist.rs b/src/client/playlist.rs index 2130f6a..5fed815 100644 --- a/src/client/playlist.rs +++ b/src/client/playlist.rs @@ -65,10 +65,11 @@ impl MapResponse for response::Playlist { _ => return Err(response::alerts_to_err(self.alerts)), }; - let mut tcbr_contents = contents.two_column_browse_results_renderer.contents; - - let video_items = tcbr_contents - .try_swap_remove(0) + let video_items = contents + .two_column_browse_results_renderer + .contents + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed( "twoColumnBrowseResultsRenderer empty", )))? @@ -76,13 +77,15 @@ impl MapResponse for response::Playlist { .content .section_list_renderer .contents - .try_swap_remove(0) + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed( "sectionListRenderer empty", )))? .item_section_renderer .contents - .try_swap_remove(0) + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed( "itemSectionRenderer empty", )))? @@ -93,10 +96,11 @@ impl MapResponse for response::Playlist { let (thumbnails, last_update_txt) = match self.sidebar { Some(sidebar) => { - let mut sidebar_items = sidebar.playlist_sidebar_renderer.contents; + let sidebar_items = sidebar.playlist_sidebar_renderer.contents; let mut primary = sidebar_items - .try_swap_remove(0) + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed( "no primary sidebar", )))?; diff --git a/src/client/response/music_item.rs b/src/client/response/music_item.rs index b6bb9b6..7d9f6ea 100644 --- a/src/client/response/music_item.rs +++ b/src/client/response/music_item.rs @@ -11,7 +11,7 @@ use crate::{ text::{Text, TextComponents}, MapResult, }, - util::{self, dictionary, TryRemove}, + util::{self, dictionary}, }; use super::{ @@ -587,14 +587,14 @@ impl MusicListMapper { } } // Playlist item - FlexColumnDisplayStyle::Default => { - let mut fixed_columns = item.fixed_columns; - ( - c2.map(TextComponents::from), - c3.map(TextComponents::from), - fixed_columns.try_swap_remove(0).map(TextComponents::from), - ) - } + FlexColumnDisplayStyle::Default => ( + c2.map(TextComponents::from), + c3.map(TextComponents::from), + item.fixed_columns + .into_iter() + .next() + .map(TextComponents::from), + ), }; let duration = diff --git a/src/client/response/video_item.rs b/src/client/response/video_item.rs index 29df448..52f6491 100644 --- a/src/client/response/video_item.rs +++ b/src/client/response/video_item.rs @@ -477,7 +477,7 @@ impl YouTubeListMapper { is_upcoming: video.upcoming_event_data.is_some(), short_description: video .detailed_metadata_snippets - .and_then(|mut snippets| snippets.try_swap_remove(0).map(|s| s.snippet_text)) + .and_then(|snippets| snippets.into_iter().next().map(|s| s.snippet_text)) .or(video.description_snippet), } } diff --git a/src/client/trends.rs b/src/client/trends.rs index cc62032..cc7408f 100644 --- a/src/client/trends.rs +++ b/src/client/trends.rs @@ -5,7 +5,6 @@ use crate::{ model::{paginator::Paginator, VideoItem}, param::Language, serializer::MapResult, - util::TryRemove, }; use super::{response, ClientType, MapResponse, QBrowse, QBrowseParams, RustyPipeQuery}; @@ -56,9 +55,12 @@ impl MapResponse> for response::Startpage { lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, ) -> Result>, ExtractionError> { - let mut contents = self.contents.two_column_browse_results_renderer.contents; - let grid = contents - .try_swap_remove(0) + let grid = self + .contents + .two_column_browse_results_renderer + .contents + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no contents")))? .tab_renderer .content @@ -80,9 +82,12 @@ impl MapResponse> for response::Trending { lang: crate::param::Language, _deobf: Option<&crate::deobfuscate::DeobfData>, ) -> Result>, ExtractionError> { - let mut contents = self.contents.two_column_browse_results_renderer.contents; - let items = contents - .try_swap_remove(0) + let items = self + .contents + .two_column_browse_results_renderer + .contents + .into_iter() + .next() .ok_or(ExtractionError::InvalidData(Cow::Borrowed("no contents")))? .tab_renderer .content diff --git a/src/client/video_details.rs b/src/client/video_details.rs index 0c20594..68754f1 100644 --- a/src/client/video_details.rs +++ b/src/client/video_details.rs @@ -129,11 +129,11 @@ impl MapResponse for response::VideoDetails { } response::video_details::VideoResultsItem::ItemSectionRenderer(section) => { match section { - response::video_details::ItemSection::CommentsEntryPoint { mut contents } => { - comment_count_section = contents.try_swap_remove(0); + response::video_details::ItemSection::CommentsEntryPoint { contents } => { + comment_count_section = contents.into_iter().next(); } - response::video_details::ItemSection::CommentItemSection { mut contents } => { - comment_ctoken_section = contents.try_swap_remove(0); + response::video_details::ItemSection::CommentItemSection { contents } => { + comment_ctoken_section = contents.into_iter().next(); } response::video_details::ItemSection::None => {} }