aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorscria1000 <91804886+scria1000@users.noreply.github.com>2021-12-20 13:18:40 +0000
committerGitHub <noreply@github.com>2021-12-20 13:18:40 +0000
commita7b58cf0a410a1670aa9230cab4d05938caf6648 (patch)
tree9b72e4b935b681b62108e364647819f991016085 /app
parent34127032de45b6f860d998daf3adfebcb029e0fc (diff)
downloadinfinity-for-reddit-a7b58cf0a410a1670aa9230cab4d05938caf6648.tar
infinity-for-reddit-a7b58cf0a410a1670aa9230cab4d05938caf6648.tar.gz
infinity-for-reddit-a7b58cf0a410a1670aa9230cab4d05938caf6648.tar.bz2
infinity-for-reddit-a7b58cf0a410a1670aa9230cab4d05938caf6648.tar.lz
infinity-for-reddit-a7b58cf0a410a1670aa9230cab4d05938caf6648.tar.xz
infinity-for-reddit-a7b58cf0a410a1670aa9230cab4d05938caf6648.tar.zst
infinity-for-reddit-a7b58cf0a410a1670aa9230cab4d05938caf6648.zip
Support imgur gifv with audio (#602)
Support imgur gifv videos with audio.
Diffstat (limited to 'app')
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java2
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java9
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java10
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java15
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java61
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java11
6 files changed, 88 insertions, 20 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java
index fe7c89c3..a8c609f2 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java
@@ -261,6 +261,8 @@ public class LinkResolverActivity extends AppCompatActivity {
startActivity(intent);
} else if (path.endsWith("gifv")) {
String url = uri.toString();
+ // Insecure imgur links won't load
+ url = url.replaceFirst("http://" , "https://");
url = url.substring(0, url.length() - 5) + ".mp4";
Intent intent = new Intent(this, ViewVideoActivity.class);
intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_DIRECT);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java
index 2727e40a..b53ddf7e 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java
@@ -126,6 +126,7 @@ public class ViewVideoActivity extends AppCompatActivity {
public static final String EXTRA_V_REDD_IT_URL = "EVRIU";
public static final String EXTRA_STREAMABLE_SHORT_CODE = "ESSC";
public static final String EXTRA_IS_NSFW = "EIN";
+ public static final int VIDEO_TYPE_IMGUR = 7;
public static final int VIDEO_TYPE_STREAMABLE = 5;
public static final int VIDEO_TYPE_V_REDD_IT = 4;
public static final int VIDEO_TYPE_DIRECT = 3;
@@ -523,9 +524,13 @@ public class ViewVideoActivity extends AppCompatActivity {
player.prepare(new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mVideoUri));
preparePlayer(savedInstanceState);
}
- } else if (videoType == VIDEO_TYPE_DIRECT) {
+ } else if (videoType == VIDEO_TYPE_DIRECT || videoType == VIDEO_TYPE_IMGUR) {
videoDownloadUrl = mVideoUri.toString();
- videoFileName = FilenameUtils.getName(videoDownloadUrl);
+ if (videoType == VIDEO_TYPE_DIRECT) {
+ videoFileName = FilenameUtils.getName(videoDownloadUrl);
+ } else {
+ videoFileName = "imgur-" + FilenameUtils.getName(videoDownloadUrl);
+ }
// Produces DataSource instances through which media data is loaded.
dataSourceFactory = new CacheDataSourceFactory(mSimpleCache,
new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "Infinity")));
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java
index 0f268f08..6b63a0c0 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostDetailRecyclerViewAdapter.java
@@ -1657,7 +1657,10 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
if (canStartActivity) {
canStartActivity = false;
Intent intent = new Intent(mActivity, ViewVideoActivity.class);
- if (mPost.isGfycat()) {
+ if (mPost.isImgur()) {
+ intent.setData(Uri.parse(mPost.getVideoUrl()));
+ intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_IMGUR);
+ } else if (mPost.isGfycat()) {
intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_GFYCAT);
intent.putExtra(ViewVideoActivity.EXTRA_GFYCAT_ID, mPost.getGfycatId());
if (mPost.isLoadGfycatOrStreamableVideoSuccess()) {
@@ -1882,7 +1885,10 @@ public class PostDetailRecyclerViewAdapter extends RecyclerView.Adapter<Recycler
canStartActivity = false;
if (mPost.getPostType() == Post.VIDEO_TYPE) {
Intent intent = new Intent(mActivity, ViewVideoActivity.class);
- if (mPost.isGfycat()) {
+ if (mPost.isImgur()) {
+ intent.setData(Uri.parse(mPost.getVideoUrl()));
+ intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_IMGUR);
+ } else if (mPost.isGfycat()) {
intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_GFYCAT);
intent.putExtra(ViewVideoActivity.EXTRA_GFYCAT_ID, mPost.getGfycatId());
} else if (mPost.isRedgifs()) {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java
index eb2dd24e..f69b8378 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/adapters/PostRecyclerViewAdapter.java
@@ -1943,7 +1943,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
canStartActivity = false;
if (post.getPostType() == Post.VIDEO_TYPE) {
Intent intent = new Intent(mActivity, ViewVideoActivity.class);
- if (post.isGfycat()) {
+ if (post.isImgur()) {
+ intent.setData(Uri.parse(post.getVideoUrl()));
+ intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_IMGUR);
+ } else if (post.isGfycat()) {
intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_GFYCAT);
intent.putExtra(ViewVideoActivity.EXTRA_GFYCAT_ID, post.getGfycatId());
} else if (post.isRedgifs()) {
@@ -2683,7 +2686,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
if (post != null) {
markPostRead(post, true);
Intent intent = new Intent(mActivity, ViewVideoActivity.class);
- if (post.isGfycat()) {
+ if (post.isImgur()) {
+ intent.setData(Uri.parse(post.getVideoUrl()));
+ intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_IMGUR);
+ } else if (post.isGfycat()) {
intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_GFYCAT);
intent.putExtra(ViewVideoActivity.EXTRA_GFYCAT_ID, post.getGfycatId());
if (post.isLoadGfycatOrStreamableVideoSuccess()) {
@@ -3968,7 +3974,10 @@ public class PostRecyclerViewAdapter extends PagingDataAdapter<Post, RecyclerVie
if (post != null) {
markPostRead(post, true);
Intent intent = new Intent(mActivity, ViewVideoActivity.class);
- if (post.isGfycat()) {
+ if (post.isImgur()) {
+ intent.setData(Uri.parse(post.getVideoUrl()));
+ intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_IMGUR);
+ } else if (post.isGfycat()) {
intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_GFYCAT);
intent.putExtra(ViewVideoActivity.EXTRA_GFYCAT_ID, post.getGfycatId());
if (post.isLoadGfycatOrStreamableVideoSuccess()) {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java
index c7c7c997..b3260973 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/ParsePost.java
@@ -13,6 +13,7 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Objects;
import java.util.concurrent.Executor;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -400,20 +401,38 @@ public class ParsePost {
post.setVideoDownloadUrl(videoDownloadUrl);
} else if (data.has(JSONUtils.PREVIEW_KEY)) {
if (data.getJSONObject(JSONUtils.PREVIEW_KEY).has(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY)) {
- //Gif video post (HLS)
int postType = Post.VIDEO_TYPE;
- String videoUrl = Html.fromHtml(data.getJSONObject(JSONUtils.PREVIEW_KEY)
- .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.HLS_URL_KEY)).toString();
- String videoDownloadUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY)
- .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.FALLBACK_URL_KEY);
-
- post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFlair,
- authorFlairHTML, postTimeMillis, title, permalink, score, postType, voteType,
- nComments, upvoteRatio, flair, awards, nAwards, hidden, spoiler, nsfw, stickied,
- archived, locked, saved, isCrosspost);
- post.setPreviews(previews);
- post.setVideoUrl(videoUrl);
- post.setVideoDownloadUrl(videoDownloadUrl);
+ Uri uri = Uri.parse(url);
+ String authority = uri.getAuthority();
+ // The hls stream inside REDDIT_VIDEO_PREVIEW_KEY can sometimes lack an audio track
+ // This happens with imgur gifv that are actually mp4, even the official Reddit app has this bug
+ if (authority.contains("imgur.com") && url.endsWith(".gifv")) {
+ url = url.substring(0, url.length() - 5) + ".mp4";
+
+ post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFlair,
+ authorFlairHTML, postTimeMillis, title, permalink, score, postType, voteType,
+ nComments, upvoteRatio, flair, awards, nAwards, hidden, spoiler, nsfw, stickied,
+ archived, locked, saved, isCrosspost);
+ post.setPreviews(previews);
+ post.setVideoUrl(url);
+ post.setVideoDownloadUrl(url);
+ post.setIsImgur(true);
+ } else {
+ //Gif video post (HLS)
+
+ String videoUrl = Html.fromHtml(data.getJSONObject(JSONUtils.PREVIEW_KEY)
+ .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.HLS_URL_KEY)).toString();
+ String videoDownloadUrl = data.getJSONObject(JSONUtils.PREVIEW_KEY)
+ .getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.FALLBACK_URL_KEY);
+
+ post = new Post(id, fullName, subredditName, subredditNamePrefixed, author, authorFlair,
+ authorFlairHTML, postTimeMillis, title, permalink, score, postType, voteType,
+ nComments, upvoteRatio, flair, awards, nAwards, hidden, spoiler, nsfw, stickied,
+ archived, locked, saved, isCrosspost);
+ post.setPreviews(previews);
+ post.setVideoUrl(videoUrl);
+ post.setVideoDownloadUrl(videoDownloadUrl);
+ }
} else {
if (url.endsWith("jpg") || url.endsWith("png")) {
//Image post
@@ -449,6 +468,22 @@ public class ParsePost {
post.setPreviews(previews);
post.setVideoUrl(url);
post.setVideoDownloadUrl(url);
+ } else if (url.endsWith("gifv") && Objects.equals(Uri.parse(url).getAuthority(), "i.imgur.com")) {
+ // Imgur gifv/mp4
+ int postType = Post.VIDEO_TYPE;
+
+ // Insecure imgur links won't load
+ url = url.replaceFirst("http://" , "https://");
+ url = url.substring(0, url.length() - 5) + ".mp4";
+
+ post = new Post(id, fullName, subredditName, subredditNamePrefixed, author,
+ authorFlair, authorFlairHTML, postTimeMillis, title, url, permalink, score,
+ postType, voteType, nComments, upvoteRatio, flair, awards, nAwards,
+ hidden, spoiler, nsfw, stickied, archived, locked, saved, isCrosspost);
+ post.setPreviews(previews);
+ post.setVideoUrl(url);
+ post.setVideoDownloadUrl(url);
+ post.setIsImgur(true);
} else {
if (url.contains(permalink)) {
//Text post but with a preview
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java
index c20df496..82060f0e 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/Post.java
@@ -52,6 +52,7 @@ public class Post implements Parcelable {
private String videoDownloadUrl;
private String gfycatId;
private String streamableShortCode;
+ private boolean isImgur;
private boolean isGfycat;
private boolean isRedgifs;
private boolean isStreamable;
@@ -175,6 +176,7 @@ public class Post implements Parcelable {
videoDownloadUrl = in.readString();
gfycatId = in.readString();
streamableShortCode = in.readString();
+ isImgur = in.readByte() != 0;
isGfycat = in.readByte() != 0;
isRedgifs = in.readByte() != 0;
isStreamable = in.readByte() != 0;
@@ -333,6 +335,14 @@ public class Post implements Parcelable {
this.streamableShortCode = shortCode;
}
+ public void setIsImgur(boolean isImgur) {
+ this.isImgur = isImgur;
+ }
+
+ public boolean isImgur() {
+ return isImgur;
+ }
+
public boolean isGfycat() {
return isGfycat;
}
@@ -553,6 +563,7 @@ public class Post implements Parcelable {
parcel.writeString(videoDownloadUrl);
parcel.writeString(gfycatId);
parcel.writeString(streamableShortCode);
+ parcel.writeByte((byte) (isImgur ? 1 : 0));
parcel.writeByte((byte) (isGfycat ? 1 : 0));
parcel.writeByte((byte) (isRedgifs ? 1 : 0));
parcel.writeByte((byte) (isStreamable ? 1 : 0));