Whenever a urlRetrieve() fails due to an unexpected error (ENOTFOUND, ETIMEDOUT, Socket hang up, etc.), the domain handler and the global exception handler would detect this and not crash the server, however the dirty internal state would somehow prevent future HTTP requests from completing successfully.
Removed domain usage since that feature is marked "unstable" and is rumored to be marked for deprecation in future versions of node. Using the "error" event of the request object itself, which means errors are local in scope and won't pollute global state. This should have been the solution originally, but when urlRetrieve() was written, I was not as familiar with node.
The underlying cause of #419 is the default utf8 collation in MySQL/MariaDB, which only supports the base plane of Unicode (\u0000-\uffff). By changing the collation to utf8mb4_general_ci, stuff like ban reasons and profile text may have emoji and other non-base-plane Unicode.
The charset for playlist titles is NOT changed, and non-base-plane characters are replaced by question marks. This is because switching to utf8mb4 would make the primary key too long.
Instead of silently failing when browser policy blocks HTTP embeds over HTTPS, pre-fill the video div with an error message and attempt to salvage the link with s/http/https/g.
- User playlists should now list correctly (fixed a race condition)
- Livestream types can autoplay (no longer stuck at currentTime = -3)
- Playlist items with NaN duration do not break user playlist saving
- ffmpeg support can handle live media (e.g. icecast)
- Invalid volume is sanitized and an error message is added
- JWPlayer displays correctly for both HTML5 and Flash
- JWPlayer volume synchronization is fixed
- <audio> and <video> tags are scaled correctly with .embed-responsive-item