fix: check file existance before fetching metadata

This commit is contained in:
2026-03-14 11:07:57 +01:00
parent aef6e80c77
commit 3d3f57db04
3 changed files with 61 additions and 28 deletions
+22 -16
View File
@@ -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
+36 -11
View File
@@ -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
}
+3 -1
View File
@@ -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
}