feat: add rich text extraction

- add video detail tests
This commit is contained in:
ThetaDev 2022-09-21 15:00:33 +02:00
parent 3596861b77
commit 8629454b5b
18 changed files with 1784 additions and 8921 deletions

View file

@ -18,7 +18,7 @@ use serde_with::{serde_as, DefaultOnError, VecSkipError};
use crate::serializer::{
ignore_any,
text::{Text, TextLink, TextLinks},
text::{Text, TextComponent},
};
#[derive(Clone, Debug, Deserialize)]
@ -121,8 +121,7 @@ pub struct VideoOwner {
#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VideoOwnerRenderer {
#[serde_as(as = "TextLink")]
pub title: TextLink,
pub title: TextComponent,
pub thumbnail: Thumbnails,
#[serde_as(as = "Option<Text>")]
pub subscriber_count_text: Option<String>,
@ -249,8 +248,7 @@ pub struct MusicColumn {
#[serde_as]
#[derive(Clone, Debug, Deserialize)]
pub struct MusicColumnRenderer {
#[serde_as(as = "TextLinks")]
pub text: Vec<TextLink>,
pub text: TextComponent,
}
#[derive(Clone, Debug, Deserialize)]

View file

@ -2,7 +2,7 @@ use serde::Deserialize;
use serde_with::serde_as;
use serde_with::{json::JsonString, DefaultOnError, VecSkipError};
use crate::serializer::text::{Text, TextLink};
use crate::serializer::text::{Text, TextComponent};
use crate::serializer::{MapResult, VecLogError};
use super::{ContentRenderer, ContentsRenderer, Thumbnails, ThumbnailsWrap, VideoListItem};
@ -70,8 +70,7 @@ pub struct PlaylistVideo {
#[serde_as(as = "Text")]
pub title: String,
#[serde(rename = "shortBylineText")]
#[serde_as(as = "TextLink")]
pub channel: TextLink,
pub channel: TextComponent,
#[serde_as(as = "JsonString")]
pub length_seconds: u32,
}
@ -94,8 +93,7 @@ pub struct HeaderRenderer {
pub description_text: Option<String>,
#[serde_as(as = "Text")]
pub num_videos_text: String,
#[serde_as(as = "Option<TextLink>")]
pub owner_text: Option<TextLink>,
pub owner_text: Option<TextComponent>,
// Alternative layout
pub playlist_header_banner: Option<PlaylistHeaderBanner>,

View file

@ -4,10 +4,11 @@ use serde::Deserialize;
use serde_with::serde_as;
use serde_with::{DefaultOnError, VecSkipError};
use crate::serializer::text::TextComponents;
use crate::serializer::MapResult;
use crate::serializer::{
ignore_any,
text::{AccessibilityText, Text, TextLink, TextLinks},
text::{AccessibilityText, Text, TextComponent},
VecLogError,
};
@ -88,8 +89,7 @@ pub enum VideoResultsItem {
VideoSecondaryInfoRenderer {
owner: VideoOwner,
#[serde(default)]
#[serde_as(as = "Text")]
description: String,
description: TextComponents,
/// Additional metadata (e.g. Creative Commons License)
#[serde(default)]
#[serde_as(deserialize_as = "DefaultOnError")]
@ -210,8 +210,7 @@ pub struct MetadataRowRenderer {
/// Text (en): `Creative Commons Attribution license (reuse allowed)`
///
/// URL: `https://www.youtube.com/t/creative_commons`
#[serde_as(as = "Vec<TextLinks>")]
pub contents: Vec<Vec<TextLink>>,
pub contents: Vec<TextComponents>,
}
/// Contains current video ID
@ -297,8 +296,7 @@ pub struct RecommendedVideo {
#[serde_as(as = "Text")]
pub title: String,
#[serde(rename = "shortBylineText")]
#[serde_as(as = "TextLink")]
pub channel: TextLink,
pub channel: TextComponent,
pub channel_thumbnail: Thumbnails,
/// Channel verification badge
#[serde(default)]
@ -309,8 +307,8 @@ pub struct RecommendedVideo {
/// (e.g. `11 months ago`)
#[serde_as(as = "Option<Text>")]
pub published_time_text: Option<String>,
#[serde_as(as = "Text")]
pub view_count_text: String,
#[serde_as(as = "Option<Text>")]
pub view_count_text: Option<String>,
/// Badges are displayed on the video thumbnail and
/// show certain video properties (e.g. active livestream)
#[serde(default)]
@ -560,8 +558,7 @@ pub struct CommentRenderer {
#[serde_as(as = "DefaultOnError")]
pub author_endpoint: Option<AuthorEndpoint>,
/// Comment text
#[serde_as(as = "Text")]
pub content_text: String,
pub content_text: TextComponents,
/// Textual publish date (e.g. `15 minutes ago`, `2 days ago`)
#[serde_as(as = "Text")]
pub published_time_text: String,