@ -4,6 +4,7 @@ import os
import re
import re
from .fragment import FragmentFD
from .fragment import FragmentFD
from ..compat import compat_urllib_error
from ..utils import (
from ..utils import (
sanitize_open ,
sanitize_open ,
encodeFilename ,
encodeFilename ,
@ -36,20 +37,41 @@ class DashSegmentsFD(FragmentFD):
segments_filenames = [ ]
segments_filenames = [ ]
def append_url_to_file ( target_url , target_filename ) :
success = ctx [ ' dl ' ] . download ( target_filename , { ' url ' : combine_url ( base_url , target_url ) } )
if not success :
fragment_retries = self . params . get ( ' fragment_retries ' , 0 )
def append_url_to_file ( target_url , tmp_filename , segment_name ) :
target_filename = ' %s - %s ' % ( tmp_filename , segment_name )
count = 0
while count < = fragment_retries :
try :
success = ctx [ ' dl ' ] . download ( target_filename , { ' url ' : combine_url ( base_url , target_url ) } )
if not success :
return False
down , target_sanitized = sanitize_open ( target_filename , ' rb ' )
ctx [ ' dest_stream ' ] . write ( down . read ( ) )
down . close ( )
segments_filenames . append ( target_sanitized )
break
except ( compat_urllib_error . HTTPError , ) as err :
# YouTube may often return 404 HTTP error for a fragment causing the
# whole download to fail. However if the same fragment is immediately
# retried with the same request data this usually succeeds (1-2 attemps
# is usually enough) thus allowing to download the whole file successfully.
# So, we will retry all fragments that fail with 404 HTTP error for now.
if err . code != 404 :
raise
# Retry fragment
count + = 1
if count < = fragment_retries :
self . report_retry_fragment ( segment_name , count , fragment_retries )
if count > fragment_retries :
self . report_error ( ' giving up after %s fragment retries ' % fragment_retries )
return False
return False
down , target_sanitized = sanitize_open ( target_filename , ' rb ' )
ctx [ ' dest_stream ' ] . write ( down . read ( ) )
down . close ( )
segments_filenames . append ( target_sanitized )
if initialization_url :
if initialization_url :
append_url_to_file ( initialization_url , ctx [ ' tmpfilename ' ] + ' -Init ' )
append_url_to_file ( initialization_url , ctx [ ' tmpfilename ' ] , ' Init ' )
for i , segment_url in enumerate ( segment_urls ) :
for i , segment_url in enumerate ( segment_urls ) :
segment_filename = ' %s -Seg %d ' % ( ctx [ ' tmpfilename ' ] , i )
append_url_to_file ( segment_url , segment_filename )
append_url_to_file ( segment_url , ctx [ ' tmpfilename ' ] , ' Seg %d ' % i )
self . _finish_frag_download ( ctx )
self . _finish_frag_download ( ctx )