fix(channel): new rich grid renderer continuation format

This commit is contained in:
ThetaDev 2022-10-19 00:24:37 +02:00
parent 9f7f337efd
commit 39b32da5a4
4 changed files with 41 additions and 14 deletions

View file

@ -53,14 +53,20 @@ impl<T: TryFrom<YouTubeItem>> MapResponse<Paginator<T>> for response::Continuati
lang: crate::param::Language, lang: crate::param::Language,
_deobf: Option<&crate::deobfuscate::Deobfuscator>, _deobf: Option<&crate::deobfuscate::Deobfuscator>,
) -> Result<MapResult<Paginator<T>>, ExtractionError> { ) -> Result<MapResult<Paginator<T>>, ExtractionError> {
let mut actions = self.on_response_received_actions; let items = self
let items = actions .on_response_received_actions
.try_swap_remove(0) .and_then(|mut actions| {
actions
.try_swap_remove(0)
.map(|action| action.append_continuation_items_action.continuation_items)
})
.or_else(|| {
self.continuation_contents
.map(|contents| contents.rich_grid_continuation.contents)
})
.ok_or(ExtractionError::InvalidData(Cow::Borrowed( .ok_or(ExtractionError::InvalidData(Cow::Borrowed(
"no item section renderer", "no continuation items",
)))? )))?;
.append_continuation_items_action
.continuation_items;
let mut mapper = response::YouTubeListMapper::<YouTubeItem>::new(lang); let mut mapper = response::YouTubeListMapper::<YouTubeItem>::new(lang);
mapper.map_response(items); mapper.map_response(items);

View file

@ -140,6 +140,12 @@ pub(crate) struct AlertRenderer {
pub text: String, pub text: String,
} }
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct ResponseContext {
pub visitor_data: Option<String>,
}
// CONTINUATION // CONTINUATION
#[serde_as] #[serde_as]
@ -153,8 +159,12 @@ pub(crate) struct Continuation {
alias = "onResponseReceivedCommands", alias = "onResponseReceivedCommands",
alias = "onResponseReceivedEndpoints" alias = "onResponseReceivedEndpoints"
)] )]
#[serde_as(as = "VecSkipError<_>")] #[serde_as(as = "Option<VecSkipError<_>>")]
pub on_response_received_actions: Vec<ContinuationActionWrap>, pub on_response_received_actions: Option<Vec<ContinuationActionWrap>>,
/// Used for channel video rich grid renderer
///
/// A/B test seen on 19.10.2022
pub continuation_contents: Option<RichGridContinuationContents>,
} }
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
@ -173,8 +183,16 @@ pub(crate) struct ContinuationAction {
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct ResponseContext { pub(crate) struct RichGridContinuationContents {
pub visitor_data: Option<String>, pub rich_grid_continuation: RichGridContinuation,
}
#[serde_as]
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct RichGridContinuation {
#[serde_as(as = "VecLogError<_>")]
pub contents: MapResult<Vec<YouTubeListItem>>,
} }
// YouTube Music // YouTube Music

View file

@ -66,8 +66,8 @@ pub(crate) struct VideoResultsWrap {
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) struct VideoResults { pub(crate) struct VideoResults {
#[serde_as(as = "VecLogError<_>")] #[serde_as(as = "Option<VecLogError<_>>")]
pub contents: MapResult<Vec<VideoResultsItem>>, pub contents: Option<MapResult<Vec<VideoResultsItem>>>,
} }
/// Video metadata item /// Video metadata item

View file

@ -102,7 +102,10 @@ impl MapResponse<VideoDetails> for response::VideoDetails {
.two_column_watch_next_results .two_column_watch_next_results
.results .results
.results .results
.contents; .contents
.ok_or(ExtractionError::ContentUnavailable(Cow::Borrowed(
"Video not found",
)))?;
warnings.append(&mut primary_results.warnings); warnings.append(&mut primary_results.warnings);
let mut primary_info = None; let mut primary_info = None;