unfunny the comments
This commit is contained in:
@@ -116,12 +116,12 @@ type templateData struct {
|
|||||||
Playlists []*db.Playlist
|
Playlists []*db.Playlist
|
||||||
TranscodePreferences []*db.TranscodePreference
|
TranscodePreferences []*db.TranscodePreference
|
||||||
TranscodeProfiles []string
|
TranscodeProfiles []string
|
||||||
//
|
|
||||||
CurrentLastFMAPIKey string
|
CurrentLastFMAPIKey string
|
||||||
CurrentLastFMAPISecret string
|
CurrentLastFMAPISecret string
|
||||||
DefaultListenBrainzURL string
|
DefaultListenBrainzURL string
|
||||||
SelectedUser *db.User
|
SelectedUser *db.User
|
||||||
//
|
|
||||||
Podcasts []*db.Podcast
|
Podcasts []*db.Podcast
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ func (c *Controller) ServeHome(r *http.Request) *Response {
|
|||||||
}
|
}
|
||||||
// podcasts box
|
// podcasts box
|
||||||
c.DB.Find(&data.Podcasts)
|
c.DB.Find(&data.Podcasts)
|
||||||
//
|
|
||||||
return &Response{
|
return &Response{
|
||||||
template: "home.tmpl",
|
template: "home.tmpl",
|
||||||
data: data,
|
data: data,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import (
|
|||||||
func playlistRender(c *Controller, playlist *db.Playlist) *spec.Playlist {
|
func playlistRender(c *Controller, playlist *db.Playlist) *spec.Playlist {
|
||||||
user := &db.User{}
|
user := &db.User{}
|
||||||
c.DB.Where("id=?", playlist.UserID).Find(user)
|
c.DB.Where("id=?", playlist.UserID).Find(user)
|
||||||
//
|
|
||||||
resp := &spec.Playlist{
|
resp := &spec.Playlist{
|
||||||
ID: playlist.ID,
|
ID: playlist.ID,
|
||||||
Name: playlist.Name,
|
Name: playlist.Name,
|
||||||
@@ -24,7 +24,7 @@ func playlistRender(c *Controller, playlist *db.Playlist) *spec.Playlist {
|
|||||||
Created: playlist.CreatedAt,
|
Created: playlist.CreatedAt,
|
||||||
SongCount: playlist.TrackCount,
|
SongCount: playlist.TrackCount,
|
||||||
}
|
}
|
||||||
//
|
|
||||||
trackIDs := playlist.GetItems()
|
trackIDs := playlist.GetItems()
|
||||||
resp.List = make([]*spec.TrackChild, len(trackIDs))
|
resp.List = make([]*spec.TrackChild, len(trackIDs))
|
||||||
for i, id := range trackIDs {
|
for i, id := range trackIDs {
|
||||||
@@ -88,12 +88,14 @@ func (c *Controller) ServeCreatePlaylist(r *http.Request) *spec.Response {
|
|||||||
c.DB.
|
c.DB.
|
||||||
Where("id=?", playlistID).
|
Where("id=?", playlistID).
|
||||||
FirstOrCreate(&playlist)
|
FirstOrCreate(&playlist)
|
||||||
// ** begin update meta info
|
|
||||||
|
// update meta info
|
||||||
playlist.UserID = user.ID
|
playlist.UserID = user.ID
|
||||||
if val, err := params.Get("name"); err == nil {
|
if val, err := params.Get("name"); err == nil {
|
||||||
playlist.Name = val
|
playlist.Name = val
|
||||||
}
|
}
|
||||||
// ** begin replace song IDs
|
|
||||||
|
// replace song IDs
|
||||||
var trackIDs []int
|
var trackIDs []int
|
||||||
if p, err := params.GetIDList("songId"); err == nil {
|
if p, err := params.GetIDList("songId"); err == nil {
|
||||||
for _, i := range p {
|
for _, i := range p {
|
||||||
@@ -103,7 +105,7 @@ func (c *Controller) ServeCreatePlaylist(r *http.Request) *spec.Response {
|
|||||||
// Set the items of the playlist
|
// Set the items of the playlist
|
||||||
playlist.SetItems(trackIDs)
|
playlist.SetItems(trackIDs)
|
||||||
c.DB.Save(playlist)
|
c.DB.Save(playlist)
|
||||||
//
|
|
||||||
sub := spec.NewResponse()
|
sub := spec.NewResponse()
|
||||||
sub.Playlist = playlistRender(c, &playlist)
|
sub.Playlist = playlistRender(c, &playlist)
|
||||||
return sub
|
return sub
|
||||||
@@ -119,7 +121,8 @@ func (c *Controller) ServeUpdatePlaylist(r *http.Request) *spec.Response {
|
|||||||
c.DB.
|
c.DB.
|
||||||
Where("id=?", playlistID).
|
Where("id=?", playlistID).
|
||||||
FirstOrCreate(&playlist)
|
FirstOrCreate(&playlist)
|
||||||
// ** begin update meta info
|
|
||||||
|
// update meta info
|
||||||
playlist.UserID = user.ID
|
playlist.UserID = user.ID
|
||||||
if val, err := params.Get("name"); err == nil {
|
if val, err := params.Get("name"); err == nil {
|
||||||
playlist.Name = val
|
playlist.Name = val
|
||||||
@@ -128,20 +131,22 @@ func (c *Controller) ServeUpdatePlaylist(r *http.Request) *spec.Response {
|
|||||||
playlist.Comment = val
|
playlist.Comment = val
|
||||||
}
|
}
|
||||||
trackIDs := playlist.GetItems()
|
trackIDs := playlist.GetItems()
|
||||||
// ** begin delete items
|
|
||||||
|
// delete items
|
||||||
if p, err := params.GetIntList("songIndexToRemove"); err == nil {
|
if p, err := params.GetIntList("songIndexToRemove"); err == nil {
|
||||||
sort.Sort(sort.Reverse(sort.IntSlice(p)))
|
sort.Sort(sort.Reverse(sort.IntSlice(p)))
|
||||||
for _, i := range p {
|
for _, i := range p {
|
||||||
trackIDs = append(trackIDs[:i], trackIDs[i+1:]...)
|
trackIDs = append(trackIDs[:i], trackIDs[i+1:]...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ** begin add items
|
|
||||||
|
// add items
|
||||||
if p, err := params.GetIDList("songIdToAdd"); err == nil {
|
if p, err := params.GetIDList("songIdToAdd"); err == nil {
|
||||||
for _, i := range p {
|
for _, i := range p {
|
||||||
trackIDs = append(trackIDs, i.Value)
|
trackIDs = append(trackIDs, i.Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
|
||||||
playlist.SetItems(trackIDs)
|
playlist.SetItems(trackIDs)
|
||||||
c.DB.Save(playlist)
|
c.DB.Save(playlist)
|
||||||
return spec.NewResponse()
|
return spec.NewResponse()
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ func (c *Controller) WithUser(next http.Handler) http.Handler {
|
|||||||
password, _ := params.Get("p")
|
password, _ := params.Get("p")
|
||||||
token, _ := params.Get("t")
|
token, _ := params.Get("t")
|
||||||
salt, _ := params.Get("s")
|
salt, _ := params.Get("s")
|
||||||
//
|
|
||||||
passwordAuth := token == "" && salt == ""
|
passwordAuth := token == "" && salt == ""
|
||||||
tokenAuth := password == ""
|
tokenAuth := password == ""
|
||||||
if tokenAuth == passwordAuth {
|
if tokenAuth == passwordAuth {
|
||||||
|
|||||||
@@ -1,24 +1,24 @@
|
|||||||
// package params provides methods on url.Values for parsing params for the subsonic api
|
// package params provides methods on url.Values for parsing params for the subsonic api
|
||||||
//
|
|
||||||
// the format of the functions are:
|
// the format of the functions are:
|
||||||
// `Get[First|Or|FirstOr][Int|ID|Bool|TimeMs][List]`
|
// `Get[First|Or|FirstOr][Int|ID|Bool|TimeMs][List]`
|
||||||
//
|
|
||||||
// first component (key selection):
|
// first component (key selection):
|
||||||
// "" -> lookup the key as usual, err if not found
|
// "" -> lookup the key as usual, err if not found
|
||||||
// "First" -> lookup from a list of possible keys, err if none found
|
// "First" -> lookup from a list of possible keys, err if none found
|
||||||
// "Or" -> lookup the key as usual, return `or` if not found
|
// "Or" -> lookup the key as usual, return `or` if not found
|
||||||
// "FirstOr" -> lookup from a list of possible keys, return `or` if not found
|
// "FirstOr" -> lookup from a list of possible keys, return `or` if not found
|
||||||
//
|
|
||||||
// second component (type selection):
|
// second component (type selection):
|
||||||
// "" -> parse the value as a string
|
// "" -> parse the value as a string
|
||||||
// "Int" -> parse the value as an integer
|
// "Int" -> parse the value as an integer
|
||||||
// "ID" -> parse the value as an artist, track, album etc id
|
// "ID" -> parse the value as an artist, track, album etc id
|
||||||
// "Bool" -> parse the value as a boolean
|
// "Bool" -> parse the value as a boolean
|
||||||
//
|
|
||||||
// last component (list parsing with stacked keys, eg. `?a=1&a=2&a=3`):
|
// last component (list parsing with stacked keys, eg. `?a=1&a=2&a=3`):
|
||||||
// "" -> return the first value, eg. `1`
|
// "" -> return the first value, eg. `1`
|
||||||
// "List" -> return all values, eg. `{1, 2, 3}`
|
// "List" -> return all values, eg. `{1, 2, 3}`
|
||||||
//
|
|
||||||
// note: these bulk of these funcs were generated with vim macros, so let me know if
|
// note: these bulk of these funcs were generated with vim macros, so let me know if
|
||||||
// you see something wrong :)
|
// you see something wrong :)
|
||||||
|
|
||||||
@@ -60,7 +60,8 @@ func parse(values []string, i interface{}) error {
|
|||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
switch v := i.(type) {
|
switch v := i.(type) {
|
||||||
// ** begin *T
|
|
||||||
|
// *T
|
||||||
case *string:
|
case *string:
|
||||||
*v, err = parseStr(values[0])
|
*v, err = parseStr(values[0])
|
||||||
case *int:
|
case *int:
|
||||||
@@ -71,7 +72,8 @@ func parse(values []string, i interface{}) error {
|
|||||||
*v, err = parseBool(values[0])
|
*v, err = parseBool(values[0])
|
||||||
case *time.Time:
|
case *time.Time:
|
||||||
*v, err = parseTime(values[0])
|
*v, err = parseTime(values[0])
|
||||||
// ** begin *[]T
|
|
||||||
|
// *[]T
|
||||||
case *[]string:
|
case *[]string:
|
||||||
for _, value := range values {
|
for _, value := range values {
|
||||||
parsed, err := parseStr(value)
|
parsed, err := parseStr(value)
|
||||||
@@ -143,7 +145,7 @@ func (p Params) getFirst(keys []string) []string {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ** begin str {get, get first, get or, get first or}
|
// str {get, get first, get or, get first or}
|
||||||
|
|
||||||
func (p Params) Get(key string) (string, error) {
|
func (p Params) Get(key string) (string, error) {
|
||||||
var ret string
|
var ret string
|
||||||
@@ -171,7 +173,7 @@ func (p Params) GetFirstOr(or string, keys ...string) string {
|
|||||||
return or
|
return or
|
||||||
}
|
}
|
||||||
|
|
||||||
// ** begin []str {get, get first, get or, get first or}
|
// []str {get, get first, get or, get first or}
|
||||||
|
|
||||||
func (p Params) GetList(key string) ([]string, error) {
|
func (p Params) GetList(key string) ([]string, error) {
|
||||||
var ret []string
|
var ret []string
|
||||||
@@ -199,7 +201,7 @@ func (p Params) GetFirstOrList(or []string, keys ...string) []string {
|
|||||||
return or
|
return or
|
||||||
}
|
}
|
||||||
|
|
||||||
// ** begin int {get, get first, get or, get first or}
|
// int {get, get first, get or, get first or}
|
||||||
|
|
||||||
func (p Params) GetInt(key string) (int, error) {
|
func (p Params) GetInt(key string) (int, error) {
|
||||||
var ret int
|
var ret int
|
||||||
@@ -227,7 +229,7 @@ func (p Params) GetFirstOrInt(or int, keys ...string) int {
|
|||||||
return or
|
return or
|
||||||
}
|
}
|
||||||
|
|
||||||
// ** begin []int {get, get first, get or, get first or}
|
// []int {get, get first, get or, get first or}
|
||||||
|
|
||||||
func (p Params) GetIntList(key string) ([]int, error) {
|
func (p Params) GetIntList(key string) ([]int, error) {
|
||||||
var ret []int
|
var ret []int
|
||||||
@@ -255,7 +257,7 @@ func (p Params) GetFirstOrIntList(or []int, keys ...string) []int {
|
|||||||
return or
|
return or
|
||||||
}
|
}
|
||||||
|
|
||||||
// ** begin specid.ID {get, get first, get or, get first or}
|
// specid.ID {get, get first, get or, get first or}
|
||||||
|
|
||||||
func (p Params) GetID(key string) (specid.ID, error) {
|
func (p Params) GetID(key string) (specid.ID, error) {
|
||||||
var ret specid.ID
|
var ret specid.ID
|
||||||
@@ -283,7 +285,7 @@ func (p Params) GetFirstOrID(or specid.ID, keys ...string) specid.ID {
|
|||||||
return or
|
return or
|
||||||
}
|
}
|
||||||
|
|
||||||
// ** begin []specid.ID {get, get first, get or, get first or}
|
// []specid.ID {get, get first, get or, get first or}
|
||||||
|
|
||||||
func (p Params) GetIDList(key string) ([]specid.ID, error) {
|
func (p Params) GetIDList(key string) ([]specid.ID, error) {
|
||||||
var ret []specid.ID
|
var ret []specid.ID
|
||||||
@@ -311,7 +313,7 @@ func (p Params) GetFirstOrIDList(or []specid.ID, keys ...string) []specid.ID {
|
|||||||
return or
|
return or
|
||||||
}
|
}
|
||||||
|
|
||||||
// ** begin bool {get, get first, get or, get first or}
|
// bool {get, get first, get or, get first or}
|
||||||
|
|
||||||
func (p Params) GetBool(key string) (bool, error) {
|
func (p Params) GetBool(key string) (bool, error) {
|
||||||
var ret bool
|
var ret bool
|
||||||
@@ -339,7 +341,7 @@ func (p Params) GetFirstOrBool(or bool, keys ...string) bool {
|
|||||||
return or
|
return or
|
||||||
}
|
}
|
||||||
|
|
||||||
// ** begin []bool {get, get first, get or, get first or}
|
// []bool {get, get first, get or, get first or}
|
||||||
|
|
||||||
func (p Params) GetBoolList(key string) ([]bool, error) {
|
func (p Params) GetBoolList(key string) ([]bool, error) {
|
||||||
var ret []bool
|
var ret []bool
|
||||||
@@ -367,7 +369,7 @@ func (p Params) GetFirstOrBoolList(or []bool, keys ...string) []bool {
|
|||||||
return or
|
return or
|
||||||
}
|
}
|
||||||
|
|
||||||
// ** begin time {get, get first, get or, get first or}
|
// time {get, get first, get or, get first or}
|
||||||
|
|
||||||
func (p Params) GetTime(key string) (time.Time, error) {
|
func (p Params) GetTime(key string) (time.Time, error) {
|
||||||
var ret time.Time
|
var ret time.Time
|
||||||
|
|||||||
@@ -208,7 +208,7 @@ func encode(out io.Writer, trackPath, cachePath string, profile Profile) error {
|
|||||||
// still unsure if buffer version (cmdOutputWrite) is any better than io.Copy-based one (cmdOutputCopy)
|
// still unsure if buffer version (cmdOutputWrite) is any better than io.Copy-based one (cmdOutputCopy)
|
||||||
// initial goal here is to start streaming response asap, with smallest ttfb. more testing needed
|
// initial goal here is to start streaming response asap, with smallest ttfb. more testing needed
|
||||||
// -- @spijet
|
// -- @spijet
|
||||||
//
|
|
||||||
// start up writers for cache file and http response
|
// start up writers for cache file and http response
|
||||||
go cmdOutputWrite(out, cacheFile, pipeReader)
|
go cmdOutputWrite(out, cacheFile, pipeReader)
|
||||||
// run ffmpeg
|
// run ffmpeg
|
||||||
|
|||||||
@@ -136,7 +136,8 @@ func setupMisc(r *mux.Router, ctrl *ctrlbase.Controller) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func setupAdmin(r *mux.Router, ctrl *ctrladmin.Controller) {
|
func setupAdmin(r *mux.Router, ctrl *ctrladmin.Controller) {
|
||||||
// ** begin public routes (creates session)
|
|
||||||
|
// public routes (creates session)
|
||||||
r.Use(ctrl.WithSession)
|
r.Use(ctrl.WithSession)
|
||||||
r.Handle("/login", ctrl.H(ctrl.ServeLogin))
|
r.Handle("/login", ctrl.H(ctrl.ServeLogin))
|
||||||
r.Handle("/login_do", ctrl.HR(ctrl.ServeLoginDo)) // "raw" handler, updates session
|
r.Handle("/login_do", ctrl.HR(ctrl.ServeLoginDo)) // "raw" handler, updates session
|
||||||
@@ -144,7 +145,7 @@ func setupAdmin(r *mux.Router, ctrl *ctrladmin.Controller) {
|
|||||||
staticHandler := http.StripPrefix("/admin", http.FileServer(http.FS(assets.Static)))
|
staticHandler := http.StripPrefix("/admin", http.FileServer(http.FS(assets.Static)))
|
||||||
r.PathPrefix("/static").Handler(staticHandler)
|
r.PathPrefix("/static").Handler(staticHandler)
|
||||||
|
|
||||||
// ** begin user routes (if session is valid)
|
// user routes (if session is valid)
|
||||||
routUser := r.NewRoute().Subrouter()
|
routUser := r.NewRoute().Subrouter()
|
||||||
routUser.Use(ctrl.WithUserSession)
|
routUser.Use(ctrl.WithUserSession)
|
||||||
routUser.Handle("/logout", ctrl.HR(ctrl.ServeLogout)) // "raw" handler, updates session
|
routUser.Handle("/logout", ctrl.HR(ctrl.ServeLogout)) // "raw" handler, updates session
|
||||||
@@ -166,7 +167,7 @@ func setupAdmin(r *mux.Router, ctrl *ctrladmin.Controller) {
|
|||||||
routUser.Handle("/download_podcast_do", ctrl.H(ctrl.ServePodcastDownloadDo))
|
routUser.Handle("/download_podcast_do", ctrl.H(ctrl.ServePodcastDownloadDo))
|
||||||
routUser.Handle("/update_podcast_do", ctrl.H(ctrl.ServePodcastUpdateDo))
|
routUser.Handle("/update_podcast_do", ctrl.H(ctrl.ServePodcastUpdateDo))
|
||||||
|
|
||||||
// ** begin admin routes (if session is valid, and is admin)
|
// admin routes (if session is valid, and is admin)
|
||||||
routAdmin := routUser.NewRoute().Subrouter()
|
routAdmin := routUser.NewRoute().Subrouter()
|
||||||
routAdmin.Use(ctrl.WithAdminSession)
|
routAdmin.Use(ctrl.WithAdminSession)
|
||||||
routAdmin.Handle("/change_username", ctrl.H(ctrl.ServeChangeUsername))
|
routAdmin.Handle("/change_username", ctrl.H(ctrl.ServeChangeUsername))
|
||||||
@@ -194,7 +195,7 @@ func setupSubsonic(r *mux.Router, ctrl *ctrlsubsonic.Controller) {
|
|||||||
r.Use(ctrl.WithRequiredParams)
|
r.Use(ctrl.WithRequiredParams)
|
||||||
r.Use(ctrl.WithUser)
|
r.Use(ctrl.WithUser)
|
||||||
|
|
||||||
// ** begin common
|
// common
|
||||||
r.Handle("/getLicense{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetLicence))
|
r.Handle("/getLicense{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetLicence))
|
||||||
r.Handle("/getMusicFolders{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetMusicFolders))
|
r.Handle("/getMusicFolders{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetMusicFolders))
|
||||||
r.Handle("/getScanStatus{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetScanStatus))
|
r.Handle("/getScanStatus{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetScanStatus))
|
||||||
@@ -217,12 +218,12 @@ func setupSubsonic(r *mux.Router, ctrl *ctrlsubsonic.Controller) {
|
|||||||
r.Handle("/createBookmark{_:(?:\\.view)?}", ctrl.H(ctrl.ServeCreateBookmark))
|
r.Handle("/createBookmark{_:(?:\\.view)?}", ctrl.H(ctrl.ServeCreateBookmark))
|
||||||
r.Handle("/deleteBookmark{_:(?:\\.view)?}", ctrl.H(ctrl.ServeDeleteBookmark))
|
r.Handle("/deleteBookmark{_:(?:\\.view)?}", ctrl.H(ctrl.ServeDeleteBookmark))
|
||||||
|
|
||||||
// ** begin raw
|
// raw
|
||||||
r.Handle("/download{_:(?:\\.view)?}", ctrl.HR(ctrl.ServeDownload))
|
r.Handle("/download{_:(?:\\.view)?}", ctrl.HR(ctrl.ServeDownload))
|
||||||
r.Handle("/getCoverArt{_:(?:\\.view)?}", ctrl.HR(ctrl.ServeGetCoverArt))
|
r.Handle("/getCoverArt{_:(?:\\.view)?}", ctrl.HR(ctrl.ServeGetCoverArt))
|
||||||
r.Handle("/stream{_:(?:\\.view)?}", ctrl.HR(ctrl.ServeStream))
|
r.Handle("/stream{_:(?:\\.view)?}", ctrl.HR(ctrl.ServeStream))
|
||||||
|
|
||||||
// ** begin browse by tag
|
// browse by tag
|
||||||
r.Handle("/getAlbum{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetAlbum))
|
r.Handle("/getAlbum{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetAlbum))
|
||||||
r.Handle("/getAlbumList2{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetAlbumListTwo))
|
r.Handle("/getAlbumList2{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetAlbumListTwo))
|
||||||
r.Handle("/getArtist{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetArtist))
|
r.Handle("/getArtist{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetArtist))
|
||||||
@@ -230,7 +231,7 @@ func setupSubsonic(r *mux.Router, ctrl *ctrlsubsonic.Controller) {
|
|||||||
r.Handle("/search3{_:(?:\\.view)?}", ctrl.H(ctrl.ServeSearchThree))
|
r.Handle("/search3{_:(?:\\.view)?}", ctrl.H(ctrl.ServeSearchThree))
|
||||||
r.Handle("/getArtistInfo2{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetArtistInfoTwo))
|
r.Handle("/getArtistInfo2{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetArtistInfoTwo))
|
||||||
|
|
||||||
// ** begin browse by folder
|
// browse by folder
|
||||||
r.Handle("/getIndexes{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetIndexes))
|
r.Handle("/getIndexes{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetIndexes))
|
||||||
r.Handle("/getMusicDirectory{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetMusicDirectory))
|
r.Handle("/getMusicDirectory{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetMusicDirectory))
|
||||||
r.Handle("/getAlbumList{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetAlbumList))
|
r.Handle("/getAlbumList{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetAlbumList))
|
||||||
@@ -238,7 +239,7 @@ func setupSubsonic(r *mux.Router, ctrl *ctrlsubsonic.Controller) {
|
|||||||
r.Handle("/getGenres{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetGenres))
|
r.Handle("/getGenres{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetGenres))
|
||||||
r.Handle("/getArtistInfo{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetArtistInfo))
|
r.Handle("/getArtistInfo{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetArtistInfo))
|
||||||
|
|
||||||
// ** begin podcasts
|
// podcasts
|
||||||
r.Handle("/getPodcasts{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetPodcasts))
|
r.Handle("/getPodcasts{_:(?:\\.view)?}", ctrl.H(ctrl.ServeGetPodcasts))
|
||||||
r.Handle("/downloadPodcastEpisode{_:(?:\\.view)?}", ctrl.H(ctrl.ServeDownloadPodcastEpisode))
|
r.Handle("/downloadPodcastEpisode{_:(?:\\.view)?}", ctrl.H(ctrl.ServeDownloadPodcastEpisode))
|
||||||
r.Handle("/createPodcastChannel{_:(?:\\.view)?}", ctrl.H(ctrl.ServeCreatePodcastChannel))
|
r.Handle("/createPodcastChannel{_:(?:\\.view)?}", ctrl.H(ctrl.ServeCreatePodcastChannel))
|
||||||
|
|||||||
Reference in New Issue
Block a user