barinsta/app/src/main/java/awais/instagrabber/asyncs/DiscoverFetcher.java

201 lines
9.3 KiB
Java
Raw Normal View History

2020-07-01 19:08:28 +02:00
package awais.instagrabber.asyncs;
import android.os.AsyncTask;
import android.os.Environment;
import android.util.Log;
import android.util.Pair;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
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 awais.instagrabber.BuildConfig;
import awais.instagrabber.interfaces.FetchListener;
import awais.instagrabber.models.DiscoverItemModel;
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;
2020-07-01 19:08:28 +02:00
import awais.instagrabber.utils.Utils;
import awaisomereport.LogCollector;
2020-07-31 18:33:38 +02:00
import static awais.instagrabber.utils.Constants.DOWNLOAD_USER_FOLDER;
2020-07-01 19:08:28 +02:00
import static awais.instagrabber.utils.Constants.FOLDER_PATH;
import static awais.instagrabber.utils.Constants.FOLDER_SAVE_TO;
import static awais.instagrabber.utils.Utils.logCollector;
import static awais.instagrabber.utils.Utils.settingsHelper;
public final class DiscoverFetcher extends AsyncTask<Void, Void, DiscoverItemModel[]> {
2020-08-12 20:38:07 +02:00
private final String cluster, maxId, rankToken;
2020-07-01 19:08:28 +02:00
private final FetchListener<DiscoverItemModel[]> fetchListener;
private int lastId = 0;
private boolean isFirst, moreAvailable;
private String nextMaxId;
2020-08-12 20:38:07 +02:00
public DiscoverFetcher(final String cluster, final String maxId, final String rankToken,
2020-08-05 20:54:49 +02:00
final FetchListener<DiscoverItemModel[]> fetchListener, final boolean isFirst) {
this.cluster = cluster == null ? "explore_all%3A0" : cluster.replace(":", "%3A");
2020-07-01 19:08:28 +02:00
this.maxId = maxId == null ? "" : "&max_id=" + maxId;
2020-08-12 20:38:07 +02:00
this.rankToken = rankToken;
2020-07-01 19:08:28 +02:00
this.fetchListener = fetchListener;
this.isFirst = isFirst;
}
@Nullable
@Override
protected final DiscoverItemModel[] doInBackground(final Void... voids) {
DiscoverItemModel[] result = null;
2020-07-31 23:34:44 +02:00
final ArrayList<DiscoverItemModel> discoverItemModels = fetchItems(null, maxId);
2020-07-01 19:08:28 +02:00
if (discoverItemModels != null) {
result = discoverItemModels.toArray(new DiscoverItemModel[0]);
if (result.length > 0) {
final DiscoverItemModel lastModel = result[result.length - 1];
2020-08-05 20:54:49 +02:00
if (lastModel != null && nextMaxId != null) lastModel.setMore(moreAvailable, nextMaxId);
2020-07-01 19:08:28 +02:00
}
}
return result;
}
2020-07-31 23:34:44 +02:00
private ArrayList<DiscoverItemModel> fetchItems(ArrayList<DiscoverItemModel> discoverItemModels, final String maxId) {
2020-07-01 19:08:28 +02:00
try {
final String url = "https://www.instagram.com/explore/grid/?is_prefetch=false&omit_cover_media=true&module=explore_popular" +
"&use_sectional_payload=false&cluster_id=" + cluster + "&include_fixed_destinations=true&session_id=" + rankToken + maxId;
2020-07-01 19:08:28 +02:00
final HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection();
urlConnection.setUseCaches(false);
2020-08-12 20:38:07 +02:00
urlConnection.setRequestProperty("User-Agent", Constants.I_USER_AGENT);
2020-07-01 19:08:28 +02:00
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
final JSONObject discoverResponse = new JSONObject(NetworkUtils.readFromConnection(urlConnection));
2020-07-01 19:08:28 +02:00
moreAvailable = discoverResponse.getBoolean("more_available");
2020-08-05 20:54:49 +02:00
nextMaxId = discoverResponse.optString("next_max_id");
2020-07-01 19:08:28 +02:00
final JSONArray sectionalItems = discoverResponse.getJSONArray("sectional_items");
if (discoverItemModels == null) discoverItemModels = new ArrayList<>(sectionalItems.length() * 2);
for (int i = 0; i < sectionalItems.length(); ++i) {
final JSONObject sectionItem = sectionalItems.getJSONObject(i);
final String feedType = sectionItem.getString("feed_type");
final String layoutType = sectionItem.getString("layout_type");
if (sectionItem.has("layout_content") && feedType.equals("media")) {
final JSONObject layoutContent = sectionItem.getJSONObject("layout_content");
if ("media_grid".equals(layoutType)) {
final JSONArray medias = layoutContent.getJSONArray("medias");
for (int j = 0; j < medias.length(); ++j)
2020-07-31 23:34:44 +02:00
discoverItemModels.add(makeDiscoverModel(medias.getJSONObject(j).getJSONObject("media")));
2020-07-01 19:08:28 +02:00
} else {
final boolean isOneSide = "one_by_two_left".equals(layoutType);
if (isOneSide || "two_by_two_right".equals(layoutType)) {
final JSONObject layoutItem = layoutContent.getJSONObject(isOneSide ? "one_by_two_item" : "two_by_two_item");
if (layoutItem.has("media"))
2020-07-31 23:34:44 +02:00
discoverItemModels.add(makeDiscoverModel(layoutItem.getJSONObject("media")));
2020-07-01 19:08:28 +02:00
if (layoutContent.has("fill_items")) {
final JSONArray fillItems = layoutContent.getJSONArray("fill_items");
for (int j = 0; j < fillItems.length(); ++j)
2020-07-31 23:34:44 +02:00
discoverItemModels.add(makeDiscoverModel(fillItems.getJSONObject(j).getJSONObject("media")));
2020-07-01 19:08:28 +02:00
}
}
}
}
}
discoverItemModels.trimToSize();
urlConnection.disconnect();
// hack to fetch 50+ items
if (this.isFirst) {
final int size = discoverItemModels.size();
if (size > 50) this.isFirst = false;
2020-07-31 23:34:44 +02:00
discoverItemModels = fetchItems(discoverItemModels, "&max_id=" + (lastId++));
2020-07-01 19:08:28 +02:00
}
} else {
urlConnection.disconnect();
}
} catch (final Exception e) {
if (logCollector != null)
logCollector.appendException(e, LogCollector.LogFile.ASYNC_DISCOVER_FETCHER, "fetchItems",
new Pair<>("maxId", maxId),
new Pair<>("lastId", lastId),
new Pair<>("isFirst", isFirst),
new Pair<>("nextMaxId", nextMaxId));
2020-07-01 19:08:28 +02:00
if (BuildConfig.DEBUG) Log.e("AWAISKING_APP", "", e);
}
return discoverItemModels;
}
@NonNull
2020-07-31 23:34:44 +02:00
private DiscoverItemModel makeDiscoverModel(@NonNull final JSONObject media) throws Exception {
2020-07-01 19:08:28 +02:00
final JSONObject user = media.getJSONObject(Constants.EXTRAS_USER);
final String username = user.getString(Constants.EXTRAS_USERNAME);
// final ProfileModel userProfileModel = new ProfileModel(user.getBoolean("is_private"),
// user.getBoolean("is_verified"),
// String.valueOf(user.get("pk")),
// username,
// user.getString("full_name"),
// null,
// user.getString("profile_pic_url"), null,
// 0, 0, 0);
// final String comment;
// if (!media.has("caption")) comment = null;
// else {
// final Object caption = media.get("caption");
// comment = caption instanceof JSONObject ? ((JSONObject) caption).getString("text") : null;
// }
final MediaItemType mediaType = ResponseBodyUtils.getMediaItemType(media.getInt("media_type"));
2020-07-01 19:08:28 +02:00
final DiscoverItemModel model = new DiscoverItemModel(mediaType,
media.getString("pk"),
media.getString("code"),
ResponseBodyUtils.getThumbnailUrl(media, mediaType));
2020-07-01 19:08:28 +02:00
2020-07-31 18:33:38 +02:00
final File downloadDir = new File(Environment.getExternalStorageDirectory(), "Download" +
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER) ? ("/" + username) : ""));
2020-07-31 18:33:38 +02:00
2020-07-31 23:34:44 +02:00
// to check if file exists
File customDir = null;
if (settingsHelper.getBoolean(FOLDER_SAVE_TO)) {
final String customPath = settingsHelper.getString(FOLDER_PATH);
if (!TextUtils.isEmpty(customPath)) customDir = new File(customPath +
(Utils.settingsHelper.getBoolean(DOWNLOAD_USER_FOLDER)
? "/" + username
: ""));
2020-07-31 23:34:44 +02:00
}
DownloadUtils.checkExistence(downloadDir, customDir, mediaType == MediaItemType.MEDIA_TYPE_SLIDER, model);
2020-07-01 19:08:28 +02:00
return model;
}
@Override
protected void onPreExecute() {
if (fetchListener != null) fetchListener.doBefore();
}
@Override
protected void onPostExecute(final DiscoverItemModel[] discoverItemModels) {
if (fetchListener != null) fetchListener.onResult(discoverItemModels);
}
}