Compare commits

..

2 Commits

Author SHA1 Message Date
Davide Polonio 34c294ef0f feat: add duration information, fix logging 2021-09-22 20:59:20 +02:00
Davide Polonio 06c0db1574 feat: first working bot version, add Dockerfile
- swap rspotify with aspotify
- add Docker image
2021-09-22 19:48:28 +02:00
1 changed files with 31 additions and 25 deletions

View File

@ -1,11 +1,18 @@
use crate::SpotifyURL::Track; use crate::SpotifyURL::Track;
use aspotify::{Client, ClientCredentials}; use aspotify::{Client, ClientCredentials};
use std::time::Duration;
use teloxide::prelude::*; use teloxide::prelude::*;
enum SpotifyURL { enum SpotifyURL {
Track(String), Track(String),
} }
struct TrackInfo {
name: String,
artist: Vec<String>,
duration: Duration,
}
fn get_spotify_entry(url: &str) -> Option<SpotifyURL> { fn get_spotify_entry(url: &str) -> Option<SpotifyURL> {
if url.contains("https://open.spotify.com/track/") { if url.contains("https://open.spotify.com/track/") {
let track_id = url.rsplit('/').next().and_then(|x| x.split('?').next()); let track_id = url.rsplit('/').next().and_then(|x| x.split('?').next());
@ -17,16 +24,12 @@ fn get_spotify_entry(url: &str) -> Option<SpotifyURL> {
return None; return None;
} }
struct TrackInfo {
name: String,
artist: Vec<String>,
}
async fn get_spotify_track(spotify: Box<Client>, id: &String) -> Option<TrackInfo> { async fn get_spotify_track(spotify: Box<Client>, id: &String) -> Option<TrackInfo> {
match spotify.tracks().get_track(id.as_str(), None).await { match spotify.tracks().get_track(id.as_str(), None).await {
Ok(track) => Some(TrackInfo { Ok(track) => Some(TrackInfo {
name: track.data.name, name: track.data.name,
artist: track.data.artists.iter().map(|x| x.name.clone()).collect(), artist: track.data.artists.iter().map(|x| x.name.clone()).collect(),
duration: track.data.duration,
}), }),
Err(_e) => None, Err(_e) => None,
} }
@ -39,31 +42,34 @@ async fn main() {
let bot = Bot::from_env().auto_send(); let bot = Bot::from_env().auto_send();
teloxide::repl(bot, |message| async move { teloxide::repl(bot, |message| async move {
let spotify_creds =
ClientCredentials::from_env().expect("CLIENT_ID and CLIENT_SECRET not found.");
let spotify_client = Box::new(Client::new(spotify_creds));
log::info!("Connected to Spotify");
let text = message.update.text().and_then(get_spotify_entry); let text = message.update.text().and_then(get_spotify_entry);
match text { match text {
Some(spotify) => match spotify { Some(spotify) => {
Track(id) => { let spotify_creds =
let track_info = get_spotify_track(spotify_client, &id).await; ClientCredentials::from_env().expect("CLIENT_ID and CLIENT_SECRET not found.");
match track_info { let spotify_client = Box::new(Client::new(spotify_creds));
Some(info) => { match spotify {
let reply = format!( Track(id) => {
"Track information:\n\ log::debug!("Parsing spotify song: {}", id);
Track name: {}\n\ let track_info = get_spotify_track(spotify_client, &id).await;
Artists: {}", match track_info {
info.name, Some(info) => {
info.artist.join(", ") let reply = format!(
); "Track information:\n\
Some(message.reply_to(reply).await?) 🎵 Track name: {}\n\
🧑🎤 Artist(s): {}\n\
Duration: {} second(s)",
info.name,
info.artist.join(", "),
info.duration.as_secs()
);
Some(message.reply_to(reply).await?)
}
None => None,
} }
None => None,
} }
} }
}, }
None => None, None => None,
}; };
respond(()) respond(())