Last active
November 21, 2017 21:39
-
-
Save Elvis10ten/6fb118dc73c0fbbe8e68148b15bb171b to your computer and use it in GitHub Desktop.
ACRCloud helper function in kotlin
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
class ACRCloudResponseDeserializer : JsonDeserializer<Song> { | |
@Throws(JsonParseException::class) | |
override fun deserialize(json: JsonElement, typeOfT: Type, context: JsonDeserializationContext): Song { | |
val music = Song() | |
val responseObject = json.asJsonObject | |
setSongStatus(music, responseObject) | |
setMetadata(music, responseObject) | |
return music | |
} | |
private fun setSongStatus(music: Song, responseObject: JsonObject) { | |
if (responseObject.has("status")) { | |
val statusObject = responseObject.getAsJsonObject("status") | |
if (statusObject.has("code")) { | |
music.statusCode = statusObject.getAsJsonPrimitive("code").asInt | |
} | |
} | |
} | |
private fun setMetadata(music: Song, responseObject: JsonObject) { | |
if (responseObject.has("metadata")) { | |
val metadataObject = responseObject.getAsJsonObject("metadata") | |
if (metadataObject.has("music")) { | |
val musicArray = metadataObject.getAsJsonArray("music") | |
if (musicArray.size() > 0) { | |
// We only need the first music result | |
setSongDetails(music, musicArray.get(0).asJsonObject) | |
} | |
} | |
} | |
} | |
private fun setSongDetails(music: Song, musicObject: JsonObject) { | |
if (musicObject.has("play_offset_ms")) { | |
music.playOffsetMs = musicObject.getAsJsonPrimitive("play_offset_ms").asLong | |
} | |
if (musicObject.has("release_date")) { | |
music.releaseDate = musicObject.getAsJsonPrimitive("release_date").asString | |
} | |
if (musicObject.has("title")) { | |
music.title = musicObject.getAsJsonPrimitive("title").asString | |
} | |
if (musicObject.has("label")) { | |
music.label = musicObject.getAsJsonPrimitive("label").asString | |
} | |
if (musicObject.has("duration_ms")) { | |
music.durationMs = musicObject.getAsJsonPrimitive("duration_ms").asLong | |
} | |
setArtistNames(music, musicObject) | |
setGenreNames(music, musicObject) | |
setAlbums(music, musicObject) | |
setExternalMetadata(music, musicObject) | |
setExternalIds(music, musicObject) | |
} | |
private fun setArtistNames(music: Song, musicObject: JsonObject) { | |
if (musicObject.has("artists")) { | |
val artistArray = musicObject.getAsJsonArray("artists") | |
val artistNames = ArrayList<String>() | |
for (artistElement in artistArray) { | |
val artistObject = artistElement.asJsonObject | |
if (artistObject.has("name")) { | |
artistNames.add(artistObject.get("name").asString) | |
} | |
} | |
music.artistNames = artistNames | |
} | |
} | |
private fun setGenreNames(music: Song, musicObject: JsonObject) { | |
if (musicObject.has("genres")) { | |
val genreArray = musicObject.getAsJsonArray("genres") | |
val genreNames = ArrayList<String>() | |
for (genreElement in genreArray) { | |
val genreObject = genreElement.asJsonObject | |
if (genreObject.has("name")) { | |
genreNames.add(genreObject.get("name").asString) | |
} | |
} | |
music.genreNames = genreNames | |
} | |
} | |
private fun setAlbums(music: Song, musicObject: JsonObject) { | |
if (musicObject.has("album")) { | |
val albumObject = musicObject.getAsJsonObject("album") | |
if (albumObject.has("name")) { | |
music.albumName = albumObject.get("name").asString | |
} | |
} | |
} | |
private fun setExternalMetadata(music: Song, musicObject: JsonObject) { | |
if (musicObject.has("external_metadata")) { | |
val externalMetadataObject = musicObject.getAsJsonObject("external_metadata") | |
val deezerTrackId = getDeezerTrackId(externalMetadataObject) | |
if (deezerTrackId != null) { | |
music.deezerId = deezerTrackId | |
} | |
val spotifyTrackId = getSpotifyTrackId(externalMetadataObject) | |
if (spotifyTrackId != null) { | |
music.spotifyId = spotifyTrackId | |
} | |
val youtubeId = getYoutubeTrackId(externalMetadataObject) | |
if (youtubeId != null) { | |
music.youtubeId = youtubeId | |
} | |
} | |
} | |
private fun getDeezerTrackId(externalMetadataObject: JsonObject): String? { | |
if (externalMetadataObject.has("deezer")) { | |
val deezerObject = externalMetadataObject.getAsJsonObject("deezer") | |
if (deezerObject.has("track")) { | |
val deezerTrackObject = deezerObject.getAsJsonObject("track") | |
if (deezerTrackObject.has("id")) { | |
return deezerTrackObject.getAsJsonPrimitive("id").asString | |
} | |
} | |
} | |
return null | |
} | |
private fun getSpotifyTrackId(externalMetadataObject: JsonObject): String? { | |
if (externalMetadataObject.has("spotify")) { | |
val spotifyObject = externalMetadataObject.getAsJsonObject("spotify") | |
if (spotifyObject.has("track")) { | |
val spotifyTrackObject = spotifyObject.getAsJsonObject("track") | |
if (spotifyTrackObject.has("id")) { | |
return spotifyTrackObject.getAsJsonPrimitive("id").asString | |
} | |
} | |
} | |
return null | |
} | |
private fun getYoutubeTrackId(externalMetadataObject: JsonObject): String? { | |
if (externalMetadataObject.has("youtube")) { | |
val youtubeObject = externalMetadataObject.getAsJsonObject("youtube") | |
if (youtubeObject.has("vid")) { | |
return youtubeObject.getAsJsonPrimitive("vid").asString | |
} | |
} | |
return null | |
} | |
private fun setExternalIds(music: Song, musicObject: JsonObject) { | |
if (musicObject.has("external_ids")) { | |
val externalIdsObject = musicObject.getAsJsonObject("external_ids") | |
if (externalIdsObject.has("isrc")) { | |
music.isrc = externalIdsObject.getAsJsonPrimitive("isrc").asString | |
} | |
if (externalIdsObject.has("upc")) { | |
music.upc = externalIdsObject.getAsJsonPrimitive("upc").asString | |
} | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.os.Parcel | |
import android.os.Parcelable | |
import com.google.gson.annotations.JsonAdapter | |
@JsonAdapter(ACRCloudResponseDeserializer::class) | |
class Song() : Parcelable { | |
var statusCode = -1 | |
var playOffsetMs: Long = 0 | |
var releaseDate: String? = null | |
var title: String? = null | |
var label: String? = null | |
var durationMs: Long = 0 | |
var artistNames: List<String>? = null | |
var genreNames: List<String>? = null | |
var albumName: String? = null | |
var isrc: String? = null | |
var upc: String? = null | |
var deezerId: String? = null | |
var spotifyId: String? = null | |
var youtubeId: String? = null | |
constructor(parcel: Parcel) : this() { | |
statusCode = parcel.readInt() | |
playOffsetMs = parcel.readLong() | |
releaseDate = parcel.readString() | |
title = parcel.readString() | |
label = parcel.readString() | |
durationMs = parcel.readLong() | |
artistNames = parcel.createStringArrayList() | |
genreNames = parcel.createStringArrayList() | |
albumName = parcel.readString() | |
isrc = parcel.readString() | |
upc = parcel.readString() | |
deezerId = parcel.readString() | |
spotifyId = parcel.readString() | |
youtubeId = parcel.readString() | |
} | |
override fun writeToParcel(parcel: Parcel, flags: Int) { | |
parcel.writeInt(statusCode) | |
parcel.writeLong(playOffsetMs) | |
parcel.writeString(releaseDate) | |
parcel.writeString(title) | |
parcel.writeString(label) | |
parcel.writeLong(durationMs) | |
parcel.writeStringList(artistNames) | |
parcel.writeStringList(genreNames) | |
parcel.writeString(albumName) | |
parcel.writeString(isrc) | |
parcel.writeString(upc) | |
parcel.writeString(deezerId) | |
parcel.writeString(spotifyId) | |
parcel.writeString(youtubeId) | |
} | |
override fun describeContents(): Int { | |
return 0 | |
} | |
companion object CREATOR : Parcelable.Creator<Song> { | |
override fun createFromParcel(parcel: Parcel): Song { | |
return Song(parcel) | |
} | |
override fun newArray(size: Int): Array<Song?> { | |
return arrayOfNulls(size) | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment