Metadata should be determined from a chain of places: first the TrackGenerator if possible, then the archive, then the player. Right now, its only TG and then player. Work it so that filtering down the chain gets as much metadata as possible. This way, you can implement MetadataSource to provide some little bit, like just the request flag, and then everything that you didn't fill, will be provided by the next thing in the chain, say the archive or the mandatory source from the player. This frees up the inheritance chain on modules, which is a necessity.