seperate routes, provide robust handler types, use mux
This commit is contained in:
107
server/ctrlsubsonic/handlers_common.go
Normal file
107
server/ctrlsubsonic/handlers_common.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package ctrlsubsonic
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
"time"
|
||||
"unicode"
|
||||
|
||||
"senan.xyz/g/gonic/model"
|
||||
"senan.xyz/g/gonic/scanner"
|
||||
"senan.xyz/g/gonic/server/ctrlsubsonic/spec"
|
||||
"senan.xyz/g/gonic/server/key"
|
||||
"senan.xyz/g/gonic/server/lastfm"
|
||||
"senan.xyz/g/gonic/server/parsing"
|
||||
)
|
||||
|
||||
func lowerUDecOrHash(in string) string {
|
||||
lower := unicode.ToLower(rune(in[0]))
|
||||
if !unicode.IsLetter(lower) {
|
||||
return "#"
|
||||
}
|
||||
return string(lower)
|
||||
}
|
||||
|
||||
func (c *Controller) ServeGetLicence(r *http.Request) *spec.Response {
|
||||
sub := spec.NewResponse()
|
||||
sub.Licence = &spec.Licence{
|
||||
Valid: true,
|
||||
}
|
||||
return sub
|
||||
}
|
||||
|
||||
func (c *Controller) ServePing(r *http.Request) *spec.Response {
|
||||
return spec.NewResponse()
|
||||
}
|
||||
|
||||
func (c *Controller) ServeScrobble(r *http.Request) *spec.Response {
|
||||
id, err := parsing.GetIntParam(r, "id")
|
||||
if err != nil {
|
||||
return spec.NewError(10, "please provide an `id` parameter")
|
||||
}
|
||||
// fetch user to get lastfm session
|
||||
user := r.Context().Value(key.User).(*model.User)
|
||||
if user.LastFMSession == "" {
|
||||
return spec.NewError(0, "you don't have a last.fm session")
|
||||
}
|
||||
// fetch track for getting info to send to last.fm function
|
||||
track := &model.Track{}
|
||||
c.DB.
|
||||
Preload("Album").
|
||||
Preload("Artist").
|
||||
First(track, id)
|
||||
// scrobble with above info
|
||||
err = lastfm.Scrobble(
|
||||
c.DB.GetSetting("lastfm_api_key"),
|
||||
c.DB.GetSetting("lastfm_secret"),
|
||||
user.LastFMSession,
|
||||
track,
|
||||
// clients will provide time in miliseconds, so use that or
|
||||
// instead convert UnixNano to miliseconds
|
||||
parsing.GetIntParamOr(r, "time", int(time.Now().UnixNano()/1e6)),
|
||||
parsing.GetStrParamOr(r, "submission", "true") != "false",
|
||||
)
|
||||
if err != nil {
|
||||
return spec.NewError(0, "error when submitting: %v", err)
|
||||
}
|
||||
return spec.NewResponse()
|
||||
}
|
||||
|
||||
func (c *Controller) ServeGetMusicFolders(r *http.Request) *spec.Response {
|
||||
folders := &spec.MusicFolders{}
|
||||
folders.List = []*spec.MusicFolder{
|
||||
{ID: 1, Name: "music"},
|
||||
}
|
||||
sub := spec.NewResponse()
|
||||
sub.MusicFolders = folders
|
||||
return sub
|
||||
}
|
||||
|
||||
func (c *Controller) ServeStartScan(r *http.Request) *spec.Response {
|
||||
go func() {
|
||||
err := scanner.
|
||||
New(c.DB, c.MusicPath).
|
||||
Start()
|
||||
if err != nil {
|
||||
log.Printf("error while scanning: %v\n", err)
|
||||
}
|
||||
}()
|
||||
return c.ServeGetScanStatus(r)
|
||||
}
|
||||
|
||||
func (c *Controller) ServeGetScanStatus(r *http.Request) *spec.Response {
|
||||
var trackCount int
|
||||
c.DB.
|
||||
Model(model.Track{}).
|
||||
Count(&trackCount)
|
||||
sub := spec.NewResponse()
|
||||
sub.ScanStatus = &spec.ScanStatus{
|
||||
Scanning: scanner.IsScanning(),
|
||||
Count: trackCount,
|
||||
}
|
||||
return sub
|
||||
}
|
||||
|
||||
func (c *Controller) ServeNotFound(r *http.Request) *spec.Response {
|
||||
return spec.NewError(70, "view not found")
|
||||
}
|
||||
Reference in New Issue
Block a user