Compare commits
	
		
			4 Commits
		
	
	
		
			a65a0469c1
			...
			f0b904f17e
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| f0b904f17e | |||
| 10040d1f39 | |||
| 0ba77b0aa6 | |||
| c9a252fb9a | 
							
								
								
									
										2
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.dockerignore
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
				
			|||||||
 | 
					target/
 | 
				
			||||||
 | 
					.idea/
 | 
				
			||||||
@ -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"] }
 | 
				
			||||||
rspotify = "0.10.0"
 | 
					aspotify = "0.7.0"
 | 
				
			||||||
							
								
								
									
										18
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								Dockerfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					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
 | 
				
			||||||
							
								
								
									
										71
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										71
									
								
								src/main.rs
									
									
									
									
									
								
							@ -1,27 +1,35 @@
 | 
				
			|||||||
 | 
					use crate::SpotifyURL::Track;
 | 
				
			||||||
 | 
					use aspotify::{Client, ClientCredentials};
 | 
				
			||||||
use teloxide::prelude::*;
 | 
					use teloxide::prelude::*;
 | 
				
			||||||
use crate::Spotify::Track;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum Spotify {
 | 
					enum SpotifyURL {
 | 
				
			||||||
    Track(String)
 | 
					    Track(String),
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn get_spotify_entry(url : &str) -> Option<Spotify> {
 | 
					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());
 | 
				
			||||||
        return match track_id {
 | 
					        return match track_id {
 | 
				
			||||||
            Some(id) => Some(Spotify::Track(id.to_string())),
 | 
					            Some(id) => Some(SpotifyURL::Track(id.to_string())),
 | 
				
			||||||
            None => None
 | 
					            None => None,
 | 
				
			||||||
        }
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return None
 | 
					    return None;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn is_spotify_url(url : &str) -> Option<&str> {
 | 
					struct TrackInfo {
 | 
				
			||||||
    // https://open.spotify.com/track/0VffaI2jwQknRrxpECYHsF?si=1e16c64779744375
 | 
					    name: String,
 | 
				
			||||||
    if url.contains("https://open.spotify.com/") {
 | 
					    artist: Vec<String>,
 | 
				
			||||||
        return Some(url)
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async fn get_spotify_track(spotify: Box<Client>, id: &String) -> Option<TrackInfo> {
 | 
				
			||||||
 | 
					    match spotify.tracks().get_track(id.as_str(), None).await {
 | 
				
			||||||
 | 
					        Ok(track) => Some(TrackInfo {
 | 
				
			||||||
 | 
					            name: track.data.name,
 | 
				
			||||||
 | 
					            artist: track.data.artists.iter().map(|x| x.name.clone()).collect(),
 | 
				
			||||||
 | 
					        }),
 | 
				
			||||||
 | 
					        Err(_e) => None,
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return None
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[tokio::main]
 | 
					#[tokio::main]
 | 
				
			||||||
@ -30,18 +38,37 @@ async fn main() {
 | 
				
			|||||||
    log::info!("Starting Songlify...");
 | 
					    log::info!("Starting Songlify...");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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 text  = message.update.text().and_then(get_spotify_entry);
 | 
					        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);
 | 
				
			||||||
        match text {
 | 
					        match text {
 | 
				
			||||||
            Some(spotify) => {
 | 
					            Some(spotify) => match spotify {
 | 
				
			||||||
                match spotify {
 | 
					                Track(id) => {
 | 
				
			||||||
                    Track(id) => Some(message.reply_to(id).await?)
 | 
					                    let track_info = get_spotify_track(spotify_client, &id).await;
 | 
				
			||||||
 | 
					                    match track_info {
 | 
				
			||||||
 | 
					                        Some(info) => {
 | 
				
			||||||
 | 
					                            let reply = format!(
 | 
				
			||||||
 | 
					                                "Track information:\n\
 | 
				
			||||||
 | 
					                                Track name: {}\n\
 | 
				
			||||||
 | 
					                                Artists: {}",
 | 
				
			||||||
 | 
					                                info.name,
 | 
				
			||||||
 | 
					                                info.artist.join(", ")
 | 
				
			||||||
 | 
					                            );
 | 
				
			||||||
 | 
					                            Some(message.reply_to(reply).await?)
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                        None => None,
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            },
 | 
				
			||||||
            None => None
 | 
					            None => None,
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
        respond(())
 | 
					        respond(())
 | 
				
			||||||
    })
 | 
					    })
 | 
				
			||||||
        .await;
 | 
					    .await;
 | 
				
			||||||
}
 | 
					
 | 
				
			||||||
 | 
					    log::info!("Exiting...");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user