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 }