@@ -7,56 +7,61 @@ pub struct IcyMetadata {
77 pub stream_title : Option < String > ,
88}
99
10- #[ tauri:: command]
11- pub async fn get_icy_metadata ( url : String ) -> Result < IcyMetadata , String > {
12- let mut headers = HeaderMap :: new ( ) ;
13- headers. insert ( "Icy-MetaData" , HeaderValue :: from_static ( "1" ) ) ;
14- headers. insert ( "User-Agent" , HeaderValue :: from_static ( "FXRadio/2.0" ) ) ;
15-
16- let client = reqwest:: blocking:: Client :: new ( ) ;
17- let mut response = client. get ( & url)
18- . headers ( headers)
19- . send ( )
20- . map_err ( |e| e. to_string ( ) ) ?;
21-
22- let metaint = response. headers ( )
23- . get ( "icy-metaint" )
24- . and_then ( |h| h. to_str ( ) . ok ( ) )
25- . and_then ( |s| s. parse :: < usize > ( ) . ok ( ) ) ;
26-
27- if let Some ( interval) = metaint {
28- let mut buffer = vec ! [ 0u8 ; interval] ;
29- response. read_exact ( & mut buffer) . map_err ( |e| e. to_string ( ) ) ?;
30-
31- let mut length_byte = [ 0u8 ; 1 ] ;
32- response. read_exact ( & mut length_byte) . map_err ( |e| e. to_string ( ) ) ?;
33-
34- let length = length_byte[ 0 ] as usize * 16 ;
35- if length > 0 {
36- let mut meta_buffer = vec ! [ 0u8 ; length] ;
37- response. read_exact ( & mut meta_buffer) . map_err ( |e| e. to_string ( ) ) ?;
38-
39- let meta_str = String :: from_utf8_lossy ( & meta_buffer) ;
40- // Example: StreamTitle='Song Artist - Song Name';
41- if let Some ( start) = meta_str. find ( "StreamTitle='" ) {
42- let rest = & meta_str[ start + 13 ..] ;
43- if let Some ( end) = rest. find ( "';" ) {
44- return Ok ( IcyMetadata {
45- stream_title : Some ( rest[ ..end] . to_string ( ) ) ,
46- } ) ;
10+ mod commands {
11+ use super :: * ;
12+ use std:: io:: Read ;
13+
14+ #[ tauri:: command]
15+ pub fn get_icy_metadata ( url : String ) -> Result < IcyMetadata , String > {
16+ let mut headers = HeaderMap :: new ( ) ;
17+ headers. insert ( "Icy-MetaData" , HeaderValue :: from_static ( "1" ) ) ;
18+ headers. insert ( "User-Agent" , HeaderValue :: from_static ( "FXRadio/2.0" ) ) ;
19+
20+ let client = reqwest:: blocking:: Client :: new ( ) ;
21+ let mut response = client. get ( & url)
22+ . headers ( headers)
23+ . send ( )
24+ . map_err ( |e| e. to_string ( ) ) ?;
25+
26+ let metaint = response. headers ( )
27+ . get ( "icy-metaint" )
28+ . and_then ( |h| h. to_str ( ) . ok ( ) )
29+ . and_then ( |s| s. parse :: < usize > ( ) . ok ( ) ) ;
30+
31+ if let Some ( interval) = metaint {
32+ let mut buffer = vec ! [ 0u8 ; interval] ;
33+ response. read_exact ( & mut buffer) . map_err ( |e| e. to_string ( ) ) ?;
34+
35+ let mut length_byte = [ 0u8 ; 1 ] ;
36+ response. read_exact ( & mut length_byte) . map_err ( |e| e. to_string ( ) ) ?;
37+
38+ let length = length_byte[ 0 ] as usize * 16 ;
39+ if length > 0 {
40+ let mut meta_buffer = vec ! [ 0u8 ; length] ;
41+ response. read_exact ( & mut meta_buffer) . map_err ( |e| e. to_string ( ) ) ?;
42+
43+ let meta_str = String :: from_utf8_lossy ( & meta_buffer) ;
44+ // Example: StreamTitle='Song Artist - Song Name';
45+ if let Some ( start) = meta_str. find ( "StreamTitle='" ) {
46+ let rest = & meta_str[ start + 13 ..] ;
47+ if let Some ( end) = rest. find ( "';" ) {
48+ return Ok ( IcyMetadata {
49+ stream_title : Some ( rest[ ..end] . to_string ( ) ) ,
50+ } ) ;
51+ }
4752 }
4853 }
4954 }
50- }
5155
52- Ok ( IcyMetadata { stream_title : None } )
56+ Ok ( IcyMetadata { stream_title : None } )
57+ }
5358}
5459
5560#[ cfg_attr( mobile, tauri:: mobile_entry_point) ]
5661pub fn run ( ) {
5762 tauri:: Builder :: default ( )
5863 . plugin ( tauri_plugin_opener:: init ( ) )
59- . invoke_handler ( tauri:: generate_handler![ get_icy_metadata] )
64+ . invoke_handler ( tauri:: generate_handler![ commands :: get_icy_metadata] )
6065 . run ( tauri:: generate_context!( ) )
6166 . expect ( "error while running tauri application" ) ;
6267}
0 commit comments