Skip to content

Instantly share code, notes, and snippets.

@Elvis10ten
Last active November 21, 2017 21:39
Show Gist options
  • Save Elvis10ten/6fb118dc73c0fbbe8e68148b15bb171b to your computer and use it in GitHub Desktop.
Save Elvis10ten/6fb118dc73c0fbbe8e68148b15bb171b to your computer and use it in GitHub Desktop.
ACRCloud helper function in kotlin
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
}
}
}
}
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