@@ -8,7 +8,7 @@ use reqwest::header::HeaderMap;
88
99
1010// While creating files, certain characters are not allowed to be in the name, so we use this to delete them
11- fn sanitize_song_name ( input : & str ) -> String {
11+ fn sanitize_song_name ( input : & str , path : & PathBuf ) -> String {
1212 let mut result = input
1313 . replace ( "\\ u0026" , "and" ) ; // & -> and
1414 result = result. replace ( "\\ u003c3" , "ily" ) ; // <3 -> ily
@@ -36,7 +36,7 @@ fn regex_get_first(regex: Regex, text: &str) -> Option<String> {
3636
3737struct ThreadWatcher ;
3838
39- // If the function panics, remove one count from tthe thread count since the thread obviously isn't running
39+ // If the function panics, remove one count from the thread count since the thread obviously isn't running
4040impl Drop for ThreadWatcher {
4141 fn drop ( & mut self ) {
4242 if thread:: panicking ( ) {
@@ -50,7 +50,7 @@ use std::thread;
5050static GLOBAL_THREAD_COUNT : std:: sync:: atomic:: AtomicUsize = std:: sync:: atomic:: AtomicUsize :: new ( 0 ) ;
5151
5252
53- pub fn prepare_download ( songs : Vec < String > , temp_dir : & mut PathBuf , download_dir : & mut PathBuf , threads : usize , is_track : bool ) {
53+ pub fn prepare_download ( songs : Vec < String > , temp_dir : & mut PathBuf , download_dir : & mut PathBuf , threads : usize , is_track : bool , client_id : String ) {
5454 let max_threads = std:: sync:: atomic:: AtomicUsize :: new ( 0 ) ;
5555 max_threads. fetch_add ( threads, Ordering :: SeqCst ) ;
5656 let req: Client = reqwest:: blocking:: ClientBuilder :: new ( ) . use_rustls_tls ( ) . danger_accept_invalid_certs ( true ) . build ( ) . unwrap ( ) ;
@@ -64,6 +64,7 @@ pub fn prepare_download(songs: Vec<String>, temp_dir: &mut PathBuf, download_dir
6464 let song_wrapped = Arc :: new ( Mutex :: new ( song. clone ( ) ) ) ;
6565 let temp_dir_wrapped = Arc :: new ( Mutex :: new ( temp_dir. clone ( ) ) ) ;
6666 let download_dir_wrapped = Arc :: new ( Mutex :: new ( download_dir. clone ( ) ) ) ;
67+ let client_id_wrapped = Arc :: new ( Mutex :: new ( client_id. clone ( ) ) ) ;
6768 GLOBAL_THREAD_COUNT . fetch_add ( 1 , Ordering :: Relaxed ) ;
6869 logging ( Severities :: INFO , format ! ( "Downloading {}" , & song) ) ;
6970 thread:: spawn ( move || {
@@ -73,8 +74,9 @@ pub fn prepare_download(songs: Vec<String>, temp_dir: &mut PathBuf, download_dir
7374 let song_locked = song_wrapped. lock ( ) . unwrap ( ) ;
7475 let mut temp_dir_locked = temp_dir_wrapped. lock ( ) . unwrap ( ) ;
7576 let mut download_dir_locked = download_dir_wrapped. lock ( ) . unwrap ( ) ;
77+ let client_id_locked = client_id_wrapped. lock ( ) . unwrap ( ) ;
7678
77- download ( req_locked. clone ( ) , song_locked. to_string ( ) , & mut temp_dir_locked, & mut download_dir_locked, is_track) ;
79+ download ( req_locked. clone ( ) , song_locked. to_string ( ) , & mut temp_dir_locked, & mut download_dir_locked, is_track, & client_id_locked ) ;
7880 GLOBAL_THREAD_COUNT . fetch_sub ( 1 , Ordering :: Relaxed ) ;
7981 } ) ;
8082 run = false ;
@@ -102,7 +104,7 @@ fn count_mp3(root: PathBuf) -> u32 {
102104}
103105
104106
105- fn download ( req : Client , song : String , temp_dir : & mut PathBuf , download_dir : & mut PathBuf , is_track : bool ) {
107+ fn download ( req : Client , song : String , temp_dir : & mut PathBuf , download_dir : & mut PathBuf , is_track : bool , client_id : & str ) {
106108 let mut temp_dir = temp_dir. clone ( ) . to_owned ( ) ;
107109 let mut download_dir = download_dir. clone ( ) . to_owned ( ) ;
108110 let mut audio_file_nmbr_count: u32 = 0 ;
@@ -265,7 +267,24 @@ fn download(req: Client, song: String, temp_dir: &mut PathBuf, download_dir: &mu
265267 if let Some ( hls) = capture. get ( 1 ) {
266268 let track_auth = track_auth. as_str ( ) ;
267269 let hls = hls. as_str ( ) ;
268- let r = req. get ( format ! ( "{hls}?client_id=baLbCx2miy7TG4nunX9yTWklG3ecgeE9&track_authorization={track_auth}" ) )
270+ let mut headers = HeaderMap :: new ( ) ;
271+ headers. insert ( "Accept" , "*/*" . parse ( ) . unwrap ( ) ) ;
272+ headers. insert ( "Accept-Language" , "hu-HU,hu;q=0.9" . parse ( ) . unwrap ( ) ) ;
273+ headers. insert ( "Cache-Control" , "no-cache" . parse ( ) . unwrap ( ) ) ;
274+ headers. insert ( "Connection" , "keep-alive" . parse ( ) . unwrap ( ) ) ;
275+ headers. insert ( "Content-Type" , "application/json" . parse ( ) . unwrap ( ) ) ;
276+ headers. insert ( "Origin" , "https://soundcloud.com" . parse ( ) . unwrap ( ) ) ;
277+ headers. insert ( "Pragma" , "no-cache" . parse ( ) . unwrap ( ) ) ;
278+ headers. insert ( "Referer" , "https://soundcloud.com/" . parse ( ) . unwrap ( ) ) ;
279+ headers. insert ( "Sec-Fetch-Dest" , "empty" . parse ( ) . unwrap ( ) ) ;
280+ headers. insert ( "Sec-Fetch-Mode" , "cors" . parse ( ) . unwrap ( ) ) ;
281+ headers. insert ( "Sec-Fetch-Site" , "same-site" . parse ( ) . unwrap ( ) ) ;
282+ headers. insert ( "User-Agent" , "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" . parse ( ) . unwrap ( ) ) ;
283+ headers. insert ( "sec-ch-ua" , "\" Chromium\" ;v=\" 116\" , \" Not)A;Brand\" ;v=\" 24\" , \" Google Chrome\" ;v=\" 116\" " . parse ( ) . unwrap ( ) ) ;
284+ headers. insert ( "sec-ch-ua-mobile" , "?0" . parse ( ) . unwrap ( ) ) ;
285+ headers. insert ( "sec-ch-ua-platform" , "\" Windows\" " . parse ( ) . unwrap ( ) ) ;
286+ let r = req. get ( format ! ( "{hls}?client_id={client_id}&track_authorization={track_auth}" ) )
287+ . headers ( headers. clone ( ) )
269288 . send ( ) . unwrap ( ) ;
270289 if !r. status ( ) . is_success ( ) {
271290 logging ( Severities :: ERROR , format ! ( "Expected status code 200, got status code {} on song : {}" , r. status( ) , & song) ) ;
@@ -276,7 +295,7 @@ fn download(req: Client, song: String, temp_dir: &mut PathBuf, download_dir: &mu
276295 logging ( Severities :: ERROR , format ! ( "No download link found on song : {} | If this issue persists, please contact the developer" , & song) ) ;
277296 return ;
278297 }
279- let r = req. get ( & r[ 8 ..r. len ( ) -2 ] ) . send ( ) . unwrap ( ) . text ( ) . unwrap ( ) ;
298+ let r = req. get ( & r[ 8 ..r. len ( ) -2 ] ) . headers ( headers ) . send ( ) . unwrap ( ) . text ( ) . unwrap ( ) ;
280299 let re = Regex :: new ( r#"(https://cf-hls-media.sndcdn.com/media/.*?)\n"# ) . unwrap ( ) ;
281300 let links = re. captures_iter ( & r) ;
282301
@@ -301,7 +320,7 @@ fn download(req: Client, song: String, temp_dir: &mut PathBuf, download_dir: &mu
301320 }
302321 // mp3cat magic
303322 let mut arguments: Vec < String > = Vec :: new ( ) ;
304- download_dir. push ( format ! ( "{}.mp3" , sanitize_song_name( & song_name) ) ) ;
323+ download_dir. push ( format ! ( "{}.mp3" , sanitize_song_name( & song_name, & download_dir ) ) ) ;
305324
306325 let mut audio = 0 ;
307326 while audio < audio_file_nmbr_count {
0 commit comments