maitreyee19
Fix for -PyTube can't download or iterete over playlist it it contains a "subMenuItems" #915 (#918)
1ef61ce
unverified
# -*- coding: utf-8 -*- | |
import datetime | |
from unittest import mock | |
from unittest.mock import MagicMock | |
from pytube import Playlist | |
def test_title(request_get): | |
request_get.return_value = ( | |
"<title>(149) Python Tutorial for Beginners " | |
"(For Absolute Beginners) - YouTube</title>" | |
) | |
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)" | |
) | |
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 | |
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" | |
) | |
def test_last_updated(request_get, playlist_html): | |
expected = datetime.date(2020, 3, 11) | |
request_get.return_value = playlist_html | |
playlist = Playlist( | |
"https://www.youtube.com/playlist?list" | |
"=PLS1QulWo1RIaJECMeUT4LFwJ-ghgoSH6n" | |
) | |
assert playlist.last_updated == expected | |
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", | |
] | |
def test_repr(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 ( | |
repr(playlist) == "[" | |
"'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'" | |
"]" | |
) | |
def test_sequence(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 playlist[0] == "https://www.youtube.com/watch?v=ujTCoH21GlA" | |
assert len(playlist) == 12 | |
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 | |
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 | |
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"}) | |
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", | |
] | |
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 | |
# TODO: Cannot get this test to work probably | |
# request_get.assert_called_with( | |
# "https://www.youtube.com/browse_ajax?ctoken" # noqa | |
# "=4qmFsgIsEhpWTFVVYS12aW9HaGUyYnRCY1puZWFQb25LQRoOZWdaUVZEcERSMUUlM0Q" # noqa | |
# "%3D&continuation" # noqa | |
# "=4qmFsgIsEhpWTFVVYS12aW9HaGUyYnRCY1puZWFQb25LQRoOZWdaUVZEcERSMUUlM0Q" # noqa | |
# "%3D", # noqa | |
# {"extra_headers": {'X-YouTube-Client-Name': '1', | |
# 'X-YouTube-Client-Version': '2.20200720.00.02'}} | |
# ) # noqa | |
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":"<a ' | |
'href=\\"/watch?v=BcWz41-4cDk&feature=plpp_video&ved' | |
'=CCYQxjQYACITCO33n5-pn-cCFUG3xAodLogN2yj6LA\\">}", ' | |
'"load_more_widget_html":""}', | |
"{}", | |
] | |
playlist = Playlist(url) | |
assert len(playlist.video_urls) == 100 | |
assert request_get.call_count == 2 | |
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":"<a ' | |
'href=\\"/watch?v=BcWz41-4cDk&feature=plpp_video&ved' | |
'=CCYQxjQYACITCO33n5-pn-cCFUG3xAodLogN2yj6LA\\">}", ' | |
'"load_more_widget_html":""}', | |
"{}", | |
] | |
playlist = Playlist(url) | |
assert len(list(playlist.trimmed("GTpl5yq3bvk"))) == 3 | |
assert request_get.call_count == 1 | |
# TODO: Test case not clear to me | |
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":"<a ' | |
'href=\\"/watch?v=BcWz41-4cDk&feature=plpp_video&ved' | |
'=CCYQxjQYACITCO33n5-pn-cCFUG3xAodLogN2yj6LA\\">}", ' | |
'"load_more_widget_html":""}', | |
"{}", | |
] | |
playlist = Playlist(url) # noqa | |
# assert len(list(playlist.trimmed("wont-be-found"))) == 101 # noqa | |
assert True | |
# test case for playlist with submenus | |
def test_playlist_submenu( | |
request_get, playlist_submenu_html): | |
url = "https://www.fakeurl.com/playlist?list=whatever" | |
request_get.side_effect = [ | |
playlist_submenu_html, | |
'{"content_html":"<a ' | |
'href=\\"/watch?v=BcWz41-4cDk&feature=plpp_video&ved' | |
'=CCYQxjQYACITCO33n5-pn-cCFUG3xAodLogN2yj6LA\\">}", ' | |
'"load_more_widget_html":""}', | |
"{}", | |
] | |
playlist = Playlist(url) | |
assert len(playlist.video_urls) == 12 | |