/*
* Copyright (C) 2013 Chris Lacy
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package org.tweetalib.android.model;
import android.net.Uri;
import org.json.JSONException;
import org.json.JSONObject;
import twitter4j.DirectMessage;
import twitter4j.MediaEntity;
import twitter4j.Status;
import twitter4j.URLEntity;
public class TwitterMediaEntity {
// https://dev.twitter.com/docs/tweet-entities
/*
*
*/
public enum Source {
TWITTER, INSTAGRAM, TWITPIC, LOCKERZ, // Note that Plixi and Lockerz use
// the same API, so
// Plixi is treated as Lockerz
YFROG, IMGUR, YOUTUBE,
}
/*
*
*/
public enum Size {
THUMB, SMALL, MEDIUM, LARGE,
}
/*
*
*/
public static TwitterMediaEntity createFromString(String jsonString) {
try {
return new TwitterMediaEntity(jsonString);
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/*
*
*/
public static TwitterMediaEntity createMediaEntity(Status status) {
MediaEntity[] mediaEntities;
URLEntity[] urlEntities;
if (status.isRetweet()) {
mediaEntities = status.getRetweetedStatus().getMediaEntities();
urlEntities = status.getRetweetedStatus().getURLEntities();
} else {
mediaEntities = status.getMediaEntities();
urlEntities = status.getURLEntities();
}
if (mediaEntities != null && mediaEntities.length > 0) {
return new TwitterMediaEntity(mediaEntities[0]);
} else if (urlEntities != null) {
for (URLEntity urlEntity : urlEntities) {
// This shouldn't be necessary, but is
String expandedUrl = urlEntity.getExpandedURL();
if (expandedUrl == null) {
continue;
}
TwitterMediaEntity entity = getTwitterMediaEntityFromUrl(
urlEntity.getURL(), urlEntity.getExpandedURL());
if (entity != null) {
return entity;
}
}
}
return null;
}
public static TwitterMediaEntity createMediaEntity(DirectMessage status) {
MediaEntity[] mediaEntities;
URLEntity[] urlEntities;
mediaEntities = status.getMediaEntities();
urlEntities = status.getURLEntities();
if (mediaEntities != null && mediaEntities.length > 0) {
return new TwitterMediaEntity(mediaEntities[0]);
} else if (urlEntities != null) {
for (URLEntity urlEntity : urlEntities) {
// This shouldn't be necessary, but is
String expandedUrl = urlEntity.getExpandedURL();
if (expandedUrl == null) {
continue;
}
TwitterMediaEntity entity = getTwitterMediaEntityFromUrl(
urlEntity.getURL(), urlEntity.getExpandedURL());
if (entity != null) {
return entity;
}
}
}
return null;
}
private static TwitterMediaEntity getTwitterMediaEntityFromUrl(
String tinyUrl, String expandedUrl) {
String mediaUrl = getInstagramMediaUrl(expandedUrl);
if (mediaUrl != null) {
return new TwitterMediaEntity(Source.INSTAGRAM, mediaUrl, tinyUrl,
expandedUrl);
}
mediaUrl = getTwitpicMediaUrl(expandedUrl);
if (mediaUrl != null) {
return new TwitterMediaEntity(Source.TWITPIC, mediaUrl, tinyUrl,
expandedUrl);
}
mediaUrl = getLockerzMediaUrl(expandedUrl);
if (mediaUrl != null) {
return new TwitterMediaEntity(Source.LOCKERZ, mediaUrl, tinyUrl,
expandedUrl);
}
mediaUrl = getYfrogMediaUrl(expandedUrl);
if (mediaUrl != null) {
return new TwitterMediaEntity(Source.YFROG, mediaUrl, tinyUrl,
expandedUrl);
}
mediaUrl = getImgurUrl(expandedUrl);
if (mediaUrl != null) {
return new TwitterMediaEntity(Source.IMGUR, mediaUrl, tinyUrl,
expandedUrl);
}
mediaUrl = getYouTubeUrl(expandedUrl);
if (mediaUrl != null) {
return new TwitterMediaEntity(Source.YOUTUBE, mediaUrl, tinyUrl,
expandedUrl);
}
return null;
}
/*
*
*/
private static String getInstagramMediaUrl(String url) {
String lowerCaseUrl = url.toLowerCase();
if (lowerCaseUrl.indexOf("://instagr.am/p/") > -1) {
String instagramMatch = "://instagr.am/p/";
int startIndex = lowerCaseUrl.indexOf(instagramMatch);
if (startIndex > -1) {
startIndex += instagramMatch.length();
int endIndex = lowerCaseUrl.indexOf("/", startIndex);
if (endIndex > -1) {
String code = url.substring(startIndex, endIndex);
return "http://instagr.am/p/" + code + "/media/";
}
}
}
if (lowerCaseUrl.indexOf("://instagram.com/p/") > -1) {
String instagramMatch = "://instagram.com/p/";
int startIndex = lowerCaseUrl.indexOf(instagramMatch);
if (startIndex > -1) {
startIndex += instagramMatch.length();
int endIndex = lowerCaseUrl.indexOf("/", startIndex);
if (endIndex > -1) {
String code = url.substring(startIndex, endIndex);
return "http://instagram.com/p/" + code + "/media/";
}
}
}
return null;
}
/*
*
*/
private static String getTwitpicMediaUrl(String url) {
String lowerCaseUrl = url.toLowerCase();
String match = "://twitpic.com/";
int startIndex = lowerCaseUrl.indexOf(match);
if (startIndex > -1) {
startIndex += match.length();
return url.substring(startIndex);
}
return null;
}
/*
*
*/
private static String getLockerzMediaUrl(String url) {
String lowerCaseUrl = url.toLowerCase();
if (lowerCaseUrl.indexOf("://lockerz.com/") > -1) {
return "http://api.plixi.com/api/tpapi.svc/imagefromurl?url=" + url;
}
if (lowerCaseUrl.indexOf("://plixi.com/") > -1) {
return "http://api.plixi.com/api/tpapi.svc/imagefromurl?url=" + url;
}
return null;
}
/*
*
*/
private static String getImgurUrl(String url) {
String lowerCaseUrl = url.toLowerCase();
String match = "imgur.com/";
int startIndex = lowerCaseUrl.indexOf(match);
if (startIndex > -1) {
String code = url.substring(startIndex + match.length());
return code.replace(".png", "").replace(".gif", "")
.replace(".jpg", "");
}
return null;
}
/*
*
*/
private static String getYfrogMediaUrl(String url) {
String lowerCaseUrl = url.toLowerCase();
if (lowerCaseUrl.indexOf("://yfrog.com/") > -1) {
return url;
}
return null;
}
/*
*
*/
private static String getYouTubeUrl(String url) {
String lowerCaseUrl = url.toLowerCase();
if (lowerCaseUrl.indexOf("youtube.com/watch?") > -1) {
Uri uri = Uri.parse(url);
String videoId = uri.getQueryParameter("v");
if (videoId != null) {
return videoId;
}
}
String prefix = "youtu.be/";
int startIndex = lowerCaseUrl.indexOf(prefix);
if (startIndex > -1) {
startIndex += prefix.length();
int endIndex = lowerCaseUrl.indexOf('?', startIndex);
if (endIndex > -1) {
return url.substring(startIndex, endIndex);
} else {
return url.substring(startIndex);
}
}
return null;
}
/*
*
*/
private TwitterMediaEntity(Source source, String mediaCode, String url,
String expandedUrl) {
mSource = source;
mMediaCode = mediaCode;
mUrl = url;
mExpandedUrl = expandedUrl;
}
/*
*
*/
private TwitterMediaEntity(MediaEntity mediaEntity) {
mSource = Source.TWITTER;
mMediaCode = mediaEntity.getMediaURL();
mUrl = mediaEntity.getURL();
mExpandedUrl = mediaEntity.getExpandedURL();
/*
* mSizeThumb = new
* SizeInfo(mediaEntity.getSizes().get(MediaEntity.Size.THUMB));
* mSizeSmall = new
* SizeInfo(mediaEntity.getSizes().get(MediaEntity.Size.SMALL));
* mSizeMedium = new
* SizeInfo(mediaEntity.getSizes().get(MediaEntity.Size.MEDIUM));
* mSizeLarge = new
* SizeInfo(mediaEntity.getSizes().get(MediaEntity.Size.LARGE));
*/
}
/*
*
*/
private TwitterMediaEntity(String jsonAsString) throws JSONException {
JSONObject object = new JSONObject(jsonAsString);
mSource = Source.valueOf(object.getString(KEY_SOURCE));
mMediaCode = object.getString(KEY_MEDIA_CODE);
mUrl = object.getString(KEY_URL);
mExpandedUrl = object.getString(KEY_EXPANDED_URL);
}
public TwitterMediaEntity(TwitterMediaEntity other) {
mSource = other.mSource;
mMediaCode = other.mMediaCode;
mUrl = other.mUrl;
mExpandedUrl = other.mExpandedUrl;
}
/*
*
*/
public String toString() {
JSONObject object = new JSONObject();
try {
object.put(KEY_SOURCE, mSource.toString());
object.put(KEY_MEDIA_CODE, mMediaCode);
object.put(KEY_URL, mUrl);
object.put(KEY_EXPANDED_URL, mExpandedUrl);
} catch (JSONException e) {
e.printStackTrace();
}
return object.toString();
}
public String getExpandedUrl() {
return mExpandedUrl;
}
public Source getSource() {
return mSource;
}
/*
*
*/
public String getMediaUrl(Size size) {
switch (mSource) {
case TWITTER:
switch (size) {
case THUMB:
return mMediaCode + ":thumb";
case SMALL:
return mMediaCode + ":small";
case MEDIUM:
return mMediaCode + ":medium";
case LARGE:
return mMediaCode + ":large";
}
break;
case INSTAGRAM:
switch (size) {
case THUMB:
return mMediaCode + "?size=t";
case SMALL:
return mMediaCode + "?size=t";
case MEDIUM:
return mMediaCode + "?size=m";
case LARGE:
return mMediaCode + "?size=l";
}
break;
case TWITPIC:
switch (size) {
case THUMB:
return "http://twitpic.com/show/mini/" + mMediaCode;
case SMALL:
return "http://twitpic.com/show/thumb/" + mMediaCode;
case MEDIUM:
return "http://twitpic.com/show/thumb/" + mMediaCode;
case LARGE:
return "http://twitpic.com/show/full/" + mMediaCode;
}
break;
case LOCKERZ:
switch (size) {
case THUMB:
return mMediaCode + "&size=thumbnail";
case SMALL:
return mMediaCode + "&size=small";
case MEDIUM:
return mMediaCode + "&size=medium";
case LARGE:
return mMediaCode + "&size=big";
}
case YFROG:
switch (size) {
// http://yfrog.com/page/api#a5
case THUMB:
return mMediaCode + ":small";
case SMALL:
return mMediaCode + ":small";
case MEDIUM:
return mMediaCode + ":iphone";
case LARGE:
return mMediaCode + ":medium";
}
case IMGUR:
switch (size) {
// http://webapps.stackexchange.com/a/16104
case THUMB:
return "http://i.imgur.com/" + mMediaCode + "s.png";
case SMALL:
return "http://i.imgur.com/" + mMediaCode + "b.png";
case MEDIUM:
return "http://i.imgur.com/" + mMediaCode + "m.png";
case LARGE:
return "http://i.imgur.com/" + mMediaCode + ".png";
}
case YOUTUBE: {
switch (size) {
case THUMB:
case SMALL:
return "http://img.youtube.com/vi/" + mMediaCode
+ "/default.jpg";
case MEDIUM:
return "http://img.youtube.com/vi/" + mMediaCode
+ "/mqdefault.jpg";
case LARGE:
return "http://img.youtube.com/vi/" + mMediaCode
+ "/hqdefault.jpg";
}
}
}
return null;
}
/*
*
*/
private Source mSource;
private String mMediaCode;
private String mUrl;
private String mExpandedUrl;
/*
*
*/
private final String KEY_SOURCE = "mSource";
private final String KEY_MEDIA_CODE = "mMediaCode";
private final String KEY_URL = "mUrl";
private final String KEY_EXPANDED_URL = "mExpandedUrl";
/*
*
*/
/*
* public class SizeInfo {
*
* public SizeInfo(MediaEntity.Size size) { mWidth = size.getWidth();
* mHeight = size.getHeight(); }
*
* public int getWidth() { return mWidth; } public int getHeight() { return
* mHeight; }
*
* int mWidth; int mHeight; }
*
* public SizeInfo getSize(Size size) { switch (size) { case THUMB: return
* mSizeThumb; case SMALL: return mSizeSmall; case MEDIUM: return
* mSizeMedium; case LARGE: return mSizeLarge; }
*
* return mSizeThumb; }
*
* private SizeInfo mSizeThumb; private SizeInfo mSizeSmall; private
* SizeInfo mSizeMedium; private SizeInfo mSizeLarge;
*/
}