Yonah b5f5626b02
album: extend struct for /api/album/%d/data
This also includes tests against a sample response from the
https://monster-siren.hypergryph.com/api/album/1030/data endpoint.

Signed-off-by: Yonah <contrib@gensokyo.uk>
2025-09-18 19:29:23 +09:00

89 lines
2.8 KiB
Go

package main
import (
"context"
"flag"
"log"
"slices"
"git.gensokyo.uk/yonah/monstersirenfetch"
)
var (
flagAlbumsPath string
flagSongsPath string
flagOutputPath string
)
func init() {
flag.StringVar(&flagAlbumsPath, "a", "albums.json",
"Path to file containing the response body of /api/albums")
flag.StringVar(&flagSongsPath, "s", "songs.json",
"Path to file containing the response body of /api/songs")
flag.StringVar(&flagOutputPath, "o", "composite.json",
"Path to write composite data")
}
func mustEnrich(ctx context.Context) {
var (
albumsResponse monstersirenfetch.AlbumsResponse
songsResponse monstersirenfetch.SongsResponse
)
mustReadJSON(flagAlbumsPath, &albumsResponse)
mustReadJSON(flagSongsPath, &songsResponse)
if c, err := monstersirenfetch.Flatten(albumsResponse.Data, songsResponse.Data); err != nil {
log.Fatal(err)
} else {
n := new(netDirect)
for _, ca := range c {
if ca.Album == nil {
log.Fatal("albums contains nil")
}
if !ca.Album.IsFull() {
if err = ca.Album.Enrich(ctx, n); err != nil {
log.Fatal(err)
}
log.Printf("enriched album %s (%s) with %d songs", ca.Album.CID.String(), ca.Album.Name, len(ca.Songs))
} else {
log.Printf("skipped album %s (%s)", ca.Album.CID.String(), ca.Album.Name)
}
// consistency check: for later validating enriched songs against flatten
flattenSongs := make([]monstersirenfetch.AlbumSong, 0, len(ca.Songs))
for _, cs := range ca.Songs {
if cs == nil {
log.Fatal("songs contains nil")
}
flattenSongs = append(flattenSongs, monstersirenfetch.AlbumSong{CID: cs.CID, Name: cs.Name, Artists: cs.Artists})
if !cs.IsFull() {
if err = cs.Enrich(ctx, n); err != nil {
log.Fatal(err)
}
log.Printf("enriched song %s: %s (%s)", cs.CID.String(), cs.SourceURL, cs.Name)
} else {
log.Printf("skipped song %s: %s (%s)", cs.CID.String(), cs.SourceURL, cs.Name)
}
}
// consistency check: enriched songs match flattened songs
slices.SortFunc(flattenSongs, func(a, b monstersirenfetch.AlbumSong) int { return int(a.CID - b.CID) })
enrichSongs := make([]monstersirenfetch.AlbumSong, len(ca.Album.Songs))
copy(enrichSongs, ca.Album.Songs)
slices.SortFunc(enrichSongs, func(a, b monstersirenfetch.AlbumSong) int { return int(a.CID - b.CID) })
if !slices.EqualFunc(flattenSongs, enrichSongs, func(a monstersirenfetch.AlbumSong, b monstersirenfetch.AlbumSong) bool {
return a.CID == b.CID && a.Name == b.Name && slices.Equal(a.Artists, b.Artists)
}) {
log.Fatalf("album %s enrichment inconsistent with flatten state", ca.Album.Name)
} else {
log.Printf("validated %d songs associated with album %s", len(enrichSongs), ca.Album.CID.String())
}
}
mustWriteJSON(flagOutputPath, c)
log.Println("composite data written to", flagOutputPath)
}
}