Files
spotiflac-cli/lib/download.go

134 lines
2.2 KiB
Go

package lib
import (
"errors"
"io"
"net/http"
"os"
)
const (
DEFAULT_DOWNLOAD_SERVICE = "tidal"
DEFAULT_DOWNLOAD_OUTPUT_FOLDER = "."
)
type DownloadRequest struct {
Service AvailableServices
Track string
Artist string
Album string
Artists string
ReleaseDate string
Cover string
OutputDir string
SpotifyID string
}
func (app *App) Download(url string, outputFile string, service string, quality string) error {
if service == "" {
service = DEFAULT_DOWNLOAD_SERVICE
}
urlType, err := ParseUrlType(url)
if err != nil {
return err
}
switch urlType {
case UrlTypeTrack:
if err := app.DownloadTrack(url, outputFile, service, quality); err != nil {
return err
}
return nil
case UrlTypePlaylist:
_, err := app.GetPlaylistMetadata(url)
if err != nil {
return err
}
return nil
}
return errors.New("Invalid URL type.")
}
func (app *App) DownloadTrack(url string, outputFile, service string, quality string) error {
songlink, err := app.ConvertSongUrl(url)
if err != nil {
return err
}
tidalId, err := app.GetTidalIdFromSonglink(songlink)
if err != nil {
return err
}
downloadUrl, err := app.GetTidalDownloadUrl(tidalId, quality)
if err != nil {
return err
}
metadata, err := app.GetTrackMetadata(url)
if err != nil {
return err
}
extension, err := GetFormatFromQuality(quality)
if err != nil {
return err
}
outputFile, err = BuildFileOutput(outputFile, extension, metadata)
if err != nil {
return err
}
fileExists, err := FileExists(outputFile)
if err != nil {
return err
}
if fileExists {
app.log("File " + outputFile + " already exists")
return nil
}
err = app.DownloadFromUrl(downloadUrl, outputFile)
if err != nil {
return err
}
err = app.EmbedMetadata(outputFile, metadata)
if err != nil {
return err
}
return nil
}
func (app *App) DownloadFromUrl(url string, outputFilePath string) error {
app.log("Downloading " + outputFilePath)
outputFile, err := os.Create(outputFilePath)
if err != nil {
return err
}
defer outputFile.Close()
res, err := http.Get(url)
if err != nil {
return err
}
defer res.Body.Close()
_, err = io.Copy(outputFile, res.Body)
if err != nil {
return err
}
app.log("Download completed")
return nil
}