fix(channel): new rich grid renderer continuation format
This commit is contained in:
parent
9f7f337efd
commit
39b32da5a4
4 changed files with 41 additions and 14 deletions
|
|
@ -53,14 +53,20 @@ impl<T: TryFrom<YouTubeItem>> MapResponse<Paginator<T>> for response::Continuati
|
|||
lang: crate::param::Language,
|
||||
_deobf: Option<&crate::deobfuscate::Deobfuscator>,
|
||||
) -> Result<MapResult<Paginator<T>>, ExtractionError> {
|
||||
let mut actions = self.on_response_received_actions;
|
||||
let items = actions
|
||||
.try_swap_remove(0)
|
||||
let items = self
|
||||
.on_response_received_actions
|
||||
.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(
|
||||
"no item section renderer",
|
||||
)))?
|
||||
.append_continuation_items_action
|
||||
.continuation_items;
|
||||
"no continuation items",
|
||||
)))?;
|
||||
|
||||
let mut mapper = response::YouTubeListMapper::<YouTubeItem>::new(lang);
|
||||
mapper.map_response(items);
|
||||
|
|
|
|||
|
|
@ -140,6 +140,12 @@ pub(crate) struct AlertRenderer {
|
|||
pub text: String,
|
||||
}
|
||||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct ResponseContext {
|
||||
pub visitor_data: Option<String>,
|
||||
}
|
||||
|
||||
// CONTINUATION
|
||||
|
||||
#[serde_as]
|
||||
|
|
@ -153,8 +159,12 @@ pub(crate) struct Continuation {
|
|||
alias = "onResponseReceivedCommands",
|
||||
alias = "onResponseReceivedEndpoints"
|
||||
)]
|
||||
#[serde_as(as = "VecSkipError<_>")]
|
||||
pub on_response_received_actions: Vec<ContinuationActionWrap>,
|
||||
#[serde_as(as = "Option<VecSkipError<_>>")]
|
||||
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)]
|
||||
|
|
@ -173,8 +183,16 @@ pub(crate) struct ContinuationAction {
|
|||
|
||||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct ResponseContext {
|
||||
pub visitor_data: Option<String>,
|
||||
pub(crate) struct RichGridContinuationContents {
|
||||
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
|
||||
|
|
|
|||
|
|
@ -66,8 +66,8 @@ pub(crate) struct VideoResultsWrap {
|
|||
#[derive(Debug, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
pub(crate) struct VideoResults {
|
||||
#[serde_as(as = "VecLogError<_>")]
|
||||
pub contents: MapResult<Vec<VideoResultsItem>>,
|
||||
#[serde_as(as = "Option<VecLogError<_>>")]
|
||||
pub contents: Option<MapResult<Vec<VideoResultsItem>>>,
|
||||
}
|
||||
|
||||
/// Video metadata item
|
||||
|
|
|
|||
|
|
@ -102,7 +102,10 @@ impl MapResponse<VideoDetails> for response::VideoDetails {
|
|||
.two_column_watch_next_results
|
||||
.results
|
||||
.results
|
||||
.contents;
|
||||
.contents
|
||||
.ok_or(ExtractionError::ContentUnavailable(Cow::Borrowed(
|
||||
"Video not found",
|
||||
)))?;
|
||||
warnings.append(&mut primary_results.warnings);
|
||||
|
||||
let mut primary_info = None;
|
||||
|
|
|
|||
Reference in a new issue