make gevent optional
[mygpo.git] / mygpo / core / podcasts.py
blob4ca3d766c8b6025ed58bfd0b2cc072cd31dcefc3
1 from itertools import chain, islice
3 try:
4 import gevent
5 except ImportError:
6 gevent = None
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)
33 if gevent:
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]
38 gevent.joinall(jobs)
40 episodes = chain.from_iterable(job.get() for job in jobs)
42 else:
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)