fix(S21/T01): fix all lint warnings and upgrade wsl to wsl_v5

Files:
- .golangci.yml
- backend/events/cmd/genevents/main.go
- backend/fileutil/atomicwrite_test.go
- backend/library/library.go
- backend/player/buffered_streamer_test.go
- backend/player/player.go
- backend/tagwriter/dbsync.go
- backend/tagwriter/mp3_test.go
- backend/tagwriter/ogg.go
- backend/tagwriter/ogg_test.go
- backend/tagwriter/ogg_vorbis.go
- backend/tagwriter/pipeline.go
- backend/tagwriter/tagwriter.go
- backend/tagwriter/wav_test.go
This commit is contained in:
2026-03-20 14:36:18 -04:00
parent 2409b3435a
commit f16157a213
14 changed files with 61 additions and 91 deletions
+24 -75
View File
@@ -14,14 +14,14 @@ import (
// Sentinel errors for OGG operations.
var (
errNotOgg = errors.New("not an OGG file")
errNotVorbis = errors.New("not an OGG Vorbis file")
errOggMultiStream = errors.New("this OGG file contains multiple streams and cannot be edited")
errOggTruncated = errors.New("OGG file is truncated")
errOggInvalidPage = errors.New("invalid OGG page")
errOggBadVersion = errors.New("unsupported OGG version")
errOggNoPages = errors.New("OGG file contains no pages")
errOggMissingSetup = errors.New("OGG file is missing the setup header packet")
errNotOgg = errors.New("not an OGG file")
errNotVorbis = errors.New("not an OGG Vorbis file")
errOggMultiStream = errors.New("this OGG file contains multiple streams and cannot be edited")
errOggTruncated = errors.New("OGG file is truncated")
errOggBadVersion = errors.New("unsupported OGG version")
errOggTooFewPackets = errors.New("ogg vorbis: expected at least 3 header packets")
errOggNoPages = errors.New("OGG file contains no pages")
errOggMissingSetup = errors.New("OGG file is missing the setup header packet")
)
// oggCRCTable is the pre-computed 256-entry CRC32 lookup table for OGG.
@@ -117,7 +117,11 @@ func parseOggPages(logger *slog.Logger, filePath string) ([]oggPage, error) {
segEnd := segStart + numSegments
if segEnd > len(raw) {
return nil, fmt.Errorf("%w: segment table truncated at offset %d", errOggTruncated, offset)
return nil, fmt.Errorf(
"%w: segment table truncated at offset %d",
errOggTruncated,
offset,
)
}
segmentTable := make([]byte, numSegments)
@@ -192,7 +196,8 @@ func parseOggPages(logger *slog.Logger, filePath string) ([]oggPage, error) {
// Validate: first page is Vorbis identification header.
firstPacketData := pages[0].data
if len(firstPacketData) < 7 || firstPacketData[0] != 0x01 || //nolint:mnd // Vorbis ID header magic
if len(firstPacketData) < 7 ||
firstPacketData[0] != 0x01 || //nolint:mnd // Vorbis ID header magic
string(firstPacketData[1:7]) != "vorbis" {
return nil, errNotVorbis
}
@@ -249,6 +254,7 @@ func writeOggPage(w io.Writer, page oggPage) error {
// a value <255 terminates it.
func extractPackets(pages []oggPage) [][]byte {
var packets [][]byte
var current []byte
for _, page := range pages {
@@ -299,7 +305,12 @@ func splitPacketIntoSegments(packet []byte) []byte {
// respecting the 255-segment-per-page limit. The first page gets the
// headerType as-is; continuation pages get the continued flag (0x01)
// ORed in. All pages share the same serialNo and granulePos.
func buildPagesFromSegments(segments []byte, packetData []byte, serialNo uint32, granulePos int64) []oggPage {
func buildPagesFromSegments(
segments []byte,
packetData []byte,
serialNo uint32,
granulePos int64,
) []oggPage {
const maxSegmentsPerPage = 255
var pages []oggPage
@@ -400,7 +411,7 @@ func writeOggTags(logger *slog.Logger, filePath string, changes TagChanges) erro
const minHeaderPackets = 3
if len(packets) < minHeaderPackets {
return fmt.Errorf("ogg vorbis: expected at least 3 header packets, got %d", len(packets))
return fmt.Errorf("%w: got %d", errOggTooFewPackets, len(packets))
}
_ = packets[0] // identification packet — preserved as page 0 unchanged
@@ -503,72 +514,10 @@ func findAudioPageStart(pages []oggPage) int {
return len(pages)
}
// serializePacketsToPages is a helper that builds pages from multiple
// packets concatenated into the same page stream. This is used for
// the comment + setup header packets which share pages per Vorbis spec.
func serializePacketsToPages(packets [][]byte, serialNo uint32, granulePos int64) []oggPage {
var allSegs []byte
var allData []byte
for _, pkt := range packets {
segs := splitPacketIntoSegments(pkt)
allSegs = append(allSegs, segs...)
allData = append(allData, pkt...)
}
return buildPagesFromSegments(allSegs, allData, serialNo, granulePos)
}
// computePacketBoundaryInPages determines how many complete packets
// exist starting from the beginning of a sequence of pages, using
// lacing values. It returns the number of complete packets and
// whether the reading ended mid-packet (a continued packet).
func computePacketBoundaryInPages(pages []oggPage) (completedPackets int, midPacket bool) {
inPacket := false
for _, page := range pages {
for _, lacing := range page.segmentTable {
if lacing > 0 {
inPacket = true
}
if lacing < 255 { //nolint:mnd // OGG lacing terminates packet
if inPacket || lacing == 0 {
completedPackets++
inPacket = false
}
}
}
}
return completedPackets, inPacket
}
// oggPagesCopy creates a deep copy of a slice of oggPage.
func oggPagesCopy(pages []oggPage) []oggPage {
cp := make([]oggPage, len(pages))
for i, p := range pages {
cp[i] = oggPage{
headerType: p.headerType,
granulePos: p.granulePos,
serialNo: p.serialNo,
seqNo: p.seqNo,
}
cp[i].segmentTable = make([]byte, len(p.segmentTable))
copy(cp[i].segmentTable, p.segmentTable)
cp[i].data = make([]byte, len(p.data))
copy(cp[i].data, p.data)
}
return cp
}
// pageBytes serializes an OGG page to raw bytes (for CRC verification etc.).
func pageBytes(page oggPage) []byte {
var buf bytes.Buffer
_ = writeOggPage(&buf, page)
return buf.Bytes()