|
"""Unit tests for the :module:`extract <extract>` module.""" |
|
from datetime import datetime |
|
import pytest |
|
import re |
|
|
|
from pytube import extract |
|
from pytube.exceptions import RegexMatchError |
|
|
|
|
|
def test_extract_video_id(): |
|
url = "https://www.youtube.com/watch?v=2lAe1cqCOXo" |
|
video_id = extract.video_id(url) |
|
assert video_id == "2lAe1cqCOXo" |
|
|
|
|
|
def test_info_url(age_restricted): |
|
video_info_url = extract.video_info_url_age_restricted( |
|
video_id="QRS8MkLhQmM", embed_html=age_restricted["embed_html"], |
|
) |
|
assert video_info_url.startswith('https://www.youtube.com/get_video_info') |
|
assert 'video_id=QRS8MkLhQmM' in video_info_url |
|
|
|
|
|
def test_info_url_age_restricted(cipher_signature): |
|
video_info_url = extract.video_info_url( |
|
video_id=cipher_signature.video_id, |
|
watch_url=cipher_signature.watch_url, |
|
) |
|
assert video_info_url.startswith('https://www.youtube.com/get_video_info') |
|
assert 'video_id=2lAe1cqCOXo' in video_info_url |
|
|
|
|
|
def test_js_url(cipher_signature): |
|
expected = ( |
|
r"https://youtube.com/s/player/([\w\d]+)/player_ias.vflset/en_US/base.js" |
|
) |
|
result = extract.js_url(cipher_signature.watch_html) |
|
match = re.search(expected, result) |
|
assert match is not None |
|
|
|
|
|
def test_age_restricted(age_restricted): |
|
assert extract.is_age_restricted(age_restricted["watch_html"]) |
|
|
|
|
|
def test_non_age_restricted(cipher_signature): |
|
assert not extract.is_age_restricted(cipher_signature.watch_html) |
|
|
|
|
|
def test_is_private(private): |
|
assert extract.is_private(private['watch_html']) |
|
|
|
|
|
def test_not_is_private(cipher_signature): |
|
assert not extract.is_private(cipher_signature.watch_html) |
|
|
|
|
|
def test_recording_available(cipher_signature): |
|
assert extract.recording_available(cipher_signature.watch_html) |
|
|
|
|
|
def test_publish_date(cipher_signature): |
|
expected = datetime(2019, 12, 5) |
|
assert cipher_signature.publish_date == expected |
|
assert extract.publish_date('') is None |
|
|
|
|
|
def test_not_recording_available(missing_recording): |
|
assert not extract.recording_available(missing_recording['watch_html']) |
|
|
|
|
|
def test_mime_type_codec(): |
|
mime_type, mime_subtype = extract.mime_type_codec( |
|
'audio/webm; codecs="opus"' |
|
) |
|
assert mime_type == "audio/webm" |
|
assert mime_subtype == ["opus"] |
|
|
|
|
|
def test_mime_type_codec_with_no_match_should_error(): |
|
with pytest.raises(RegexMatchError): |
|
extract.mime_type_codec("audio/webm") |
|
|
|
|
|
def test_get_ytplayer_config_with_no_match_should_error(): |
|
with pytest.raises(RegexMatchError): |
|
extract.get_ytplayer_config("") |
|
|
|
|
|
def test_get_ytplayer_js_with_no_match_should_error(): |
|
with pytest.raises(RegexMatchError): |
|
extract.get_ytplayer_js("") |
|
|
|
|
|
def test_initial_data_missing(): |
|
with pytest.raises(RegexMatchError): |
|
extract.initial_data('') |
|
|
|
|
|
def test_initial_data(stream_dict): |
|
initial_data = extract.initial_data(stream_dict) |
|
assert 'contents' in initial_data |
|
|