Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
 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
Exemplo n.º 7
0
    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)
Exemplo n.º 8
0
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'
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
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'
Exemplo n.º 11
0
 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
Exemplo n.º 12
0
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
Exemplo n.º 13
0
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
Exemplo n.º 14
0
 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)
Exemplo n.º 15
0
 def handle(self):
     for podcast in FileStorage().get_podcasts().values():
         try:
             print(podcast.name, podcast.feed)
         except BrokenPipeError:
             return
Exemplo n.º 16
0
    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)
Exemplo n.º 17
0
 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)