@aquilax: I see the artist object having the name and url properties being initialized in 3 different places, same for album.

You can create those objects with their common properties in one place and then customize their properties depending on the context; doing so allows to modify those DTOs to add common properties by doing so in one single place. That is removing duplication and separate concerns, not abstraction.

Looking at this further, I see in other classes/methods hashes are used to describe the same common set of properties (name, url of song/artist/album), why not using the same DTO everywhere rather than 2 different data structures?