@ -11,7 +11,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
import copy
import json
from test . helper import FakeYDL , assertRegexpMatches
from test . helper import FakeYDL , assertRegexpMatches , try_rm
from yt_dlp import YoutubeDL
from yt_dlp . compat import compat_os_name
from yt_dlp . extractor import YoutubeIE
@ -24,6 +24,8 @@ from yt_dlp.utils import (
int_or_none ,
match_filter_func ,
)
from yt_dlp . utils . traversal import traverse_obj
TEST_URL = ' http://localhost/sample.mp4 '
@ -1227,10 +1229,10 @@ class TestYoutubeDL(unittest.TestCase):
_test_url = ' https://yt.dlp/test '
def test ( encoded_cookies , cookies , headers = False , round_trip = None , error = None ) :
def test ( encoded_cookies , cookies , * , headers = False , round_trip = None , error _re = None ) :
def _test ( ) :
ydl . cookiejar . clear ( )
ydl . _load_cookies ( encoded_cookies , from_headers = headers )
ydl . _load_cookies ( encoded_cookies , autoscope = headers )
if headers :
ydl . _apply_header_cookies ( _test_url )
data = { ' url ' : _test_url }
@ -1245,14 +1247,14 @@ class TestYoutubeDL(unittest.TestCase):
ydl . __dict__ [ ' _YoutubeDL__header_cookies ' ] = [ ]
with self . subTest ( msg = encoded_cookies ) :
if not error :
if not error _re :
_test ( )
return
with self . assertRaisesRegex ( Exception , error ) :
with self . assertRaisesRegex ( Exception , error _re ) :
_test ( )
test ( ' test=value; Domain=.yt.dlp ' , [ cookie ( ' test ' , ' value ' , domain = ' .yt.dlp ' ) ] )
test ( ' test=value ' , [ cookie ( ' test ' , ' value ' ) ] , error = ' Unscoped cookies are not allowed ' )
test ( ' test=value ' , [ cookie ( ' test ' , ' value ' ) ] , error _re = r ' Unscoped cookies are not allowed ' )
test ( ' cookie1=value1; Domain=.yt.dlp; Path=/test; cookie2=value2; Domain=.yt.dlp; Path=/ ' , [
cookie ( ' cookie1 ' , ' value1 ' , domain = ' .yt.dlp ' , path = ' /test ' ) ,
cookie ( ' cookie2 ' , ' value2 ' , domain = ' .yt.dlp ' , path = ' / ' ) ] )
@ -1265,9 +1267,76 @@ class TestYoutubeDL(unittest.TestCase):
round_trip = ' name= " " ; Domain=.yt.dlp ' )
test ( ' test=value ' , [ cookie ( ' test ' , ' value ' , domain = ' .yt.dlp ' ) ] , headers = True )
test ( ' cookie1=value; Domain=.yt.dlp; cookie2=value ' , [ ] , headers = True , error = ' Invalid syntax ' )
test ( ' cookie1=value; Domain=.yt.dlp; cookie2=value ' , [ ] , headers = True , error _re = r ' Invalid syntax ' )
ydl . deprecated_feature = ydl . report_error
test ( ' test=value ' , [ ] , headers = True , error = ' Passing cookies as a header is a potential security risk ' )
test ( ' test=value ' , [ ] , headers = True , error_re = r ' Passing cookies as a header is a potential security risk ' )
def test_infojson_cookies ( self ) :
TEST_FILE = ' test_infojson_cookies.info.json '
TEST_URL = ' https://example.com/example.mp4 '
COOKIES = ' a=b; Domain=.example.com; c=d; Domain=.example.com '
COOKIE_HEADER = { ' Cookie ' : ' a=b; c=d ' }
ydl = FakeYDL ( )
ydl . process_info = lambda x : ydl . _write_info_json ( ' test ' , x , TEST_FILE )
def make_info ( info_header_cookies = False , fmts_header_cookies = False , cookies_field = False ) :
fmt = { ' url ' : TEST_URL }
if fmts_header_cookies :
fmt [ ' http_headers ' ] = COOKIE_HEADER
if cookies_field :
fmt [ ' cookies ' ] = COOKIES
return _make_result ( [ fmt ] , http_headers = COOKIE_HEADER if info_header_cookies else None )
def test ( initial_info , note ) :
result = { }
result [ ' processed ' ] = ydl . process_ie_result ( initial_info )
self . assertTrue ( ydl . cookiejar . get_cookies_for_url ( TEST_URL ) ,
msg = f ' No cookies set in cookiejar after initial process when { note } ' )
ydl . cookiejar . clear ( )
with open ( TEST_FILE ) as infojson :
result [ ' loaded ' ] = ydl . sanitize_info ( json . load ( infojson ) , True )
result [ ' final ' ] = ydl . process_ie_result ( result [ ' loaded ' ] . copy ( ) , download = False )
self . assertTrue ( ydl . cookiejar . get_cookies_for_url ( TEST_URL ) ,
msg = f ' No cookies set in cookiejar after final process when { note } ' )
ydl . cookiejar . clear ( )
for key in ( ' processed ' , ' loaded ' , ' final ' ) :
info = result [ key ]
self . assertIsNone (
traverse_obj ( info , ( ( None , ( ' formats ' , 0 ) ) , ' http_headers ' , ' Cookie ' ) , casesense = False , get_all = False ) ,
msg = f ' Cookie header not removed in { key } result when { note } ' )
self . assertEqual (
traverse_obj ( info , ( ( None , ( ' formats ' , 0 ) ) , ' cookies ' ) , get_all = False ) , COOKIES ,
msg = f ' No cookies field found in { key } result when { note } ' )
test ( { ' url ' : TEST_URL , ' http_headers ' : COOKIE_HEADER , ' id ' : ' 1 ' , ' title ' : ' x ' } , ' no formats field ' )
test ( make_info ( info_header_cookies = True ) , ' info_dict header cokies ' )
test ( make_info ( fmts_header_cookies = True ) , ' format header cookies ' )
test ( make_info ( info_header_cookies = True , fmts_header_cookies = True ) , ' info_dict and format header cookies ' )
test ( make_info ( info_header_cookies = True , fmts_header_cookies = True , cookies_field = True ) , ' all cookies fields ' )
test ( make_info ( cookies_field = True ) , ' cookies format field ' )
test ( { ' url ' : TEST_URL , ' cookies ' : COOKIES , ' id ' : ' 1 ' , ' title ' : ' x ' } , ' info_dict cookies field only ' )
try_rm ( TEST_FILE )
def test_add_headers_cookie ( self ) :
def check_for_cookie_header ( result ) :
return traverse_obj ( result , ( ( None , ( ' formats ' , 0 ) ) , ' http_headers ' , ' Cookie ' ) , casesense = False , get_all = False )
ydl = FakeYDL ( { ' http_headers ' : { ' Cookie ' : ' a=b ' } } )
ydl . _apply_header_cookies ( _make_result ( [ ] ) [ ' webpage_url ' ] ) # Scope to input webpage URL: .example.com
fmt = { ' url ' : ' https://example.com/video.mp4 ' }
result = ydl . process_ie_result ( _make_result ( [ fmt ] ) , download = False )
self . assertIsNone ( check_for_cookie_header ( result ) , msg = ' http_headers cookies in result info_dict ' )
self . assertEqual ( result . get ( ' cookies ' ) , ' a=b; Domain=.example.com ' , msg = ' No cookies were set in cookies field ' )
self . assertIn ( ' a=b ' , ydl . cookiejar . get_cookie_header ( fmt [ ' url ' ] ) , msg = ' No cookies were set in cookiejar ' )
fmt = { ' url ' : ' https://wrong.com/video.mp4 ' }
result = ydl . process_ie_result ( _make_result ( [ fmt ] ) , download = False )
self . assertIsNone ( check_for_cookie_header ( result ) , msg = ' http_headers cookies for wrong domain ' )
self . assertFalse ( result . get ( ' cookies ' ) , msg = ' Cookies set in cookies field for wrong domain ' )
self . assertFalse ( ydl . cookiejar . get_cookie_header ( fmt [ ' url ' ] ) , msg = ' Cookies set in cookiejar for wrong domain ' )
if __name__ == ' __main__ ' :