Search in sources :

Example 1 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class CastUtils method convertFromFeedMedia.

/**
     * Converts {@link FeedMedia} objects into a format suitable for sending to a Cast Device.
     * Before using this method, one should make sure {@link #isCastable(Playable)} returns
     * {@code true}.
     *
     * Unless media.{@link FeedMedia#loadMetadata() loadMetadata()} has already been called,
     * this method should not run on the main thread.
     *
     * @param media The {@link FeedMedia} object to be converted.
     * @return {@link MediaInfo} object in a format proper for casting.
     */
public static MediaInfo convertFromFeedMedia(FeedMedia media) {
    if (media == null) {
        return null;
    }
    MediaMetadata metadata = new MediaMetadata(MediaMetadata.MEDIA_TYPE_GENERIC);
    try {
        media.loadMetadata();
    } catch (Playable.PlayableException e) {
        Log.e(TAG, "Unable to load FeedMedia metadata", e);
    }
    FeedItem feedItem = media.getItem();
    if (feedItem != null) {
        metadata.putString(MediaMetadata.KEY_TITLE, media.getEpisodeTitle());
        String subtitle = media.getFeedTitle();
        if (subtitle != null) {
            metadata.putString(MediaMetadata.KEY_SUBTITLE, subtitle);
        }
        FeedImage image = feedItem.getImage();
        if (image != null && !TextUtils.isEmpty(image.getDownload_url())) {
            metadata.addImage(new WebImage(Uri.parse(image.getDownload_url())));
        }
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(media.getItem().getPubDate());
        metadata.putDate(MediaMetadata.KEY_RELEASE_DATE, calendar);
        Feed feed = feedItem.getFeed();
        if (feed != null) {
            if (!TextUtils.isEmpty(feed.getAuthor())) {
                metadata.putString(MediaMetadata.KEY_ARTIST, feed.getAuthor());
            }
            if (!TextUtils.isEmpty(feed.getDownload_url())) {
                metadata.putString(KEY_FEED_URL, feed.getDownload_url());
            }
            if (!TextUtils.isEmpty(feed.getLink())) {
                metadata.putString(KEY_FEED_WEBSITE, feed.getLink());
            }
        }
        if (!TextUtils.isEmpty(feedItem.getItemIdentifier())) {
            metadata.putString(KEY_EPISODE_IDENTIFIER, feedItem.getItemIdentifier());
        } else {
            metadata.putString(KEY_EPISODE_IDENTIFIER, media.getStreamUrl());
        }
        if (!TextUtils.isEmpty(feedItem.getLink())) {
            metadata.putString(KEY_EPISODE_LINK, feedItem.getLink());
        }
    }
    String notes = null;
    try {
        notes = media.loadShownotes().call();
    } catch (Exception e) {
        Log.e(TAG, "Unable to load FeedMedia notes", e);
    }
    if (notes != null) {
        if (notes.length() > EPISODE_NOTES_MAX_LENGTH) {
            notes = notes.substring(0, EPISODE_NOTES_MAX_LENGTH);
        }
        metadata.putString(KEY_EPISODE_NOTES, notes);
    }
    // This field only identifies the id on the device that has the original version.
    // Idea is to perhaps, on a first approach, check if the version on the local DB with the
    // same id matches the remote object, and if not then search for episode and feed identifiers.
    // This at least should make media recognition for a single device much quicker.
    metadata.putInt(KEY_MEDIA_ID, ((Long) media.getIdentifier()).intValue());
    // A way to identify different casting media formats in case we change it in the future and
    // senders with different versions share a casting device.
    metadata.putInt(KEY_FORMAT_VERSION, FORMAT_VERSION_VALUE);
    MediaInfo.Builder builder = new MediaInfo.Builder(media.getStreamUrl()).setContentType(media.getMime_type()).setStreamType(MediaInfo.STREAM_TYPE_BUFFERED).setMetadata(metadata);
    if (media.getDuration() > 0) {
        builder.setStreamDuration(media.getDuration());
    }
    return builder.build();
}
Also used : FeedImage(de.danoeh.antennapod.core.feed.FeedImage) MediaInfo(com.google.android.gms.cast.MediaInfo) FeedItem(de.danoeh.antennapod.core.feed.FeedItem) Playable(de.danoeh.antennapod.core.util.playback.Playable) Calendar(java.util.Calendar) MediaMetadata(com.google.android.gms.cast.MediaMetadata) WebImage(com.google.android.gms.common.images.WebImage) Feed(de.danoeh.antennapod.core.feed.Feed)

Example 2 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class RemoteMedia method equals.

@Override
public boolean equals(Object other) {
    if (other instanceof RemoteMedia) {
        RemoteMedia rm = (RemoteMedia) other;
        return TextUtils.equals(downloadUrl, rm.downloadUrl) && TextUtils.equals(feedUrl, rm.feedUrl) && TextUtils.equals(itemIdentifier, rm.itemIdentifier);
    }
    if (other instanceof FeedMedia) {
        FeedMedia fm = (FeedMedia) other;
        if (!TextUtils.equals(downloadUrl, fm.getStreamUrl())) {
            return false;
        }
        FeedItem fi = fm.getItem();
        if (fi == null || !TextUtils.equals(itemIdentifier, fi.getItemIdentifier())) {
            return false;
        }
        Feed feed = fi.getFeed();
        return feed != null && TextUtils.equals(feedUrl, feed.getDownload_url());
    }
    return false;
}
Also used : FeedItem(de.danoeh.antennapod.core.feed.FeedItem) FeedMedia(de.danoeh.antennapod.core.feed.FeedMedia) Feed(de.danoeh.antennapod.core.feed.Feed)

