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>
89 lines
2.8 KiB
Go
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)
|
|
}
|
|
}
|