You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
2.5 KiB
Go

package lists
import (
"context"
"fmt"
"time"
"gitea.ravianand.me/Dan6erbond/listy/core"
"gitea.ravianand.me/Dan6erbond/listy/internal"
"gitea.ravianand.me/Dan6erbond/listy/models"
"gitea.ravianand.me/Dan6erbond/listy/users"
"github.com/zmb3/spotify/v2"
)
func SyncMonthlyList(ctx context.Context, app *core.App, user *models.User) (int, error) {
client, err := users.GetSpotifyClient(ctx, app, user)
if err != nil {
return 0, err
}
beginningOfMonth := internal.BeginningOfMonth()
playlistName := fmt.Sprintf("%d %d", beginningOfMonth.Year(), beginningOfMonth.Month())
var playlist *spotify.SimplePlaylist
playlists, err := client.CurrentUsersPlaylists(ctx)
if err != nil {
return 0, err
}
PLAYLISTS:
for page := 1; ; page++ {
for _, pl := range playlists.Playlists {
if pl.Name == playlistName {
playlist = &pl
break PLAYLISTS
}
}
err := client.NextPage(ctx, playlists)
if err == spotify.ErrNoMorePages {
break
}
if err != nil {
return 0, err
}
}
if playlist == nil {
fullPlaylist, err := client.CreatePlaylistForUser(ctx, user.SpotifyID, playlistName, "", false, false)
if err != nil {
return 0, err
}
playlist = &fullPlaylist.SimplePlaylist
}
var playlistTracks []spotify.PlaylistItemTrack
items, err := client.GetPlaylistItems(ctx, playlist.ID)
if err != nil {
return 0, err
}
for page := 1; ; page++ {
for _, item := range items.Items {
playlistTracks = append(playlistTracks, item.Track)
}
err := client.NextPage(ctx, items)
if err == spotify.ErrNoMorePages {
break
}
if err != nil {
return 0, err
}
}
tracks, err := client.CurrentUsersTracks(ctx)
if err != nil {
return 0, err
}
var trackIDs []spotify.ID
TRACKS:
for page := 1; ; page++ {
TRACK:
for _, track := range tracks.Tracks {
for _, t := range playlistTracks {
if t.Track.ID == track.ID {
continue TRACK
}
}
addedAt, err := time.Parse(time.RFC3339, track.AddedAt)
if err != nil {
return 0, err
}
if addedAt.Before(beginningOfMonth) {
break TRACKS
}
fmt.Println("Adding", track.Name, "(added at", track.AddedAt+")")
trackIDs = append(trackIDs, track.ID)
}
err := client.NextPage(ctx, tracks)
if err == spotify.ErrNoMorePages {
break
}
if err != nil {
return 0, err
}
}
if len(trackIDs) > 0 {
_, err = client.AddTracksToPlaylist(ctx, playlist.ID, trackIDs...)
if err != nil {
return 0, err
}
return len(trackIDs), nil
}
return 0, nil
}