Compare commits

..

1 Commits

Author SHA1 Message Date
Davide Polonio a65a0469c1 feat: first working version, add Docker integration
- swap rspotify with aspotify
- add Dockerfile
2021-09-22 19:08:09 +02:00
4 changed files with 22 additions and 32 deletions

View File

@ -1,2 +0,0 @@
target/
.idea/

View File

@ -10,4 +10,4 @@ teloxide = { version = "0.5", features = ["auto-send", "macros"] }
log = "0.4" log = "0.4"
pretty_env_logger = "0.4.0" pretty_env_logger = "0.4.0"
tokio = { version = "1.8", features = ["rt-multi-thread", "macros"] } tokio = { version = "1.8", features = ["rt-multi-thread", "macros"] }
aspotify = "0.7.0" rspotify = { version = "0.10.0", features = ["blocking"] }

View File

@ -1,18 +0,0 @@
FROM rust:1.55.0-bullseye as builder
# ENV RUSTFLAGS="-C target-feature=+crt-static"
WORKDIR /build
RUN apt-get update && apt-get install -y \
libssl-dev
COPY ./ /build
RUN cargo build --release
FROM gcr.io/distroless/base
COPY --from=builder /build/target/release/songlify /usr/bin/songlify
COPY --from=builder /lib/x86_64-linux-gnu/libgcc_s.so.1 /lib/x86_64-linux-gnu/
COPY --from=builder /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/x86_64-linux-gnu/
ENTRYPOINT /usr/bin/songlify

View File

@ -1,5 +1,6 @@
use crate::SpotifyURL::Track; use crate::SpotifyURL::Track;
use aspotify::{Client, ClientCredentials}; use rspotify::blocking::client::Spotify;
use rspotify::blocking::oauth2::SpotifyClientCredentials;
use teloxide::prelude::*; use teloxide::prelude::*;
enum SpotifyURL { enum SpotifyURL {
@ -17,16 +18,24 @@ fn get_spotify_entry(url: &str) -> Option<SpotifyURL> {
return None; return None;
} }
fn is_spotify_url(url: &str) -> Option<&str> {
// https://open.spotify.com/track/0VffaI2jwQknRrxpECYHsF?si=1e16c64779744375
if url.contains("https://open.spotify.com/") {
return Some(url);
}
return None;
}
struct TrackInfo { struct TrackInfo {
name: String, name: String,
artist: Vec<String>, artist: Vec<String>,
} }
async fn get_spotify_track(spotify: Box<Client>, id: &String) -> Option<TrackInfo> { fn get_spotify_track(spotify: Box<Spotify>, id: &String) -> Option<TrackInfo> {
match spotify.tracks().get_track(id.as_str(), None).await { match spotify.track(id.as_str()) {
Ok(track) => Some(TrackInfo { Ok(track) => Some(TrackInfo {
name: track.data.name, name: track.name,
artist: track.data.artists.iter().map(|x| x.name.clone()).collect(), artist: track.artists.iter().map(|x| x.name.clone()).collect(),
}), }),
Err(_e) => None, Err(_e) => None,
} }
@ -39,16 +48,19 @@ 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 = let spotify_creds = SpotifyClientCredentials::default().build();
ClientCredentials::from_env().expect("CLIENT_ID and CLIENT_SECRET not found."); let spotify_client = Box::new(
let spotify_client = Box::new(Client::new(spotify_creds)); Spotify::default()
.client_credentials_manager(spotify_creds)
.build(),
);
log::info!("Connected to Spotify"); 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) => match spotify {
Track(id) => { Track(id) => {
let track_info = get_spotify_track(spotify_client, &id).await; let track_info = get_spotify_track(spotify_client, &id);
match track_info { match track_info {
Some(info) => { Some(info) => {
let reply = format!( let reply = format!(
@ -69,6 +81,4 @@ async fn main() {
respond(()) respond(())
}) })
.await; .await;
log::info!("Exiting...");
} }