146 lines
3.5 KiB
Go
146 lines
3.5 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"strconv"
|
|
"time"
|
|
|
|
"git.gay/besties/yellowcab/scrape"
|
|
"git.gay/besties/yellowcab/spotify"
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gofiber/fiber/v2/middleware/cors"
|
|
"github.com/gofiber/fiber/v2/middleware/encryptcookie"
|
|
"github.com/gofiber/template/html"
|
|
)
|
|
|
|
type ApiResponse struct {
|
|
Success bool `json:"success"`
|
|
Response *scrape.ScrobblerResponse `json:"response"`
|
|
}
|
|
|
|
func literalPointer(str string) *string {
|
|
return &str
|
|
}
|
|
|
|
var FakeResponse *scrape.ScrobblerResponse
|
|
|
|
func init() {
|
|
startupmsg := ` /\_____/\
|
|
/ o o \
|
|
( == ^ == )
|
|
) (
|
|
( )
|
|
( ( ) ( ) )
|
|
(__(__)___(__)__)`
|
|
fmt.Println(startupmsg)
|
|
FakeResponse = &scrape.ScrobblerResponse{
|
|
FromScrobbler: scrape.FromScrobbler{
|
|
Name: "Last.fm",
|
|
UserURL: "https://www.last.fm/user/hazysu/",
|
|
},
|
|
Cover: literalPointer("/assets/demo-cover-totep.webp"),
|
|
Track: scrape.Track{
|
|
Name: "You Know How It Is",
|
|
URL: literalPointer("https://www.last.fm/music/Kero+Kero+Bonito/_/You+Know+How+It+Is"),
|
|
StreamURL: literalPointer("https://www.youtube.com/watch?v=SmbPstHsmC4"),
|
|
},
|
|
Artist: &scrape.Artist{
|
|
URL: literalPointer("https://www.last.fm/music/Kero+Kero+Bonito"),
|
|
Name: "Kero Kero Bonito",
|
|
},
|
|
Album: &scrape.Album{
|
|
URL: literalPointer("https://www.last.fm/music/Kero+Kero+Bonito/TOTEP"),
|
|
Name: "TOTEP",
|
|
},
|
|
EstTimestamp: "live",
|
|
TimestampMs: time.Now().UnixMilli(),
|
|
}
|
|
}
|
|
|
|
func GetNowPlaying(service string, username string) (response *scrape.ScrobblerResponse, err error) {
|
|
switch service {
|
|
case "last":
|
|
response, err = scrape.Lastfm.GetNowPlaying(username)
|
|
case "listenbrainz":
|
|
response, err = scrape.Listenbrainz.GetNowPlaying(username)
|
|
case "spotify":
|
|
response, err = spotify.Spotify.GetNowPlaying(username)
|
|
case "fake":
|
|
response = FakeResponse
|
|
}
|
|
return
|
|
}
|
|
|
|
func main() {
|
|
app := fiber.New(fiber.Config{
|
|
Views: html.New("./template", ".tmpl"),
|
|
})
|
|
|
|
app.Use(cors.New())
|
|
|
|
app.Use(encryptcookie.New(encryptcookie.Config{
|
|
// openssl rand -base64 32
|
|
Key: os.Getenv("COOKIE_SECRET"),
|
|
}))
|
|
|
|
app.Get("/", func(c *fiber.Ctx) error {
|
|
return c.Render("home", fiber.Map{})
|
|
})
|
|
|
|
app.Get("/create", func(c *fiber.Ctx) error {
|
|
return c.Render("create", fiber.Map{})
|
|
})
|
|
|
|
app.Get("/gen", func(c *fiber.Ctx) error {
|
|
return c.Redirect("/create")
|
|
})
|
|
|
|
app.Get("/spotifyauth", spotify.SpotifyAuthHandler)
|
|
|
|
app.Get("/spotifyauth/callback", spotify.CompleteSpotifyAuth)
|
|
|
|
app.Get("/embed/:service/:username", func(c *fiber.Ctx) (err error) {
|
|
theme := c.Query("force-theme", "auto")
|
|
mini := c.Query("mini", "false") == "true"
|
|
refreshRate, err := strconv.Atoi(c.Query("autorefresh", "30"))
|
|
if err != nil {
|
|
return
|
|
}
|
|
if theme == "lite" {
|
|
theme = "light"
|
|
}
|
|
|
|
scrobblerResponse, err := GetNowPlaying(c.Params("service"), c.Params("username"))
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
return
|
|
}
|
|
|
|
return c.Render("embed", fiber.Map{
|
|
"Username": c.Params("username"),
|
|
"Playing": *scrobblerResponse,
|
|
"Theme": theme,
|
|
"Refresh": refreshRate,
|
|
"Mini": mini,
|
|
})
|
|
})
|
|
|
|
app.Get("/api/:service/:username", func(c *fiber.Ctx) (err error) {
|
|
scrobblerResponse, err := GetNowPlaying(c.Params("service"), c.Params("username"))
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, err)
|
|
}
|
|
response := ApiResponse{
|
|
Success: err == nil,
|
|
Response: scrobblerResponse,
|
|
}
|
|
return c.JSON(response)
|
|
})
|
|
|
|
app.Static("/", "./static")
|
|
|
|
log.Fatal(app.Listen("127.0.0.1:3232"))
|
|
}
|