From bfe7a3dfb2e56ad21de0d618cf54fe2ab50c02f4 Mon Sep 17 00:00:00 2001 From: Mariotaku Lee Date: Mon, 29 Feb 2016 08:53:04 +0800 Subject: [PATCH] added workaround for internal server error while getting webm videos - fixed #415 --- .../activity/support/MediaViewerActivity.java | 15 +++++++++--- .../twidere/util/media/MediaExtra.java | 9 +++++++ .../util/media/TwidereMediaDownloader.java | 24 +++++++++++++++++-- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java index 6a2d4bc39..99402bd52 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java +++ b/twidere/src/main/java/org/mariotaku/twidere/activity/support/MediaViewerActivity.java @@ -871,6 +871,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements private static final String EXTRA_LOOP = "loop"; private static final String[] SUPPORTED_VIDEO_TYPES; + private static final String[] FALLBACK_VIDEO_TYPES; static { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { @@ -878,6 +879,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements } else { SUPPORTED_VIDEO_TYPES = new String[]{"video/webm", "video/mp4"}; } + FALLBACK_VIDEO_TYPES = new String[]{"video/mp4"}; } private TextureVideoView mVideoView; @@ -895,6 +897,10 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements protected Object getDownloadExtra() { final MediaExtra extra = new MediaExtra(); extra.setUseThumbor(false); + final Pair fallbackUrlAndType = getBestVideoUrlAndType(getMedia(), FALLBACK_VIDEO_TYPES); + if (fallbackUrlAndType != null) { + extra.setFallbackUrl(fallbackUrlAndType.first); + } return extra; } @@ -910,7 +916,8 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements @Nullable @Override protected Uri getDownloadUri() { - final Pair bestVideoUrlAndType = getBestVideoUrlAndType(getMedia()); + final Pair bestVideoUrlAndType = getBestVideoUrlAndType(getMedia(), + SUPPORTED_VIDEO_TYPES); if (bestVideoUrlAndType == null || bestVideoUrlAndType.first == null) return null; return Uri.parse(bestVideoUrlAndType.first); } @@ -1040,7 +1047,9 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements updateVolume(); } - private Pair getBestVideoUrlAndType(ParcelableMedia media) { + @Nullable + private Pair getBestVideoUrlAndType(final ParcelableMedia media, + @NonNull final String[] supportedTypes) { if (media == null) return null; switch (media.type) { case ParcelableMedia.Type.VIDEO: @@ -1048,7 +1057,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements if (media.video_info == null) { return Pair.create(media.media_url, null); } - for (String supportedType : SUPPORTED_VIDEO_TYPES) { + for (String supportedType : supportedTypes) { for (ParcelableMedia.VideoInfo.Variant variant : media.video_info.variants) { if (supportedType.equalsIgnoreCase(variant.content_type)) return Pair.create(variant.url, variant.content_type); diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/media/MediaExtra.java b/twidere/src/main/java/org/mariotaku/twidere/util/media/MediaExtra.java index f67c18450..924fb68e1 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/media/MediaExtra.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/media/MediaExtra.java @@ -6,6 +6,7 @@ package org.mariotaku.twidere.util.media; public class MediaExtra { long accountId; boolean useThumbor = true; + String fallbackUrl; public long getAccountId() { return accountId; @@ -22,4 +23,12 @@ public class MediaExtra { public void setUseThumbor(boolean useThumbor) { this.useThumbor = useThumbor; } + + public String getFallbackUrl() { + return fallbackUrl; + } + + public void setFallbackUrl(String fallbackUrl) { + this.fallbackUrl = fallbackUrl; + } } diff --git a/twidere/src/main/java/org/mariotaku/twidere/util/media/TwidereMediaDownloader.java b/twidere/src/main/java/org/mariotaku/twidere/util/media/TwidereMediaDownloader.java index 0391458dc..09b983713 100644 --- a/twidere/src/main/java/org/mariotaku/twidere/util/media/TwidereMediaDownloader.java +++ b/twidere/src/main/java/org/mariotaku/twidere/util/media/TwidereMediaDownloader.java @@ -81,8 +81,28 @@ public class TwidereMediaDownloader implements MediaDownloader, Constants { @NonNull @Override public CacheDownloadLoader.DownloadResult get(@NonNull String url, Object extra) throws IOException { - final ParcelableMedia media = PreviewMediaExtractor.fromLink(url, mClient, extra); - return getInternal(media != null && media.media_url != null ? media.media_url : url, extra); + try { + final ParcelableMedia media = PreviewMediaExtractor.fromLink(url, mClient, extra); + if (media != null && media.media_url != null) { + return getInternal(media.media_url, extra); + } else { + return getInternal(url, extra); + } + } catch (IOException e) { + if (extra instanceof MediaExtra) { + final String fallbackUrl = ((MediaExtra) extra).getFallbackUrl(); + if (fallbackUrl != null) { + final ParcelableMedia media = PreviewMediaExtractor.fromLink(fallbackUrl, + mClient, extra); + if (media != null && media.media_url != null) { + return getInternal(media.media_url, extra); + } else { + return getInternal(fallbackUrl, extra); + } + } + } + throw e; + } } protected CacheDownloadLoader.DownloadResult getInternal(@NonNull String url,