96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/zmb3/spotify/v2"
|
|
spotifyauth "github.com/zmb3/spotify/v2/auth"
|
|
"golang.org/x/oauth2"
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
|
|
ctx := context.Background()
|
|
|
|
token := &oauth2.Token{
|
|
AccessToken: os.Getenv("SPOTIFY_ACCESS_TOKEN"),
|
|
RefreshToken: os.Getenv("SPOTIFY_REFRESH_TOKEN"),
|
|
TokenType: "Bearer",
|
|
Expiry: time.Now(),
|
|
}
|
|
|
|
endpoint := os.Getenv("MISSKEY_ENDPOINT")
|
|
misskeyToken := "Bearer " + os.Getenv("MISSKEY_TOKEN")
|
|
|
|
httpClient := spotifyauth.New(
|
|
spotifyauth.WithClientID(os.Getenv("SPOTIFY_CLIENT_ID")),
|
|
spotifyauth.WithClientSecret(os.Getenv("SPOTIFY_CLIENT_SECRET")),
|
|
).Client(ctx, token)
|
|
client := spotify.New(httpClient)
|
|
|
|
lastId := ""
|
|
|
|
for {
|
|
playing, err := client.PlayerCurrentlyPlaying(ctx)
|
|
if err != nil {
|
|
log.Println(err)
|
|
time.Sleep(10 * time.Minute)
|
|
continue
|
|
}
|
|
|
|
if !playing.Playing {
|
|
time.Sleep(5 * time.Minute)
|
|
continue
|
|
}
|
|
|
|
if playing.Item.ID.String() == lastId {
|
|
time.Sleep(30 * time.Second)
|
|
continue
|
|
}
|
|
|
|
lastId = playing.Item.ID.String()
|
|
|
|
builder := strings.Builder{}
|
|
|
|
for _, artist := range playing.Item.Artists {
|
|
builder.WriteString("?[<plain>")
|
|
builder.WriteString(artist.Name)
|
|
builder.WriteString("</plain>](<https://open.spotify.com/artist/")
|
|
builder.WriteString(artist.ID.String())
|
|
builder.WriteString(">),")
|
|
}
|
|
|
|
before, _ := strings.CutSuffix(builder.String(), ",")
|
|
text := fmt.Sprintf("[<plain>%s</plain>](<https://open.spotify.com/track/%s>)\\n<small>%s</small>", playing.Item.Name, playing.Item.ID, before)
|
|
|
|
body := fmt.Sprintf("{ \"visibility\" : \"home\", \"text\": \"%s\\n\\n#NowPlaying #usbharu_NowPlaying \"}", text)
|
|
|
|
request, err := http.NewRequest("POST", endpoint, strings.NewReader(body))
|
|
if err != nil {
|
|
log.Println(err)
|
|
continue
|
|
}
|
|
request.Header.Add("Authorization", misskeyToken)
|
|
request.Header.Add("Content-Type", "application/json")
|
|
|
|
misskeyHttpClient := new(http.Client)
|
|
post, err := misskeyHttpClient.Do(request)
|
|
if err != nil {
|
|
log.Println(err)
|
|
continue
|
|
}
|
|
if post.StatusCode != 200 {
|
|
log.Printf("Status is not 200. status: %d \n", post.StatusCode)
|
|
continue
|
|
}
|
|
|
|
time.Sleep(1 * time.Minute)
|
|
}
|
|
|
|
}
|