yellowcab/main.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"))
}