From ac56eff5b9abc9ad63ffcf848998b7f496332748 Mon Sep 17 00:00:00 2001 From: Mac Call Date: Mon, 6 Mar 2023 19:46:45 +0100 Subject: [PATCH] moins de plantage sur EOF et n'ecrase le fichier que si le nouveau est plus gros --- stream_cut.go | 41 +++++++++++++++++++++++++++++------------ stream_enregistre.go | 8 ++++---- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/stream_cut.go b/stream_cut.go index d04824c..ae51cea 100644 --- a/stream_cut.go +++ b/stream_cut.go @@ -4,6 +4,7 @@ import ( "bufio" "errors" "fmt" + "io" "os" "strconv" "strings" @@ -60,6 +61,17 @@ func timerToBytes(timer float64) int64 { return int64(128000. / 8. * timer) } +func isWriteMp3(filename string, newSize int64) bool { + fileInfo, err := os.Stat(filename) + // si le fichier n'existe pasn on peut ecrire le mp3 + if os.IsNotExist(err) { + return true + } + // si le fichier existant est plus petit que le fichier qu'on souhaite créer, on l'ecrase + fileSize := fileInfo.Size() + return fileSize < newSize +} + func cutAndSave(mp3File string, timerDebut float64, timerFin float64, artiste string, titre string) { octetDebut := timerToBytes(timerDebut) octetsFin := timerToBytes(timerFin) @@ -69,18 +81,22 @@ func cutAndSave(mp3File string, timerDebut float64, timerFin float64, artiste st // ouvrir le fichier f, err := os.Open(mp3File) if err != nil { - fmt.Fprintf(os.Stderr, "Erreur d'ouverture du fichier mp3 : %v", err) + fmt.Fprintf(os.Stderr, "Erreur d'ouverture du fichier mp3 : %v\n", err) panic(err) } defer f.Close() + bufferSize := octetsFin - octetDebut + // créer un tampon pour stocker les octets lus - tampon := make([]byte, octetsFin-octetDebut) + tampon := make([]byte, bufferSize) // lire les octets spécifiés à partir de la position spécifiée n, err := f.ReadAt(tampon, int64(octetDebut)) - if err != nil { - fmt.Fprintf(os.Stderr, "Erreur de lecture du fichier mp3 de %d a %d soit %d octets: %v", octetDebut, octetsFin, n, err) + // en cas d'erreur EOF, on continue comme si de rien n'était (il est possible qu'on tente + //d'accedeer un pu plus loin que la fin du fichier avec le delaiFin, ce n'est pas grave ça passera la fois d'apres ) + if err != nil && !errors.Is(err, io.EOF) { + fmt.Fprintf(os.Stderr, "Erreur de lecture du fichier mp3 de %d a %d soit %d octets: %v\n", octetDebut, octetsFin, n, err) panic(err) } @@ -92,19 +108,20 @@ func cutAndSave(mp3File string, timerDebut float64, timerFin float64, artiste st titre = strings.ReplaceAll(titre, "/", "_") var outputFile string = fmt.Sprintf("%s.__.%s.mp3", artiste, titre) - err = os.WriteFile(outputFile, tampon, 0644) - if err != nil { - fmt.Fprintf(os.Stderr, "Erreur d'écriture du fichier mp3 du morceau: %v", err) - panic(err) + if isWriteMp3(outputFile, bufferSize) { + err = os.WriteFile(outputFile, tampon, 0644) + if err != nil { + fmt.Fprintf(os.Stderr, "Erreur d'écriture du fichier mp3 du morceau: %v\n", err) + panic(err) + } } - } func Cut(mp3File string, indexFile string) { // Ouvrir le fichier index en lecture fichier, err := os.Open(indexFile) if err != nil { - fmt.Fprintf(os.Stderr, "Erreur d'ouverture du fichier index : %v", err) + fmt.Fprintf(os.Stderr, "Erreur d'ouverture du fichier index : %v\n", err) panic(err) } defer fichier.Close() @@ -121,7 +138,7 @@ func Cut(mp3File string, indexFile string) { ligne := scanner.Text() timer, artiste, titre, err := GetInfo(ligne) if err != nil { - fmt.Fprintf(os.Stderr, "Erreur de récupération des infos de la ligne %s : %v", ligne, err) + fmt.Fprintf(os.Stderr, "Erreur de récupération des infos de la ligne %s : %v\n", ligne, err) panic(err) } @@ -138,7 +155,7 @@ func Cut(mp3File string, indexFile string) { // Vérifier s'il y a eu une erreur lors de la lecture du fichier if err := scanner.Err(); err != nil { - fmt.Fprintf(os.Stderr, "Erreur de lecture du fichier index : %v", err) + fmt.Fprintf(os.Stderr, "Erreur de lecture du fichier index : %v\n", err) panic(err) } } diff --git a/stream_enregistre.go b/stream_enregistre.go index a964f51..db3c4a2 100644 --- a/stream_enregistre.go +++ b/stream_enregistre.go @@ -31,7 +31,7 @@ func Enregistre_stream(done chan bool, errChan chan error, filename string) { // 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) + fmt.Fprintf(os.Stderr, "Error creating file : %s\n", err) done <- false errChan <- err } @@ -43,7 +43,7 @@ func Enregistre_stream(done chan bool, errChan chan error, filename string) { // 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) + fmt.Fprintf(os.Stderr, "Erreur du strip de l'entête et générique du stream: %s\n", err) done <- false errChan <- err } @@ -54,14 +54,14 @@ func Enregistre_stream(done chan bool, errChan chan error, filename string) { for { n, err := resp.Body.Read(buffer) if err != nil && err != io.EOF { - fmt.Fprintf(os.Stderr, "Error lecture buffer stream : %s", err) + fmt.Fprintf(os.Stderr, "Error lecture buffer stream : %s\n", err) done <- false errChan <- err } _, err = file.Write(buffer[:n]) if err != nil { - fmt.Fprintf(os.Stderr, "Error copying stream : %s", err) + fmt.Fprintf(os.Stderr, "Error copying stream : %s\n", err) done <- false errChan <- err }