ShowSongMetadata is an iOS Jailbreak (needs MobileSubstrate) tweak that can display song metadata inside a popup in the default Music app.
When this tweak is loaded, an info button is added to all relevant UITableViewCells in the Music app's UITableViews that launches a detailed popup when pressed.
You can find the current version
1.1.2-1 hosted on the
BigBoss Repo in Cydia.
It is built and tested with an iPod Touch on iOS 8.1.2 and should work with iPhones as well on iOS 8. This tweak may or may not work iOS 7, since I don't own such a device and cannot inspect the Music app.
(Why? Documentation is nice.)
I used cycript to first explore the structure of the Music app at runtime. To do this, I hooked using
cycript -p Music. I found instances of
MusicSongListTableViewCell, and explored up and down the view structure until I reached a
MPConcreteMediaItem referenced in the parent view
MusicTableView's view controller
MusicSongsViewController respectively. To determine which index of the
NSArray to pick, I found the row and section of the cell in its parent tableView through getting a cell's
NSIndexPath, and used it to lookup in the
NSArray. Knowing that the data was stored in these media-related objects, I added an info button using a cell's
setAccessoryType method to each relevant cell that, when pressed, would fetch and display the data in a
For searches, elements
MusicSearchTableViewCell's are presented in a
MusicSearchTableView. It similarly has an associated
MusicSearchViewController. However, this view controller houses a private variable
_nonEmptySearchDataSources which is an
MPUSearchDataSource. Since these objects represent search queries, they have a property
MPMediaQuery that contains the query itself, and within these,
MPConcreteMediaItem which is what I want. The query itself also has a property
groupingType that distinguishes between queries against specific parts of the music library, of which the enum
MPMediaGroupingTitle=0, represents song title queries, and will have relevant data. So I similarly carefully fetch the
MPConcreteMediaItem inside these and display the data inside.
A button is also added in the Now Playing view. A
MusicNowPlayingViewController was hooked, and its
titleView was replaced with a
UIView with subviews
UIButton, relative position preserved in the process. Similarly, when the button was pressed, the
mediaItem inside the
_item in the view controller was used to extract metadata.
TL;DR, looking through private Apple things at runtime is cool. Locating what you want to find, though, is very time-consuming.
- Settings preference pane
- (Maybe? if possible...) modifying metadata/MP3 tags on device.