Files
2026-09-30 21:59:32 +02:00

30 lines
779 B
Go

package infra
import (
"fmt"
"strings"
"radio-go/internal/domain"
)
// sanitize flattens a string so it can't break or forge an m3u line:
// newlines become spaces and "#EXT" sequences are stripped so a song title
// can never inject a fake #EXTINF entry.
func sanitize(s string) string {
return strings.ReplaceAll(
strings.NewReplacer("\r", " ", "\n", " ").Replace(s),
"#EXT", "")
}
// WriteM3U renders an extended M3U playlist (relative mp3 names).
func WriteM3U(station string, pl []domain.Track) string {
var b strings.Builder
b.WriteString("#EXTM3U\n")
for _, t := range pl {
dur := int(t.Duration)
title := sanitize(fmt.Sprintf("%s - %s", station, t.DisplayTitle()))
fmt.Fprintf(&b, "#EXTINF:%d,%s\n%s.mp3\n", dur, title, t.ID)
}
return b.String()
}