From 2a4b6d3a747c3bd703a1b2e395c771ba25146be4 Mon Sep 17 00:00:00 2001 From: daniel oeh Date: Thu, 2 Aug 2012 00:34:35 +0200 Subject: Created classes for communicating with the Miro Guide API --- .../antennapod/miroguide/con/MiroConnector.java | 128 ++++++++++++++++++ .../antennapod/miroguide/con/MiroException.java | 23 ++++ .../antennapod/miroguide/con/MiroService.java | 148 +++++++++++++++++++++ .../antennapod/miroguide/model/MiroChannel.java | 75 +++++++++++ .../antennapod/miroguide/model/MiroItem.java | 40 ++++++ 5 files changed, 414 insertions(+) create mode 100644 src/de/danoeh/antennapod/miroguide/con/MiroConnector.java create mode 100644 src/de/danoeh/antennapod/miroguide/con/MiroException.java create mode 100644 src/de/danoeh/antennapod/miroguide/con/MiroService.java create mode 100644 src/de/danoeh/antennapod/miroguide/model/MiroChannel.java create mode 100644 src/de/danoeh/antennapod/miroguide/model/MiroItem.java (limited to 'src') diff --git a/src/de/danoeh/antennapod/miroguide/con/MiroConnector.java b/src/de/danoeh/antennapod/miroguide/con/MiroConnector.java new file mode 100644 index 000000000..9620d1fe6 --- /dev/null +++ b/src/de/danoeh/antennapod/miroguide/con/MiroConnector.java @@ -0,0 +1,128 @@ +package de.danoeh.antennapod.miroguide.con; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.net.Uri; + +/** Executes HTTP requests and returns the results. */ +public class MiroConnector { + private HttpClient httpClient; + + private static final String HOST_URL = "www.miroguide.com/api/"; + private static final String PATH_GET_CHANNELS = "get_channels"; + private static final String PATH_LIST_CATEGORIES = "list_categories"; + private static final String PATH_GET_CHANNEL = "get_channel"; + + public MiroConnector() { + httpClient = new DefaultHttpClient(); + } + + public void shutdown() { + httpClient.getConnectionManager().shutdown(); + } + + private Uri.Builder getBaseURIBuilder(String path) { + Uri.Builder builder = new Uri.Builder(); + builder.scheme("https").appendPath(HOST_URL).appendPath(path) + .appendQueryParameter("datatype", "json"); + return builder; + } + + public JSONArray getArrayResponse(Uri uri) throws MiroException { + try { + JSONArray result = new JSONArray(executeRequest(uri)); + return result; + } catch (JSONException e) { + e.printStackTrace(); + throw new MiroException(); + } + } + + public JSONObject getSingleObjectResponse(Uri uri) throws MiroException { + try { + JSONObject result = new JSONObject(executeRequest(uri)); + return result; + } catch (JSONException e) { + e.printStackTrace(); + throw new MiroException(); + } + } + + /** + * Executes a HTTP GET request with the given URI and returns the content of + * the return value. + * + * @throws MiroException + */ + private String executeRequest(Uri uri) throws MiroException { + HttpGet httpGet = new HttpGet(uri.toString()); + String result = null; + try { + HttpResponse response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + InputStream in = entity.getContent(); + + BufferedReader reader = new BufferedReader( + new InputStreamReader(in)); + result = reader.readLine(); + } + } else { + throw new MiroException(response.getStatusLine() + .getReasonPhrase()); + } + } catch (IOException e) { + e.printStackTrace(); + throw new MiroException(e.getMessage()); + } + return result; + + } + + public Uri createGetChannelsUri(String filter, String filterValue, + String sort, String limit, String offset) throws MiroException { + Uri.Builder resultBuilder = getBaseURIBuilder(PATH_GET_CHANNELS); + resultBuilder.appendQueryParameter("filter", filter) + .appendQueryParameter("filter_value", filterValue); + + if (sort != null) { + resultBuilder.appendQueryParameter("sort", sort); + } + if (limit != null) { + resultBuilder.appendQueryParameter("limit", limit); + } + if (offset != null) { + resultBuilder.appendQueryParameter("offset", offset); + } + Uri result = resultBuilder.build(); + return result; + } + + public Uri createListCategoriesURI() throws MiroException { + Uri.Builder resultBuilder = getBaseURIBuilder(PATH_LIST_CATEGORIES); + Uri result = resultBuilder.build(); + + return result; + } + + public Uri createGetChannelUri(String id) throws MiroException { + Uri.Builder resultBuilder = getBaseURIBuilder(PATH_GET_CHANNEL) + .appendQueryParameter("id", id); + Uri result = resultBuilder.build(); + return result; + } + +} diff --git a/src/de/danoeh/antennapod/miroguide/con/MiroException.java b/src/de/danoeh/antennapod/miroguide/con/MiroException.java new file mode 100644 index 000000000..7b4ee1651 --- /dev/null +++ b/src/de/danoeh/antennapod/miroguide/con/MiroException.java @@ -0,0 +1,23 @@ +package de.danoeh.antennapod.miroguide.con; + +public class MiroException extends Exception { + private static final long serialVersionUID = -8834656185748713194L; + + public MiroException() { + super(); + } + + public MiroException(String arg0, Throwable arg1) { + super(arg0, arg1); + } + + public MiroException(String arg0) { + super(arg0); + } + + public MiroException(Throwable arg0) { + super(arg0); + } + + +} diff --git a/src/de/danoeh/antennapod/miroguide/con/MiroService.java b/src/de/danoeh/antennapod/miroguide/con/MiroService.java new file mode 100644 index 000000000..6a0d7f0b0 --- /dev/null +++ b/src/de/danoeh/antennapod/miroguide/con/MiroService.java @@ -0,0 +1,148 @@ +package de.danoeh.antennapod.miroguide.con; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Locale; + +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import de.danoeh.antennapod.miroguide.model.MiroChannel; +import de.danoeh.antennapod.miroguide.model.MiroItem; + + +/** Provides methods to communicate with the Miroguide API on an abstract level. */ +public class MiroService { + public static final int DEFAULT_CHANNEL_LIMIT = 20; + + public static final String FILTER_CATEGORY = "category"; + public static final String FILTER_NAME = "name"; + public static final String SORT_NAME = "name"; + public static final String SORT_POPULAR = "popular"; + public static final String SORT_RATING = "rating"; + + public static final String JSON_DATE_FORMAT_STRING = "yyyy-MM-dd'T'HH:mm:ss"; + + private MiroConnector connector; + + private static ThreadLocal jSONDateFormat = new ThreadLocal() { + @Override + protected SimpleDateFormat initialValue() { + return new SimpleDateFormat(JSON_DATE_FORMAT_STRING, Locale.US); + } + + }; + + public MiroService() { + connector = new MiroConnector(); + } + + public String[] getCategories() throws MiroException { + JSONArray resultArray = connector.getArrayResponse(connector + .createListCategoriesURI()); + String[] result = new String[resultArray.length()]; + for (int i = 0; i < resultArray.length(); i++) { + try { + result[i] = resultArray.getJSONObject(i).getString("name"); + } catch (JSONException e) { + e.printStackTrace(); + throw new MiroException(); + } + } + return result; + } + + /** Get a list of MiroChannel objects without their items. */ + public List getChannelList(String filter, String filterValue, + String sort, int limit, int offset) throws MiroException { + JSONArray resultArray = connector.getArrayResponse(connector + .createGetChannelsUri(filter, filterValue, sort, + Integer.toString(limit), Integer.toString(offset))); + int resultLen = resultArray.length(); + List channels = new ArrayList(resultLen); + for (int i = 0; i < resultLen; i++) { + JSONObject content = null; + try { + content = resultArray.getJSONObject(i); + MiroChannel channel = extractMiroChannel(content, false); + channels.add(channel); + } catch (JSONException e) { + e.printStackTrace(); + throw new MiroException(); + } + } + + return channels; + } + + /** + * Get a single channel with its items. + * + * @throws MiroException + */ + public MiroChannel getChannel(long id) throws MiroException { + JSONObject resultObject = connector.getSingleObjectResponse(connector + .createGetChannelUri(Long.toString(id))); + MiroChannel result = null; + try { + result = extractMiroChannel(resultObject, true); + } catch (JSONException e) { + e.printStackTrace(); + throw new MiroException(); + } + return result; + } + + /** + * Get a MiroChannel object from it's JSON source. The itemlist of the + * channel can be included or excluded + * + * @throws JSONException + */ + private MiroChannel extractMiroChannel(JSONObject content, boolean withItems) + throws JSONException { + long id = content.getLong("id"); + String name = content.getString("name"); + String description = content.getString("description"); + String thumbnailUrl = content.getString("thumbnail_url"); + String downloadUrl = content.getString("url"); + String websiteUrl = content.getString("website_url"); + if (!withItems) { + return new MiroChannel(id, name, thumbnailUrl, downloadUrl, + websiteUrl, description); + } else { + JSONArray itemData = content.getJSONArray("item"); + int numItems = itemData.length(); + ArrayList items = new ArrayList(numItems); + for (int i = 0; i < numItems; i++) { + items.add(extractMiroItem(itemData.getJSONObject(i))); + } + + return new MiroChannel(id, name, thumbnailUrl, downloadUrl, + websiteUrl, description, items); + } + } + + /** Get a MiroItem from its JSON source. */ + private MiroItem extractMiroItem(JSONObject content) throws JSONException { + Date date = parseMiroItemDate(content.getString("date")); + String description = content.getString("description"); + String name = content.getString("name"); + String url = content.getString("url"); + return new MiroItem(name, description, date, url); + } + + private Date parseMiroItemDate(String s) { + try { + return jSONDateFormat.get().parse(s); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + +} diff --git a/src/de/danoeh/antennapod/miroguide/model/MiroChannel.java b/src/de/danoeh/antennapod/miroguide/model/MiroChannel.java new file mode 100644 index 000000000..97b9946df --- /dev/null +++ b/src/de/danoeh/antennapod/miroguide/model/MiroChannel.java @@ -0,0 +1,75 @@ +package de.danoeh.antennapod.miroguide.model; + +import java.util.ArrayList; + +public class MiroChannel { + private long id; + private String name; + private String thumbnailUrl; + private String downloadUrl; + private String websiteUrl; + private String description; + private ArrayList items; + + public MiroChannel(long id, String name, String thumbnailUrl, + String downloadUrl, String websiteUrl, String description) { + super(); + this.id = id; + this.name = name; + this.thumbnailUrl = thumbnailUrl; + this.downloadUrl = downloadUrl; + this.websiteUrl = websiteUrl; + this.description = description; + } + + public MiroChannel(long id, String name, String thumbnailUrl, + String downloadUrl, String websiteUrl, String description, + ArrayList items) { + super(); + this.id = id; + this.name = name; + this.thumbnailUrl = thumbnailUrl; + this.downloadUrl = downloadUrl; + this.websiteUrl = websiteUrl; + this.description = description; + this.items = items; + } + + + + @Override + public String toString() { + return id + " " + name; + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getThumbnailUrl() { + return thumbnailUrl; + } + + public String getDownloadUrl() { + return downloadUrl; + } + + public String getWebsiteUrl() { + return websiteUrl; + } + + public String getDescription() { + return description; + } + + public ArrayList getItems() { + return items; + } + + + +} diff --git a/src/de/danoeh/antennapod/miroguide/model/MiroItem.java b/src/de/danoeh/antennapod/miroguide/model/MiroItem.java new file mode 100644 index 000000000..64a96dcf4 --- /dev/null +++ b/src/de/danoeh/antennapod/miroguide/model/MiroItem.java @@ -0,0 +1,40 @@ +package de.danoeh.antennapod.miroguide.model; + +import java.util.Date; + +public class MiroItem { + private String name; + private String description; + private Date date; + private String url; + + public MiroItem(String name, String description, Date date, String url) { + super(); + this.name = name; + this.description = description; + this.date = date; + this.url = url; + } + + @Override + public String toString() { + return name + " " + date.toString(); + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public Date getDate() { + return date; + } + + public String getUrl() { + return url; + } + +} -- cgit v1.2.3