diff --git a/main.go b/main.go index c9d0d05..a63da05 100644 --- a/main.go +++ b/main.go @@ -6,7 +6,6 @@ import ( "os" "github.com/Superredstone/spotiflac-cli/app" - "github.com/Superredstone/spotiflac-cli/lib" "github.com/Superredstone/spotiflac-cli/pkg" "github.com/urfave/cli/v3" ) @@ -14,7 +13,6 @@ import ( func main() { var song_url string application := app.NewApp() - startup() cmd := &cli.Command{ Name: "spotiflac-cli", @@ -26,25 +24,11 @@ func main() { }, }, Action: func(ctx context.Context, cmd *cli.Command) error { - pkg.Download(application, song_url) - - return nil + err := pkg.Download(application, song_url) + return err }, } if err := cmd.Run(context.Background(), os.Args); err != nil { log.Fatal(err) - shutdown() - } - - shutdown() -} - -func startup() { - if err := lib.InitHistoryDB("SpotiFLAC"); err != nil { - log.Fatal("Failed to init history DB: %v\n", err) } } - -func shutdown() { - lib.CloseHistoryDB() -} diff --git a/pkg/download.go b/pkg/download.go index 9a6e008..91007ae 100644 --- a/pkg/download.go +++ b/pkg/download.go @@ -2,12 +2,19 @@ package pkg import ( "encoding/json" + "errors" "fmt" "strconv" + "strings" "github.com/Superredstone/spotiflac-cli/app" ) +const ( + DEFAULT_DOWNLOAD_SERVICE = "tidal" + DEFAULT_DOWNLOAD_OUTPUT_FOLDER = "downloads/" +) + type MetadataSong struct { Track MetadataTrack `json:"track"` } @@ -36,36 +43,72 @@ type MetadataPlaylist struct { TrackList []MetadataTrack `json:"track_list"` } -func Download(application *app.App, url string) { - metadata, err := GetMetadata[MetadataPlaylist](application, url) - if err != nil { - fmt.Println("Unable to fetch metadata for song " + url) - } - - trackListSize := strconv.Itoa(len(metadata.TrackList)) - for idx, track := range metadata.TrackList { - fmt.Println("[" + strconv.Itoa(idx+1) + "/" + trackListSize + "] " + track.Name + " - " + track.Artists) +func Download(application *app.App, url string) error { + if strings.Contains(url, "https://open.spotify.com/track") { + metadata, err := GetMetadata[MetadataSong](application, url) + if err != nil { + return err + } + track := metadata.Track downloadRequest := app.DownloadRequest{ - Service: "tidal", + Service: DEFAULT_DOWNLOAD_SERVICE, TrackName: track.Name, ArtistName: track.Artists, AlbumName: track.AlbumName, AlbumArtist: track.AlbumArtist, ReleaseDate: track.ReleaseDate, - OutputDir: "downloads/", + CoverURL: track.Images, + OutputDir: DEFAULT_DOWNLOAD_OUTPUT_FOLDER, SpotifyID: track.SpotifyID, } - application.DownloadTrack(downloadRequest) + + _, err = application.DownloadTrack(downloadRequest) + return err + } else if strings.Contains(url, "https://open.spotify.com/playlist") { + metadata, err := GetMetadata[MetadataPlaylist](application, url) + if err != nil { + fmt.Println("Unable to fetch metadata for song " + url) + return err + } + + trackListSize := strconv.Itoa(len(metadata.TrackList)) + for idx, track := range metadata.TrackList { + fmt.Println("[" + strconv.Itoa(idx+1) + "/" + trackListSize + "] " + track.Name + " - " + track.Artists) + + downloadRequest := app.DownloadRequest{ + Service: DEFAULT_DOWNLOAD_SERVICE, + TrackName: track.Name, + ArtistName: track.Artists, + AlbumName: track.AlbumName, + AlbumArtist: track.AlbumArtist, + ReleaseDate: track.ReleaseDate, + CoverURL: track.Images, + OutputDir: DEFAULT_DOWNLOAD_OUTPUT_FOLDER, + SpotifyID: track.SpotifyID, + } + + application.DownloadTrack(downloadRequest) + } + + return nil } + + return errors.New("Invalid Spotify URL.") } func GetMetadata[T MetadataPlaylist | MetadataSong](application *app.App, url string) (T, error) { var result T - metadata, err := GetGenericMetadata(application, url) + metadataRequest := app.SpotifyMetadataRequest{ + URL: url, + Delay: 0, + Timeout: 5, + } + + metadata, err := application.GetSpotifyMetadata(metadataRequest) if err != nil { - return result, nil + return result, err } err = json.Unmarshal([]byte(metadata), &result) @@ -75,18 +118,3 @@ func GetMetadata[T MetadataPlaylist | MetadataSong](application *app.App, url st return result, nil } - -func GetGenericMetadata(application *app.App, url string) (string, error) { - metadataRequest := app.SpotifyMetadataRequest{ - URL: url, - Delay: 0, - Timeout: 5, - } - - metadata, err := application.GetSpotifyMetadata(metadataRequest) - if err != nil { - return metadata, err - } - - return metadata, nil -}