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, podcast_name=None): if podcast_name is not None: episodes = FileStorage().get_podcasts()[podcast_name].episodes else: episodes = [] for podcast in FileStorage().get_podcasts().values(): episodes.extend(podcast.episodes) episodes.sort(key=lambda e: e.published, reverse=True) for episode in episodes: try: print(episode.title, episode.media_href) except BrokenPipeError: return
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 test_save_podcast(tmpdir, monkeypatch): file_storage = FileStorage() monkeypatch.setattr( 'riley.storage.user_data_dir', lambda x, y: tmpdir.strpath) podcast = Podcast('abc', 'def', FileEpisodeStorage()) podcast.episodes.append(Episode( podcast, 1, 2, 3, 4, strptime('2015-11-12 01:02:03', '%Y-%m-%d %H:%M:%S'), True)) file_storage.save_podcast(podcast) config_path = tmpdir.join('config.yml') data = yaml.load(config_path.read()) assert len(data) == 2 assert data['podcasts'] == {'abc': {'feed': 'def', 'priority': 5}} history_path = tmpdir.join('abc_history.csv') assert history_path.read() == \ 'guid,title,link,media_href,published,downloaded\n' \ '1,2,3,4,2015-11-12 01:02:03,True\n'
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 test_save_podcast(tmpdir, monkeypatch): file_storage = FileStorage() monkeypatch.setattr('riley.storage.user_data_dir', lambda x, y: tmpdir.strpath) podcast = Podcast('abc', 'def', FileEpisodeStorage()) podcast.episodes.append( Episode(podcast, 1, 2, 3, 4, strptime('2015-11-12 01:02:03', '%Y-%m-%d %H:%M:%S'), True)) file_storage.save_podcast(podcast) config_path = tmpdir.join('config.yml') data = yaml.load(config_path.read()) assert len(data) == 2 assert data['podcasts'] == {'abc': {'feed': 'def', 'priority': 5}} history_path = tmpdir.join('abc_history.csv') assert history_path.read() == \ 'guid,title,link,media_href,published,downloaded\n' \ '1,2,3,4,2015-11-12 01:02:03,True\n'
def test_dont_save_podcast_if_not_modified(tmpdir, monkeypatch): monkeypatch.setattr('riley.storage.user_data_dir', lambda x, y: tmpdir.strpath) podcast = Podcast('abc', 'def', MagicMock()) file_storage = FileStorage() save_config_data = MagicMock(side_effect=file_storage._save_config_data) file_storage._save_config_data = save_config_data file_storage.save_podcast(podcast) # Wrote the podcats to disc assert file_storage._save_config_data.call_count == 1 file_storage.save_podcast(podcast) # Since the podcast hasn't been modified it wasn't rewritten to disc assert file_storage._save_config_data.call_count == 1
def test_dont_save_podcast_if_not_modified(tmpdir, monkeypatch): monkeypatch.setattr( 'riley.storage.user_data_dir', lambda x, y: tmpdir.strpath) podcast = Podcast('abc', 'def', MagicMock()) file_storage = FileStorage() save_config_data = MagicMock(side_effect=file_storage._save_config_data) file_storage._save_config_data = save_config_data file_storage.save_podcast(podcast) # Wrote the podcats to disc assert file_storage._save_config_data.call_count == 1 file_storage.save_podcast(podcast) # Since the podcast hasn't been modified it wasn't rewritten to disc assert file_storage._save_config_data.call_count == 1
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): for podcast in FileStorage().get_podcasts().values(): try: print(podcast.name, podcast.feed) except BrokenPipeError: return
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)