diff options
author | Alex Ning <chineseperson5@gmail.com> | 2021-03-12 00:55:33 +0000 |
---|---|---|
committer | Alex Ning <chineseperson5@gmail.com> | 2021-03-12 00:55:33 +0000 |
commit | 2efb890100a507e7eab717cf12a9b5e422385e7f (patch) | |
tree | 1d8a5b5478e1b8935a5b1582efe5dcb0450262b8 /app/src/main/java | |
parent | 2d4b308e393c8b0df64fe95f826d1a5f6ea7895b (diff) | |
download | infinity-for-reddit-2efb890100a507e7eab717cf12a9b5e422385e7f.tar infinity-for-reddit-2efb890100a507e7eab717cf12a9b5e422385e7f.tar.gz infinity-for-reddit-2efb890100a507e7eab717cf12a9b5e422385e7f.tar.bz2 infinity-for-reddit-2efb890100a507e7eab717cf12a9b5e422385e7f.tar.lz infinity-for-reddit-2efb890100a507e7eab717cf12a9b5e422385e7f.tar.xz infinity-for-reddit-2efb890100a507e7eab717cf12a9b5e422385e7f.tar.zst infinity-for-reddit-2efb890100a507e7eab717cf12a9b5e422385e7f.zip |
Support v.redd.it videos.
Diffstat (limited to 'app/src/main/java')
6 files changed, 173 insertions, 47 deletions
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java index 82796cec..b3bb499c 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppModule.java @@ -143,6 +143,16 @@ class AppModule { } @Provides + @Named("vReddIt") + @Singleton + Retrofit provideVReddItRetrofit() { + return new Retrofit.Builder() + .baseUrl("http://localhost/") + .addConverterFactory(ScalarsConverterFactory.create()) + .build(); + } + + @Provides @Singleton OkHttpClient provideOkHttpClient(@Named("no_oauth") Retrofit retrofit, RedditDataRoomDatabase accountRoomDatabase, @Named("current_account") SharedPreferences currentAccountSharedPreferences) { 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 db96c96e..5e536223 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/LinkResolverActivity.java @@ -113,7 +113,12 @@ public class LinkResolverActivity extends AppCompatActivity { List<String> segments = uri.getPathSegments(); if (authority != null) { - if (authority.contains("reddit.com") || authority.contains("redd.it") || authority.contains("reddit.app")) { + if (authority.equals("v.redd.it")) { + Intent intent = new Intent(this, ViewVideoActivity.class); + intent.putExtra(ViewVideoActivity.EXTRA_VIDEO_TYPE, ViewVideoActivity.VIDEO_TYPE_V_REDD_IT); + intent.putExtra(ViewVideoActivity.EXTRA_V_REDD_IT_URL, uri.toString()); + startActivity(intent); + } else if (authority.contains("reddit.com") || authority.contains("redd.it") || authority.contains("reddit.app")) { if (authority.equals("reddit.app.link") && path.isEmpty()) { String redirect = uri.getQueryParameter("$og_redirect"); handleUri(Uri.parse(redirect)); 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 417d8de7..df24e15b 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/activities/ViewVideoActivity.java @@ -48,21 +48,29 @@ import com.google.android.material.snackbar.Snackbar; import com.thefuntasty.hauler.DragDirection; import com.thefuntasty.hauler.HaulerView; +import java.util.List; + import javax.inject.Inject; import javax.inject.Named; import butterknife.BindView; import butterknife.ButterKnife; import ml.docilealligator.infinityforreddit.FetchGfycatOrRedgifsVideoLinks; +import ml.docilealligator.infinityforreddit.Infinity; +import ml.docilealligator.infinityforreddit.R; +import ml.docilealligator.infinityforreddit.apis.VReddIt; import ml.docilealligator.infinityforreddit.font.ContentFontFamily; import ml.docilealligator.infinityforreddit.font.FontFamily; import ml.docilealligator.infinityforreddit.font.TitleFontFamily; -import ml.docilealligator.infinityforreddit.Infinity; -import ml.docilealligator.infinityforreddit.R; +import ml.docilealligator.infinityforreddit.post.FetchPost; +import ml.docilealligator.infinityforreddit.post.Post; import ml.docilealligator.infinityforreddit.services.DownloadMediaService; import ml.docilealligator.infinityforreddit.services.DownloadRedditVideoService; import ml.docilealligator.infinityforreddit.utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.utils.Utils; +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; import retrofit2.Retrofit; public class ViewVideoActivity extends AppCompatActivity { @@ -74,15 +82,22 @@ public class ViewVideoActivity extends AppCompatActivity { public static final String EXTRA_PROGRESS_SECONDS = "EPS"; public static final String EXTRA_VIDEO_TYPE = "EVT"; public static final String EXTRA_GFYCAT_ID = "EGI"; + public static final String EXTRA_V_REDD_IT_URL = "EVRIU"; public static final String EXTRA_IS_NSFW = "EIN"; + public static final int VIDEO_TYPE_V_REDD_IT = 4; public static final int VIDEO_TYPE_DIRECT = 3; public static final int VIDEO_TYPE_REDGIFS = 2; public static final int VIDEO_TYPE_GFYCAT = 1; private static final int VIDEO_TYPE_NORMAL = 0; private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0; + private static final String IS_MUTE_STATE = "IMS"; private static final String VIDEO_DOWNLOAD_URL_STATE = "VDUS"; private static final String VIDEO_URI_STATE = "VUS"; + private static final String VIDEO_TYPE_STATE = "VTS"; + private static final String SUBREDDIT_NAME_STATE = "SNS"; + private static final String ID_STATE= "IS"; + @BindView(R.id.hauler_view_view_video_activity) HaulerView haulerView; @BindView(R.id.coordinator_layout_view_video_activity) @@ -116,6 +131,10 @@ public class ViewVideoActivity extends AppCompatActivity { private boolean isHd; @Inject + @Named("no_oauth") + Retrofit retrofit; + + @Inject @Named("gfycat") Retrofit gfycatRetrofit; @@ -124,6 +143,10 @@ public class ViewVideoActivity extends AppCompatActivity { Retrofit redgifsRetrofit; @Inject + @Named("vReddIt") + Retrofit vReddItRetrofit; + + @Inject @Named("default") SharedPreferences mSharedPreferences; @@ -186,7 +209,6 @@ public class ViewVideoActivity extends AppCompatActivity { }); Intent intent = getIntent(); - mVideoUri = intent.getData(); postTitle = intent.getStringExtra(EXTRA_POST_TITLE); isNSFW = intent.getBooleanExtra(EXTRA_IS_NSFW, false); if (savedInstanceState == null) { @@ -223,17 +245,24 @@ public class ViewVideoActivity extends AppCompatActivity { trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); player = ExoPlayerFactory.newSimpleInstance(this, trackSelector); videoPlayerView.setPlayer(player); - videoType = getIntent().getIntExtra(EXTRA_VIDEO_TYPE, VIDEO_TYPE_NORMAL); - if (videoType == VIDEO_TYPE_GFYCAT || videoType == VIDEO_TYPE_REDGIFS) { + if (savedInstanceState == null) { + mVideoUri = intent.getData(); + videoType = getIntent().getIntExtra(EXTRA_VIDEO_TYPE, VIDEO_TYPE_NORMAL); + } else { + String videoUrl = savedInstanceState.getString(VIDEO_URI_STATE); + if (videoUrl != null) { + mVideoUri = Uri.parse(videoUrl); + } + videoType = savedInstanceState.getInt(VIDEO_TYPE_STATE); + subredditName = savedInstanceState.getString(SUBREDDIT_NAME_STATE); + id = savedInstanceState.getString(ID_STATE); + } + + if (videoType == VIDEO_TYPE_V_REDD_IT) { + loadVReddItVideo(savedInstanceState); + } else if (videoType == VIDEO_TYPE_GFYCAT || videoType == VIDEO_TYPE_REDGIFS) { if (savedInstanceState != null) { - String videoUrl = savedInstanceState.getString(VIDEO_URI_STATE); - if (videoUrl != null) { - mVideoUri = Uri.parse(videoUrl); - } videoDownloadUrl = savedInstanceState.getString(VIDEO_DOWNLOAD_URL_STATE); - } else { - mVideoUri = intent.getData(); - videoDownloadUrl = intent.getStringExtra(EXTRA_VIDEO_DOWNLOAD_URL); } String gfycatId = intent.getStringExtra(EXTRA_GFYCAT_ID); @@ -265,6 +294,7 @@ public class ViewVideoActivity extends AppCompatActivity { dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "Infinity")); // Prepare the player with the source. player.prepare(new ProgressiveMediaSource.Factory(dataSourceFactory).createMediaSource(mVideoUri)); + preparePlayer(savedInstanceState); } else { videoDownloadUrl = intent.getStringExtra(EXTRA_VIDEO_DOWNLOAD_URL); subredditName = intent.getStringExtra(EXTRA_SUBREDDIT); @@ -274,9 +304,8 @@ public class ViewVideoActivity extends AppCompatActivity { dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(this, "Infinity")); // Prepare the player with the source. player.prepare(new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(mVideoUri)); + preparePlayer(savedInstanceState); } - - preparePlayer(savedInstanceState); } private void preparePlayer(Bundle savedInstanceState) { @@ -388,6 +417,77 @@ public class ViewVideoActivity extends AppCompatActivity { }); } + private void loadVReddItVideo(Bundle savedInstanceState) { + progressBar.setVisibility(View.VISIBLE); + vReddItRetrofit.create(VReddIt.class).getRedirectUrl(getIntent().getStringExtra(EXTRA_V_REDD_IT_URL)).enqueue(new Callback<String>() { + @Override + public void onResponse(@NonNull Call<String> call, @NonNull Response<String> response) { + Uri redirectUri = Uri.parse(response.raw().request().url().toString()); + String redirectPath = redirectUri.getPath(); + if (redirectPath.matches("/r/\\w+/comments/\\w+/?\\w+/?") || redirectPath.matches("/user/\\w+/comments/\\w+/?\\w+/?")) { + List<String> segments = redirectUri.getPathSegments(); + int commentsIndex = segments.lastIndexOf("comments"); + String postId = segments.get(commentsIndex + 1); + FetchPost.fetchPost(retrofit, postId, null, new FetchPost.FetchPostListener() { + @Override + public void fetchPostSuccess(Post post) { + if (post.isGfycat()) { + videoType = VIDEO_TYPE_GFYCAT; + String gfycatId = post.getGfycatId(); + if (gfycatId != null && gfycatId.contains("-")) { + gfycatId = gfycatId.substring(0, gfycatId.indexOf('-')); + } + if (videoType == VIDEO_TYPE_GFYCAT) { + videoFileName = "Gfycat-" + gfycatId + ".mp4"; + } else { + videoFileName = "Redgifs-" + gfycatId + ".mp4"; + } + loadGfycatOrRedgifsVideo(gfycatRetrofit, gfycatId, savedInstanceState, true); + } else if (post.isRedgifs()) { + videoType = VIDEO_TYPE_REDGIFS; + String gfycatId = post.getGfycatId(); + if (gfycatId != null && gfycatId.contains("-")) { + gfycatId = gfycatId.substring(0, gfycatId.indexOf('-')); + } + if (videoType == VIDEO_TYPE_GFYCAT) { + videoFileName = "Gfycat-" + gfycatId + ".mp4"; + } else { + videoFileName = "Redgifs-" + gfycatId + ".mp4"; + } + loadGfycatOrRedgifsVideo(redgifsRetrofit, gfycatId, savedInstanceState, false); + } else { + progressBar.setVisibility(View.INVISIBLE); + mVideoUri = Uri.parse(post.getVideoUrl()); + subredditName = post.getSubredditName(); + id = post.getId(); + videoDownloadUrl = post.getVideoDownloadUrl(); + + videoFileName = subredditName + "-" + id + ".mp4"; + // Produces DataSource instances through which media data is loaded. + dataSourceFactory = new DefaultHttpDataSourceFactory(Util.getUserAgent(ViewVideoActivity.this, "Infinity")); + // Prepare the player with the source. + player.prepare(new HlsMediaSource.Factory(dataSourceFactory).createMediaSource(mVideoUri)); + preparePlayer(savedInstanceState); + } + } + + @Override + public void fetchPostFailed() { + + } + }); + } else { + + } + } + + @Override + public void onFailure(@NonNull Call<String> call, @NonNull Throwable t) { + + } + }); + } + @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.view_video, menu); @@ -404,39 +504,39 @@ public class ViewVideoActivity extends AppCompatActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case android.R.id.home: - finish(); - return true; - case R.id.action_download_view_video_activity: - if (isDownloading) { - return false; - } + int itemId = item.getItemId(); + if (itemId == android.R.id.home) { + finish(); + return true; + } else if (itemId == R.id.action_download_view_video_activity) { + if (isDownloading) { + return false; + } - if (videoDownloadUrl == null) { - Toast.makeText(this, R.string.fetching_video_info_please_wait, Toast.LENGTH_SHORT).show(); - return true; - } + if (videoDownloadUrl == null) { + Toast.makeText(this, R.string.fetching_video_info_please_wait, Toast.LENGTH_SHORT).show(); + return true; + } - isDownloading = true; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (ContextCompat.checkSelfPermission(this, - Manifest.permission.WRITE_EXTERNAL_STORAGE) - != PackageManager.PERMISSION_GRANTED) { - - // Permission is not granted - // No explanation needed; request the permission - ActivityCompat.requestPermissions(this, - new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, - PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); - } else { - // Permission has already been granted - download(); - } + isDownloading = true; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (ContextCompat.checkSelfPermission(this, + Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED) { + + // Permission is not granted + // No explanation needed; request the permission + ActivityCompat.requestPermissions(this, + new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); } else { + // Permission has already been granted download(); } - return true; + } else { + download(); + } + return true; } return false; @@ -493,9 +593,12 @@ public class ViewVideoActivity extends AppCompatActivity { protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); outState.putBoolean(IS_MUTE_STATE, isMute); + outState.putInt(VIDEO_TYPE_STATE, videoType); if (mVideoUri != null) { outState.putString(VIDEO_URI_STATE, mVideoUri.toString()); outState.putString(VIDEO_DOWNLOAD_URL_STATE, videoDownloadUrl); + outState.putString(SUBREDDIT_NAME_STATE, subredditName); + outState.putString(ID_STATE, id); } } } diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/apis/VReddIt.java b/app/src/main/java/ml/docilealligator/infinityforreddit/apis/VReddIt.java new file mode 100644 index 00000000..b9d0365f --- /dev/null +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/apis/VReddIt.java @@ -0,0 +1,10 @@ +package ml.docilealligator.infinityforreddit.apis; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Url; + +public interface VReddIt { + @GET() + Call<String> getRedirectUrl(@Url String vReddItUrl); +} diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/ViewPostDetailFragment.java b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/ViewPostDetailFragment.java index 744f0d04..97d55b66 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/ViewPostDetailFragment.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/fragments/ViewPostDetailFragment.java @@ -1371,7 +1371,7 @@ public class ViewPostDetailFragment extends Fragment implements FragmentCommunic } else { retrofit = mOauthRetrofit; } - FetchPost.fetchPost(retrofit, mPost.getId(), mAccessToken, mLocale, + FetchPost.fetchPost(retrofit, mPost.getId(), mAccessToken, new FetchPost.FetchPostListener() { @Override public void fetchPostSuccess(Post post) { diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/post/FetchPost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/post/FetchPost.java index bdb3b17e..6566b623 100644 --- a/app/src/main/java/ml/docilealligator/infinityforreddit/post/FetchPost.java +++ b/app/src/main/java/ml/docilealligator/infinityforreddit/post/FetchPost.java @@ -2,8 +2,6 @@ package ml.docilealligator.infinityforreddit.post; import androidx.annotation.NonNull; -import java.util.Locale; - import ml.docilealligator.infinityforreddit.apis.RedditAPI; import ml.docilealligator.infinityforreddit.utils.APIUtils; import retrofit2.Call; @@ -12,7 +10,7 @@ import retrofit2.Response; import retrofit2.Retrofit; public class FetchPost { - public static void fetchPost(Retrofit retrofit, String id, String accessToken, Locale locale, FetchPostListener fetchPostListener) { + public static void fetchPost(Retrofit retrofit, String id, String accessToken, FetchPostListener fetchPostListener) { Call<String> postCall; if (accessToken == null) { postCall = retrofit.create(RedditAPI.class).getPost(id); |