docs: server comments say what the code does, not how it came to be (#6277)
Comment blocks in cmd/minstrel and 30 smaller internal packages, rewritten
to rule 32's standard with each citation read in context: task, milestone
and rule ids go, and so do the stories they were attached to ("used to",
"Before #N", measurements from one install, quotes, pointers to Fabled
Librarian's records and to docs/superpowers files that are not in the
repo). Where a story wrapped a real constraint, the constraint stays as a
present-tense fact.
Comments that had gone stale are corrected:
- taste.Config: the tuned values are overlaid by internal/recsettings;
it is no longer "a later follow-up".
- StorageConfig: the data dir holds art, caches and the stream secret,
not only playlist covers.
- the Subsonic album list and getUser comments describe what they do
today rather than a milestone that would change it.
Checked: the non-comment token stream of every changed file matches
HEAD, and gofmt -l is empty.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -26,8 +26,8 @@ type browseHandlers struct {
|
||||
// for backwards compatibility with clients that regroup client-side.
|
||||
const ignoredArticles = "The El La Los Las Le Les"
|
||||
|
||||
// getMusicFolders always returns a single folder. Minstrel has no multi-library
|
||||
// concept in M1; clients use the folder id as an opaque cookie so we return 1.
|
||||
// getMusicFolders always returns a single folder: Minstrel serves one library,
|
||||
// and clients use the folder id as an opaque cookie, so it is 1.
|
||||
func (b *browseHandlers) getMusicFolders(w http.ResponseWriter, r *http.Request) {
|
||||
Write(w, r, MusicFoldersResponse{
|
||||
Envelope: NewEnvelope("ok"),
|
||||
@@ -236,9 +236,8 @@ func (b *browseHandlers) getSong(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
// getAlbumList2 returns a paged album list filtered by type. Supported types
|
||||
// match the Subsonic spec § getAlbumList2. "recent"/"frequent" require play
|
||||
// history (M2) and currently return an empty list rather than an error so
|
||||
// clients that poll them don't break.
|
||||
// match the Subsonic spec § getAlbumList2. "recent" and "frequent" return an
|
||||
// empty list rather than an error, so clients that poll them don't break.
|
||||
func (b *browseHandlers) getAlbumList2(w http.ResponseWriter, r *http.Request) {
|
||||
params := r.URL.Query()
|
||||
listType := params.Get("type")
|
||||
@@ -285,15 +284,14 @@ func (b *browseHandlers) getAlbumList2(w http.ResponseWriter, r *http.Request) {
|
||||
WriteFail(w, r, ErrMissingParameter, "Missing required parameter: genre")
|
||||
return
|
||||
}
|
||||
// Genre is a plain string as of #367 — the query now splits
|
||||
// tracks.genre on [;,] instead of comparing the whole column, so a
|
||||
// client asking for "Rock" also reaches tracks tagged "Rock;Pop".
|
||||
// Previously those were unreachable from either of their genres.
|
||||
// The query splits tracks.genre on [;,] rather than comparing the
|
||||
// whole column, so a client asking for "Rock" also reaches tracks
|
||||
// tagged "Rock;Pop".
|
||||
albums, err = q.ListAlbumsByGenre(r.Context(), dbq.ListAlbumsByGenreParams{
|
||||
Genre: genre, Lim: int32(size), Off: int32(offset),
|
||||
})
|
||||
case "recent", "frequent":
|
||||
// Play history lands in M2; return empty to keep clients happy.
|
||||
// Not served from play history: empty keeps clients working.
|
||||
albums = nil
|
||||
default:
|
||||
WriteFail(w, r, ErrGeneric, "Invalid list type: "+listType)
|
||||
|
||||
@@ -11,7 +11,7 @@ import (
|
||||
)
|
||||
|
||||
// OpenSubsonic's replayGain is an object in JSON and an element with
|
||||
// attributes in XML. Clients parse both, so both are pinned (#4997).
|
||||
// attributes in XML. Clients parse both, so both are pinned.
|
||||
func TestSongRef_ReplayGainEncodesForBothFormats(t *testing.T) {
|
||||
gain, peak := float32(-4.5), float32(0.8913)
|
||||
tr := dbq.Track{Title: "Song", FilePath: "/m/a.flac", FileFormat: "flac"}
|
||||
|
||||
@@ -40,7 +40,7 @@ func (m *mediaHandlers) handleStar(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
if trackID.Valid {
|
||||
// Stars the song: every copy of it (M498 #5438).
|
||||
// Stars the song: every copy of it.
|
||||
liked, err := q.LikeTrack(r.Context(), dbq.LikeTrackParams{UserID: user.ID, TrackID: trackID})
|
||||
if err != nil {
|
||||
WriteFail(w, r, ErrGeneric, "Could not star track")
|
||||
@@ -182,7 +182,7 @@ func (m *mediaHandlers) handleGetStarred2(w http.ResponseWriter, r *http.Request
|
||||
// loadStarred fetches the user's full starred set in liked_at DESC order,
|
||||
// projects to Subsonic refs (Song / Album / Artist).
|
||||
func loadStarred(ctx context.Context, q *dbq.Queries, userID pgtype.UUID) ([]SongRef, []AlbumRef, []ArtistRef, error) {
|
||||
const cap = 500 // bounded for safety; M2 doesn't paginate getStarred
|
||||
const cap = 500 // bounded for safety; getStarred is not paginated
|
||||
songs := []SongRef{}
|
||||
albums := []AlbumRef{}
|
||||
artists := []ArtistRef{}
|
||||
|
||||
@@ -181,7 +181,7 @@ type SongRef struct {
|
||||
BitRate int `json:"bitRate,omitempty" xml:"bitRate,attr,omitempty"`
|
||||
IsDir bool `json:"isDir" xml:"isDir,attr"`
|
||||
Type string `json:"type" xml:"type,attr"`
|
||||
// ReplayGain is OpenSubsonic's replayGain (M464 #4997): Minstrel's own
|
||||
// ReplayGain is OpenSubsonic's replayGain: Minstrel's own
|
||||
// measurements, so third-party clients that level by ReplayGain do it
|
||||
// from the same numbers the Minstrel apps use. Omitted until measured.
|
||||
ReplayGain *ReplayGain `json:"replayGain,omitempty" xml:"replayGain,omitempty"`
|
||||
|
||||
@@ -52,9 +52,8 @@ func handleGetUser(w http.ResponseWriter, r *http.Request) {
|
||||
WriteFail(w, r, ErrNotAuthorized, "Not authorized to view other users")
|
||||
return
|
||||
}
|
||||
// We don't have a per-user lookup wired up yet; until then admins asking
|
||||
// for another username see the caller's roles. Acceptable while M1 has a
|
||||
// single user; revisit once user management lands.
|
||||
// No per-user lookup: an admin asking for another username is answered
|
||||
// with the caller's own roles.
|
||||
Write(w, r, UserResponse{
|
||||
Envelope: NewEnvelope("ok"),
|
||||
User: userPayload(caller),
|
||||
|
||||
Reference in New Issue
Block a user