Example 3 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class NSRSS20 method handleElementStart.

@Override
public SyndElement handleElementStart(String localName, HandlerState state, Attributes attributes) {
    if (ITEM.equals(localName)) {
        state.setCurrentItem(new FeedItem());
        state.getItems().add(state.getCurrentItem());
        state.getCurrentItem().setFeed(state.getFeed());
    } else if (ENCLOSURE.equals(localName)) {
        String type = attributes.getValue(ENC_TYPE);
        String url = attributes.getValue(ENC_URL);
        boolean validType = SyndTypeUtils.enclosureTypeValid(type);
        if (!validType) {
            type = SyndTypeUtils.getMimeTypeFromUrl(url);
            validType = SyndTypeUtils.enclosureTypeValid(type);
        }
        boolean validUrl = !TextUtils.isEmpty(url);
        if (state.getCurrentItem() != null && state.getCurrentItem().getMedia() == null && validType && validUrl) {
            long size = 0;
            try {
                size = Long.parseLong(attributes.getValue(ENC_LEN));
                if (size < 16384) {
                    // less than 16kb is suspicious, check manually
                    size = 0;
                }
            } catch (NumberFormatException e) {
                Log.d(TAG, "Length attribute could not be parsed.");
            }
            FeedMedia media = new FeedMedia(state.getCurrentItem(), url, size, type);
            state.getCurrentItem().setMedia(media);
        }
    } else if (IMAGE.equals(localName)) {
        if (state.getTagstack().size() >= 1) {
            String parent = state.getTagstack().peek().getName();
            if (CHANNEL.equals(parent)) {
                Feed feed = state.getFeed();
                if (feed != null && feed.getImage() == null) {
                    feed.setImage(new FeedImage());
                    feed.getImage().setOwner(state.getFeed());
                }
            }
        }
    }
    return new SyndElement(localName, this);
}
Also used : FeedImage(de.danoeh.antennapod.core.feed.FeedImage) FeedItem(de.danoeh.antennapod.core.feed.FeedItem) FeedMedia(de.danoeh.antennapod.core.feed.FeedMedia) Feed(de.danoeh.antennapod.core.feed.Feed)

Example 4 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class DBReader method getNavDrawerData.

/**
     * Returns data necessary for displaying the navigation drawer. This includes
     * the list of subscriptions, the number of items in the queue and the number of unread
     * items.
     *
     */
