diff --git a/.gitignore b/.gitignore index 8d9d1b7..158d51a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ bin/ -.idea \ No newline at end of file +.idea +.vscode/launch.json diff --git a/cmd/telegramBot.go b/cmd/telegramBot.go index b1d451c..eb5aeb5 100644 --- a/cmd/telegramBot.go +++ b/cmd/telegramBot.go @@ -24,14 +24,15 @@ package cmd import ( "context" "fmt" + "log" + "strings" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/zmb3/spotify/v2" spotifyauth "github.com/zmb3/spotify/v2/auth" "golang.org/x/oauth2" - "log" - "strings" ) // telegramBotCmd represents the telegramBot command @@ -104,30 +105,70 @@ It is not planned to extend this in the future.`, cobra.CheckErr(err) if results != nil { - track := results.Tracks.Tracks[0] + playlist, err := client.GetPlaylist(ctx, spotify.ID(viper.GetString("spotify_playlist_id"))) cobra.CheckErr(err) - addTrackResponse, err := client.AddTracksToPlaylist(ctx, - playlist.ID, - results.Tracks.Tracks[0].ID) + tracks, err := client.GetPlaylistItems(ctx, playlist.ID) cobra.CheckErr(err) - msg.Text = fmt.Sprintf("Ich habe den Titel
%svon
%szur Playlist
%shinzugefügt.", - track.Name, - track.Artists[0].Name, - playlist.Name, - ) - msg.ParseMode = "HTML" - _, err = bot.Send(msg) - cobra.CheckErr(err) + trackIDs := make([]spotify.ID, 0, len(tracks.Items)) - fmt.Printf("New track added to playlist: %s by %s\nsnapshot: %s\n\n", - track.Name, - track.Artists[0].Name, - addTrackResponse) + for page := 1; ; page++ { + for _, track := range tracks.Items { + trackIDs = append(trackIDs, track.Track.Track.ID) + } + + err = client.NextPage(ctx, tracks) + if err == spotify.ErrNoMorePages { + break + } + if err != nil { + cobra.CheckErr(err) + } + } + + if contains(trackIDs, results.Tracks.Tracks[0].ID) { + track := results.Tracks.Tracks[0] + + msg.Text = fmt.Sprintf("⛔ Ooops, dieser Titel ist schon in der Playlist!\n Ich habe den Titel
%svon
%snicht ERNEUT zur Playlist
%shinzugefügt.", + track.Name, + track.Artists[0].Name, + playlist.Name, + ) + msg.ParseMode = "HTML" + _, err = bot.Send(msg) + cobra.CheckErr(err) + + fmt.Printf("Declined adding duplicate track: %s by %s", + track.Name, + track.Artists[0].Name) + + } else { + track := results.Tracks.Tracks[0] + + addTrackResponse, err := client.AddTracksToPlaylist(ctx, + playlist.ID, + results.Tracks.Tracks[0].ID) + cobra.CheckErr(err) + + msg.Text = fmt.Sprintf("Ich habe den Titel
%svon
%szur Playlist
%shinzugefügt.", + track.Name, + track.Artists[0].Name, + playlist.Name, + ) + msg.ParseMode = "HTML" + _, err = bot.Send(msg) + cobra.CheckErr(err) + + fmt.Printf("New track added to playlist: %s by %s\nsnapshot: %s\n\n", + track.Name, + track.Artists[0].Name, + addTrackResponse) + } } + case "rofl": msg.Text = "🤣" _, err = bot.Send(msg) @@ -156,3 +197,12 @@ func init() { // is called directly, e.g.: // telegramBotCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") } + +func contains(s []spotify.ID, e spotify.ID) bool { + for _, a := range s { + if a == e { + return true + } + } + return false +}