◂ KJsing Songbook ▸

for the KJ
KJsing Songbook — KJSing backend, Gopher+ interface
====================================================

This server speaks Gopher (RFC 1436) and Gopher+ on port 70.
The same data is available over HTTP:

  /songlist.csv          full song list, CSV
  /v1/songs              songs (json | csv | msgpack via ?format= or Accept)
  /v1/requests           pending requests (same formats)
  /v1/venues             venues + accepting state
  /v1/meta               server info + change serial
  POST  /v1/requests     submit {singer, artist, title, key_change, venue_id}
  POST  /                legacy okjsongbook JSON API (OpenKJ compatible)

Gopher+ views on this server:

  text/plain             human-readable
  text/csv               song/request rows
  application/msgpack    machine records for small clients

Request a view with:  selector TAB + application/msgpack CRLF
Ask for attributes:   selector TAB ! CRLF
Search:               /7/search TAB your words [TAB +] CRLF
Submit a request:     /7/request TAB Your Name :: Artist :: Title CRLF
                     (or  Your Name :: #songid  for an exact version;
                      append  :: +2  for a key change. The name is
                      asked fresh every time — nothing is remembered.)

Apps & house clients: poll /0/serial (text or msgpack view); its
number advances whenever a request, venue, category, or the
songbook changes — one cheap check tells a client to refetch.
The status number matches the OpenKJ API's: any new/removed
request, venue state change, category change, or song sync bumps
the number.

Categories (holiday/seasonal): /1/categories lists them; featured
ones appear on the root menu — any number can be featured at once
(two holidays simultaneously is the normal case).