# -*- coding: utf-8 -*- import datetime from unittest import mock from unittest.mock import MagicMock from pytube import Playlist @mock.patch("pytube.contrib.playlist.request.get") def test_title(request_get): request_get.return_value = ( "(149) Python Tutorial for Beginners " "(For Absolute Beginners) - YouTube" ) url = "https://www.fakeurl.com/playlist?list=PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n" pl = Playlist(url) pl_title = pl.title() assert pl_title == "(149) Python Tutorial for Beginners (For Absolute Beginners)" @mock.patch("pytube.contrib.playlist.request.get") def test_init_with_playlist_url(request_get): request_get.return_value = "" url = "https://www.youtube.com/playlist?list=PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n" playlist = Playlist(url) assert playlist.playlist_url == url @mock.patch("pytube.contrib.playlist.request.get") def test_init_with_watch_url(request_get): request_get.return_value = "" url = ( "https://www.youtube.com/watch?v=1KeYzjILqDo&" "list=PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n&index=2&t=661s" ) playlist = Playlist(url) assert ( playlist.playlist_url == "https://www.youtube.com/playlist?list=PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n" ) @mock.patch("pytube.contrib.playlist.request.get") def test_last_update(request_get, playlist_html): expected = datetime.date(2019, 3, 7) request_get.return_value = playlist_html playlist = Playlist("url") assert playlist.last_update == expected @mock.patch("pytube.contrib.playlist.request.get") def test_init_with_watch_id(request_get): request_get.return_value = "" playlist = Playlist("PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n") assert ( playlist.playlist_url == "https://www.youtube.com/playlist?list=PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n" ) @mock.patch("pytube.contrib.playlist.request.get") def test_video_urls(request_get, playlist_html): url = "https://www.fakeurl.com/playlist?list=whatever" request_get.return_value = playlist_html playlist = Playlist(url) playlist._find_load_more_url = MagicMock(return_value=None) request_get.assert_called() assert playlist.video_urls == [ "https://www.youtube.com/watch?v=ujTCoH21GlA", "https://www.youtube.com/watch?v=45ryDIPHdGg", "https://www.youtube.com/watch?v=1BYu65vLKdA", "https://www.youtube.com/watch?v=3AQ_74xrch8", "https://www.youtube.com/watch?v=ddqQUz9mZaM", "https://www.youtube.com/watch?v=vwLT6bZrHEE", "https://www.youtube.com/watch?v=TQKI0KE-JYY", "https://www.youtube.com/watch?v=dNBvQ38MlT8", "https://www.youtube.com/watch?v=JHxyrMgOUWI", "https://www.youtube.com/watch?v=l2I8NycJMCY", "https://www.youtube.com/watch?v=g1Zbuk1gAfk", "https://www.youtube.com/watch?v=zixd-si9Q-o", ] @mock.patch("pytube.contrib.playlist.request.get") @mock.patch("pytube.cli.YouTube.__init__", return_value=None) def test_videos(youtube, request_get, playlist_html): url = "https://www.fakeurl.com/playlist?list=whatever" request_get.return_value = playlist_html playlist = Playlist(url) playlist._find_load_more_url = MagicMock(return_value=None) request_get.assert_called() assert len(list(playlist.videos)) == 12 @mock.patch("pytube.contrib.playlist.request.get") @mock.patch("pytube.cli.YouTube.__init__", return_value=None) def test_load_more(youtube, request_get, playlist_html): url = "https://www.fakeurl.com/playlist?list=whatever" request_get.side_effect = [ playlist_html, '{"content_html":"", "load_more_widget_html":""}', ] playlist = Playlist(url) playlist._find_load_more_url = MagicMock(side_effect=["dummy", None]) request_get.assert_called() assert len(list(playlist.videos)) == 12 @mock.patch("pytube.contrib.playlist.request.get") @mock.patch("pytube.contrib.playlist.install_proxy", return_value=None) def test_proxy(install_proxy, request_get): url = "https://www.fakeurl.com/playlist?list=whatever" request_get.return_value = "" Playlist(url, proxies={"http": "things"}) install_proxy.assert_called_with({"http": "things"}) @mock.patch("pytube.contrib.playlist.request.get") def test_trimmed(request_get, playlist_html): url = "https://www.fakeurl.com/playlist?list=whatever" request_get.return_value = playlist_html playlist = Playlist(url) playlist._find_load_more_url = MagicMock(return_value=None) assert request_get.call_count == 1 trimmed = list(playlist.trimmed("1BYu65vLKdA")) assert trimmed == [ "https://www.youtube.com/watch?v=ujTCoH21GlA", "https://www.youtube.com/watch?v=45ryDIPHdGg", ] @mock.patch("pytube.contrib.playlist.request.get") def test_playlist_failed_pagination(request_get, playlist_long_html): url = "https://www.fakeurl.com/playlist?list=whatever" request_get.side_effect = [ playlist_long_html, "{}", ] playlist = Playlist(url) video_urls = playlist.video_urls assert len(video_urls) == 100 assert request_get.call_count == 2 request_get.assert_called_with( "https://www.youtube.com/browse_ajax?action_continuation=1&continuation" "=4qmFsgIsEhpWTFVVYS12aW9HaGUyYnRCY1puZWFQb25LQRoOZWdaUVZEcERSMUUlM0Q%253D" ) @mock.patch("pytube.contrib.playlist.request.get") def test_playlist_pagination(request_get, playlist_html, playlist_long_html): url = "https://www.fakeurl.com/playlist?list=whatever" request_get.side_effect = [ playlist_long_html, '{"content_html":"}", "load_more_widget_html":""}', "{}", ] playlist = Playlist(url) assert len(playlist.video_urls) == 101 assert request_get.call_count == 2 @mock.patch("pytube.contrib.playlist.request.get") def test_trimmed_pagination(request_get, playlist_html, playlist_long_html): url = "https://www.fakeurl.com/playlist?list=whatever" request_get.side_effect = [ playlist_long_html, '{"content_html":"}", "load_more_widget_html":""}', "{}", ] playlist = Playlist(url) assert len(list(playlist.trimmed("FN9vC8aR7Yk"))) == 3 assert request_get.call_count == 1 @mock.patch("pytube.contrib.playlist.request.get") def test_trimmed_pagination_not_found(request_get, playlist_html, playlist_long_html): url = "https://www.fakeurl.com/playlist?list=whatever" request_get.side_effect = [ playlist_long_html, '{"content_html":"}", "load_more_widget_html":""}', "{}", ] playlist = Playlist(url) assert len(list(playlist.trimmed("wont-be-found"))) == 101