From 3d3f57db046926b374830dfdb4a6f7d037329489 Mon Sep 17 00:00:00 2001 From: Superredstone Date: Sat, 14 Mar 2026 11:07:57 +0100 Subject: [PATCH] fix: check file existance before fetching metadata --- lib/download.go | 38 ++++++++++++++++++++++---------------- lib/types.go | 47 ++++++++++++++++++++++++++++++++++++----------- lib/utils.go | 4 +++- 3 files changed, 61 insertions(+), 28 deletions(-) diff --git a/lib/download.go b/lib/download.go index 7121dfd..0689a16 100644 --- a/lib/download.go +++ b/lib/download.go @@ -75,30 +75,36 @@ func (app *App) DownloadPlaylist(url string, outputFile string, service string, return err } - var urls []string - for _, item := range playlist.Data.Playlist.Content.Items { - url, err := SpotifyUriToLink(item.Item.Data.Uri) + playlistItems := playlist.GetPlaylistItems() + trackListSize := len(playlistItems) + for idx, item := range playlistItems { + artists := item.GetArtists() + fileName := outputFile + fmt.Sprintf(FILE_NAME_FORMAT, item.Item.Data.IdentityTrait.Name, artists, "flac") + + fmt.Println("[" + strconv.Itoa(idx+1) + "/" + strconv.Itoa(trackListSize) + "] " + item.Item.Data.IdentityTrait.Name + " - " + artists) + + songExists, err := FileExists(fileName) if err != nil { - return err + if app.StopOnFail { + return err + } + continue } - urls = append(urls, url) - } + if songExists && !app.OverrideDownload { + app.log("Song " + fileName + " already exists") + continue + } - trackListSize := len(urls) - for idx, url := range urls { + url, err := SpotifyUriToLink(item.Item.Data.Uri) metadata, err := app.GetTrackMetadata(url) if err != nil { - return err + if app.StopOnFail { + return err + } + continue } - artists, err := GetArtists(metadata) - if err != nil { - return err - } - - fmt.Println("[" + strconv.Itoa(idx+1) + "/" + strconv.Itoa(trackListSize) + "] " + metadata.Data.TrackUnion.Name + " - " + artists) - if err := app.DownloadTrack(url, outputFile+"/", service, quality, true, metadata); err != nil { if app.StopOnFail { return err diff --git a/lib/types.go b/lib/types.go index 6bd864f..3a73556 100644 --- a/lib/types.go +++ b/lib/types.go @@ -130,17 +130,8 @@ type PlaylistMetadata struct { Name string `json:"name"` Uri string `json:"uri"` Content struct { - TotalCount int `json:"totalCount"` - Items []struct { - Item struct { - Data struct { - IdentityTrait struct { - Name string `json:"name"` - } `json:"identityTrait"` - Uri string `json:"uri"` - } `json:"data"` - } `json:"itemV3"` - } `json:"items"` + TotalCount int `json:"totalCount"` + Items []PlaylistItems `json:"items"` } `json:"content"` Members struct { Items []struct { @@ -155,3 +146,37 @@ type PlaylistMetadata struct { } `json:"playlistV2"` } `json:"data"` } + +type PlaylistItems struct { + Item struct { + Data struct { + IdentityTrait struct { + Name string `json:"name"` + Contributors struct { + Items []struct { + Name string `json:"name"` + } + } `json:"contributors"` + } `json:"identityTrait"` + Uri string `json:"uri"` + } `json:"data"` + } `json:"itemV3"` +} + +func (metadata *PlaylistMetadata) GetPlaylistItems() []PlaylistItems { + return metadata.Data.Playlist.Content.Items +} + +func (playlistItem *PlaylistItems) GetArtists() string { + var result = "" + for idx, artist := range playlistItem.Item.Data.IdentityTrait.Contributors.Items { + if idx == len(playlistItem.Item.Data.IdentityTrait.Contributors.Items)-1 { + result += artist.Name + continue + } + + result += artist.Name + ", " + } + + return result +} diff --git a/lib/utils.go b/lib/utils.go index 7fa86b8..4f89206 100644 --- a/lib/utils.go +++ b/lib/utils.go @@ -46,6 +46,8 @@ func ParseTrackId(url string) (string, error) { return tmp2[0], nil } +const FILE_NAME_FORMAT = "%s - %s.%s" + func BuildFileName(metadata TrackMetadata, extension string) (string, error) { var result string @@ -54,7 +56,7 @@ func BuildFileName(metadata TrackMetadata, extension string) (string, error) { return result, err } - result = fmt.Sprintf("%s - %s.%s", metadata.Data.TrackUnion.Name, artists, extension) + result = fmt.Sprintf(FILE_NAME_FORMAT, metadata.Data.TrackUnion.Name, artists, extension) return result, nil }