Skip to content

Instantly share code, notes, and snippets.

@Elvis10ten
Created November 18, 2017 23:18
Show Gist options
  • Save Elvis10ten/bfe6063bd820be7b83260436761c2a4c to your computer and use it in GitHub Desktop.
Save Elvis10ten/bfe6063bd820be7b83260436761c2a4c to your computer and use it in GitHub Desktop.
Helper for ACRCloud
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class ACRCloudResponseDeserializer implements JsonDeserializer<Music> {
@Override
public Music deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
Music music = new Music();
JsonObject responseObject = json.getAsJsonObject();
setMusicStatus(music, responseObject);
setMetadata(music, responseObject);
return music;
}
private void setMusicStatus(@NonNull Music music, @NonNull JsonObject responseObject) {
if(responseObject.has("status")) {
JsonObject statusObject = responseObject.getAsJsonObject("status");
if(statusObject.has("code")) {
music.statusCode = statusObject.getAsJsonPrimitive("code").getAsInt();
}
}
}
private void setMetadata(@NonNull Music music, @NonNull JsonObject responseObject) {
if(responseObject.has("metadata")) {
JsonObject metadataObject = responseObject.getAsJsonObject("metadata");
if (metadataObject.has("music")) {
JsonArray musicArray = metadataObject.getAsJsonArray("music");
if(musicArray.size() > 0) {
// We only need the first music result
setMusicDetails(music, musicArray.get(0).getAsJsonObject());
}
}
}
}
private void setMusicDetails(@NonNull Music music, @NonNull JsonObject musicObject) {
if(musicObject.has("play_offset_ms")) {
music.playOffsetMs = musicObject.getAsJsonPrimitive("play_offset_ms").getAsLong();
}
if(musicObject.has("release_date")) {
music.releaseDate = musicObject.getAsJsonPrimitive("release_date").getAsString();
}
if(musicObject.has("title")) {
music.title = musicObject.getAsJsonPrimitive("title").getAsString();
}
if(musicObject.has("label")) {
music.label = musicObject.getAsJsonPrimitive("label").getAsString();
}
if(musicObject.has("duration_ms")) {
music.durationMs = musicObject.getAsJsonPrimitive("duration_ms").getAsLong();
}
setArtistNames(music, musicObject);
setGenreNames(music, musicObject);
setAlbums(music, musicObject);
setExternalMetadata(music, musicObject);
setExternalIds(music, musicObject);
}
private void setArtistNames(@NonNull Music music, @NonNull JsonObject musicObject) {
if(musicObject.has("artists")) {
JsonArray artistArray = musicObject.getAsJsonArray("artists");
List<String> artistNames = new ArrayList<>();
for(JsonElement artistElement : artistArray) {
JsonObject artistObject = artistElement.getAsJsonObject();
if(artistObject.has("name")) {
artistNames.add(artistObject.get("name").getAsString());
}
}
music.artistNames = artistNames;
}
}
private void setGenreNames(@NonNull Music music, @NonNull JsonObject musicObject) {
if(musicObject.has("genres")) {
JsonArray genreArray = musicObject.getAsJsonArray("genres");
List<String> genreNames = new ArrayList<>();
for(JsonElement genreElement : genreArray) {
JsonObject genreObject = genreElement.getAsJsonObject();
if(genreObject.has("name")) {
genreNames.add(genreObject.get("name").getAsString());
}
}
music.genreNames = genreNames;
}
}
private void setAlbums(@NonNull Music music, @NonNull JsonObject musicObject) {
if(musicObject.has("album")) {
JsonObject albumObject = musicObject.getAsJsonObject("album");
if(albumObject.has("name")) {
music.albumName = albumObject.get("name").getAsString();
}
}
}
private void setExternalMetadata(@NonNull Music music, @NonNull JsonObject musicObject) {
if (musicObject.has("external_metadata")) {
JsonObject externalMetadataObject = musicObject.getAsJsonObject("external_metadata");
String deezerTrackId = getDeezerTrackId(externalMetadataObject);
if(deezerTrackId != null) {
music.deezerId = deezerTrackId;
}
String spotifyTrackId = getSpotifyTrackId(externalMetadataObject);
if(spotifyTrackId != null) {
music.spotifyId = spotifyTrackId;
}
String youtubeId = getYoutubeTrackId(externalMetadataObject);
if(youtubeId != null) {
music.youtubeId = youtubeId;
}
}
}
private @Nullable String getDeezerTrackId(@NonNull JsonObject externalMetadataObject) {
if(externalMetadataObject.has("deezer")) {
JsonObject deezerObject = externalMetadataObject.getAsJsonObject("deezer");
if(deezerObject.has("track")) {
JsonObject deezerTrackObject = deezerObject.getAsJsonObject("track");
if(deezerTrackObject.has("id")) {
return deezerTrackObject.getAsJsonPrimitive("id").getAsString();
}
}
}
return null;
}
private @Nullable String getSpotifyTrackId(@NonNull JsonObject externalMetadataObject) {
if(externalMetadataObject.has("spotify")) {
JsonObject spotifyObject = externalMetadataObject.getAsJsonObject("spotify");
if(spotifyObject.has("track")) {
JsonObject spotifyTrackObject = spotifyObject.getAsJsonObject("track");
if(spotifyTrackObject.has("id")) {
return spotifyTrackObject.getAsJsonPrimitive("id").getAsString();
}
}
}
return null;
}
private @Nullable String getYoutubeTrackId(@NonNull JsonObject externalMetadataObject) {
if(externalMetadataObject.has("youtube")) {
JsonObject youtubeObject = externalMetadataObject.getAsJsonObject("youtube");
if(youtubeObject.has("vid")) {
return youtubeObject.getAsJsonPrimitive("vid").getAsString();
}
}
return null;
}
private void setExternalIds(@NonNull Music music, @NonNull JsonObject musicObject) {
if (musicObject.has("external_ids")) {
JsonObject externalIdsObject = musicObject.getAsJsonObject("external_ids");
if(externalIdsObject.has("isrc")) {
music.isrc = externalIdsObject.getAsJsonPrimitive("isrc").getAsString();
}
if(externalIdsObject.has("upc")) {
music.upc = externalIdsObject.getAsJsonPrimitive("upc").getAsString();
}
}
}
}
import com.google.gson.annotations.JsonAdapter;
import java.util.List;
@JsonAdapter(ACRCloudResponseDeserializer.class)
public class Music {
public int statusCode = -1;
public long playOffsetMs;
public String releaseDate;
public String title;
public String label;
public long durationMs;
public List<String> artistNames;
public List<String> genreNames;
public String albumName;
public String isrc;
public String upc;
public String deezerId;
public String spotifyId;
public String youtubeId;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment