From 36030f9f4c625b0eb443573d520a6f01a4f4940e Mon Sep 17 00:00:00 2001 From: Superredstone Date: Fri, 20 Feb 2026 09:32:59 +0100 Subject: [PATCH] feat: implement metadata fetch command --- lib/metadata.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++- lib/types.go | 14 ++++++++++- 2 files changed, 76 insertions(+), 2 deletions(-) diff --git a/lib/metadata.go b/lib/metadata.go index 684ae58..23fd934 100644 --- a/lib/metadata.go +++ b/lib/metadata.go @@ -3,8 +3,10 @@ package lib import ( "encoding/json" "errors" + "fmt" "io" "net/http" + "strconv" "github.com/go-flac/flacpicture/v2" "github.com/go-flac/flacvorbis/v2" @@ -66,7 +68,67 @@ func (app *App) GetTrackMetadata(url string) (TrackMetadata, error) { } func (app *App) PrintMetadata(url string) error { - return errors.New("Unimplemented.") + urlType, err := ParseUrlType(url) + if err != nil { + return err + } + + switch urlType { + case UrlTypeTrack: + metadata, err := app.GetTrackMetadata(url) + if err != nil { + return err + } + + if err = PrintTrackMetadata(metadata); err != nil { + return err + } + + return nil + case UrlTypePlaylist: + metadata, err := app.GetPlaylistMetadata(url) + if err != nil { + return err + } + + var members, owner string + for _, member := range metadata.Data.Playlist.Members.Items { + if member.IsOwner { + owner = member.User.Data.Name + continue + } + + members += member.User.Data.Name + " " + } + + fmt.Println( + "Name: " + metadata.Data.Playlist.Name + "\n" + + "Owner: " + owner + "\n" + + "Members: " + members + "\n" + + "Tracks: " + strconv.Itoa(metadata.Data.Playlist.Content.TotalCount), + ) + + return nil + } + + return errors.New("Invalid URL type.") +} + +func PrintTrackMetadata(metadata TrackMetadata) error { + artists, err := GetArtists(metadata) + if err != nil { + return err + } + + fmt.Println( + "Name:\t\t" + metadata.Data.TrackUnion.Name + "\n" + + "Artists:\t" + artists + "\n" + + "Album:\t\t" + metadata.Data.TrackUnion.AlbumOfTrack.Name + "\n" + + "Year:\t\t" + strconv.FormatInt(metadata.Data.TrackUnion.AlbumOfTrack.Date.Year, 10) + "\n" + + "Spotify ID:\t" + metadata.Data.TrackUnion.Id, + ) + + return nil } func (app *App) EmbedMetadata(fileName string, metadata TrackMetadata) error { diff --git a/lib/types.go b/lib/types.go index 5acc756..6bd864f 100644 --- a/lib/types.go +++ b/lib/types.go @@ -128,8 +128,10 @@ type PlaylistMetadata struct { Data struct { Playlist struct { Name string `json:"name"` + Uri string `json:"uri"` Content struct { - Items []struct { + TotalCount int `json:"totalCount"` + Items []struct { Item struct { Data struct { IdentityTrait struct { @@ -140,6 +142,16 @@ type PlaylistMetadata struct { } `json:"itemV3"` } `json:"items"` } `json:"content"` + Members struct { + Items []struct { + IsOwner bool `json:"isOwner"` + User struct { + Data struct { + Name string `json:"name"` + } `json:"data"` + } `json:"user"` + } `json:"items"` + } `json:"members"` } `json:"playlistV2"` } `json:"data"` }