Merge pull request #1201 from tcely/issue-1178

Use Uri.parse for IntentUtils.parseUrl
This commit is contained in:
Austin Huang 2021-05-19 17:01:10 -04:00 committed by GitHub
commit a812161185
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,78 +1,61 @@
package awais.instagrabber.utils; package awais.instagrabber.utils;
import android.net.Uri;
import android.text.TextUtils; import android.text.TextUtils;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import java.util.List;
import awais.instagrabber.models.IntentModel; import awais.instagrabber.models.IntentModel;
import awais.instagrabber.models.enums.IntentModelType; import awais.instagrabber.models.enums.IntentModelType;
public final class IntentUtils { public final class IntentUtils {
@Nullable @Nullable
public static IntentModel parseUrl(@NonNull String url) { public static IntentModel parseUrl(@NonNull final String url) {
if (url.contains("instagr.am/")) { final Uri parsedUrl = Uri.parse(url).normalizeScheme();
url = url.replaceFirst("s?://(?:www\\.)?instagr\\.am/", "s://www.instagram.com/");
}
final int wwwDel = url.contains("www.") ? 4 : 0;
final boolean isHttps = url.startsWith("https");
// final String domain = parsedUrl.getHost().replaceFirst("^www\\.", "");
// final boolean isHttpsUri = "https".equals(parsedUrl.getScheme());
final List<String> paths = parsedUrl.getPathSegments();
if (paths.isEmpty()) {
return null;
}
String path = paths.get(0);
String text = null;
IntentModelType type = IntentModelType.UNKNOWN; IntentModelType type = IntentModelType.UNKNOWN;
if (url.contains("instagram.com/")) { if (1 == paths.size()) {
url = url.substring((isHttps ? 22 : 21) + wwwDel); text = path;
// final char firstChar = url.charAt(0);
if (url.startsWith("p/") || url.startsWith("reel/") || url.startsWith("tv/")) {
url = url.substring(url.startsWith("p/") ? 2 : (url.startsWith("tv/") ? 3 : 5));
type = IntentModelType.POST;
} else if (url.startsWith("explore/tags/")) {
url = url.substring(13);
type = IntentModelType.HASHTAG;
} else if (url.startsWith("explore/locations/")) {
url = url.substring(18);
type = IntentModelType.LOCATION;
} else if (url.startsWith("_u/")) { // usually exists in embeds
url = url.substring(3);
type = IntentModelType.USERNAME;
}
url = cleanString(url);
if (TextUtils.isEmpty(url)) return null;
else if (type == IntentModelType.UNKNOWN){
type = IntentModelType.USERNAME;
}
} else if (url.contains("ig.me/u/")) {
url = url.substring((isHttps ? 16 : 15) + wwwDel);
url = cleanString(url);
type = IntentModelType.USERNAME; type = IntentModelType.USERNAME;
} else if ("_u".equals(path)) {
text = paths.get(1);
type = IntentModelType.USERNAME;
} else if ("p".equals(path) || "reel".equals(path) || "tv".equals(path)) {
text = paths.get(1);
type = IntentModelType.POST;
} else if (2 < paths.size() && "explore".equals(path)) {
path = paths.get(1);
} else return null; if ("locations".equals(path)) {
text = paths.get(2);
type = IntentModelType.LOCATION;
}
final int clipLen = url.length() - 1; if ("tags".equals(path)) {
if (url.charAt(clipLen) == '/') text = paths.get(2);
url = url.substring(0, clipLen); type = IntentModelType.HASHTAG;
}
if (type == IntentModelType.LOCATION && url.contains("/")) {
url = url.substring(0, url.indexOf("/"));
} }
if (!url.contains("/")) return new IntentModel(type, url); if (TextUtils.isEmpty(text)) {
return null; return null;
}
@NonNull
public static String cleanString(@NonNull final String clipString) {
final int queryIndex = clipString.indexOf('?');
final int paramIndex = clipString.indexOf('#');
int startIndex = -1;
if (queryIndex > 0 && paramIndex > 0) {
if (queryIndex < paramIndex) startIndex = queryIndex;
else if (paramIndex < queryIndex) startIndex = paramIndex;
} else if (queryIndex == -1 && paramIndex >= 0) {
startIndex = paramIndex;
} else if (paramIndex == -1 && queryIndex >= 0) {
startIndex = queryIndex;
} }
return startIndex != -1 ? clipString.substring(0, startIndex) : clipString;
return new IntentModel(type, text);
} }
} }