def handle(self, podcast_name=None): file_storage = FileStorage() if podcast_name is None: podcasts = file_storage.get_podcasts().values() else: podcasts = [file_storage.get_podcasts()[podcast_name]] for podcast in podcasts: print(podcast.name) feed = feedparser.parse(podcast.feed) episodes = [] for entry in feed.entries: enclosures = getattr(entry, 'enclosures', []) if len(enclosures) == 0: continue # Use an empty string when no link is available link = getattr(entry, 'link', '') media_href = entry.enclosures[0].href episodes.append( Episode(podcast, entry.guid, entry.title, link, media_href, entry.published_parsed, False)) for episode in episodes: if episode not in podcast.episodes: podcast.episodes.append(episode) FileEpisodeStorage().save_episodes(podcast)
def test_file_storage(tmpdir, monkeypatch): config_path = tmpdir.join('config.yml') config_path.write(config) history_path = tmpdir.join('kalle_history.csv') history_path.write(history) file_storage = FileStorage() monkeypatch.setattr( 'riley.storage.user_data_dir', lambda x, y: tmpdir.strpath) podcasts = file_storage.get_podcasts() assert len(podcasts), 1 podcast = podcasts['kalle'] assert podcast.name == 'kalle' assert podcast.feed == 'http://anka.se' assert podcast.priority == 5 assert len(podcast.episodes) == 1 episode = podcast.episodes[0] assert episode.guid == 'abc' assert episode.title == 'def' assert episode.link == 'ghi' assert episode.media_href == 'jkl' assert episode.published == struct_time(( 2012, 12, 12, 12, 12, 12, 2, 347, -1)) assert episode.downloaded == True
def test_file_storage(tmpdir, monkeypatch): config_path = tmpdir.join('config.yml') config_path.write(config) history_path = tmpdir.join('kalle_history.csv') history_path.write(history) file_storage = FileStorage() monkeypatch.setattr('riley.storage.user_data_dir', lambda x, y: tmpdir.strpath) podcasts = file_storage.get_podcasts() assert len(podcasts), 1 podcast = podcasts['kalle'] assert podcast.name == 'kalle' assert podcast.feed == 'http://anka.se' assert podcast.priority == 5 assert len(podcast.episodes) == 1 episode = podcast.episodes[0] assert episode.guid == 'abc' assert episode.title == 'def' assert episode.link == 'ghi' assert episode.media_href == 'jkl' assert episode.published == struct_time( (2012, 12, 12, 12, 12, 12, 2, 347, -1)) assert episode.downloaded == True
def handle(self, podcasts_and_episodes): file_storage = FileStorage() podcasts = file_storage.get_podcasts() podcasts_and_episodes_to_download = OrderedDict() podcast = None for string in podcasts_and_episodes: if podcast is not None: episode_ranges = string try: episode_indices_to_download = self.get_indices( episode_ranges) except ValueError: episodes = podcast.episodes podcasts_and_episodes_to_download[podcast] = episodes podcast = None else: if episode_indices_to_download[-1] < len(podcast.episodes): episodes = [podcast.episodes[i] for i in episode_indices_to_download] podcasts_and_episodes_to_download[podcast] = episodes podcast = None continue else: last = episode_indices_to_download[-1] sys.exit('\n'.join([ "The podcast does not have an episode with index '%d'." % last, "", "The valid range is: [%d, %d]" % (0, len(podcast.episodes) - 1), ])) if podcast is None: podcast_name = string if podcast_name in podcasts: podcast = podcasts[podcast_name] podcasts_and_episodes_to_download[podcast] = None else: list_of_podcasts = '\n'.join( '* %s' % name for name in podcasts.keys()) sys.exit('\n'.join([ "A podcast with the name '%s' does not exist." % podcast_name, "", "Try one of these instead:", "", list_of_podcasts ])) if len(podcasts_and_episodes_to_download) > 0: episodes = chain.from_iterable( podcasts_and_episodes_to_download.values()) else: episodes = chain.from_iterable( podcast.episodes for podcast in podcasts.values()) download_directory = file_storage.get_config()['storage'] for episode in episodes: download.download(episode.media_href, download_directory, episode.published) episode.downloaded = True FileStorage().save_podcast(episode.podcast)
def handle(self, number_of_episodes): file_storage = FileStorage() podcasts = file_storage.get_podcasts() episodes = [] for podcast in podcasts.values(): episodes.extend(podcast.episodes) episodes = heapq.nlargest( number_of_episodes, episodes, key=lambda e: e.score) download_directory = file_storage.get_config()['storage'] for episode in episodes: print("Downloading '{}' from '{}'.".format( episode.title, episode.podcast.name)) download.download(episode.media_href, download_directory, episode.published) episode.downloaded = True FileStorage().save_podcast(episode.podcast)
def handle(self, number_of_episodes): file_storage = FileStorage() podcasts = file_storage.get_podcasts() episodes = [] for podcast in podcasts.values(): episodes.extend(podcast.episodes) episodes = heapq.nlargest(number_of_episodes, episodes, key=lambda e: e.score) download_directory = file_storage.get_config()['storage'] for episode in episodes: print("Downloading '{}' from '{}'.".format(episode.title, episode.podcast.name)) download.download(episode.media_href, download_directory, episode.published) episode.downloaded = True FileStorage().save_podcast(episode.podcast)
def handle(self, name, url): file_storage = FileStorage() if name not in file_storage.get_podcasts(): file_storage.save_podcast(Podcast(name, url, FileEpisodeStorage())) else: sys.exit("The name '%s' is already registered." % name)
def handle(self, podcasts_and_episodes): file_storage = FileStorage() podcasts = file_storage.get_podcasts() podcasts_and_episodes_to_download = OrderedDict() podcast = None for string in podcasts_and_episodes: if podcast is not None: episode_ranges = string try: episode_indices_to_download = self.get_indices( episode_ranges) except ValueError: episodes = podcast.episodes podcasts_and_episodes_to_download[podcast] = episodes podcast = None else: if episode_indices_to_download[-1] < len(podcast.episodes): episodes = [ podcast.episodes[i] for i in episode_indices_to_download ] podcasts_and_episodes_to_download[podcast] = episodes podcast = None continue else: last = episode_indices_to_download[-1] sys.exit('\n'.join([ "The podcast does not have an episode with index '%d'." % last, "", "The valid range is: [%d, %d]" % (0, len(podcast.episodes) - 1), ])) if podcast is None: podcast_name = string if podcast_name in podcasts: podcast = podcasts[podcast_name] podcasts_and_episodes_to_download[podcast] = None else: list_of_podcasts = '\n'.join('* %s' % name for name in podcasts.keys()) sys.exit('\n'.join([ "A podcast with the name '%s' does not exist." % podcast_name, "", "Try one of these instead:", "", list_of_podcasts ])) if len(podcasts_and_episodes_to_download) > 0: episodes = chain.from_iterable( podcasts_and_episodes_to_download.values()) else: episodes = chain.from_iterable(podcast.episodes for podcast in podcasts.values()) download_directory = file_storage.get_config()['storage'] for episode in episodes: download.download(episode.media_href, download_directory, episode.published) episode.downloaded = True FileStorage().save_podcast(episode.podcast)