Implement an in-memory music player that supports: addSong(id, metadata), removeSong(id), play(id), pause(), next(), prev(), getNowPlaying(), queueSong(id); and a favorites feature with fixed capacity 3 via addFavorite(id), removeFavorite(id), listFavorites(). Do not use an LRU cache; when attempting to add a fourth favorite, define deterministic behavior (e.g., reject with error). Handle corner cases: removing the currently playing song, duplicate adds, empty queue navigation, invalid song IDs, and concurrent calls. Describe chosen data structures, time/space complexities, and provide unit tests.