- convert majority of application to typescript
- support purging individual tracks
- support additional libraries
- begin migration to typescript
- remove router and make calls directly to server
- reduce memory usage when streaming files from client server
- show skip count in UI
- record each time a song is skipped
- allow song upload to replace existing song and take over its play history
- show iframe of album art exchange when editing album art
- bypass router when syncing and directly call API
- major refactor to separate the UI from the router
- deployment now has two separately running modules
- the UI: UI and local backend services
- the router: publicly exposed, routes requests to local server and to remote server
- deployment now has two separately running modules
- feature: support uploading new tracks
- feature: websocket for album art update status
- fix: sync, by refactoring to avoid using the HttpServletRequest
- feature: update album art
- feature: edit rating for a song
- feature: show album art in background
- fix: clicking create smart playlist opens the update modal, not the create modal
- feature: smart playlists
- feature: persist metadata changes for a track to disk
- feature: edit metadata for a track
- feature: allow deletion of purgeable tracks (tracks marked deleted in database)
- feature: show historical plays (songs played on a particular date)
- fix: reload song list after performing sync
- fix: missing dependencies
- fix: prevent sync from beginning if sync is already occurring
- feature: display album art
- use shared MetadataService
- fix: increase socket timeout to 10 minutes
- fix: allow sync forcing updates using UI
- fix: only show sync button if there are no songs playing or queued
- feature: display date created in song list
- retrieve audio file header information (like file length)
- add ability to show detailed song info