1 from itertools
import chain
, islice
8 from mygpo
.core
.models
import Podcast
9 from mygpo
.core
.proxy
import proxy_object
10 from mygpo
.db
.couchdb
.episode
import episodes_for_podcast
13 class PodcastSet(set):
14 """ Represents a set of podcasts """
16 def __init__(self
, podcasts
=None):
17 self
.podcasts
= podcasts
or []
20 def get_newest_episodes(self
, max_date
, num_episodes
, max_per_podcast
=5):
21 """ Returns the newest episodes for a set of podcasts """
23 podcast_key
= lambda p
: p
.latest_episode_timestamp
25 podcasts
= filter(lambda p
: p
.latest_episode_timestamp
, self
.podcasts
)
26 podcasts
= sorted(podcasts
, key
=podcast_key
, reverse
=True)
28 # we need at most num_episodes podcasts
29 podcasts
= podcasts
[:num_episodes
]
31 podcast_dict
= dict((p
.get_id(), p
) for p
in podcasts
)
34 jobs
= [gevent
.spawn(episodes_for_podcast
, podcast
, since
=1,
35 until
=max_date
, descending
=True,
36 limit
=max_per_podcast
) for podcast
in podcasts
]
40 episodes
= chain
.from_iterable(job
.get() for job
in jobs
)
43 episodes
= [episodes_for_podcast(podcast
, since
=1,
44 until
=max_date
, descending
=True,
45 limit
=max_per_podcast
) for podcast
in podcasts
]
48 episodes
= sorted(episodes
, key
=lambda e
: e
.released
, reverse
=True)
50 for episode
in islice(episodes
, num_episodes
):
51 p
= podcast_dict
.get(episode
.podcast
, None)
52 yield proxy_object(episode
, podcast
=p
)