package main import ( "fmt" "io" "net/http" "os" ) const stream_url = "http://streaming.rolandradio.net/rolandradio" const stream_file = "./rolanradio_%s.mp3" const sizeGeneriqueToStrip = 0x702A0 //octets const bufferSize = 2048 //octets func stopRecording() bool { return false } // Enregistre le stream_url dans stream_file en ajoutant la date (%s) // prend un channel de type booleen en entrée : true a la fin de la fonction OK, false si erreur func Enregistre_stream(done chan bool, errChan chan error, filename string) { // Obtenir la réponse HTTP depuis l'URL resp, err := http.Get(stream_url) if err != nil { fmt.Println("Error fetching stream:", err) done <- false errChan <- err } defer resp.Body.Close() // Créer un fichier local pour écrire les données du flux audio file, err := os.Create(filename) if err != nil { fmt.Fprintf(os.Stderr, "Error creating file : %s", err) done <- false errChan <- err } defer file.Close() //fmt.Println("Rejet des ", sizeGeneriqueToStrip, " premiers octets du stream") fmt.Println("Recording...") // met a la poubelle les premiers octets du stream (entete + generique roland radio) _, err = io.CopyN(io.Discard, resp.Body, sizeGeneriqueToStrip) if err != nil { fmt.Fprintf(os.Stderr, "Erreur du strip de l'entête et générique du stream: %s", err) done <- false errChan <- err } buffer := make([]byte, bufferSize) var totalBytes int64 for { n, err := resp.Body.Read(buffer) if err != nil && err != io.EOF { fmt.Fprintf(os.Stderr, "Error lecture buffer stream : %s", err) done <- false errChan <- err } _, err = file.Write(buffer[:n]) if err != nil { fmt.Fprintf(os.Stderr, "Error copying stream : %s", err) done <- false errChan <- err } totalBytes += int64(n) if stopRecording() { break } } done <- true }