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, '*****@*****.**')
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)
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()]))
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)
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")
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'})
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))
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))
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()
def test_get_options(self): with Database(DATABASE) as db: self.assertEqual((HOME, False, ''), db.get_options())