aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java163
1 files changed, 163 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java
new file mode 100644
index 000000000..94ad8ece0
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java
@@ -0,0 +1,163 @@
+package org.wordpress.android.ui.reader.utils;
+
+import android.net.Uri;
+import android.text.TextUtils;
+
+import com.android.volley.Response;
+import com.android.volley.VolleyError;
+import com.android.volley.toolbox.JsonArrayRequest;
+
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.wordpress.android.WordPress;
+import org.wordpress.android.util.AppLog;
+import org.wordpress.android.util.AppLog.T;
+import org.wordpress.android.util.JSONUtils;
+
+public class ReaderVideoUtils {
+ private ReaderVideoUtils() {
+ throw new AssertionError();
+ }
+
+ /*
+ * returns the url to get the full-size (480x360) thumbnail url for the passed video
+ * see http://www.reelseo.com/youtube-thumbnail-image/ for other sizes
+ */
+ public static String getYouTubeThumbnailUrl(final String videoUrl) {
+ String videoId = getYouTubeVideoId(videoUrl);
+ if (TextUtils.isEmpty(videoId))
+ return "";
+ // note that this *must* use https rather than http - ex: https://img.youtube.com/vi/ClbE019cLNI/0.jpg
+ return "https://img.youtube.com/vi/" + videoId + "/0.jpg";
+ }
+
+ /*
+ * returns true if the passed url is a link to a YouTube video
+ */
+ public static boolean isYouTubeVideoLink(final String link) {
+ return (!TextUtils.isEmpty(getYouTubeVideoId(link)));
+ }
+
+ /*
+ * extract the video id from the passed YouTube url
+ */
+ private static String getYouTubeVideoId(final String link) {
+ if (link==null)
+ return "";
+
+ Uri uri = Uri.parse(link);
+ try {
+ String host = uri.getHost();
+ if (host==null)
+ return "";
+
+ // youtube.com links
+ if (host.equals("youtube.com") || host.equals("www.youtube.com")) {
+ // if link contains "watch" in the path, then the id is in the "v=" query param
+ if (link.contains("watch"))
+ return uri.getQueryParameter("v");
+ // if the link contains "embed" in the path, then the id is the last path segment
+ // ex: https://www.youtube.com/embed/fw3w68YrKwc?version=3&rel=1&
+ if (link.contains("/embed/"))
+ return uri.getLastPathSegment();
+ return "";
+ }
+
+ // youtu.be urls have the videoId as the path - ex: http://youtu.be/pEnXclbO9jg
+ if (host.equals("youtu.be")) {
+ String path = uri.getPath();
+ if (path==null)
+ return "";
+ // remove the leading slash
+ return path.replace("/", "");
+ }
+
+ // YouTube mobile urls include video id in fragment, ex: http://m.youtube.com/?dc=organic&source=mog#/watch?v=t77Vlme_pf8
+ if (host.equals("m.youtube.com")) {
+ String fragment = uri.getFragment();
+ if (fragment==null)
+ return "";
+ int index = fragment.lastIndexOf("v=");
+ if (index!=-1)
+ return fragment.substring(index+2, fragment.length());
+ }
+
+ return "";
+ } catch (UnsupportedOperationException e) {
+ AppLog.e(T.READER, e);
+ return "";
+ } catch (IndexOutOfBoundsException e) {
+ // thrown by substring
+ AppLog.e(T.READER, e);
+ return "";
+ }
+ }
+
+ /*
+ * returns true if the passed url is a link to a Vimeo video
+ */
+ public static boolean isVimeoLink(final String link) {
+ return (!TextUtils.isEmpty(getVimeoVideoId(link)));
+ }
+
+ /*
+ * extract the video id from the passed Vimeo url
+ * ex: http://player.vimeo.com/video/72386905 -> 72386905
+ */
+ private static String getVimeoVideoId(final String link) {
+ if (link==null)
+ return "";
+ if (!link.contains("player.vimeo.com"))
+ return "";
+
+ Uri uri = Uri.parse(link);
+ return uri.getLastPathSegment();
+ }
+
+ /*
+ * unlike YouTube thumbnails, Vimeo thumbnails require network request
+ */
+ public static void requestVimeoThumbnail(final String videoUrl, final VideoThumbnailListener thumbListener) {
+ // useless without a listener
+ if (thumbListener==null)
+ return;
+
+ String id = getVimeoVideoId(videoUrl);
+ if (TextUtils.isEmpty(id)) {
+ thumbListener.onResponse(false, null);
+ return;
+ }
+
+ Response.Listener<JSONArray> listener = new Response.Listener<JSONArray>() {
+ public void onResponse(JSONArray response) {
+ String thumbnailUrl = null;
+ if (response!=null && response.length() > 0) {
+ JSONObject json = response.optJSONObject(0);
+ if (json!=null && json.has("thumbnail_large"))
+ thumbnailUrl = JSONUtils.getString(json, "thumbnail_large");
+ }
+ if (TextUtils.isEmpty(thumbnailUrl)) {
+ thumbListener.onResponse(false, null);
+ } else {
+ thumbListener.onResponse(true, thumbnailUrl);
+ }
+ }
+ };
+ Response.ErrorListener errorListener = new Response.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError volleyError) {
+ AppLog.e(T.READER, volleyError);
+ thumbListener.onResponse(false, null);
+ }
+ };
+
+ String url = "http://vimeo.com/api/v2/video/" + id + ".json";
+ JsonArrayRequest request = new JsonArrayRequest(url, listener, errorListener);
+
+ WordPress.requestQueue.add(request);
+ }
+
+ public interface VideoThumbnailListener {
+ void onResponse(boolean successful, String thumbnailUrl);
+ }
+}