moins de plantage sur EOF et n'ecrase le fichier que si le nouveau est plus gros

This commit is contained in:
Mac Call
2023-03-06 19:46:45 +01:00
parent e53fb1b54f
commit ac56eff5b9
2 changed files with 33 additions and 16 deletions

View File

@@ -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)
}
}

View File

@@ -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
}