moins de plantage sur EOF et n'ecrase le fichier que si le nouveau est plus gros
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
|||||||
"bufio"
|
"bufio"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -60,6 +61,17 @@ func timerToBytes(timer float64) int64 {
|
|||||||
return int64(128000. / 8. * timer)
|
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) {
|
func cutAndSave(mp3File string, timerDebut float64, timerFin float64, artiste string, titre string) {
|
||||||
octetDebut := timerToBytes(timerDebut)
|
octetDebut := timerToBytes(timerDebut)
|
||||||
octetsFin := timerToBytes(timerFin)
|
octetsFin := timerToBytes(timerFin)
|
||||||
@@ -69,18 +81,22 @@ func cutAndSave(mp3File string, timerDebut float64, timerFin float64, artiste st
|
|||||||
// ouvrir le fichier
|
// ouvrir le fichier
|
||||||
f, err := os.Open(mp3File)
|
f, err := os.Open(mp3File)
|
||||||
if err != nil {
|
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)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
|
|
||||||
|
bufferSize := octetsFin - octetDebut
|
||||||
|
|
||||||
// créer un tampon pour stocker les octets lus
|
// 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
|
// lire les octets spécifiés à partir de la position spécifiée
|
||||||
n, err := f.ReadAt(tampon, int64(octetDebut))
|
n, err := f.ReadAt(tampon, int64(octetDebut))
|
||||||
if err != nil {
|
// en cas d'erreur EOF, on continue comme si de rien n'était (il est possible qu'on tente
|
||||||
fmt.Fprintf(os.Stderr, "Erreur de lecture du fichier mp3 de %d a %d soit %d octets: %v", octetDebut, octetsFin, n, err)
|
//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)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,19 +108,20 @@ func cutAndSave(mp3File string, timerDebut float64, timerFin float64, artiste st
|
|||||||
titre = strings.ReplaceAll(titre, "/", "_")
|
titre = strings.ReplaceAll(titre, "/", "_")
|
||||||
|
|
||||||
var outputFile string = fmt.Sprintf("%s.__.%s.mp3", artiste, titre)
|
var outputFile string = fmt.Sprintf("%s.__.%s.mp3", artiste, titre)
|
||||||
|
if isWriteMp3(outputFile, bufferSize) {
|
||||||
err = os.WriteFile(outputFile, tampon, 0644)
|
err = os.WriteFile(outputFile, tampon, 0644)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "Erreur d'écriture du fichier mp3 du morceau: %v", err)
|
fmt.Fprintf(os.Stderr, "Erreur d'écriture du fichier mp3 du morceau: %v\n", err)
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func Cut(mp3File string, indexFile string) {
|
func Cut(mp3File string, indexFile string) {
|
||||||
// Ouvrir le fichier index en lecture
|
// Ouvrir le fichier index en lecture
|
||||||
fichier, err := os.Open(indexFile)
|
fichier, err := os.Open(indexFile)
|
||||||
if err != nil {
|
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)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer fichier.Close()
|
defer fichier.Close()
|
||||||
@@ -121,7 +138,7 @@ func Cut(mp3File string, indexFile string) {
|
|||||||
ligne := scanner.Text()
|
ligne := scanner.Text()
|
||||||
timer, artiste, titre, err := GetInfo(ligne)
|
timer, artiste, titre, err := GetInfo(ligne)
|
||||||
if err != nil {
|
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)
|
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
|
// Vérifier s'il y a eu une erreur lors de la lecture du fichier
|
||||||
if err := scanner.Err(); err != nil {
|
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)
|
panic(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
// Créer un fichier local pour écrire les données du flux audio
|
||||||
file, err := os.Create(filename)
|
file, err := os.Create(filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "Error creating file : %s", err)
|
fmt.Fprintf(os.Stderr, "Error creating file : %s\n", err)
|
||||||
done <- false
|
done <- false
|
||||||
errChan <- err
|
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)
|
// met a la poubelle les premiers octets du stream (entete + generique roland radio)
|
||||||
_, err = io.CopyN(io.Discard, resp.Body, sizeGeneriqueToStrip)
|
_, err = io.CopyN(io.Discard, resp.Body, sizeGeneriqueToStrip)
|
||||||
if err != nil {
|
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
|
done <- false
|
||||||
errChan <- err
|
errChan <- err
|
||||||
}
|
}
|
||||||
@@ -54,14 +54,14 @@ func Enregistre_stream(done chan bool, errChan chan error, filename string) {
|
|||||||
for {
|
for {
|
||||||
n, err := resp.Body.Read(buffer)
|
n, err := resp.Body.Read(buffer)
|
||||||
if err != nil && err != io.EOF {
|
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
|
done <- false
|
||||||
errChan <- err
|
errChan <- err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = file.Write(buffer[:n])
|
_, err = file.Write(buffer[:n])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(os.Stderr, "Error copying stream : %s", err)
|
fmt.Fprintf(os.Stderr, "Error copying stream : %s\n", err)
|
||||||
done <- false
|
done <- false
|
||||||
errChan <- err
|
errChan <- err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user