use crate::transcript_list::TranscriptList;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct TranslationLanguage {
pub language: String,
pub language_code: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FetchedTranscriptSnippet {
pub text: String,
pub start: f64,
pub duration: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VideoDetails {
pub video_id: String,
pub title: String,
pub length_seconds: u32,
pub keywords: Option<Vec<String>>,
pub channel_id: String,
pub short_description: String,
pub view_count: String,
pub author: String,
pub thumbnails: Vec<VideoThumbnail>,
pub is_live_content: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VideoThumbnail {
pub url: String,
pub width: u32,
pub height: u32,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct MicroformatData {
pub available_countries: Option<Vec<String>>,
pub category: Option<String>,
pub description: Option<String>,
pub embed: Option<MicroformatEmbed>,
pub external_channel_id: Option<String>,
pub external_video_id: Option<String>,
pub has_ypc_metadata: Option<bool>,
pub is_family_safe: Option<bool>,
pub is_shorts_eligible: Option<bool>,
pub is_unlisted: Option<bool>,
pub length_seconds: Option<String>,
pub like_count: Option<String>,
pub owner_channel_name: Option<String>,
pub owner_profile_url: Option<String>,
pub publish_date: Option<String>,
pub thumbnail: Option<MicroformatThumbnail>,
pub title: Option<String>,
pub upload_date: Option<String>,
pub view_count: Option<String>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct MicroformatEmbed {
pub height: Option<i32>,
pub iframe_url: Option<String>,
pub width: Option<i32>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct MicroformatThumbnail {
pub thumbnails: Option<Vec<VideoThumbnail>>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct Range {
pub start: String,
pub end: String,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct ColorInfo {
pub primaries: Option<String>,
pub transfer_characteristics: Option<String>,
pub matrix_coefficients: Option<String>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct StreamingFormat {
pub itag: u32,
pub url: Option<String>,
pub mime_type: String,
pub bitrate: u64,
pub width: Option<u32>,
pub height: Option<u32>,
pub init_range: Option<Range>,
pub index_range: Option<Range>,
pub last_modified: Option<String>,
pub content_length: Option<String>,
pub quality: String,
pub fps: Option<u32>,
pub quality_label: Option<String>,
pub projection_type: String,
pub average_bitrate: Option<u64>,
pub audio_quality: Option<String>,
pub approx_duration_ms: String,
pub audio_sample_rate: Option<String>,
pub audio_channels: Option<u32>,
pub quality_ordinal: Option<String>,
pub high_replication: Option<bool>,
pub color_info: Option<ColorInfo>,
pub loudness_db: Option<f64>,
pub is_drc: Option<bool>,
pub xtags: Option<String>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct StreamingData {
pub expires_in_seconds: String,
pub formats: Vec<StreamingFormat>,
pub adaptive_formats: Vec<StreamingFormat>,
pub server_abr_streaming_url: Option<String>,
}
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize)]
pub struct VideoInfos {
pub video_details: VideoDetails,
pub microformat: MicroformatData,
pub streaming_data: StreamingData,
pub transcript_list: TranscriptList,
}