song.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use super::subprocess::ytdl;
  2. use serenity::model::user::User;
  3. #[derive(Clone)]
  4. pub struct Song {
  5. pub url: String,
  6. pub artist: Option<String>,
  7. pub title: Option<String>,
  8. pub duration: Option<u64>,
  9. pub queuer: User,
  10. }
  11. impl Song {
  12. pub async fn from_query(user: User, query: String) -> Result<Song, std::io::Error> {
  13. let query = if query.contains("watch?v=") {
  14. query.to_string()
  15. } else {
  16. format!("ytsearch:{}", query)
  17. };
  18. let video = ytdl(&query).await?;
  19. let song = Song {
  20. artist: video["channel"].as_str().map(|t| t.to_string()),
  21. title: video["title"].as_str().map(|t| t.to_string()),
  22. url: video["url"].as_str().unwrap().to_string(),
  23. duration: video["duration"].as_u64(),
  24. queuer: user,
  25. };
  26. Ok(song)
  27. }
  28. pub fn get_string(&self) -> String {
  29. let artist = self.artist.clone().unwrap_or("unknown".to_string());
  30. let title = self.title.clone().unwrap_or("unknown".to_string());
  31. let duration = match self.duration {
  32. Some(duration) => {
  33. let mins = duration / 60;
  34. let secs = duration - mins * 60;
  35. format!("{}:{:0>2}", mins, secs)
  36. }
  37. None => "unknown duration".to_string(),
  38. };
  39. format!("{} by {} | {}", title, artist, &duration)
  40. }
  41. }