Merge branch 'dev'
Merge branch 'dev'
lambda/ugc to tagged 1.0.0lambda/util to tagged 1.0.0
Merge branch 'dev'
Merge branch 'dev'
Detect stalled archive uploads
Abort and retry an upload that sends nothing for 60 seconds, instead of waiting out the 2 hour limit with no output
Log upload progress every 30 seconds
Give the website 10 minutes to reply once the file is sent
Fail connections to an unreachable website after 30 seconds
Shutting down mid-upload is logged as such, not as a failed attempt
Merge branch 'master' of git.internal.net:lambda/web2/service-manager
Update packages
Fix 404 when authorising through an application
Merge branch 'dev'
▍██▅▄▄█▍▌▇▉ .▊▊▄ ▆▄▄ ▊▅█
Fix slow Spotify lookups holding up song changes
Song changes wait at most 3 seconds for Spotify and stored ratings, which now run at the same time; late details are sent out as they arrive
Recently played is still recorded at the song change, and its entry and database row are updated when the details arrive
API calls time out after 10 seconds (was 100) and connections after 5
Drop idle API connections after 4 seconds, as POSTs on connections the web server had closed failed with "An error occurred while sending the request"
Upload finished recordings to the website archive
New Uploader worker: posts audio, timeline JSON and sha256 to /api/system/radio/archives, oldest first, with retry and backoff
Writes a .upload.json result per recording so it is never sent twice
Optional DeleteAfterUpload once the website confirms it has the files
Recordings left unfinished by a crash are closed off as incomplete (EndReason Interrupted) at startup so they can still be uploaded
Add RecordingID to the recording JSON; older recordings get one on upload
Pick up song details the radio server sends after the song change
Add docs/sample-recording.json
PEM private keys load as ephemeral keys, which SChannel can't use for server certificates. On Windows the certificate is now re-imported via PKCS12.
Only run string.Format when arguments are passed
Pre-built messages (e.g. interpolated strings) containing braces made logging throw a FormatException.