Ejemplo n.º 1
0
 def test_get_credentials(self):
     with Database(DATABASE) as db:
         sender, password, recipient = db.get_credentials()
     self.assertEqual(sender, '')
     self.assertEqual(recipient, '')
     with Database(DATABASE) as db:
         db.change_option('sender_address', '*****@*****.**')
         sender, *_ = db.get_credentials()
     self.assertEqual(sender, '*****@*****.**')
Ejemplo n.º 2
0
    def test_add_podcast(self):

        with Database(DATABASE) as db:
            db.add_podcast(name=NAME, url=URL, directory=DIRECTORY)
        conn = sqlite3.connect(DATABASE)
        cursor = conn.cursor()
        cursor.execute('SELECT * FROM main.podcasts WHERE id = 1')
        res = cursor.fetchone()
        self.assertEqual(res, (1, NAME, URL, DIRECTORY))
        with Database(DATABASE) as db:
            with self.assertRaises(
                    sqlite3.IntegrityError
            ):  # Checking that unique constraint is raised
                db.add_podcast(name=NAME, url=URL, directory=DIRECTORY)
Ejemplo n.º 3
0
 def test_remove_podcast(self):
     url2 = 'google.com'
     with Database(DATABASE) as db:
         db.add_podcast(name=NAME, url=URL, directory=DIRECTORY)
         db.add_podcast(name=NAME, url=url2, directory=DIRECTORY)
         db.add_episode(podcast_url=URL, feed_id='123456')
         db.add_episode(podcast_url=URL, feed_id='512312456')
     with Database(DATABASE) as db:
         db.remove_podcast(url=URL)
     conn = sqlite3.connect(DATABASE)
     cursor = conn.cursor()
     cursor.execute('SELECT * from main.episodes')
     self.assertEqual(0, len([i[0] for i in cursor.fetchall()]))
     cursor.execute('SELECT * from main.podcasts')
     self.assertEqual(1, len([i[0] for i in cursor.fetchall()]))
Ejemplo n.º 4
0
def threaded_downloader(eps_to_download: List[Episode]) -> None:
    """Create thread-pool to download episodes.

    :param eps_to_download: list of Episodes to be downloaded
    :return: None
    """
    def download_worker(episode: Episode) -> Episode:
        """Download and tag episode.

        Function used by ThreadPool.map to download each episode.
        :param: episode Episode obj
        :return: Noned
        """
        print(f"Downloading {episode.podcast_name} - {episode.title}")
        episode.download()
        episode.tag()
        if not episode.error:
            return episode

    if eps_to_download:
        pool = ThreadPool(3)
        results = pool.map(download_worker, eps_to_download)
        pool.close()
        pool.join()
        with Database() as _db:
            for epi in results:
                if epi:
                    _db.add_episode(podcast_url=epi.podcast_url,
                                    feed_id=epi.entry.id)
Ejemplo n.º 5
0
def downloader() -> None:
    """Download all new episodes.

    Refreshes subscriptions, downloads new episodes, sends email messages.
    :return: None.
    """
    with Database() as _db:
        _, send_notifications, _ = _db.get_options()
        if send_notifications:
            sender, password, recipient = _db.get_credentials()
            if not password:
                send_notifications = False
                print(
                    'Unable to fetch password from keyring, notifications disabled.'
                )
        podcasts, eps_to_download = threaded_update(_db.get_podcasts())
    if podcasts and eps_to_download:
        threaded_downloader(eps_to_download)
        if send_notifications:
            message_packet = [
                p.good_episodes for p in podcasts
                if p.good_episodes is not None
            ]
            if message_packet:
                Message(message_packet, sender, password, recipient).send()
    else:
        print("No new episodes")
Ejemplo n.º 6
0
 def test_get_episodes(self):
     url2 = 'google.com'
     with Database(DATABASE) as db:
         db.add_podcast(name=NAME, url=URL, directory=DIRECTORY)
         db.add_podcast(name=NAME, url=url2, directory=DIRECTORY)
         db.add_episode(podcast_url=URL, feed_id='123456')
         db.add_episode(podcast_url=URL, feed_id='512312456')
         db.add_episode(podcast_url=URL, feed_id='4')
         db.add_episode(podcast_url=URL, feed_id='5')
         db.add_episode(podcast_url=url2, feed_id='1')
         db.add_episode(podcast_url=url2, feed_id='2')
     with Database(DATABASE) as db:
         db.add_episode(podcast_url=URL, feed_id='6')
         db.add_episode(podcast_url=url2, feed_id='3')
     with Database(DATABASE) as db:
         self.assertEqual(db.get_episodes(URL),
                          {'123456', '512312456', '4', '5', '6'})
         self.assertEqual(db.get_episodes(url2), {'1', '2', '3'})
Ejemplo n.º 7
0
 def test_get_podcasts(self):
     url2 = 'google.com'
     with Database(DATABASE) as db:
         db.add_podcast(name=NAME, url=URL, directory=DIRECTORY)
         db.add_podcast(name=NAME, url=url2, directory=DIRECTORY)
         podcasts = db.get_podcasts()
     one, two = podcasts
     self.assertEqual(one, (NAME, URL, DIRECTORY))
     self.assertEqual(two, (NAME, url2, DIRECTORY))
Ejemplo n.º 8
0
 def test_add_episodes(self):
     feed_id = '1234567'
     with Database(DATABASE) as db:
         db.add_podcast(name=NAME, url=URL, directory=DIRECTORY)
         db.add_episode(podcast_url=URL, feed_id=feed_id)
     conn = sqlite3.connect(DATABASE)
     cursor = conn.cursor()
     cursor.execute('SELECT * FROM main.episodes WHERE id = 1')
     res = cursor.fetchone()
     self.assertEqual(res, (1, feed_id, 1))
Ejemplo n.º 9
0
    def __init__(self, url: str, directory: str):
        """init method.

        :param url: rss feed url for this podcast
        :param directory: download directory for this podcast
        """
        self._url = url
        self._dl_dir = directory
        self._logger = logger(f"{self.__class__.__name__}")
        self.episodes: tp.List[Episode] = []
        _old_eps = Database().get_episodes(self._url)
        _feed: fp.FeedParserDict = fp.parse(self._url)
        self._name = _feed.feed.get("title", default=self._url)
        try:
            self._image = _feed.feed.image.href
        except (KeyError, AttributeError):
            self._logger.exception(f"No image for {self._url}")
            self._image = None
        self._new_entries = [
            item for item in _feed.entries if item.id not in _old_eps
        ]
        self._episode_parser()
Ejemplo n.º 10
0
 def test_get_options(self):
     with Database(DATABASE) as db:
         self.assertEqual((HOME, False, ''), db.get_options())