package com.kenny.openimgur.util;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.kenny.openimgur.classes.ImgurPhoto;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by kcampagna on 9/8/14.
*/
public class LinkUtils {
private static final String TAG = LinkUtils.class.getSimpleName();
private static final String REGEX_IMAGE_URL = "^([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://\\S+(.jpg|.jpeg|.gif|.png)$";
private static final String REGEX_IMGUR_IMAGE = "^([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://" +
"(m.imgur.com|imgur.com|i.imgur.com)/(?!=/)\\w+$";
private static final String REGEX_IMGUR_IMAGE_QUERY = "^([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://(m.imgur.com|imgur.com|i.imgur.com)/(?!=/)\\w+\\?\\w+$";
private static final String REGEX_IMGUR_GALLERY = "^([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://" +
"(m.imgur.com|imgur.com|i.imgur.com)/gallery/.+";
private static final String REGEX_IMGUR_USER = "^([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://" +
"(m.imgur.com|imgur.com|i.imgur.com)/user/.+";
private static final String REGEX_IMGUR_ALBUM = "^([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://" +
"(m.imgur.com|imgur.com|i.imgur.com)/a/.+";
private static final String REGEX_IMGUR_DIRECT_LINK = "^([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://" +
"(m.imgur.com|imgur.com|i.imgur.com)/(?!=/)\\w+(.jpg|.jpeg|.gif|.png|.gifv|.mp4|.webm)$";
private static final String REGEX_IMGUR_USER_CALLOUT = "@\\w+";
private static final String REGEX_IMAGE_URL_QUERY = "([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://\\S+(.jpg|.jpeg|.gif|.png)\\?\\w+$";
private static final String REGEX_IMGUR_PHOTO_PNG = "([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://(m.imgur.com/|imgur.com/|i.imgur.com/)\\w+\\.png$";
private static final String REGEX_IMGUR_TOPIC = "^([hH][tT][tT][pP]|[hH][tT][tT][pP][sS])://" +
"(m.imgur.com|imgur.com|i.imgur.com)/topic/.+";
// Patterns used to extract Imgur meta data from Urls
private static final Pattern ID_PATTERN = Pattern.compile("(?<=.com/)\\w+$");
private static final Pattern USER_PATTERN = Pattern.compile("(?<=/user/)(?!=/)\\w+");
private static final Pattern GALLERY_ID_PATTERN = Pattern.compile("(?<=/gallery/)(?!=/)\\w+");
private static final Pattern ALBUM_ID_PATTERN = Pattern.compile("(?<=/a/)(?!=/)\\w+");
private static final Pattern HTTP_PATTERN = Pattern.compile("^http:");
public static final Pattern USER_CALLOUT_PATTERN = Pattern.compile("@\\w+");
public static final Pattern TOPIC_PATTERN = Pattern.compile("(?<=/topic/)\\w+/\\w+$");
public enum LinkMatch {
IMAGE_URL,
IMAGE,
GALLERY,
USER,
ALBUM,
DIRECT_LINK,
USER_CALLOUT,
IMAGE_URL_QUERY,
TOPIC,
NONE
}
/**
* Find the type of imgur link that belongs to the url
*
* @param url
* @return
*/
public static LinkMatch findImgurLinkMatch(String url) {
LinkMatch match = LinkMatch.NONE;
if (!TextUtils.isEmpty(url)) {
if (url.matches(REGEX_IMGUR_DIRECT_LINK)) {
match = LinkMatch.DIRECT_LINK;
} else if (url.matches(REGEX_IMAGE_URL)) {
match = LinkMatch.IMAGE_URL;
} else if (url.matches(REGEX_IMGUR_IMAGE)) {
match = LinkMatch.IMAGE;
} else if (url.matches(REGEX_IMGUR_GALLERY)) {
match = LinkMatch.GALLERY;
} else if (url.matches(REGEX_IMGUR_USER)) {
match = LinkMatch.USER;
} else if (url.matches(REGEX_IMGUR_ALBUM)) {
match = LinkMatch.ALBUM;
} else if (url.matches(REGEX_IMGUR_USER_CALLOUT)) {
match = LinkMatch.USER_CALLOUT;
} else if (url.matches(REGEX_IMAGE_URL_QUERY)) {
match = LinkMatch.IMAGE_URL_QUERY;
} else if (url.matches(REGEX_IMGUR_IMAGE_QUERY)) {
match = LinkMatch.IMAGE_URL_QUERY;
} else if (url.matches(REGEX_IMGUR_TOPIC)) {
match = LinkMatch.TOPIC;
}
}
return match;
}
/**
* Extracts the ID of an image from a URL. This will not work for album links (/a/abcde)
*
* @param url The url of the image
* @return The id of the image, or null if not found
*/
@Nullable
public static String getId(@Nullable String url) {
if (TextUtils.isEmpty(url)) {
return null;
}
Matcher match = ID_PATTERN.matcher(url);
if (match.find()) {
String id = match.group(0);
LogUtil.v(TAG, "Id " + id + " extracted from url " + url);
return id;
}
return null;
}
/**
* Returns a username from a given url
*
* @param url
* @return
*/
@Nullable
public static String getUsername(@Nullable String url) {
if (TextUtils.isEmpty(url)) return null;
Matcher match = USER_PATTERN.matcher(url);
if (match.find()) {
String username = match.group();
LogUtil.v(TAG, "Username " + username + " extracted from url " + url);
return username;
}
return null;
}
/**
* Returns a gallery id from a given url
*
* @param url
* @return
*/
@Nullable
public static String getGalleryId(@Nullable String url) {
if (TextUtils.isEmpty(url)) return null;
Matcher match = GALLERY_ID_PATTERN.matcher(url);
if (match.find()) {
String id = match.group();
LogUtil.v(TAG, "Gallery Id " + id + " extracted from url " + url);
return id;
}
return null;
}
/**
* Returns an album id from a given url
*
* @param url
* @return
*/
@Nullable
public static String getAlbumId(@Nullable String url) {
if (TextUtils.isEmpty(url)) return null;
Matcher match = ALBUM_ID_PATTERN.matcher(url);
if (match.find()) {
String id = match.group();
LogUtil.v(TAG, "Album Id " + id + " extracted from url " + url);
return id;
}
return null;
}
/**
* Returns the Image Type based on the url
*
* @param url
* @return
*/
public static String getImageType(@Nullable String url) {
if (TextUtils.isEmpty(url)) return null;
url = url.toLowerCase();
if (url.endsWith("jpeg") || url.endsWith("jpg")) {
return ImgurPhoto.IMAGE_TYPE_JPEG;
} else if (url.endsWith("gif")) {
return ImgurPhoto.IMAGE_TYPE_GIF;
}
return ImgurPhoto.IMAGE_TYPE_PNG;
}
/**
* Returns the gallery id from a given topic url
*
* @param url
* @return
*/
public static String getTopicGalleryId(@Nullable String url) {
if (TextUtils.isEmpty(url)) return null;
Matcher match = TOPIC_PATTERN.matcher(url);
if (match.find()) {
String found = match.group();
if (!TextUtils.isEmpty(found) && found.contains("/")) {
String[] split = found.split("/");
String id = split[1];
LogUtil.v(TAG, "Topic Gallery Id " + id + " extracted from url " + url);
return id;
}
}
return null;
}
/**
* Returns if the link is a video
*
* @param url
* @return
*/
public static boolean isVideoLink(String url) {
if (TextUtils.isEmpty(url)) return false;
url = url.toLowerCase();
return url.endsWith(".gifv") || url.endsWith("mp4") || url.endsWith(".webm");
}
/**
* Returns if the url link is animated (gif/gifv/webm)
*
* @param url
* @return
*/
public static boolean isLinkAnimated(@Nullable String url) {
if (!TextUtils.isEmpty(url)) {
url = url.toLowerCase();
return url.endsWith(".gif") || isVideoLink(url);
}
return false;
}
/**
* Returns if the link is a png photo hosted on Imgur
*
* @param url
* @return
*/
public static boolean isImgurPNG(@Nullable String url) {
if (TextUtils.isEmpty(url)) return false;
return url.matches(REGEX_IMGUR_PHOTO_PNG);
}
/**
* Returns if the given url is a direct link to an image
*
* @param url
* @return
*/
public static boolean isDirectImageLink(@Nullable String url) {
if (!TextUtils.isEmpty(url)) {
url = url.toLowerCase();
return url.endsWith(".jpg") || url.endsWith(".jpeg") || url.endsWith("png") || isLinkAnimated(url);
}
return false;
}
/**
* Returns if a link is http scheme
*
* @param url
* @return
*/
public static boolean isHttpLink(@Nullable String url) {
if (TextUtils.isEmpty(url)) return false;
Matcher match = HTTP_PATTERN.matcher(url);
return match.find();
}
}