# -*- 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