12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- use super::subprocess::ytdl;
- use serenity::model::user::User;
- #[derive(Clone)]
- pub struct Song {
- pub url: String,
- pub artist: Option<String>,
- pub title: Option<String>,
- pub duration: Option<u64>,
- pub queuer: User,
- }
- impl Song {
- pub async fn from_query(user: User, query: String) -> Result<Song, std::io::Error> {
- 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)
- }
- }
|