Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
 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)
Exemplo n.º 3
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)
Exemplo n.º 4
0
    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"])
Exemplo n.º 5
0
    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"])
Exemplo n.º 6
0
    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