Catch errors when local feeds fail to update
This commit is contained in:
parent
fe5bf85e9c
commit
4d1a7773d0
|
@ -10,6 +10,7 @@ import androidx.documentfile.provider.DocumentFile;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -22,7 +23,6 @@ import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
|
|
||||||
import de.danoeh.antennapod.core.R;
|
import de.danoeh.antennapod.core.R;
|
||||||
import de.danoeh.antennapod.core.service.download.DownloadStatus;
|
import de.danoeh.antennapod.core.service.download.DownloadStatus;
|
||||||
|
@ -35,16 +35,28 @@ import de.danoeh.antennapod.core.util.DownloadError;
|
||||||
public class LocalFeedUpdater {
|
public class LocalFeedUpdater {
|
||||||
|
|
||||||
public static void updateFeed(Feed feed, Context context) {
|
public static void updateFeed(Feed feed, Context context) {
|
||||||
|
try {
|
||||||
|
tryUpdateFeed(feed, context);
|
||||||
|
|
||||||
|
if (mustReportDownloadSuccessful(feed)) {
|
||||||
|
reportSuccess(feed);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
reportError(feed, e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void tryUpdateFeed(Feed feed, Context context) throws IOException {
|
||||||
String uriString = feed.getDownload_url().replace(Feed.PREFIX_LOCAL_FOLDER, "");
|
String uriString = feed.getDownload_url().replace(Feed.PREFIX_LOCAL_FOLDER, "");
|
||||||
DocumentFile documentFolder = DocumentFile.fromTreeUri(context, Uri.parse(uriString));
|
DocumentFile documentFolder = DocumentFile.fromTreeUri(context, Uri.parse(uriString));
|
||||||
if (documentFolder == null) {
|
if (documentFolder == null) {
|
||||||
reportError(feed, "Unable to retrieve document tree."
|
throw new IOException("Unable to retrieve document tree. "
|
||||||
+ "Try re-connecting the folder on the podcast info page.");
|
+ "Try re-connecting the folder on the podcast info page.");
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
if (!documentFolder.exists() || !documentFolder.canRead()) {
|
if (!documentFolder.exists() || !documentFolder.canRead()) {
|
||||||
reportError(feed, "Cannot read local directory. Try re-connecting the folder on the podcast info page.");
|
throw new IOException("Cannot read local directory. "
|
||||||
return;
|
+ "Try re-connecting the folder on the podcast info page.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (feed.getItems() == null) {
|
if (feed.getItems() == null) {
|
||||||
|
@ -108,10 +120,6 @@ public class LocalFeedUpdater {
|
||||||
// deleting played state or position in case the folder is temporarily unavailable.
|
// deleting played state or position in case the folder is temporarily unavailable.
|
||||||
boolean removeUnlistedItems = (newItems.size() >= 1);
|
boolean removeUnlistedItems = (newItems.size() >= 1);
|
||||||
DBTasks.updateFeed(context, feed, removeUnlistedItems);
|
DBTasks.updateFeed(context, feed, removeUnlistedItems);
|
||||||
|
|
||||||
if (mustReportDownloadSuccessful(feed)) {
|
|
||||||
reportSuccess(feed);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -135,46 +143,50 @@ public class LocalFeedUpdater {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static FeedItem createFeedItem(Feed feed, DocumentFile file, Context context) {
|
private static FeedItem createFeedItem(Feed feed, DocumentFile file, Context context) {
|
||||||
String uuid = UUID.randomUUID().toString();
|
FeedItem item = new FeedItem(0, file.getName(), UUID.randomUUID().toString(),
|
||||||
|
file.getName(), new Date(file.lastModified()), FeedItem.UNPLAYED, feed);
|
||||||
|
item.setAutoDownload(false);
|
||||||
|
|
||||||
|
long size = file.length();
|
||||||
|
FeedMedia media = new FeedMedia(0, item, 0, 0, size, file.getType(),
|
||||||
|
file.getUri().toString(), file.getUri().toString(), false, null, 0, 0);
|
||||||
|
item.setMedia(media);
|
||||||
|
|
||||||
|
try {
|
||||||
|
loadMetadata(item, file, context);
|
||||||
|
} catch (Exception e) {
|
||||||
|
item.setDescription(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void loadMetadata(FeedItem item, DocumentFile file, Context context) throws Exception {
|
||||||
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
|
MediaMetadataRetriever mediaMetadataRetriever = new MediaMetadataRetriever();
|
||||||
mediaMetadataRetriever.setDataSource(context, file.getUri());
|
mediaMetadataRetriever.setDataSource(context, file.getUri());
|
||||||
String dateStr = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE);
|
|
||||||
|
|
||||||
Date date = null;
|
String dateStr = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE);
|
||||||
if (!TextUtils.isEmpty(dateStr)) {
|
if (!TextUtils.isEmpty(dateStr)) {
|
||||||
try {
|
try {
|
||||||
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.getDefault());
|
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss", Locale.getDefault());
|
||||||
date = simpleDateFormat.parse(dateStr);
|
item.setPubDate(simpleDateFormat.parse(dateStr));
|
||||||
} catch (ParseException parseException) {
|
} catch (ParseException parseException) {
|
||||||
date = DateUtils.parse(dateStr);
|
Date date = DateUtils.parse(dateStr);
|
||||||
if (date == null) {
|
if (date != null) {
|
||||||
date = new Date(file.lastModified());
|
item.setPubDate(date);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
date = new Date(file.lastModified());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FeedItem item = new FeedItem(0, file.getName(), uuid, file.getName(), date,
|
|
||||||
FeedItem.UNPLAYED, feed);
|
|
||||||
item.setAutoDownload(false);
|
|
||||||
|
|
||||||
String durationStr = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
|
|
||||||
String title = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
|
String title = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
|
||||||
if (!TextUtils.isEmpty(title)) {
|
if (!TextUtils.isEmpty(title)) {
|
||||||
item.setTitle(title);
|
item.setTitle(title);
|
||||||
}
|
}
|
||||||
|
|
||||||
//add the media to the item
|
String durationStr = mediaMetadataRetriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
|
||||||
long duration = Long.parseLong(durationStr);
|
item.getMedia().setDuration((int) Long.parseLong(durationStr));
|
||||||
long size = file.length();
|
|
||||||
FeedMedia media = new FeedMedia(0, item, (int) duration, 0, size, file.getType(),
|
|
||||||
file.getUri().toString(), file.getUri().toString(), false, null, 0, 0);
|
|
||||||
media.setHasEmbeddedPicture(mediaMetadataRetriever.getEmbeddedPicture() != null);
|
|
||||||
item.setMedia(media);
|
|
||||||
|
|
||||||
return item;
|
item.getMedia().setHasEmbeddedPicture(mediaMetadataRetriever.getEmbeddedPicture() != null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void reportError(Feed feed, String reasonDetailed) {
|
private static void reportError(Feed feed, String reasonDetailed) {
|
||||||
|
|
Loading…
Reference in New Issue