mirror of https://github.com/gabehf/Koito.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.8 KiB
94 lines
2.8 KiB
package mbz
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"slices"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type MusicBrainzReleaseGroup struct {
|
|
Title string `json:"title"`
|
|
Type string `json:"primary_type"`
|
|
ArtistCredit []MusicBrainzArtistCredit `json:"artist-credit"`
|
|
Releases []MusicBrainzRelease `json:"releases"`
|
|
}
|
|
type MusicBrainzRelease struct {
|
|
Title string `json:"title"`
|
|
ID string `json:"id"`
|
|
ArtistCredit []MusicBrainzArtistCredit `json:"artist-credit"`
|
|
Status string `json:"status"`
|
|
TextRepresentation TextRepresentation `json:"text-representation"`
|
|
}
|
|
type MusicBrainzArtistCredit struct {
|
|
Artist MusicBrainzArtist `json:"artist"`
|
|
Name string `json:"name"`
|
|
}
|
|
type TextRepresentation struct {
|
|
Language string `json:"language"`
|
|
Script string `json:"script"`
|
|
}
|
|
|
|
const releaseGroupFmtStr = "%s/ws/2/release-group/%s?inc=releases+artists"
|
|
const releaseFmtStr = "%s/ws/2/release/%s?inc=artists"
|
|
|
|
func (c *MusicBrainzClient) GetReleaseGroup(ctx context.Context, id uuid.UUID) (*MusicBrainzReleaseGroup, error) {
|
|
mbzRG := new(MusicBrainzReleaseGroup)
|
|
err := c.getEntity(ctx, releaseGroupFmtStr, id, mbzRG)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("GetReleaseGroup: %w", err)
|
|
}
|
|
return mbzRG, nil
|
|
}
|
|
|
|
func (c *MusicBrainzClient) GetRelease(ctx context.Context, id uuid.UUID) (*MusicBrainzRelease, error) {
|
|
mbzRelease := new(MusicBrainzRelease)
|
|
err := c.getEntity(ctx, releaseFmtStr, id, mbzRelease)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("GetRelease: %w", err)
|
|
}
|
|
return mbzRelease, nil
|
|
}
|
|
|
|
func (c *MusicBrainzClient) GetReleaseTitles(ctx context.Context, RGID uuid.UUID) ([]string, error) {
|
|
releaseGroup, err := c.GetReleaseGroup(ctx, RGID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("GetReleaseTitles: %w", err)
|
|
}
|
|
|
|
var titles []string
|
|
for _, release := range releaseGroup.Releases {
|
|
if !slices.Contains(titles, release.Title) {
|
|
titles = append(titles, release.Title)
|
|
}
|
|
}
|
|
|
|
return titles, nil
|
|
}
|
|
|
|
func ReleaseGroupToTitles(rg *MusicBrainzReleaseGroup) []string {
|
|
var titles []string
|
|
for _, release := range rg.Releases {
|
|
if !slices.Contains(titles, release.Title) {
|
|
titles = append(titles, release.Title)
|
|
}
|
|
}
|
|
return titles
|
|
}
|
|
|
|
// Searches for Pseudo-Releases of release groups with Latin script, and returns them as an array
|
|
func (c *MusicBrainzClient) GetLatinTitles(ctx context.Context, id uuid.UUID) ([]string, error) {
|
|
rg, err := c.GetReleaseGroup(ctx, id)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("GetLatinTitles: %w", err)
|
|
}
|
|
titles := make([]string, 0)
|
|
for _, r := range rg.Releases {
|
|
if r.Status == "Pseudo-Release" && r.TextRepresentation.Script == "Latn" { // not a typo
|
|
titles = append(titles, r.Title)
|
|
}
|
|
}
|
|
return titles, nil
|
|
}
|