in mp4parse/src/lib.rs [6009:6110]
fn read_ilst<T: Read>(src: &mut BMFFBox<T>, meta: &mut MetadataBox) -> Result<()> {
let mut iter = src.box_iter();
while let Some(mut b) = iter.next_box()? {
match b.head.name {
BoxType::AlbumEntry => meta.album = read_ilst_string_data(&mut b)?,
BoxType::ArtistEntry | BoxType::ArtistLowercaseEntry => {
meta.artist = read_ilst_string_data(&mut b)?
}
BoxType::AlbumArtistEntry => meta.album_artist = read_ilst_string_data(&mut b)?,
BoxType::CommentEntry => meta.comment = read_ilst_string_data(&mut b)?,
BoxType::DateEntry => meta.year = read_ilst_string_data(&mut b)?,
BoxType::TitleEntry => meta.title = read_ilst_string_data(&mut b)?,
BoxType::CustomGenreEntry => {
meta.genre = read_ilst_string_data(&mut b)?.map(Genre::CustomGenre)
}
BoxType::StandardGenreEntry => {
meta.genre = read_ilst_u8_data(&mut b)?
.and_then(|gnre| Some(Genre::StandardGenre(gnre.get(1).copied()?)))
}
BoxType::ComposerEntry => meta.composer = read_ilst_string_data(&mut b)?,
BoxType::EncoderEntry => meta.encoder = read_ilst_string_data(&mut b)?,
BoxType::EncodedByEntry => meta.encoded_by = read_ilst_string_data(&mut b)?,
BoxType::CopyrightEntry => meta.copyright = read_ilst_string_data(&mut b)?,
BoxType::GroupingEntry => meta.grouping = read_ilst_string_data(&mut b)?,
BoxType::CategoryEntry => meta.category = read_ilst_string_data(&mut b)?,
BoxType::KeywordEntry => meta.keyword = read_ilst_string_data(&mut b)?,
BoxType::PodcastUrlEntry => meta.podcast_url = read_ilst_string_data(&mut b)?,
BoxType::PodcastGuidEntry => meta.podcast_guid = read_ilst_string_data(&mut b)?,
BoxType::DescriptionEntry => meta.description = read_ilst_string_data(&mut b)?,
BoxType::LongDescriptionEntry => meta.long_description = read_ilst_string_data(&mut b)?,
BoxType::LyricsEntry => meta.lyrics = read_ilst_string_data(&mut b)?,
BoxType::TVNetworkNameEntry => meta.tv_network_name = read_ilst_string_data(&mut b)?,
BoxType::TVEpisodeNameEntry => meta.tv_episode_name = read_ilst_string_data(&mut b)?,
BoxType::TVShowNameEntry => meta.tv_show_name = read_ilst_string_data(&mut b)?,
BoxType::PurchaseDateEntry => meta.purchase_date = read_ilst_string_data(&mut b)?,
BoxType::RatingEntry => meta.rating = read_ilst_string_data(&mut b)?,
BoxType::OwnerEntry => meta.owner = read_ilst_string_data(&mut b)?,
BoxType::HDVideoEntry => meta.hd_video = read_ilst_bool_data(&mut b)?,
BoxType::SortNameEntry => meta.sort_name = read_ilst_string_data(&mut b)?,
BoxType::SortArtistEntry => meta.sort_artist = read_ilst_string_data(&mut b)?,
BoxType::SortAlbumEntry => meta.sort_album = read_ilst_string_data(&mut b)?,
BoxType::SortAlbumArtistEntry => {
meta.sort_album_artist = read_ilst_string_data(&mut b)?
}
BoxType::SortComposerEntry => meta.sort_composer = read_ilst_string_data(&mut b)?,
BoxType::TrackNumberEntry => {
if let Some(trkn) = read_ilst_u8_data(&mut b)? {
meta.track_number = trkn.get(3).copied();
meta.total_tracks = trkn.get(5).copied();
};
}
BoxType::DiskNumberEntry => {
if let Some(disk) = read_ilst_u8_data(&mut b)? {
meta.disc_number = disk.get(3).copied();
meta.total_discs = disk.get(5).copied();
};
}
BoxType::TempoEntry => {
meta.beats_per_minute =
read_ilst_u8_data(&mut b)?.and_then(|tmpo| tmpo.get(1).copied())
}
BoxType::CompilationEntry => meta.compilation = read_ilst_bool_data(&mut b)?,
BoxType::AdvisoryEntry => {
meta.advisory = read_ilst_u8_data(&mut b)?.and_then(|rtng| {
Some(match rtng.first()? {
2 => AdvisoryRating::Clean,
0 => AdvisoryRating::Inoffensive,
r => AdvisoryRating::Explicit(*r),
})
})
}
BoxType::MediaTypeEntry => {
meta.media_type = read_ilst_u8_data(&mut b)?.and_then(|stik| {
Some(match stik.first()? {
0 => MediaType::Movie,
1 => MediaType::Normal,
2 => MediaType::AudioBook,
5 => MediaType::WhackedBookmark,
6 => MediaType::MusicVideo,
9 => MediaType::ShortFilm,
10 => MediaType::TVShow,
11 => MediaType::Booklet,
s => MediaType::Unknown(*s),
})
})
}
BoxType::PodcastEntry => meta.podcast = read_ilst_bool_data(&mut b)?,
BoxType::TVSeasonNumberEntry => {
meta.tv_season = read_ilst_u8_data(&mut b)?.and_then(|tvsn| tvsn.get(3).copied())
}
BoxType::TVEpisodeNumberEntry => {
meta.tv_episode_number =
read_ilst_u8_data(&mut b)?.and_then(|tves| tves.get(3).copied())
}
BoxType::GaplessPlaybackEntry => meta.gapless_playback = read_ilst_bool_data(&mut b)?,
BoxType::CoverArtEntry => meta.cover_art = read_ilst_multiple_u8_data(&mut b).ok(),
_ => skip_box_content(&mut b)?,
};
check_parser_state!(b.content);
}
Ok(())
}