1
0
mirror of https://github.com/TwidereProject/Twidere-Android synced 2025-02-09 08:18:44 +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[] 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<String, String> 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<String, String> bestVideoUrlAndType = getBestVideoUrlAndType(getMedia());
final Pair<String, String> 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<String, String> getBestVideoUrlAndType(ParcelableMedia media) {
@Nullable
private Pair<String, String> 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);

View File

@ -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;
}
}

View File

@ -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,