mirror of
https://github.com/zarzet/SpotiFLAC-Mobile.git
synced 2026-09-14 22:05:39 +02:00
Add complete metadata reads with a display-name hint in Go and both native bridges. Read seekable SAF descriptors directly and use temporary copies only when direct reading fails. Add format parity tests for MP3, FLAC, M4A, and WAV plus a Dart bridge hint regression.
66 lines
2.0 KiB
Go
66 lines
2.0 KiB
Go
package gobackend
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"runtime"
|
|
"testing"
|
|
)
|
|
|
|
func TestCompleteMetadataHintMatchesNamedFileAndDescriptor(t *testing.T) {
|
|
for _, format := range []string{"mp3", "flac", "m4a", "wav"} {
|
|
t.Run(format, func(t *testing.T) {
|
|
dir := t.TempDir()
|
|
path := filepath.Join(dir, "track."+format)
|
|
switch format {
|
|
case "mp3":
|
|
data := buildID3v23Tag(id3TextFrame("TIT2", "Song"), id3TextFrame("TPE1", "Artist"), id3TextFrame("TSRC", "USRC17607839"), id3CommentFrame("USLT", "Words"), id3UserTextFrame("TXXX", "REPLAYGAIN_TRACK_GAIN", "-6.00 dB"), id3UserTextFrame("TXXX", "REPLAYGAIN_ALBUM_GAIN", "-4.00 dB"))
|
|
if err := os.WriteFile(path, data, 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
case "flac":
|
|
writeSinglePassTestFlac(t, path, nil)
|
|
case "wav":
|
|
writeTestWAV(t, path)
|
|
case "m4a":
|
|
data, _ := buildTestM4A(t, buildM4ATextAtom("\xa9nam", "Song"), []byte("audio"))
|
|
if err := os.WriteFile(path, data, 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
expected, err := ReadFileMetadata(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
extensionless := filepath.Join(dir, "descriptor")
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := os.WriteFile(extensionless, data, 0600); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
actual, err := ReadFileMetadataWithHint(extensionless, "track."+format)
|
|
if err != nil || actual != expected {
|
|
t.Fatalf("hinted metadata=%s expected=%s err=%v", actual, expected, err)
|
|
}
|
|
// Android uses /proc, which reopens with an independent offset.
|
|
// macOS /dev/fd duplicates the shared offset and is not that API.
|
|
if runtime.GOOS != "linux" {
|
|
return
|
|
}
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
defer file.Close()
|
|
prefix := "/proc/self/fd/"
|
|
actual, err = ReadFileMetadataWithHint(fmt.Sprintf("%s%d", prefix, file.Fd()), "track."+format)
|
|
if err != nil || actual != expected {
|
|
t.Fatalf("descriptor metadata=%s expected=%s err=%v", actual, expected, err)
|
|
}
|
|
})
|
|
}
|
|
}
|