Fix json-io parse issues
This commit is contained in:
parent
0e70aac95a
commit
9311a870e0
|
@ -0,0 +1,41 @@
|
||||||
|
package net.filebot.util;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.cedarsoftware.util.io.JsonReader;
|
||||||
|
|
||||||
|
public class JsonUtilities {
|
||||||
|
|
||||||
|
public static Map<?, ?> readJson(String json) {
|
||||||
|
return JsonReader.jsonToMaps(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Object[] getArray(Object node, String key) {
|
||||||
|
return (Object[]) ((Map<?, ?>) node).get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Map<?, ?> getFirstMap(Object node, String key) {
|
||||||
|
Object[] values = getArray(node, key);
|
||||||
|
if (values != null && values.length > 0) {
|
||||||
|
return (Map<?, ?>) values[0];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getString(Object node, String key) {
|
||||||
|
Object value = ((Map<?, ?>) node).get(key);
|
||||||
|
if (value != null) {
|
||||||
|
return value.toString();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Integer getInteger(Object node, String key) {
|
||||||
|
String value = getString(node, key);
|
||||||
|
if (value != null && value.length() > 0) {
|
||||||
|
return new Integer(value.toString());
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package net.filebot.web;
|
package net.filebot.web;
|
||||||
|
|
||||||
|
import static net.filebot.util.JsonUtilities.*;
|
||||||
import static net.filebot.web.WebRequest.*;
|
import static net.filebot.web.WebRequest.*;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
@ -28,9 +29,6 @@ import javax.swing.Icon;
|
||||||
import net.filebot.Cache;
|
import net.filebot.Cache;
|
||||||
import net.filebot.ResourceManager;
|
import net.filebot.ResourceManager;
|
||||||
|
|
||||||
import com.cedarsoftware.util.io.JsonObject;
|
|
||||||
import com.cedarsoftware.util.io.JsonReader;
|
|
||||||
|
|
||||||
public class AcoustIDClient implements MusicIdentificationService {
|
public class AcoustIDClient implements MusicIdentificationService {
|
||||||
|
|
||||||
private static final FloodLimit REQUEST_LIMIT = new FloodLimit(3, 1, TimeUnit.SECONDS);
|
private static final FloodLimit REQUEST_LIMIT = new FloodLimit(3, 1, TimeUnit.SECONDS);
|
||||||
|
@ -103,65 +101,40 @@ public class AcoustIDClient implements MusicIdentificationService {
|
||||||
// submit
|
// submit
|
||||||
response = Charset.forName("UTF-8").decode(post(url, postParam, requestParam)).toString();
|
response = Charset.forName("UTF-8").decode(post(url, postParam, requestParam)).toString();
|
||||||
|
|
||||||
// DEBUG
|
|
||||||
// System.out.println(response);
|
|
||||||
|
|
||||||
cache.put(cacheKey, response);
|
cache.put(cacheKey, response);
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Object[] array(Object node, String key) {
|
|
||||||
Object value = ((Map<?, ?>) node).get(key);
|
|
||||||
return value == null ? null : ((JsonObject<?, ?>) value).getArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Map<?, ?> firstMap(Object node, String key) {
|
|
||||||
Object[] values = array(node, key);
|
|
||||||
return values == null || values.length == 0 ? null : (Map<?, ?>) values[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Integer integer(Object node, String key) {
|
|
||||||
Object value = ((Map<?, ?>) node).get(key);
|
|
||||||
return value == null ? null : new Integer(value.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String string(Object node, String key) {
|
|
||||||
Object value = ((Map<?, ?>) node).get(key);
|
|
||||||
return value == null ? null : value.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public AudioTrack parseResult(String json, final int targetDuration) throws IOException {
|
public AudioTrack parseResult(String json, final int targetDuration) throws IOException {
|
||||||
Map<?, ?> data = JsonReader.jsonToMaps(json);
|
Map<?, ?> data = readJson(json);
|
||||||
|
|
||||||
if (!data.get("status").equals("ok")) {
|
if (!data.get("status").equals("ok")) {
|
||||||
throw new IOException("acoustid responded with error: " + data.get("status"));
|
throw new IOException("acoustid responded with error: " + data.get("status"));
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
for (Object result : getArray(data, "results")) {
|
||||||
for (Object result : array(data, "results")) {
|
|
||||||
try {
|
|
||||||
// pick most likely matching recording
|
// pick most likely matching recording
|
||||||
return Stream.of(array(result, "recordings")).sorted((Object o1, Object o2) -> {
|
return Stream.of(getArray(result, "recordings")).sorted((Object o1, Object o2) -> {
|
||||||
Integer i1 = integer(o1, "duration");
|
Integer i1 = getInteger(o1, "duration");
|
||||||
Integer i2 = integer(o2, "duration");
|
Integer i2 = getInteger(o2, "duration");
|
||||||
return Double.compare(i1 == null ? Double.NaN : Math.abs(i1 - targetDuration), i2 == null ? Double.NaN : Math.abs(i2 - targetDuration));
|
return Double.compare(i1 == null ? Double.NaN : Math.abs(i1 - targetDuration), i2 == null ? Double.NaN : Math.abs(i2 - targetDuration));
|
||||||
}).map((Object o) -> {
|
}).map((Object o) -> {
|
||||||
Map<?, ?> recording = (Map<?, ?>) o;
|
Map<?, ?> recording = (Map<?, ?>) o;
|
||||||
try {
|
try {
|
||||||
Map<?, ?> releaseGroup = firstMap(recording, "releasegroups");
|
Map<?, ?> releaseGroup = getFirstMap(recording, "releasegroups");
|
||||||
if (releaseGroup == null) {
|
if (releaseGroup == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
String artist = (String) firstMap(recording, "artists").get("name");
|
String artist = (String) getFirstMap(recording, "artists").get("name");
|
||||||
String title = (String) recording.get("title");
|
String title = (String) recording.get("title");
|
||||||
|
|
||||||
AudioTrack audioTrack = new AudioTrack(artist, title, null);
|
AudioTrack audioTrack = new AudioTrack(artist, title, null);
|
||||||
audioTrack.mbid = string(result, "id");
|
audioTrack.mbid = getString(result, "id");
|
||||||
|
|
||||||
String type = string(releaseGroup, "type");
|
String type = getString(releaseGroup, "type");
|
||||||
Object[] secondaryTypes = array(releaseGroup, "secondarytypes");
|
Object[] secondaryTypes = getArray(releaseGroup, "secondarytypes");
|
||||||
Object[] releases = array(releaseGroup, "releases");
|
Object[] releases = getArray(releaseGroup, "releases");
|
||||||
|
|
||||||
if (releases == null || secondaryTypes != null || (!"Album".equals(type))) {
|
if (releases == null || secondaryTypes != null || (!"Album".equals(type))) {
|
||||||
return audioTrack; // default to simple music info if album data is undesirable
|
return audioTrack; // default to simple music info if album data is undesirable
|
||||||
|
@ -172,7 +145,7 @@ public class AcoustIDClient implements MusicIdentificationService {
|
||||||
Map<?, ?> release = (Map<?, ?>) it;
|
Map<?, ?> release = (Map<?, ?>) it;
|
||||||
Map<?, ?> date = (Map<?, ?>) release.get("date");
|
Map<?, ?> date = (Map<?, ?>) release.get("date");
|
||||||
try {
|
try {
|
||||||
thisRelease.albumReleaseDate = new SimpleDate(integer(date, "year"), integer(date, "month"), integer(date, "day"));
|
thisRelease.albumReleaseDate = new SimpleDate(getInteger(date, "year"), getInteger(date, "month"), getInteger(date, "day"));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
thisRelease.albumReleaseDate = null;
|
thisRelease.albumReleaseDate = null;
|
||||||
}
|
}
|
||||||
|
@ -181,13 +154,13 @@ public class AcoustIDClient implements MusicIdentificationService {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<?, ?> medium = firstMap(release, "mediums");
|
Map<?, ?> medium = getFirstMap(release, "mediums");
|
||||||
thisRelease.mediumIndex = integer(medium, "position");
|
thisRelease.mediumIndex = getInteger(medium, "position");
|
||||||
thisRelease.mediumCount = integer(release, "medium_count");
|
thisRelease.mediumCount = getInteger(release, "medium_count");
|
||||||
|
|
||||||
Map<?, ?> track = firstMap(medium, "tracks");
|
Map<?, ?> track = getFirstMap(medium, "tracks");
|
||||||
thisRelease.trackIndex = integer(track, "position");
|
thisRelease.trackIndex = getInteger(track, "position");
|
||||||
thisRelease.trackCount = integer(medium, "track_count");
|
thisRelease.trackCount = getInteger(medium, "track_count");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
thisRelease.album = release.get("title").toString();
|
thisRelease.album = release.get("title").toString();
|
||||||
|
@ -195,7 +168,7 @@ public class AcoustIDClient implements MusicIdentificationService {
|
||||||
thisRelease.album = (String) releaseGroup.get("title");
|
thisRelease.album = (String) releaseGroup.get("title");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
thisRelease.albumArtist = (String) firstMap(releaseGroup, "artists").get("name");
|
thisRelease.albumArtist = (String) getFirstMap(releaseGroup, "artists").get("name");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
thisRelease.albumArtist = null;
|
thisRelease.albumArtist = null;
|
||||||
}
|
}
|
||||||
|
@ -214,13 +187,8 @@ public class AcoustIDClient implements MusicIdentificationService {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}).filter(o -> o != null).sorted(new MostFieldsNotNull()).findFirst().get();
|
}).filter(o -> o != null).sorted(new MostFieldsNotNull()).findFirst().get();
|
||||||
} catch (Exception e) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
// ignore
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,7 @@ public class AcoustIDClientTest {
|
||||||
String fingerprint = "AQADtJmWRFJCRkGcHXceND_Oquhz1H_xvjg8D8mYIf5-fOpKVE81NOOF5_hb1PrxJLhhRxfCLkNSOh-61Mvh3DJKOcMnG2eOPsmH_4R_I-SPJB-Df0NTB70-vPiDRtKOS3qK-Duhc8mR9-jyoOvhKhyJH-8FE5eOHHoy3BpC5Tieo_kV9LiZ41McHCF9iJmDPFTQPeiYHD5J_Cfy7DBz_IdxrXBRMTyeP9CSLeJQ8glyC18S5imeSHkSPBeavwgfHrqSD7l09Fl2mGMDVzmekAzS_Gi3HPJbIr0VvD2eJD8u-eAPxytyMccTTQ8u5YmR63iG5jm6UG3wJcmFyzFuNEclvcETfcSb4T-aDz0RWoGs5MQlg9mUBXlyodYjbId_lHke4vPxCFuO5-iNJkw-5FseJM9RckFPHJ-kH3USNL_w4i7xpT5iHvlCVOIR5viFJyFK2Yd59DzqHe8wNUfJF1rwakJTZdB_TJkk5Ntx6YOb7MHj40SZh1ERZv3wD3yaohmzC-2DyM_xND_e48-CWx-6H5FC6ApxpUf-4jpyuEo64VLCZsrwHXcWlBcaDdeWI6Zz5D9qQ0wz4WNPPPCYWWgv6OTw7Ugb_Ghihkd4gdKSqBL0hGyCH1q59GjkHaeQJ0fJLEbz2XiOmBu-RIemG55TDmGPJ3i04zouycIZuMrI4Exz480xqvnxhUS68oHKTD7-I1LGLEX7CteFmNGDD3qO6UvQRNSxKsoVXDnurEHzYWIfPKmFWJqJp3OQP4c5Ukqhx0QeY_-OXj1MLozw6AzqJBmOfNCUKslDhOHB40mGR19wHT0RplRwMsQT5VGG_Kh--D2qKEpU4quFc0Z5NIx4fJIXnHjR73COkNCaJEdF0cifE2SkPHiEJj76Y8qzHO27FE-O79hyS8R59HoQRssV6NKRx6i-o2eKP0ednGiq4Ej1oHeGZgqJnzOeCyEzvmh0XCryaLlRSUJ6YjpxHdd04-qE_kVz_EGNOsR84cuFMJNooWIgNzziKw2anUeZ5cYzBbyI3jnCPB90R0L0hFSBJxfmLLPQHF2T4Ql5nD2eWMFtwnWQL8msQF-MfEezC0x34wue48kRktORUIcbB-fhZw-87ArKI8-E5AmD-mieB7dyXKQYXMvxHDkU5T9K8sTTQ1eLPkeYG992xAweQ-eD5lmDUN_xicaX6PiNM1vxw91InGmOv7ior_AXPDueXbiOhlwkHeUV_DF-5D90Fc1zJCMzK8aT45KNV0XzYvJxJccfIZ-RLEdPKcGzDkdPonmWDMcf4WFy_MGTFVoiGp3WRwOfZMd1PDnxJ4GbCc9O5Eeih2jWo2_AKpPxKMTFHVWOhEdo_AmuD89yNJETdEdSHmGcHEezrjFoCZf0w8Lo7PC54M6DT-vwhEcPP4Hzo9uOH98TJH_TIRJzHNaS4-TBz8nRh8GZFz-eG08f9MzRrDu-iMjWC5eG_wjpoQl_zNHx3mh6BT09o1Zg93iKZj0uhSQmH8nyBHl3VHszUM9RytLwJEqKmT96NC-H41eIHzk0PUeYSx_WCE9y4qaGo7KUomk0C9eJ5L-RfUFzodSLJ3goHX3gHHkJPUMuFdfyJHB8hCeSZxH4BE1vVL6CrkmM6lEePGeK_Ei0v8KTw9GRb3gO_YfjLMgn6agYIh3xfIJ2T8jDodR2OAyso8e3bIrhJgyHHzvyKhCjpxE-MUIezeiD5suW4LzxJEfMlEJy4VFCNNeLUjqeJJ6OP8PNwsfTB9dxHUmeXAgzLuHQ4wljfDqahegj4R2JKzlO5fiDkuERJkfiKVHwxB_OHPyH6soEJk07fB9u6CyF5rmCflFwBdyiRHg4IReSBfWDX8GnHGVGNHOE-NCssEjTHFeNplsPdgmqKBea8eiD5jwuBo-SZ6gkfmhk4U6EpmKOPviJUD-S50WVgE911Id9HX3k4AmHG-9fPAneJ-hBjcWjoPzxHI9JhDSx5awQSlGPWg_8bULPHE2VE30oNNNQb7hyTD4aVUYeQUv2Ivzw1AEd7Wge9Ph-4M_xC89uJEusIVyY4cWTRC_-4-hNNI2WSciP5J3BL_Au4UyPKzgaPUN4yAuP0Dw85jqejE6CUNCRZ8OTo-mD58atGJ0jXjjjIxd09gh7hNnx4UkOnYe_4MQDTWJgaauE8Bc-KmgTDQ_6CleKD6Z8Yufxtwh1QcuCfEmGS4rwE_444TniREmOH-_wCP6MO2mDNUouPNEPTUfzqMPZI1_EB1feHDeFkjzCjMygJznuI2dYouXhS3gfhOXxi9Ap2Uj14DyeJFl6sHrwH37wKRm-8HiUJwnOC-UTNFJ1XMwz4eKDr0GbH54kVJWC78GpVfjRHD2SLcmGb0f44SAj5WgfNGOO5j36K_jUo09mNMWDbrbQOEcsLSeS50fPHL9QUceFKhOP4w_cGKGV489FPD0aJTvKP_hE6EmGpkKZH7ri4FRm44o5oZQ5-Jh-ou_RNImCw1GqTYjMo_aDRsuO__gS-CKefQlyKSf4NEdPGmGOP8eZKbjihzh1nJ_QvEa4Q6VC4UqkIz_-oEeYUH3wRR--C10JD7WOMwquhwbPQ9t6Iw1TXMNPnBciZXkC1YiYRSxq-MI35KikzEoCpcrxLNB2NDlyKcPIGH0OH3eE5wglrdB3hOGH6eKEMw725Oh39DN-NP1RMaGHhznu7Ei_ZIWei7iSCnmOZvbQM1zQ78hTo-aA6ROhJWKi49OxJzdi9fgUlL_RNMm644suXEcsJjua69BsfFpKPDrCV4fPIFe-4IknofKNo9O0Q9L4oFauoBzaiD7eG018oZSj44nW4HlCNPFioa2CPMyFUzye5vjR7mgibTitiRh5Yj7aCQAIMEQoACCQQABhCBNGCMGUEcAYYg1AQCAhDDAAAAagAQAQAAh0BmBCiPAMEHOUAAogASCBBAAklFBEEWaEIkQAAAQjQAgAgHHCIASIA0gQQwQASBggBBFKUCMAIFQSBIQERAnCECRWEACEQJIipYABnIEhACECEUAIs8wg4QRCACBmBCAEKAEIAwYpABSACAAECASCCEKgE04oYBRQChgHhABkAUEAEAIwAwAgQFAgFGMUGcIoA0AIARgAyBhAFKIKCEOIAgQZIARARhgggBGUAYiRAUAIRYQEBABAkBAECOMMIgAIhIQBCiCFCHBMEASAAEoACogoCAFGgGUGWIUAMIgRBIAzhgAFFAJEAEIEgAwZoBgAmCFmhKEMGAAUAAYsQgABgChgNAUGAASIgEAYB4gRQABBBGMGCKEAAIwggShwCChkgGIEGQaocoQBoLRBSACOHALEMQAEAkwAYoAkTDkDICEKIUMQAEQEQRRAgBCJACJCIWSAAKwBQYQABEkCBRHAAEUAoAJIgYBQTAkDAAEIIGEEMIsQx4wAwhgiEQFCGAQQA0oY4gUhCgElgEHEOECEUAYhJAQwxBgJJANIUQKEIYIoARgDhhlAHFBIIAmQQRYhoAhhCBgnLCKEKCEQIQEIR4RTCgkkCAKGCmQQQQAQgAQFgBFBCCGSAwAEIcoIoJQEDCHhEDAKKmCREswQohAgiglkACACKgOhMUAhRgwCBAipEFGMAAGEUABYhAhSAiEFoFEQASGAIAAxJQiESDEHgCEISAEQEAAIJwhAShGoBAUAUCaIUAwIgQgzghgggECAKCIcMQoJxYgSwABlhACAMgMAEkwCpCBzhgADGDACWMIEA0YbIQBiQAAgGCFAKCCEJBAAAYwhAGmiCCOOAIEcMwAIggBzjBhHmHeMSCGIEggiAA0jTCHjCABCAAUQIUQJIowQggFkKBEAGCEBBMQgBIARBkGDCCFGCMMMIIAgQBgSSAI";
|
String fingerprint = "AQADtJmWRFJCRkGcHXceND_Oquhz1H_xvjg8D8mYIf5-fOpKVE81NOOF5_hb1PrxJLhhRxfCLkNSOh-61Mvh3DJKOcMnG2eOPsmH_4R_I-SPJB-Df0NTB70-vPiDRtKOS3qK-Duhc8mR9-jyoOvhKhyJH-8FE5eOHHoy3BpC5Tieo_kV9LiZ41McHCF9iJmDPFTQPeiYHD5J_Cfy7DBz_IdxrXBRMTyeP9CSLeJQ8glyC18S5imeSHkSPBeavwgfHrqSD7l09Fl2mGMDVzmekAzS_Gi3HPJbIr0VvD2eJD8u-eAPxytyMccTTQ8u5YmR63iG5jm6UG3wJcmFyzFuNEclvcETfcSb4T-aDz0RWoGs5MQlg9mUBXlyodYjbId_lHke4vPxCFuO5-iNJkw-5FseJM9RckFPHJ-kH3USNL_w4i7xpT5iHvlCVOIR5viFJyFK2Yd59DzqHe8wNUfJF1rwakJTZdB_TJkk5Ntx6YOb7MHj40SZh1ERZv3wD3yaohmzC-2DyM_xND_e48-CWx-6H5FC6ApxpUf-4jpyuEo64VLCZsrwHXcWlBcaDdeWI6Zz5D9qQ0wz4WNPPPCYWWgv6OTw7Ugb_Ghihkd4gdKSqBL0hGyCH1q59GjkHaeQJ0fJLEbz2XiOmBu-RIemG55TDmGPJ3i04zouycIZuMrI4Exz480xqvnxhUS68oHKTD7-I1LGLEX7CteFmNGDD3qO6UvQRNSxKsoVXDnurEHzYWIfPKmFWJqJp3OQP4c5Ukqhx0QeY_-OXj1MLozw6AzqJBmOfNCUKslDhOHB40mGR19wHT0RplRwMsQT5VGG_Kh--D2qKEpU4quFc0Z5NIx4fJIXnHjR73COkNCaJEdF0cifE2SkPHiEJj76Y8qzHO27FE-O79hyS8R59HoQRssV6NKRx6i-o2eKP0ednGiq4Ej1oHeGZgqJnzOeCyEzvmh0XCryaLlRSUJ6YjpxHdd04-qE_kVz_EGNOsR84cuFMJNooWIgNzziKw2anUeZ5cYzBbyI3jnCPB90R0L0hFSBJxfmLLPQHF2T4Ql5nD2eWMFtwnWQL8msQF-MfEezC0x34wue48kRktORUIcbB-fhZw-87ArKI8-E5AmD-mieB7dyXKQYXMvxHDkU5T9K8sTTQ1eLPkeYG992xAweQ-eD5lmDUN_xicaX6PiNM1vxw91InGmOv7ior_AXPDueXbiOhlwkHeUV_DF-5D90Fc1zJCMzK8aT45KNV0XzYvJxJccfIZ-RLEdPKcGzDkdPonmWDMcf4WFy_MGTFVoiGp3WRwOfZMd1PDnxJ4GbCc9O5Eeih2jWo2_AKpPxKMTFHVWOhEdo_AmuD89yNJETdEdSHmGcHEezrjFoCZf0w8Lo7PC54M6DT-vwhEcPP4Hzo9uOH98TJH_TIRJzHNaS4-TBz8nRh8GZFz-eG08f9MzRrDu-iMjWC5eG_wjpoQl_zNHx3mh6BT09o1Zg93iKZj0uhSQmH8nyBHl3VHszUM9RytLwJEqKmT96NC-H41eIHzk0PUeYSx_WCE9y4qaGo7KUomk0C9eJ5L-RfUFzodSLJ3goHX3gHHkJPUMuFdfyJHB8hCeSZxH4BE1vVL6CrkmM6lEePGeK_Ei0v8KTw9GRb3gO_YfjLMgn6agYIh3xfIJ2T8jDodR2OAyso8e3bIrhJgyHHzvyKhCjpxE-MUIezeiD5suW4LzxJEfMlEJy4VFCNNeLUjqeJJ6OP8PNwsfTB9dxHUmeXAgzLuHQ4wljfDqahegj4R2JKzlO5fiDkuERJkfiKVHwxB_OHPyH6soEJk07fB9u6CyF5rmCflFwBdyiRHg4IReSBfWDX8GnHGVGNHOE-NCssEjTHFeNplsPdgmqKBea8eiD5jwuBo-SZ6gkfmhk4U6EpmKOPviJUD-S50WVgE911Id9HX3k4AmHG-9fPAneJ-hBjcWjoPzxHI9JhDSx5awQSlGPWg_8bULPHE2VE30oNNNQb7hyTD4aVUYeQUv2Ivzw1AEd7Wge9Ph-4M_xC89uJEusIVyY4cWTRC_-4-hNNI2WSciP5J3BL_Au4UyPKzgaPUN4yAuP0Dw85jqejE6CUNCRZ8OTo-mD58atGJ0jXjjjIxd09gh7hNnx4UkOnYe_4MQDTWJgaauE8Bc-KmgTDQ_6CleKD6Z8Yufxtwh1QcuCfEmGS4rwE_444TniREmOH-_wCP6MO2mDNUouPNEPTUfzqMPZI1_EB1feHDeFkjzCjMygJznuI2dYouXhS3gfhOXxi9Ap2Uj14DyeJFl6sHrwH37wKRm-8HiUJwnOC-UTNFJ1XMwz4eKDr0GbH54kVJWC78GpVfjRHD2SLcmGb0f44SAj5WgfNGOO5j36K_jUo09mNMWDbrbQOEcsLSeS50fPHL9QUceFKhOP4w_cGKGV489FPD0aJTvKP_hE6EmGpkKZH7ri4FRm44o5oZQ5-Jh-ou_RNImCw1GqTYjMo_aDRsuO__gS-CKefQlyKSf4NEdPGmGOP8eZKbjihzh1nJ_QvEa4Q6VC4UqkIz_-oEeYUH3wRR--C10JD7WOMwquhwbPQ9t6Iw1TXMNPnBciZXkC1YiYRSxq-MI35KikzEoCpcrxLNB2NDlyKcPIGH0OH3eE5wglrdB3hOGH6eKEMw725Oh39DN-NP1RMaGHhznu7Ei_ZIWei7iSCnmOZvbQM1zQ78hTo-aA6ROhJWKi49OxJzdi9fgUlL_RNMm644suXEcsJjua69BsfFpKPDrCV4fPIFe-4IknofKNo9O0Q9L4oFauoBzaiD7eG018oZSj44nW4HlCNPFioa2CPMyFUzye5vjR7mgibTitiRh5Yj7aCQAIMEQoACCQQABhCBNGCMGUEcAYYg1AQCAhDDAAAAagAQAQAAh0BmBCiPAMEHOUAAogASCBBAAklFBEEWaEIkQAAAQjQAgAgHHCIASIA0gQQwQASBggBBFKUCMAIFQSBIQERAnCECRWEACEQJIipYABnIEhACECEUAIs8wg4QRCACBmBCAEKAEIAwYpABSACAAECASCCEKgE04oYBRQChgHhABkAUEAEAIwAwAgQFAgFGMUGcIoA0AIARgAyBhAFKIKCEOIAgQZIARARhgggBGUAYiRAUAIRYQEBABAkBAECOMMIgAIhIQBCiCFCHBMEASAAEoACogoCAFGgGUGWIUAMIgRBIAzhgAFFAJEAEIEgAwZoBgAmCFmhKEMGAAUAAYsQgABgChgNAUGAASIgEAYB4gRQABBBGMGCKEAAIwggShwCChkgGIEGQaocoQBoLRBSACOHALEMQAEAkwAYoAkTDkDICEKIUMQAEQEQRRAgBCJACJCIWSAAKwBQYQABEkCBRHAAEUAoAJIgYBQTAkDAAEIIGEEMIsQx4wAwhgiEQFCGAQQA0oY4gUhCgElgEHEOECEUAYhJAQwxBgJJANIUQKEIYIoARgDhhlAHFBIIAmQQRYhoAhhCBgnLCKEKCEQIQEIR4RTCgkkCAKGCmQQQQAQgAQFgBFBCCGSAwAEIcoIoJQEDCHhEDAKKmCREswQohAgiglkACACKgOhMUAhRgwCBAipEFGMAAGEUABYhAhSAiEFoFEQASGAIAAxJQiESDEHgCEISAEQEAAIJwhAShGoBAUAUCaIUAwIgQgzghgggECAKCIcMQoJxYgSwABlhACAMgMAEkwCpCBzhgADGDACWMIEA0YbIQBiQAAgGCFAKCCEJBAAAYwhAGmiCCOOAIEcMwAIggBzjBhHmHeMSCGIEggiAA0jTCHjCABCAAUQIUQJIowQggFkKBEAGCEBBMQgBIARBkGDCCFGCMMMIIAgQBgSSAI";
|
||||||
|
|
||||||
String response = client.lookup(duration, fingerprint);
|
String response = client.lookup(duration, fingerprint);
|
||||||
|
System.out.println(response);
|
||||||
AudioTrack info = client.parseResult(response, duration);
|
AudioTrack info = client.parseResult(response, duration);
|
||||||
|
|
||||||
assertEquals("周杰倫", info.getArtist());
|
assertEquals("周杰倫", info.getArtist());
|
||||||
|
|
Loading…
Reference in New Issue