Implementing downloading multiple tracks into a single zip file, changing callback signature

This commit is contained in:
natilou
2023-06-15 22:16:46 -03:00
parent f190aaf732
commit 15a63681de
2 changed files with 69 additions and 22 deletions
+61 -12
View File
@@ -1,6 +1,7 @@
package controller package controller
import ( import (
"archive/zip"
"fmt" "fmt"
"image" "image"
"io" "io"
@@ -116,7 +117,7 @@ func (m *Controller) ConnectTracklistActions(tracklist *widgets.Tracklist) {
tracklist.OnColumnVisibilityMenuShown = func(pop *widget.PopUp) { tracklist.OnColumnVisibilityMenuShown = func(pop *widget.PopUp) {
m.ClosePopUpOnEscape(pop) m.ClosePopUpOnEscape(pop)
} }
tracklist.OnShowDownloadDialog = m.ShowDownloadDialog tracklist.OnDownload = m.ShowDownloadDialog
} }
func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) { func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) {
@@ -521,9 +522,15 @@ func (c *Controller) SetTrackRatings(trackIDs []string, rating int) {
} }
} }
func (c *Controller) ShowDownloadDialog(track *mediaprovider.Track) { func (c *Controller) ShowDownloadDialog(tracks []*mediaprovider.Track) {
parts := strings.Split(track.FilePath, "/") numTracks := len(tracks)
fileName := parts[len(parts)-1] var fileName string
if numTracks == 1 {
parts := strings.Split(tracks[0].FilePath, "/")
fileName = parts[len(parts)-1]
} else {
fileName = "downloaded_tracks.zip"
}
dg := dialog.NewFileSave( dg := dialog.NewFileSave(
func(file fyne.URIWriteCloser, err error) { func(file fyne.URIWriteCloser, err error) {
@@ -535,34 +542,76 @@ func (c *Controller) ShowDownloadDialog(track *mediaprovider.Track) {
if file == nil { if file == nil {
return return
} }
if numTracks == 1 {
go c.downloadTrack(tracks[0], file.URI().Path())
} else {
go c.downloadTracks(tracks, file.URI().Path())
}
filePath := file.URI().Path()
go c.downloadTrack(track.ID, filePath)
}, },
c.MainWindow) c.MainWindow)
dg.SetFileName(fileName) dg.SetFileName(fileName)
dg.Show() dg.Show()
} }
func (c *Controller) downloadTrack(trackID, filePath string) { func (c *Controller) downloadTrack(track *mediaprovider.Track, filePath string) {
reader, err := c.App.ServerManager.Server.DownloadTrack(trackID) reader, err := c.App.ServerManager.Server.DownloadTrack(track.ID)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
} }
saveDir, err := os.Create(filePath) file, err := os.Create(filePath)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
} }
defer saveDir.Close() defer file.Close()
_, err = io.Copy(saveDir, reader) _, err = io.Copy(file, reader)
if err != nil { if err != nil {
log.Println(err) log.Println(err)
return return
} }
log.Printf("Saved song to: %s\n", saveDir.Name()) log.Printf("Saved song %s to: %s\n", track.Name, filePath)
}
func (c *Controller) downloadTracks(tracks []*mediaprovider.Track, filePath string) {
zipFile, err := os.Create(filePath)
if err != nil {
log.Println(err)
return
}
defer zipFile.Close()
zipWriter := zip.NewWriter(zipFile)
defer zipWriter.Close()
for _, track := range tracks {
reader, err := c.App.ServerManager.Server.DownloadTrack(track.ID)
if err != nil {
log.Println(err)
continue
}
parts := strings.Split(track.FilePath, "/")
fileName := parts[len(parts)-1]
fileWriter, err := zipWriter.Create(fileName)
if err != nil {
log.Println(err)
continue
}
_, err = io.Copy(fileWriter, reader)
if err != nil {
log.Println(err)
continue
}
log.Printf("Saved song %s to: %s\n", track.Name, filePath)
}
log.Printf("Finished download to: %s\n", filePath)
} }
+8 -10
View File
@@ -70,13 +70,13 @@ type Tracklist struct {
DisableSorting bool DisableSorting bool
// user action callbacks // user action callbacks
OnPlayTrackAt func(int) OnPlayTrackAt func(int)
OnPlaySelection func(tracks []*mediaprovider.Track, shuffle bool) OnPlaySelection func(tracks []*mediaprovider.Track, shuffle bool)
OnAddToQueue func(trackIDs []*mediaprovider.Track) OnAddToQueue func(trackIDs []*mediaprovider.Track)
OnAddToPlaylist func(trackIDs []string) OnAddToPlaylist func(trackIDs []string)
OnSetFavorite func(trackIDs []string, fav bool) OnSetFavorite func(trackIDs []string, fav bool)
OnSetRating func(trackIDs []string, rating int) OnSetRating func(trackIDs []string, rating int)
OnShowDownloadDialog func(track *mediaprovider.Track) OnDownload func(tracks []*mediaprovider.Track)
OnShowArtistPage func(artistID string) OnShowArtistPage func(artistID string)
OnShowAlbumPage func(albumID string) OnShowAlbumPage func(albumID string)
@@ -588,9 +588,7 @@ func (t *Tracklist) onAlbumTapped(albumID string) {
} }
func (t *Tracklist) onDownload(tracks []*mediaprovider.Track) { func (t *Tracklist) onDownload(tracks []*mediaprovider.Track) {
for _, track := range tracks { t.OnDownload(tracks)
t.OnShowDownloadDialog(track)
}
} }
func (t *Tracklist) findTrackByID(id string) *mediaprovider.Track { func (t *Tracklist) findTrackByID(id string) *mediaprovider.Track {