Implementing downloading multiple tracks into a single zip file, changing callback signature
This commit is contained in:
+61
-12
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ type Tracklist struct {
|
|||||||
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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user