use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::iter::Iterator;
use std::vec::IntoIter;
use crate::models::FetchedTranscriptSnippet;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FetchedTranscript {
pub snippets: Vec<FetchedTranscriptSnippet>,
pub video_id: String,
pub language: String,
pub language_code: String,
pub is_generated: bool,
}
impl FetchedTranscript {
pub fn to_raw_data(&self) -> Vec<HashMap<String, serde_json::Value>> {
self.snippets
.iter()
.map(|snippet| {
let mut map = HashMap::new();
map.insert(
"text".to_string(),
serde_json::Value::String(snippet.text.clone()),
);
map.insert(
"start".to_string(),
serde_json::Value::Number(serde_json::Number::from_f64(snippet.start).unwrap()),
);
map.insert(
"duration".to_string(),
serde_json::Value::Number(
serde_json::Number::from_f64(snippet.duration).unwrap(),
),
);
map
})
.collect()
}
pub fn text(&self) -> String {
self.snippets
.iter()
.map(|snippet| snippet.text.clone())
.collect::<Vec<String>>()
.join(" ")
}
pub fn parts(&self) -> &[FetchedTranscriptSnippet] {
&self.snippets
}
pub fn language(&self) -> &str {
&self.language
}
pub fn language_code(&self) -> &str {
&self.language_code
}
pub fn is_generated(&self) -> bool {
self.is_generated
}
pub fn duration(&self) -> f64 {
if self.snippets.is_empty() {
return 0.0;
}
let last = &self.snippets[self.snippets.len() - 1];
last.start + last.duration
}
}
impl IntoIterator for FetchedTranscript {
type Item = FetchedTranscriptSnippet;
type IntoIter = IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.snippets.into_iter()
}
}
impl<'a> IntoIterator for &'a FetchedTranscript {
type Item = &'a FetchedTranscriptSnippet;
type IntoIter = std::slice::Iter<'a, FetchedTranscriptSnippet>;
fn into_iter(self) -> Self::IntoIter {
self.snippets.iter()
}
}