def test_youtube_error_is_400(self): google_key = '123' broadcast = 'foo' manager = YoutubeManager(logging, None, google_key) url = urls.youtube_channel_get(broadcast, google_key) code = 400 httpretty.register_uri(httpretty.GET, url, body=json.dumps(youtube_archive1.DATA), status=code) with self.assertRaises(HathorException) as error: manager.broadcast_update(broadcast) self.check_error_message('Invalid status code:%s' % code, error)
def test_youtube_do_not_download_non_videos(self): broadcast = utils.random_string() google_key = utils.random_string() manager = YoutubeManager(logging, None, google_key) url = urls.youtube_channel_get(broadcast, google_key) httpretty.register_uri(httpretty.GET, url, body=json.dumps(youtube_one_item_not_video.DATA), content_type='application/json') with mock.patch('youtube_dl.YoutubeDL', side_effect=test_utils.youtube_mock): episodes = manager.broadcast_update(broadcast) self.assert_length(episodes, 0)
def test_episode_sync_exits_on_maximum(self): with test_utils.temp_podcast(self.client, archive_type="youtube", max_allowed=1) as podcast: url1 = urls.youtube_channel_get(podcast["broadcast_id"], self.client.google_api_key) with mock.patch("youtube_dl.YoutubeDL", side_effect=test_utils.youtube_mock): httpretty.register_uri( httpretty.GET, url1, body=json.dumps(youtube_archive1.DATA), content_type="application/json" ) self.client.episode_sync() episode_list = self.client.episode_list(only_files=False) self.assert_length(episode_list, 1)
def test_download_youtube_skips_live(self): with test_utils.temp_podcast(self.client, archive_type="youtube", max_allowed=1) as podcast: url1 = urls.youtube_channel_get(podcast["broadcast_id"], self.client.google_api_key) with mock.patch("youtube_dl.YoutubeDL", side_effect=test_utils.youtube_mock_live): httpretty.register_uri( httpretty.GET, url1, body=json.dumps(youtube_archive1.DATA), content_type="application/json" ) url2 = urls.youtube_channel_get( podcast["broadcast_id"], self.client.google_api_key, page_token=youtube_archive1.DATA["nextPageToken"], ) httpretty.register_uri( httpretty.GET, url2, body=json.dumps(youtube_archive2.DATA), content_type="application/json" ) self.client.episode_sync() episode_list = self.client.episode_list(only_files=False) test_episode = episode_list[0] self.client.episode_download(test_episode["id"]) episode = self.client.episode_show(test_episode["id"])[0] self.assert_none(episode["file_path"])
def test_episode_passes_title_filters(self): with test_utils.temp_podcast(self.client, archive_type="youtube", max_allowed=1) as podcast: url1 = urls.youtube_channel_get(podcast["broadcast_id"], self.client.google_api_key) episode_title = youtube_archive1.DATA["items"][-1]["snippet"]["title"] first_item_title_regex = "^%s" % episode_title self.client.podcast_title_filter_create(podcast["id"], first_item_title_regex) with mock.patch("youtube_dl.YoutubeDL", side_effect=test_utils.youtube_mock): httpretty.register_uri( httpretty.GET, url1, body=json.dumps(youtube_archive1.DATA), content_type="application/json" ) self.client.episode_sync() episode_list = self.client.episode_list(only_files=False) self.assert_length(episode_list, 1) self.assertEqual(episode_title, episode_list[0]["title"])
def broadcast_update(self, broadcast_id, max_results=None, filters=None): self.logger.debug("Getting episodes for youtube broadcast:%s", broadcast_id) pagetoken = None archive_data = [] filters = filters or [] while True: url = urls.youtube_channel_get(broadcast_id, self.google_api_key, page_token=pagetoken) req = requests.get(url) if req.status_code == 400 or req.status_code == 403: raise HathorException("Invalid status code:%s" % req.status_code) data = json.loads(req.text) for item in data["items"]: if item["id"]["kind"] != "youtube#video": self.logger.debug("Item %s is not a video, skipping" % str(item["id"])) continue title = utils.clean_string(item["snippet"]["title"]) if not verify_title_filters(filters, title): self.logger.debug("Title:%s , does not pass filters, skipping", title) continue download_url = "https://www.youtube.com/watch?v=%s" % item["id"]["videoId"] date = datetime.strptime(item["snippet"]["publishedAt"], "%Y-%m-%dT%H:%M:%S.000Z") episode_data = { "title": title, "description": utils.clean_string(item["snippet"]["description"]), "download_link": download_url, "date": date, } archive_data.append(episode_data) if max_results and len(archive_data) >= max_results: self.logger.debug("At max results:%s, exiting early", max_results) return archive_data try: pagetoken = data["nextPageToken"] except KeyError: self.logger.debug("No key 'pagetoken' in youtube data, exiting") break if not pagetoken: self.logger.debug("Page token is none in youtube data, exiting") break return archive_data