public static NavDrawerData getNavDrawerData() {
    Log.d(TAG, "getNavDrawerData() called with: " + "");
    PodDBAdapter adapter = PodDBAdapter.getInstance();
    adapter.open();
    List<Feed> feeds = getFeedList(adapter);
    long[] feedIds = new long[feeds.size()];
    for (int i = 0; i < feeds.size(); i++) {
        feedIds[i] = feeds.get(i).getId();
    }
    final LongIntMap feedCounters = adapter.getFeedCounters(feedIds);
    Comparator<Feed> comparator;
    int feedOrder = UserPreferences.getFeedOrder();
    if (feedOrder == UserPreferences.FEED_ORDER_COUNTER) {
        comparator = (lhs, rhs) -> {
            long counterLhs = feedCounters.get(lhs.getId());
            long counterRhs = feedCounters.get(rhs.getId());
            if (counterLhs > counterRhs) {
                // reverse natural order: podcast with most unplayed episodes first
                return -1;
            } else if (counterLhs == counterRhs) {
                return lhs.getTitle().compareToIgnoreCase(rhs.getTitle());
            } else {
                return 1;
            }
        };
    } else if (feedOrder == UserPreferences.FEED_ORDER_ALPHABETICAL) {
        comparator = (lhs, rhs) -> {
            String t1 = lhs.getTitle();
            String t2 = rhs.getTitle();
            if (t1 == null) {
                return 1;
            } else if (t2 == null) {
                return -1;
            } else {
                return t1.compareToIgnoreCase(t2);
            }
        };
    } else {
        comparator = (lhs, rhs) -> {
            if (lhs.getItems() == null || lhs.getItems().size() == 0) {
                List<FeedItem> items = DBReader.getFeedItemList(lhs);
                lhs.setItems(items);
            }
            if (rhs.getItems() == null || rhs.getItems().size() == 0) {
                List<FeedItem> items = DBReader.getFeedItemList(rhs);
                rhs.setItems(items);
            }
            if (lhs.getMostRecentItem() == null) {
                return 1;
            } else if (rhs.getMostRecentItem() == null) {
                return -1;
            } else {
                Date d1 = lhs.getMostRecentItem().getPubDate();
                Date d2 = rhs.getMostRecentItem().getPubDate();
                return d2.compareTo(d1);
            }
        };
    }
    Collections.sort(feeds, comparator);
    int queueSize = adapter.getQueueSize();
    int numNewItems = adapter.getNumberOfNewItems();
    int numDownloadedItems = adapter.getNumberOfDownloadedEpisodes();
    NavDrawerData result = new NavDrawerData(feeds, queueSize, numNewItems, numDownloadedItems, feedCounters, UserPreferences.getEpisodeCleanupAlgorithm().getReclaimableItems());
    adapter.close();
    return result;
}
Also used : FeedItemPubdateComparator(de.danoeh.antennapod.core.util.comparator.FeedItemPubdateComparator) Arrays(java.util.Arrays) SimpleChapter(de.danoeh.antennapod.core.feed.SimpleChapter) Date(java.util.Date) DownloadStatusComparator(de.danoeh.antennapod.core.util.comparator.DownloadStatusComparator) VorbisCommentChapter(de.danoeh.antennapod.core.feed.VorbisCommentChapter) LongList(de.danoeh.antennapod.core.util.LongList) ArrayList(java.util.ArrayList) UserPreferences(de.danoeh.antennapod.core.preferences.UserPreferences) FeedImage(de.danoeh.antennapod.core.feed.FeedImage) ArrayMap(android.support.v4.util.ArrayMap) Map(java.util.Map) Feed(de.danoeh.antennapod.core.feed.Feed) DownloadStatus(de.danoeh.antennapod.core.service.download.DownloadStatus) Log(android.util.Log) PlaybackCompletionDateComparator(de.danoeh.antennapod.core.util.comparator.PlaybackCompletionDateComparator) Cursor(android.database.Cursor) LongIntMap(de.danoeh.antennapod.core.util.LongIntMap) FeedMedia(de.danoeh.antennapod.core.feed.FeedMedia) ID3Chapter(de.danoeh.antennapod.core.feed.ID3Chapter) FeedItem(de.danoeh.antennapod.core.feed.FeedItem) FeedPreferences(de.danoeh.antennapod.core.feed.FeedPreferences) List(java.util.List) Chapter(de.danoeh.antennapod.core.feed.Chapter) Comparator(java.util.Comparator) Collections(java.util.Collections) FlattrThing(de.danoeh.antennapod.core.util.flattr.FlattrThing) Date(java.util.Date) LongList(de.danoeh.antennapod.core.util.LongList) ArrayList(java.util.ArrayList) List(java.util.List) LongIntMap(de.danoeh.antennapod.core.util.LongIntMap) Feed(de.danoeh.antennapod.core.feed.Feed)

Example 5 with Feed

use of de.danoeh.antennapod.core.feed.Feed in project AntennaPod by AntennaPod.

the class DBTasks method loadNextPageOfFeed.

/**
     * Queues the next page of this Feed for download. The given Feed has to be a paged
     * Feed (isPaged()=true) and must contain a nextPageLink.
     *
     * @param context      Used for requesting the download.
     * @param feed         The feed whose next page should be loaded.
     * @param loadAllPages True if any subsequent pages should also be loaded, false otherwise.
     */
public static void loadNextPageOfFeed(final Context context, Feed feed, boolean loadAllPages) throws DownloadRequestException {
    if (feed.isPaged() && feed.getNextPageLink() != null) {
        int pageNr = feed.getPageNr() + 1;
        Feed nextFeed = new Feed(feed.getNextPageLink(), null, feed.getTitle() + "(" + pageNr + ")");
        nextFeed.setPageNr(pageNr);
        nextFeed.setPaged(true);
        nextFeed.setId(feed.getId());
        DownloadRequester.getInstance().downloadFeed(context, nextFeed, loadAllPages, false);
    } else {
        Log.e(TAG, "loadNextPageOfFeed: Feed was either not paged or contained no nextPageLink");
    }
}
Also used : Feed(de.danoeh.antennapod.core.feed.Feed)

Aggregations

Feed (de.danoeh.antennapod.core.feed.Feed)95 FeedItem (de.danoeh.antennapod.core.feed.FeedItem)55 PodDBAdapter (de.danoeh.antennapod.core.storage.PodDBAdapter)32 ArrayList (java.util.ArrayList)30 Date (java.util.Date)30 FeedMedia (de.danoeh.antennapod.core.feed.FeedMedia)21 File (java.io.File)20 Cursor (android.database.Cursor)16 FeedImage (de.danoeh.antennapod.core.feed.FeedImage)14 Context (android.content.Context)13 FlakyTest (android.test.FlakyTest)9 DialogInterface (android.content.DialogInterface)8 Intent (android.content.Intent)8 LayoutInflater (android.view.LayoutInflater)7 AdapterView (android.widget.AdapterView)7 ConfirmationDialog (de.danoeh.antennapod.core.dialog.ConfirmationDialog)6 FeedPreferences (de.danoeh.antennapod.core.feed.FeedPreferences)6 DownloadRequestException (de.danoeh.antennapod.core.storage.DownloadRequestException)6 Log (android.util.Log)4 View (android.view.View)4