You can do that with MPD. What might be interesting for you, since you want to automate: MPD separates the playback engine (i.e. MPD itself) and the controller (the client) into separate, mostly independent programs. You can write a client in any language you prefer and implement the automation.

Crossfading is either based on a fixed number of seconds (set by the client) or by MixRamp metadata (if your song files have this metadata).

Next song is never "requested" in the way you probably mean it; it's the other way round. The client needs to take care that there's always already a "next song" in the queue by adding new songs before the last song ends. MPD doesn't care when the client does that, or how many songs the client queues. So as soon as you know what shall be played next, add it to the queue.

This is the protocol documentation (a copy of the DocBook file which comes with every MPD source download): https://www.musicpd.org/doc/protocol/ and there are libraries for all relevant programming languages.