use super::subprocess::ytdl; use serenity::model::user::User; #[derive(Clone)] pub struct Song { pub url: String, pub artist: Option, pub title: Option, pub duration: Option, pub queuer: User, } impl Song { pub async fn from_query(user: User, query: String) -> Result { let query = if query.contains("watch?v=") { query.to_string() } else { format!("ytsearch:{}", query) }; let video = ytdl(&query).await?; let song = Song { artist: video["channel"].as_str().map(|t| t.to_string()), title: video["title"].as_str().map(|t| t.to_string()), url: video["url"].as_str().unwrap().to_string(), duration: video["duration"].as_u64(), queuer: user, }; Ok(song) } pub fn get_string(&self) -> String { let artist = self.artist.clone().unwrap_or("unknown".to_string()); let title = self.title.clone().unwrap_or("unknown".to_string()); let duration = match self.duration { Some(duration) => { let mins = duration / 60; let secs = duration - mins * 60; format!("{}:{:0>2}", mins, secs) } None => "unknown duration".to_string(), }; format!("{} by {} | {}", title, artist, &duration) } }