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") }