示例#1
0
    def test_podcast_file_sync(self):
        # download only one podcast episode
        with utils.temp_podcast(self.client, archive_type='soundcloud', max_allowed=1) as podcast:
            url = urls.soundcloud_track_list(podcast['broadcast_id'],
                                             self.client.soundcloud_client_id)
            httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_one_track.DATA))
            self.client.episode_sync()

            episode_list = self.client.episode_list(only_files=False)
            with utils.temp_audio_file() as mp3_body:
                utils.mock_mp3_download(episode_list[0]['download_url'], mp3_body)
                self.client.podcast_file_sync()
                episode_list = self.client.episode_list()
                self.assert_not_none(episode_list[0]['file_path'])
                first_episode_date = episode_list[0]['date']
                # add an additional, newer podcast, make sure things are deleted
                url = urls.soundcloud_track_list(podcast['broadcast_id'],
                                                 self.client.soundcloud_client_id)
                httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_two_tracks.DATA))
                self.client.episode_sync()
                episode_list = self.client.episode_list(only_files=False)
                with utils.temp_audio_file() as mp3_body:
                    utils.mock_mp3_download(episode_list[1]['download_url'], mp3_body)
                    self.client.podcast_file_sync()

                    # make sure 2 episodes in db, but only 1 with a file path
                    episode_list = self.client.episode_list()
                    self.assert_not_none(episode_list[0]['file_path'])
                    all_episodes = self.client.episode_list(only_files=False)
                    self.assertNotEqual(len(episode_list), len(all_episodes))
                    second_episode_date = episode_list[0]['date']

                    self.assertTrue(datetime.strptime(second_episode_date, self.client.datetime_output_format) >
                                    datetime.strptime(first_episode_date, self.client.datetime_output_format))
示例#2
0
    def test_episode_prevent_deletion(self):
        # download only one podcast episode
        with test_utils.temp_podcast(self.client, archive_type="soundcloud", max_allowed=1) as podcast:
            url = urls.soundcloud_track_list(podcast["broadcast_id"], self.client.soundcloud_client_id)
            httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_one_track.DATA))
            self.client.episode_sync()
            episode_list = self.client.episode_list(only_files=False)
            with test_utils.temp_audio_file() as mp3_body:
                test_utils.mock_mp3_download(episode_list[0]["download_url"], mp3_body)
                self.client.podcast_file_sync()
                # mark episode to prevent deletion
                self.client.episode_update(episode_list[0]["id"], prevent_delete=True)

                # add an additional, newer podcast, make sure prevented deletion episode stays
                url = urls.soundcloud_track_list(podcast["broadcast_id"], self.client.soundcloud_client_id)
                httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_three_tracks.DATA))
                self.client.episode_sync(max_episode_sync=0)
                episode_list = self.client.episode_list(only_files=False)

                test_utils.mock_mp3_download(episode_list[1]["download_url"], mp3_body)
                test_utils.mock_mp3_download(episode_list[2]["download_url"], mp3_body)
                self.client.podcast_file_sync()

                episode_list = self.client.episode_list()
                ep_ids = [i["id"] for i in episode_list]

                self.assertTrue(2 in ep_ids)
                self.assertTrue(1 in ep_ids)
                self.assertTrue(3 not in ep_ids)
示例#3
0
 def test_soundcloud_broadcast_update_skip_cant_download(self):
     sound_id = '123'
     broadcast = 'foo'
     manager = SoundcloudManager(logging, sound_id, None)
     url = urls.soundcloud_track_list(broadcast, sound_id)
     httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_one_track_cant_download.DATA))
     episodes = manager.broadcast_update(broadcast)
     self.assert_length(episodes, 0)
示例#4
0
 def test_soundcloud_error_status_not_200(self):
     sound_id = '123'
     broadcast = 'foo'
     manager = SoundcloudManager(logging, sound_id, None)
     url = urls.soundcloud_track_list(broadcast, sound_id)
     code = 400
     httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_one_track.DATA), status=code)
     with self.assertRaises(HathorException) as error:
         manager.broadcast_update(broadcast)
     self.assertTrue('Error getting soundcloud track list, request error:%s' % code, error)
