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 return err
} }
var urls []string playlistItems := playlist.GetPlaylistItems()
for _, item := range playlist.Data.Playlist.Content.Items { trackListSize := len(playlistItems)
url, err := SpotifyUriToLink(item.Item.Data.Uri) 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 { 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) url, err := SpotifyUriToLink(item.Item.Data.Uri)
for idx, url := range urls {
metadata, err := app.GetTrackMetadata(url) metadata, err := app.GetTrackMetadata(url)
if err != nil { 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 err := app.DownloadTrack(url, outputFile+"/", service, quality, true, metadata); err != nil {
if app.StopOnFail { if app.StopOnFail {
return err return err
+36 -11
View File
@@ -130,17 +130,8 @@ type PlaylistMetadata struct {
Name string `json:"name"` Name string `json:"name"`
Uri string `json:"uri"` Uri string `json:"uri"`
Content struct { Content struct {
TotalCount int `json:"totalCount"` TotalCount int `json:"totalCount"`
Items []struct { Items []PlaylistItems `json:"items"`
Item struct {
Data struct {
IdentityTrait struct {
Name string `json:"name"`
} `json:"identityTrait"`
Uri string `json:"uri"`
} `json:"data"`
} `json:"itemV3"`
} `json:"items"`
} `json:"content"` } `json:"content"`
Members struct { Members struct {
Items []struct { Items []struct {
@@ -155,3 +146,37 @@ type PlaylistMetadata struct {
} `json:"playlistV2"` } `json:"playlistV2"`
} `json:"data"` } `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 return tmp2[0], nil
} }
const FILE_NAME_FORMAT = "%s - %s.%s"
func BuildFileName(metadata TrackMetadata, extension string) (string, error) { func BuildFileName(metadata TrackMetadata, extension string) (string, error) {
var result string var result string
@@ -54,7 +56,7 @@ func BuildFileName(metadata TrackMetadata, extension string) (string, error) {
return result, err 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 return result, nil
} }