120 lines
2.9 KiB
Go
120 lines
2.9 KiB
Go
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) ServeGetUser(r *http.Request) *spec.Response {
|
|
user := r.Context().Value(key.User).(*model.User)
|
|
sub := spec.NewResponse()
|
|
sub.User = &spec.User{
|
|
Username: user.Name,
|
|
AdminRole: user.IsAdmin,
|
|
ScrobblingEnabled: user.LastFMSession != "",
|
|
Folder: []int{1},
|
|
}
|
|
return sub
|
|
}
|
|
|
|
func (c *Controller) ServeNotFound(r *http.Request) *spec.Response {
|
|
return spec.NewError(70, "view not found")
|
|
}
|