示例#5
0
 def test_podcast_file_sync_no_automatic_episode_download(self):
     # make sure no max allowed downloads all possible podcasts
     with utils.temp_podcast(self.client, archive_type='soundcloud', max_allowed=None, automatic_download=False) as podcast:
         url = urls.soundcloud_track_list(podcast['broadcast_id'],
                                          self.client.soundcloud_client_id)
         httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_one_track_only_page.DATA))
         self.client.episode_sync()
         episode_list = self.client.episode_list(only_files=False)
         with utils.temp_audio_file() as mp3_body:
             utils.mock_mp3_download(episode_list[0]['download_url'], mp3_body)
             self.client.podcast_file_sync()
             episode_list = self.client.episode_list()
             self.assert_length(episode_list, 0)
示例#6
0
 def test_episode_sync_soundcloud_max_allowed(self):
     # make sure you only get the one page from soundcloud pagination
     with test_utils.temp_podcast(self.client, archive_type="soundcloud", max_allowed=2) as podcast:
         page1_url = urls.soundcloud_track_list(podcast["broadcast_id"], self.client.soundcloud_client_id)
         httpretty.register_uri(
             httpretty.GET,
             page1_url,
             body=json.dumps(soundcloud_archive_page1.DATA),
             content_type="application/json",
         )
         self.client.episode_sync()
         episode_list = self.client.episode_list(only_files=False)
         self.assertEqual(len(episode_list), 2)
示例#7
0
 def test_podcast_dont_delete_episode_files(self):
     with utils.temp_podcast(self.client, archive_type='soundcloud', max_allowed=1) as podcast:
         url = urls.soundcloud_track_list(podcast['broadcast_id'],
                                          self.client.soundcloud_client_id)
         httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_one_track.DATA))
         self.client.episode_sync()
         episode_list = self.client.episode_list(only_files=False)
         with utils.temp_audio_file() as mp3_body:
             utils.mock_mp3_download(episode_list[0]['download_url'], mp3_body)
             self.client.podcast_file_sync()
             episode_list = self.client.episode_list()
             # delete and make sure file is still there
             self.client.podcast_delete(podcast['id'], delete_files=False)
             self.assertTrue(len(os.listdir(podcast['file_location'])) > 0)
             os.remove(episode_list[0]['file_path'])
             os.rmdir(podcast['file_location'])
示例#8
0
 def test_podcast_file_sync_exclude(self):
     # create two podcasts, exclude one, make sure only that pod was updated
     with utils.temp_podcast(self.client, archive_type='soundcloud', max_allowed=1) as podcast1:
         url = urls.soundcloud_track_list(podcast1['broadcast_id'],
                                          self.client.soundcloud_client_id)
         httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_one_track.DATA))
         self.client.episode_sync()
         episode_list = self.client.episode_list(only_files=False)
         with utils.temp_audio_file() as mp3_body:
             utils.mock_mp3_download(episode_list[0]['download_url'], mp3_body)
             with utils.temp_podcast(self.client) as podcast2:
                 self.client.podcast_file_sync(exclude_podcasts=[podcast2['id']], )
                 episode_list = self.client.episode_list()
                 self.assertTrue(len(episode_list) > 0)
                 for episode in episode_list:
                     self.assertEqual(podcast1['id'], episode['podcast_id'])
示例#9
0
 def test_episode_sync_set_number_episodes(self):
     with test_utils.temp_podcast(self.client, archive_type="soundcloud", max_allowed=2) as podcast:
         page1_url = urls.soundcloud_track_list(podcast["broadcast_id"], self.client.soundcloud_client_id)
         httpretty.register_uri(
             httpretty.GET,
             page1_url,
             body=json.dumps(soundcloud_archive_page1.DATA),
             content_type="application/json",
         )
         page2_url = soundcloud_archive_page1.DATA["next_href"]
         httpretty.register_uri(
             httpretty.GET,
             page2_url,
             body=json.dumps(soundcloud_archive_page2.DATA),
             content_type="application/json",
         )
         self.client.episode_sync(max_episode_sync=3)
         episode_list = self.client.episode_list(only_files=False)
         self.assertEqual(len(episode_list), 3)
