Austin Huang
4 years ago
No known key found for this signature in database
GPG Key ID: 84C23AA04587A91F
3 changed files with 0 additions and 414 deletions
-
140app/src/main/java/awais/instagrabber/asyncs/i/iLikedFetcher.java
-
205app/src/main/java/awais/instagrabber/asyncs/i/iPostFetcher.java
-
69app/src/main/java/awais/instagrabber/asyncs/i/iTopicFetcher.java
@ -1,140 +0,0 @@ |
|||
package awais.instagrabber.asyncs.i; |
|||
|
|||
import android.os.AsyncTask; |
|||
import android.os.Environment; |
|||
import android.util.Log; |
|||
|
|||
import org.json.JSONArray; |
|||
import org.json.JSONObject; |
|||
|
|||
import java.io.File; |
|||
import java.net.HttpURLConnection; |
|||
import java.net.URL; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
import awais.instagrabber.BuildConfig; |
|||
import awais.instagrabber.interfaces.FetchListener; |
|||
import awais.instagrabber.models.PostModel; |
|||
import awais.instagrabber.models.enums.MediaItemType; |
|||
import awais.instagrabber.utils.Constants; |
|||
import awais.instagrabber.utils.DownloadUtils; |
|||
import awais.instagrabber.utils.NetworkUtils; |
|||
import awais.instagrabber.utils.ResponseBodyUtils; |
|||
import awais.instagrabber.utils.TextUtils; |
|||
import awais.instagrabber.utils.Utils; |
|||
import awaisomereport.LogCollector; |
|||
|
|||
import static awais.instagrabber.utils.Constants.DOWNLOAD_USER_FOLDER; |
|||
import static awais.instagrabber.utils.Constants.FOLDER_PATH; |
|||
import static awais.instagrabber.utils.Constants.FOLDER_SAVE_TO; |
|||
import static awais.instagrabber.utils.Utils.logCollector; |
|||
|
|||
public final class iLikedFetcher extends AsyncTask<Void, Void, List<PostModel>> { |
|||
private static final String TAG = "iLikedFetcher"; |
|||
|
|||
private final String endCursor; |
|||
private final FetchListener<List<PostModel>> fetchListener; |
|||
|
|||
public iLikedFetcher(final FetchListener<List<PostModel>> fetchListener) { |
|||
this.endCursor = ""; |
|||
this.fetchListener = fetchListener; |
|||
} |
|||
|
|||
public iLikedFetcher(final String endCursor, final FetchListener<List<PostModel>> fetchListener) { |
|||
this.endCursor = endCursor == null ? "" : endCursor; |
|||
this.fetchListener = fetchListener; |
|||
} |
|||
|
|||
@Override |
|||
protected List<PostModel> doInBackground(final Void... voids) { |
|||
final String url = "https://i.instagram.com/api/v1/feed/liked/?max_id=" + endCursor; |
|||
|
|||
List<PostModel> result = new ArrayList<>(); |
|||
try { |
|||
final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); |
|||
conn.setUseCaches(false); |
|||
conn.setRequestProperty("User-Agent", Constants.I_USER_AGENT); |
|||
conn.connect(); |
|||
|
|||
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { |
|||
final JSONObject body = new JSONObject(NetworkUtils.readFromConnection(conn)); |
|||
|
|||
final String endCursor; |
|||
final boolean hasNextPage; |
|||
|
|||
if (body.has("more_available")) { |
|||
hasNextPage = body.optBoolean("more_available"); |
|||
endCursor = hasNextPage ? body.optString("next_max_id") : null; |
|||
} else { |
|||
hasNextPage = false; |
|||
endCursor = null; |
|||
} |
|||
|
|||
final JSONArray edges = body.getJSONArray("items"); |
|||
for (int i = 0; i < edges.length(); ++i) { |
|||
final JSONObject mediaNode = edges.getJSONObject(i); |
|||
|
|||
final boolean isSlider = mediaNode.has("carousel_media_count"); |
|||
final boolean isVideo = mediaNode.has("video_duration"); |
|||
|
|||
final MediaItemType itemType; |
|||
if (isSlider) itemType = MediaItemType.MEDIA_TYPE_SLIDER; |
|||
else if (isVideo) itemType = MediaItemType.MEDIA_TYPE_VIDEO; |
|||
else itemType = MediaItemType.MEDIA_TYPE_IMAGE; |
|||
|
|||
final PostModel model = new PostModel( |
|||
itemType, |
|||
mediaNode.getString(Constants.EXTRAS_ID), |
|||
isSlider ? ResponseBodyUtils.getHighQualityImage(mediaNode.getJSONArray("carousel_media") |
|||
.getJSONObject(0)) |
|||
: ResponseBodyUtils.getHighQualityImage(mediaNode), |
|||
isSlider ? ResponseBodyUtils.getLowQualityImage(mediaNode.getJSONArray("carousel_media") |
|||
.getJSONObject(0)) |
|||
: ResponseBodyUtils.getLowQualityImage(mediaNode), |
|||
mediaNode.getString("code"), |
|||
mediaNode.isNull("caption") ? null : mediaNode.getJSONObject("caption").optString("text"), |
|||
mediaNode.getLong("taken_at"), |
|||
true, |
|||
mediaNode.optBoolean("has_viewer_saved") |
|||
// , mediaNode.getLong("like_count") |
|||
); |
|||
result.add(model); |
|||
String username = mediaNode.getJSONObject("user").getString("username"); |
|||
final File downloadDir = new File(Environment.getExternalStorageDirectory(), "Download" + |
|||
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER) ? ("/" + username) : "")); |
|||
File customDir = null; |
|||
if (Utils.settingsHelper.getBoolean(FOLDER_SAVE_TO)) { |
|||
final String customPath = Utils.settingsHelper.getString(FOLDER_PATH + |
|||
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER) |
|||
? ("/" + username) |
|||
: "")); |
|||
if (!TextUtils.isEmpty(customPath)) customDir = new File(customPath); |
|||
} |
|||
DownloadUtils.checkExistence(downloadDir, customDir, isSlider, model); |
|||
} |
|||
|
|||
final int length = result.size(); |
|||
if (length >= 1 && result.get(length - 1) != null) { |
|||
result.get(length - 1).setPageCursor(hasNextPage, endCursor); |
|||
} |
|||
} |
|||
|
|||
conn.disconnect(); |
|||
} catch (Exception e) { |
|||
if (logCollector != null) { |
|||
logCollector.appendException(e, LogCollector.LogFile.ASYNC_MAIN_POSTS_FETCHER, "doInBackground"); |
|||
} |
|||
if (BuildConfig.DEBUG) { |
|||
Log.e(TAG, "", e); |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
@Override |
|||
protected void onPostExecute(final List<PostModel> postModels) { |
|||
if (fetchListener != null) fetchListener.onResult(postModels); |
|||
} |
|||
} |
@ -1,205 +0,0 @@ |
|||
package awais.instagrabber.asyncs.i; |
|||
|
|||
import android.os.AsyncTask; |
|||
import android.os.Environment; |
|||
import android.util.Log; |
|||
|
|||
import org.json.JSONArray; |
|||
import org.json.JSONObject; |
|||
|
|||
import java.io.File; |
|||
import java.net.HttpURLConnection; |
|||
import java.net.URL; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
import awais.instagrabber.BuildConfig; |
|||
import awais.instagrabber.interfaces.FetchListener; |
|||
import awais.instagrabber.models.FeedModel; |
|||
import awais.instagrabber.models.PostChild; |
|||
import awais.instagrabber.models.ProfileModel; |
|||
import awais.instagrabber.models.enums.MediaItemType; |
|||
import awais.instagrabber.utils.Constants; |
|||
import awais.instagrabber.utils.NetworkUtils; |
|||
import awais.instagrabber.utils.ResponseBodyUtils; |
|||
import awais.instagrabber.utils.TextUtils; |
|||
import awais.instagrabber.utils.Utils; |
|||
import awaisomereport.LogCollector; |
|||
|
|||
import static awais.instagrabber.utils.Constants.DOWNLOAD_USER_FOLDER; |
|||
import static awais.instagrabber.utils.Constants.FOLDER_PATH; |
|||
import static awais.instagrabber.utils.Constants.FOLDER_SAVE_TO; |
|||
import static awais.instagrabber.utils.Utils.logCollector; |
|||
|
|||
public final class iPostFetcher extends AsyncTask<Void, Void, FeedModel> { |
|||
private static final String TAG = "iPostFetcher"; |
|||
|
|||
private final String id; |
|||
private final FetchListener<FeedModel> fetchListener; |
|||
|
|||
public iPostFetcher(final String id, final FetchListener<FeedModel> fetchListener) { |
|||
this.id = id; |
|||
this.fetchListener = fetchListener; |
|||
} |
|||
|
|||
@Override |
|||
protected FeedModel doInBackground(final Void... voids) { |
|||
HttpURLConnection conn = null; |
|||
try { |
|||
conn = (HttpURLConnection) new URL("https://i.instagram.com/api/v1/media/" + id + "/info").openConnection(); |
|||
conn.setUseCaches(false); |
|||
conn.setRequestProperty("User-Agent", Constants.USER_AGENT); |
|||
conn.connect(); |
|||
|
|||
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { |
|||
final JSONObject media = new JSONObject(NetworkUtils.readFromConnection(conn)) |
|||
.getJSONArray("items") |
|||
.getJSONObject(0); |
|||
ProfileModel profileModel = null; |
|||
if (media.has("user")) { |
|||
final JSONObject user = media.getJSONObject("user"); |
|||
final JSONObject friendshipStatus = user.optJSONObject("friendship_status"); |
|||
boolean following = false; |
|||
boolean isRestricted = false; |
|||
boolean outgoingRequest = false; |
|||
if (friendshipStatus != null) { |
|||
following = friendshipStatus.optBoolean("following"); |
|||
isRestricted = friendshipStatus.optBoolean("is_restricted"); |
|||
outgoingRequest = friendshipStatus.optBoolean("outgoing_request"); |
|||
} |
|||
profileModel = new ProfileModel( |
|||
user.optBoolean("is_private"), |
|||
user.optBoolean("is_private"), |
|||
user.optBoolean("is_verified"), |
|||
user.optString("pk"), |
|||
user.getString(Constants.EXTRAS_USERNAME), |
|||
user.optString("fullname"), |
|||
null, |
|||
null, |
|||
user.getString("profile_pic_url"), |
|||
null, |
|||
-1, |
|||
-1, |
|||
-1, |
|||
following, |
|||
isRestricted, |
|||
false, |
|||
outgoingRequest |
|||
); |
|||
} |
|||
if (profileModel == null) { |
|||
return new FeedModel.Builder().build(); |
|||
} |
|||
|
|||
// to check if file exists |
|||
final boolean shouldDownloadToUserFolder = Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER); |
|||
final File downloadDir = new File( |
|||
Environment.getExternalStorageDirectory(), |
|||
"Download" + (shouldDownloadToUserFolder ? "/" + profileModel.getUsername() : "")); |
|||
File customDir = null; |
|||
if (Utils.settingsHelper.getBoolean(FOLDER_SAVE_TO)) { |
|||
final String customPath = Utils.settingsHelper.getString(FOLDER_PATH) |
|||
+ (shouldDownloadToUserFolder ? "/" + profileModel.getUsername() : ""); |
|||
if (!TextUtils.isEmpty(customPath)) customDir = new File(customPath); |
|||
} |
|||
|
|||
final long timestamp = media.getLong("taken_at"); |
|||
|
|||
final boolean isVideo = media.has("has_audio") && media.optBoolean("has_audio"); |
|||
final boolean isSlider = !media.isNull("carousel_media_count"); |
|||
|
|||
final MediaItemType mediaItemType; |
|||
if (isSlider) mediaItemType = MediaItemType.MEDIA_TYPE_SLIDER; |
|||
else if (isVideo) mediaItemType = MediaItemType.MEDIA_TYPE_VIDEO; |
|||
else mediaItemType = MediaItemType.MEDIA_TYPE_IMAGE; |
|||
|
|||
final String postCaption; |
|||
final JSONObject mediaToCaption = media.optJSONObject("caption"); |
|||
if (mediaToCaption == null) postCaption = null; |
|||
else postCaption = mediaToCaption.optString("text"); |
|||
|
|||
final long commentsCount = media.optLong("comment_count"); |
|||
|
|||
final JSONObject location = media.optJSONObject("location"); |
|||
String locationId = null; |
|||
String locationName = null; |
|||
if (location != null) { |
|||
locationName = location.optString("name"); |
|||
if (location.has("id")) { |
|||
locationId = location.getString("id"); |
|||
} else if (location.has("pk")) { |
|||
locationId = location.getString("pk"); |
|||
} |
|||
} |
|||
// final String locationString = location.optString("id") + "/" + location.optString("slug"); |
|||
final FeedModel.Builder feedModelBuilder = new FeedModel.Builder() |
|||
.setItemType(mediaItemType) |
|||
.setPostId(media.getString(Constants.EXTRAS_ID)) |
|||
.setDisplayUrl(isVideo ? ResponseBodyUtils.getHighQualityPost(media.optJSONArray("video_versions"), true, true, false) |
|||
: ResponseBodyUtils.getHighQualityImage(media)) |
|||
.setShortCode(media.getString("code")) |
|||
.setPostCaption(TextUtils.isEmpty(postCaption) ? null : postCaption) |
|||
.setProfileModel(profileModel) |
|||
.setViewCount(isVideo && media.has("view_count") |
|||
? media.getLong("view_count") |
|||
: -1) |
|||
.setTimestamp(timestamp) |
|||
.setLiked(media.optBoolean("has_liked")) |
|||
.setBookmarked(media.optBoolean("has_viewer_saved")) |
|||
.setLikesCount(media.getLong("like_count")) |
|||
.setLocationName(locationName) |
|||
.setLocationId(locationId) |
|||
.setCommentsCount(commentsCount); |
|||
// DownloadUtils.checkExistence(downloadDir, customDir, false, postModel); |
|||
|
|||
if (isSlider) { |
|||
final JSONArray children = media.getJSONArray("carousel_media"); |
|||
final List<PostChild> postModels = new ArrayList<>(); |
|||
for (int i = 0; i < children.length(); ++i) { |
|||
final JSONObject childNode = children.getJSONObject(i); |
|||
final boolean isChildVideo = childNode.has("video_duration"); |
|||
postModels.add(new PostChild.Builder() |
|||
.setItemType(isChildVideo ? MediaItemType.MEDIA_TYPE_VIDEO |
|||
: MediaItemType.MEDIA_TYPE_IMAGE) |
|||
.setPostId(childNode.has(Constants.EXTRAS_ID) |
|||
? childNode.getString(Constants.EXTRAS_ID) |
|||
: media.getString(Constants.EXTRAS_ID)) |
|||
// .setShortCode(childNode.optString(Constants.EXTRAS_SHORTCODE)) |
|||
.setDisplayUrl( |
|||
isChildVideo ? ResponseBodyUtils.getHighQualityPost( |
|||
childNode.optJSONArray("video_versions"), true, true, false) |
|||
: ResponseBodyUtils.getHighQualityImage(childNode)) |
|||
.setVideoViews(isChildVideo && childNode.has("video_view_count") |
|||
? childNode.getLong("video_view_count") |
|||
: -1) |
|||
.build()); |
|||
// DownloadUtils.checkExistence(downloadDir, customDir, true, postModels[i]); |
|||
} |
|||
feedModelBuilder.setSliderItems(postModels); |
|||
} |
|||
return feedModelBuilder.build(); |
|||
} |
|||
} catch (Exception e) { |
|||
if (logCollector != null) |
|||
logCollector.appendException(e, LogCollector.LogFile.ASYNC_POST_FETCHER, "doInBackground (i)"); |
|||
if (BuildConfig.DEBUG) { |
|||
Log.e(TAG, "", e); |
|||
} |
|||
} finally { |
|||
if (conn != null) { |
|||
conn.disconnect(); |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
@Override |
|||
protected void onPreExecute() { |
|||
if (fetchListener != null) fetchListener.doBefore(); |
|||
} |
|||
|
|||
@Override |
|||
protected void onPostExecute(final FeedModel feedModel) { |
|||
if (fetchListener != null) fetchListener.onResult(feedModel); |
|||
} |
|||
} |
@ -1,69 +0,0 @@ |
|||
package awais.instagrabber.asyncs.i; |
|||
|
|||
import android.os.AsyncTask; |
|||
import android.util.Log; |
|||
|
|||
import org.json.JSONArray; |
|||
import org.json.JSONObject; |
|||
|
|||
import java.net.HttpURLConnection; |
|||
import java.net.URL; |
|||
|
|||
import awais.instagrabber.BuildConfig; |
|||
import awais.instagrabber.interfaces.FetchListener; |
|||
import awais.instagrabber.models.DiscoverTopicModel; |
|||
import awais.instagrabber.utils.Constants; |
|||
import awais.instagrabber.utils.LocaleUtils; |
|||
import awais.instagrabber.utils.NetworkUtils; |
|||
import awaisomereport.LogCollector; |
|||
|
|||
import static awais.instagrabber.utils.Utils.logCollector; |
|||
|
|||
public final class iTopicFetcher extends AsyncTask<Void, Void, DiscoverTopicModel> { |
|||
private final FetchListener<DiscoverTopicModel> fetchListener; |
|||
|
|||
public iTopicFetcher(final FetchListener<DiscoverTopicModel> fetchListener) { |
|||
this.fetchListener = fetchListener; |
|||
} |
|||
|
|||
@Override |
|||
protected DiscoverTopicModel doInBackground(final Void... voids) { |
|||
final String url = "https://i.instagram.com/api/v1/discover/topical_explore/"; |
|||
|
|||
DiscoverTopicModel result = null; |
|||
try { |
|||
final HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); |
|||
conn.setUseCaches(false); |
|||
conn.setRequestProperty("User-Agent", Constants.I_USER_AGENT); |
|||
conn.setRequestProperty("Accept-Language", LocaleUtils.getCurrentLocale().getLanguage() + ",en-US;q=0.8"); |
|||
conn.connect(); |
|||
|
|||
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { |
|||
final JSONObject body = new JSONObject(NetworkUtils.readFromConnection(conn)); |
|||
|
|||
final JSONArray edges = body.getJSONArray("clusters"); |
|||
String[] names = new String[edges.length()], ids = new String[edges.length()]; |
|||
for (int i = 0; i < names.length; ++i) { |
|||
final JSONObject mediaNode = edges.getJSONObject(i); |
|||
ids[i] = mediaNode.getString("id"); |
|||
names[i] = mediaNode.getString("title"); |
|||
} |
|||
|
|||
result = new DiscoverTopicModel(ids, names, body.getString("rank_token")); |
|||
} |
|||
|
|||
conn.disconnect(); |
|||
} catch (Exception e) { |
|||
if (logCollector != null) |
|||
logCollector.appendException(e, LogCollector.LogFile.ASYNC_DISCOVER_TOPICS_FETCHER, "doInBackground"); |
|||
if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e); |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
|
|||
@Override |
|||
protected void onPostExecute(final DiscoverTopicModel discoverTopicModel) { |
|||
if (fetchListener != null) fetchListener.onResult(discoverTopicModel); |
|||
} |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue