1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-10 16:50:47 +01:00

added workaround for internal server error while getting webm videos - fixed #415

This commit is contained in:
Mariotaku Lee 2016-02-29 08:53:04 +08:00
parent d7dc65c7a6
commit bfe7a3dfb2
3 changed files with 43 additions and 5 deletions

View File

@ -871,6 +871,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
private static final String EXTRA_LOOP = "loop"; private static final String EXTRA_LOOP = "loop";
private static final String[] SUPPORTED_VIDEO_TYPES; private static final String[] SUPPORTED_VIDEO_TYPES;
private static final String[] FALLBACK_VIDEO_TYPES;
static { static {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
@ -878,6 +879,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
} else { } else {
SUPPORTED_VIDEO_TYPES = new String[]{"video/webm", "video/mp4"}; SUPPORTED_VIDEO_TYPES = new String[]{"video/webm", "video/mp4"};
} }
FALLBACK_VIDEO_TYPES = new String[]{"video/mp4"};
} }
private TextureVideoView mVideoView; private TextureVideoView mVideoView;
@ -895,6 +897,10 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
protected Object getDownloadExtra() { protected Object getDownloadExtra() {
final MediaExtra extra = new MediaExtra(); final MediaExtra extra = new MediaExtra();
extra.setUseThumbor(false); extra.setUseThumbor(false);
final Pair<String, String> fallbackUrlAndType = getBestVideoUrlAndType(getMedia(), FALLBACK_VIDEO_TYPES);
if (fallbackUrlAndType != null) {
extra.setFallbackUrl(fallbackUrlAndType.first);
}
return extra; return extra;
} }
@ -910,7 +916,8 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
@Nullable @Nullable
@Override @Override
protected Uri getDownloadUri() { protected Uri getDownloadUri() {
final Pair<String, String> bestVideoUrlAndType = getBestVideoUrlAndType(getMedia()); final Pair<String, String> bestVideoUrlAndType = getBestVideoUrlAndType(getMedia(),
SUPPORTED_VIDEO_TYPES);
if (bestVideoUrlAndType == null || bestVideoUrlAndType.first == null) return null; if (bestVideoUrlAndType == null || bestVideoUrlAndType.first == null) return null;
return Uri.parse(bestVideoUrlAndType.first); return Uri.parse(bestVideoUrlAndType.first);
} }
@ -1040,7 +1047,9 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
updateVolume(); updateVolume();
} }
private Pair<String, String> getBestVideoUrlAndType(ParcelableMedia media) { @Nullable
private Pair<String, String> getBestVideoUrlAndType(final ParcelableMedia media,
@NonNull final String[] supportedTypes) {
if (media == null) return null; if (media == null) return null;
switch (media.type) { switch (media.type) {
case ParcelableMedia.Type.VIDEO: case ParcelableMedia.Type.VIDEO:
@ -1048,7 +1057,7 @@ public final class MediaViewerActivity extends AbsMediaViewerActivity implements
if (media.video_info == null) { if (media.video_info == null) {
return Pair.create(media.media_url, 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) { for (ParcelableMedia.VideoInfo.Variant variant : media.video_info.variants) {
if (supportedType.equalsIgnoreCase(variant.content_type)) if (supportedType.equalsIgnoreCase(variant.content_type))
return Pair.create(variant.url, variant.content_type); return Pair.create(variant.url, variant.content_type);

View File

@ -6,6 +6,7 @@ package org.mariotaku.twidere.util.media;
public class MediaExtra { public class MediaExtra {
long accountId; long accountId;
boolean useThumbor = true; boolean useThumbor = true;
String fallbackUrl;
public long getAccountId() { public long getAccountId() {
return accountId; return accountId;
@ -22,4 +23,12 @@ public class MediaExtra {
public void setUseThumbor(boolean useThumbor) { public void setUseThumbor(boolean useThumbor) {
this.useThumbor = useThumbor; this.useThumbor = useThumbor;
} }
public String getFallbackUrl() {
return fallbackUrl;
}
public void setFallbackUrl(String fallbackUrl) {
this.fallbackUrl = fallbackUrl;
}
} }

View File

@ -81,8 +81,28 @@ public class TwidereMediaDownloader implements MediaDownloader, Constants {
@NonNull @NonNull
@Override @Override
public CacheDownloadLoader.DownloadResult get(@NonNull String url, Object extra) throws IOException { public CacheDownloadLoader.DownloadResult get(@NonNull String url, Object extra) throws IOException {
try {
final ParcelableMedia media = PreviewMediaExtractor.fromLink(url, mClient, extra); final ParcelableMedia media = PreviewMediaExtractor.fromLink(url, mClient, extra);
return getInternal(media != null && media.media_url != null ? media.media_url : url, 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, protected CacheDownloadLoader.DownloadResult getInternal(@NonNull String url,