radio and refillreadio and clearradio

This commit is contained in:
jjohnstondev 2023-01-07 23:57:33 -08:00
parent 01d3958de0
commit 2c0543383b
5 changed files with 189 additions and 22 deletions

View File

@ -32,6 +32,10 @@ func Run(ctx *gctx.Context, client *spotify.Client, args []string) error {
return commands.Shuffle(ctx, client)
case "radio":
return commands.Radio(ctx, client)
case "clearradio":
return commands.ClearRadio(ctx, client)
case "refillradio":
return commands.RefillRadio(ctx, client)
case "tracks":
return tui.DisplayList(ctx, client)
case "status":

View File

@ -21,6 +21,7 @@ var (
auth *spotifyauth.Authenticator
ch = make(chan *spotify.Client)
state = "abc123"
configDir, _ = os.UserConfigDir()
)
func GetClient(ctx *gctx.Context) (*spotify.Client, error) {
@ -48,9 +49,8 @@ func GetClient(ctx *gctx.Context) (*spotify.Client, error) {
spotifyauth.ScopeStreaming,
),
)
homdir, _ := os.UserHomeDir()
if _, err := os.Stat(filepath.Join(homdir, ".config/gospt/auth.json")); err == nil {
authFile, err := os.Open(filepath.Join(homdir, ".config/gospt/auth.json"))
if _, err := os.Stat(filepath.Join(configDir, "gospt/auth.json")); err == nil {
authFile, err := os.Open(filepath.Join(configDir, "gospt/auth.json"))
if err != nil {
return nil, err
}
@ -74,8 +74,7 @@ func GetClient(ctx *gctx.Context) (*spotify.Client, error) {
if err != nil {
panic(err.Error())
}
homdir, _ := os.UserHomeDir()
err = ioutil.WriteFile(filepath.Join(homdir, ".config/gospt/auth.json"), out, 0o644)
err = ioutil.WriteFile(filepath.Join(configDir, "gospt/auth.json"), out, 0o644)
if err != nil {
panic("FAILED TO SAVE AUTH")
}
@ -84,8 +83,7 @@ func GetClient(ctx *gctx.Context) (*spotify.Client, error) {
if err != nil {
panic(err.Error())
}
homdir, _ := os.UserHomeDir()
err = ioutil.WriteFile(filepath.Join(homdir, ".config/gospt/auth.json"), out, 0o644)
err = ioutil.WriteFile(filepath.Join(configDir, "gospt/auth.json"), out, 0o644)
if err != nil {
panic("FAILED TO SAVE AUTH")
}
@ -131,8 +129,7 @@ func completeAuth(w http.ResponseWriter, r *http.Request) {
if err != nil {
panic(err.Error())
}
homdir, _ := os.UserHomeDir()
err = ioutil.WriteFile(filepath.Join(homdir, ".config/gospt/auth.json"), out, 0o644)
err = ioutil.WriteFile(filepath.Join(configDir, "gospt/auth.json"), out, 0o644)
if err != nil {
panic("FAILED TO SAVE AUTH")
}

View File

@ -79,7 +79,14 @@ func QueueSong(ctx *gctx.Context, client *spotify.Client, id spotify.ID) error {
}
func Radio(ctx *gctx.Context, client *spotify.Client) error {
rand.Seed(time.Now().Unix())
err := ClearRadio(ctx, client)
if err != nil {
return err
}
radioPlaylist, err := GetRadioPlaylist(ctx, client)
if err != nil {
return err
}
current_song, err := client.PlayerCurrentlyPlaying(ctx)
if err != nil {
return err
@ -91,24 +98,119 @@ func Radio(ctx *gctx.Context, client *spotify.Client) error {
if err != nil {
return err
}
recomendationIds := []spotify.ID{}
for _, song := range recomendations.Tracks {
fmt.Println(song.Name)
recomendationIds = append(recomendationIds, song.ID)
}
fmt.Println("QUEUED")
for i := 0; i < 4; i++ {
seed_track := recomendations.Tracks[3]
seed := spotify.Seeds{
Tracks: []spotify.ID{seed_track.ID},
}
recomendations, err = client.GetRecommendations(ctx, seed, &spotify.TrackAttributes{}, spotify.Limit(100))
_, err = client.AddTracksToPlaylist(ctx, radioPlaylist.ID, recomendationIds...)
if err != nil {
return err
}
for _, song := range recomendations.Tracks {
fmt.Println(song.Name)
client.PlayOpt(ctx, &spotify.PlayOptions{
PlaybackContext: &radioPlaylist.URI,
PlaybackOffset: &spotify.PlaybackOffset{
Position: 0,
},
})
err = client.Repeat(ctx, "context")
if err != nil {
return err
}
fmt.Println("QUEUED")
rand.Seed(time.Now().Unix())
for i := 0; i < 4; i++ {
id := rand.Intn(len(recomendationIds)-2) + 1
seed := spotify.Seeds{
Tracks: []spotify.ID{recomendationIds[id]},
}
additional_recs, err := client.GetRecommendations(ctx, seed, &spotify.TrackAttributes{}, spotify.Limit(100))
if err != nil {
return err
}
fmt.Println(len(additional_recs.Tracks))
additionalRecsIds := []spotify.ID{}
for _, song := range additional_recs.Tracks {
additionalRecsIds = append(additionalRecsIds, song.ID)
}
fmt.Println(len(additionalRecsIds))
_, err = client.AddTracksToPlaylist(ctx, radioPlaylist.ID, additionalRecsIds...)
if err != nil {
return err
}
}
return nil
}
func RefillRadio(ctx *gctx.Context, client *spotify.Client) error {
status, err := client.PlayerCurrentlyPlaying(ctx)
if err != nil {
return err
}
fmt.Println("PLAYING", status.PlaybackContext.URI)
to_remove := []spotify.ID{}
radioPlaylist, err := GetRadioPlaylist(ctx, client)
found := false
page := 0
for !found {
tracks, err := client.GetPlaylistItems(ctx, radioPlaylist.ID, spotify.Limit(50), spotify.Offset(page*50))
if err != nil {
return err
}
for _, track := range tracks.Items {
fmt.Println("CHECKING", track.Track.Track.Name)
if track.Track.Track.ID == status.Item.ID {
found = true
break
}
to_remove = append(to_remove, track.Track.Track.ID)
}
page++
}
recomendationIds := []spotify.ID{}
if len(to_remove) > 0 {
fmt.Println("REPLENISHING", len(to_remove), "SONGS")
_, err = client.RemoveTracksFromPlaylist(ctx, radioPlaylist.ID, to_remove...)
if err != nil {
return err
}
current_song, err := client.PlayerCurrentlyPlaying(ctx)
if err != nil {
return err
}
seed := spotify.Seeds{
Tracks: []spotify.ID{current_song.Item.ID},
}
recomendations, err := client.GetRecommendations(ctx, seed, &spotify.TrackAttributes{}, spotify.Limit(100))
if err != nil {
return err
}
for idx, song := range recomendations.Tracks {
if idx >= len(to_remove) {
break
}
recomendationIds = append(recomendationIds, song.ID)
}
_, err = client.AddTracksToPlaylist(ctx, radioPlaylist.ID, recomendationIds...)
if err != nil {
return err
}
}
return nil
}
func ClearRadio(ctx *gctx.Context, client *spotify.Client) error {
radioPlaylist, err := GetRadioPlaylist(ctx, client)
if err != nil {
return err
}
err = client.UnfollowPlaylist(ctx, radioPlaylist.ID)
if err != nil {
return err
}
configDir, _ := os.UserConfigDir()
os.Remove(filepath.Join(configDir, "gospt/radio.json"))
client.Pause(ctx)
fmt.Println("Radio emptied")
return nil
}
@ -266,3 +368,60 @@ func queueWithTransfer(ctx *gctx.Context, client *spotify.Client, track_id spoti
ctx.Println("Playing!")
return nil
}
func activateDevice(ctx *gctx.Context, client *spotify.Client) error {
configDir, _ := os.UserConfigDir()
deviceFile, err := os.Open(filepath.Join(configDir, "gospt/device.json"))
if err != nil {
return err
}
defer deviceFile.Close()
deviceValue, err := ioutil.ReadAll(deviceFile)
if err != nil {
return err
}
var device *spotify.PlayerDevice
err = json.Unmarshal(deviceValue, &device)
if err != nil {
return err
}
err = client.TransferPlayback(ctx, device.ID, true)
if err != nil {
return err
}
return nil
}
func GetRadioPlaylist(ctx *gctx.Context, client *spotify.Client) (*spotify.FullPlaylist, error) {
configDir, _ := os.UserConfigDir()
if _, err := os.Stat(filepath.Join(configDir, "gospt/radio.json")); err == nil {
playlistFile, err := os.Open(filepath.Join(configDir, "gospt/radio.json"))
if err != nil {
return nil, err
}
defer playlistFile.Close()
playlistValue, err := ioutil.ReadAll(playlistFile)
if err != nil {
return nil, err
}
var playlist *spotify.FullPlaylist
err = json.Unmarshal(playlistValue, &playlist)
if err != nil {
return nil, err
}
return playlist, nil
}
playlist, err := client.CreatePlaylistForUser(ctx, ctx.UserId, "gosptRADIO", "This is an automanaged playlist for the custom radio of gospt", false, false)
if err != nil {
return nil, err
}
out, err := json.MarshalIndent(playlist, "", " ")
if err != nil {
return nil, err
}
err = ioutil.WriteFile(filepath.Join(configDir, "gospt/radio.json"), out, 0o644)
if err != nil {
return nil, err
}
return playlist, nil
}

View File

@ -10,6 +10,7 @@ type Context struct {
context.Context
*log.Logger
Debug *log.Logger
UserId string
}
func NewContext(ctx context.Context) *Context {
@ -17,6 +18,7 @@ func NewContext(ctx context.Context) *Context {
ctx,
log.New(os.Stdout, "LOG:", 0),
log.New(os.Stdout, "DEBUG:", 1),
"",
}
return out
}

View File

@ -27,6 +27,11 @@ func main() {
if err != nil {
panic(err.Error())
}
currentUser, err := client.CurrentUser(ctx)
if err != nil {
panic(err.Error())
}
ctx.UserId = currentUser.ID
err = api.Run(ctx, client, os.Args[1:])
if err != nil {
fmt.Println(err)