示例#10
0
    def test_podcast_database_cleanup(self):
        # download only one podcast episode
        with test_utils.temp_podcast(self.client, archive_type="soundcloud", max_allowed=1) as podcast:
            url = urls.soundcloud_track_list(podcast["broadcast_id"], self.client.soundcloud_client_id)
            httpretty.register_uri(httpretty.GET, url, body=json.dumps(soundcloud_two_tracks.DATA))

            self.client.episode_sync(max_episode_sync=0)
            episode_list = self.client.episode_list(only_files=False)
            with test_utils.temp_audio_file() as mp3_body:
                test_utils.mock_mp3_download(episode_list[0]["download_url"], mp3_body)
                self.client.podcast_file_sync()
                episode_list = self.client.episode_list()
                self.assert_not_none(episode_list[0]["file_path"])
                all_episodes = self.client.episode_list(only_files=False)
                self.assertTrue(len(all_episodes) > 1)

                self.client.database_cleanup()
                all_episodes = self.client.episode_list(only_files=False)
                self.assert_length(all_episodes, 1)
示例#11
0
    def test_episode_list_exclude_podcast_filter(self):
        with test_utils.temp_podcast(self.client, archive_type="rss", broadcast_url=True) as podcast1:
            httpretty.register_uri(httpretty.GET, podcast1["broadcast_id"], body=history_on_fire.DATA)

            with test_utils.temp_podcast(self.client, archive_type="soundcloud", max_allowed=2) as podcast2:
                page1_url = urls.soundcloud_track_list(podcast2["broadcast_id"], self.client.soundcloud_client_id)
                httpretty.register_uri(
                    httpretty.GET,
                    page1_url,
                    body=json.dumps(soundcloud_archive_page1.DATA),
                    content_type="application/json",
                )
                self.client.episode_sync()
                episode_list_all = self.client.episode_list(only_files=False)
                episode_list_exc = self.client.episode_list(only_files=False, exclude_podcasts=[podcast2["id"]])
                self.assertNotEqual(len(episode_list_all), len(episode_list_exc))

                for episode in episode_list_exc:
                    self.assertEqual(episode["podcast_id"], podcast1["id"])
示例#12
0
文件: archive.py 项目: tnoff/hathor
    def broadcast_update(self, broadcast_id, max_results=None, filters=None):
        self.logger.debug("Getting episodes from soundcloud broadcast:%s", broadcast_id)
        url = urls.soundcloud_track_list(broadcast_id, self.soundcloud_client_id)
        archive_data = []

        filters = filters or []

        while True:
            req = requests.get(url)
            if req.status_code != 200:
                raise HathorException("Error getting soundcloud track list, request error:%s" % req.status_code)
            data = json.loads(req.text)

            for item in data["collection"]:
                # if not downloadable, skip
                if not item["downloadable"]:
                    self.logger.debug("Item with title:%s not downloadable, skipping", item["title"])
                    continue
                episode_data = {
                    "date": datetime.strptime(item["created_at"], "%Y/%m/%d %H:%M:%S +0000"),
                    "title": utils.clean_string(item["title"]),
                    "download_link": utils.clean_string(item["download_url"]),
                    "description": utils.clean_string(item["description"]),
                }
                if not verify_title_filters(filters, episode_data["title"]):
                    self.logger.debug("Title:%s , does not pass filters, skipping", episode_data["title"])
                    continue
                archive_data.append(episode_data)
                if max_results and max_results <= len(archive_data):
                    self.logger.debug("At max results limit:%s, exiting early", len(archive_data))
                    return archive_data
            # check if another page is there
            try:
                url = data["next_href"]
            except KeyError:
                self.logger.debug("No more soundcloud episodes found, exiting")
                break

        return archive_data