]>
Raphaƫl G. Git Repositories - youtubedl/blob - youtube_dl/downloader/dash.py
   1 from __future__ 
import unicode_literals
 
   6 from .fragment 
import FragmentFD
 
   7 from ..compat 
import compat_urllib_error
 
  14 class DashSegmentsFD(FragmentFD
): 
  16     Download segments in a DASH manifest 
  19     FD_NAME 
= 'dashsegments' 
  21     def real_download(self
, filename
, info_dict
): 
  22         base_url 
= info_dict
['url'] 
  23         segment_urls 
= [info_dict
['segment_urls'][0]] if self
.params
.get('test', False) else info_dict
['segment_urls'] 
  24         initialization_url 
= info_dict
.get('initialization_url') 
  28             'total_frags': len(segment_urls
) + (1 if initialization_url 
else 0), 
  31         self
._prepare
_and
_start
_frag
_download
(ctx
) 
  33         def combine_url(base_url
, target_url
): 
  34             if re
.match(r
'^https?://', target_url
): 
  36             return '%s%s%s' % (base_url
, '' if base_url
.endswith('/') else '/', target_url
) 
  38         segments_filenames 
= [] 
  40         fragment_retries 
= self
.params
.get('fragment_retries', 0) 
  42         def append_url_to_file(target_url
, tmp_filename
, segment_name
): 
  43             target_filename 
= '%s-%s' % (tmp_filename
, segment_name
) 
  45             while count 
<= fragment_retries
: 
  47                     success 
= ctx
['dl'].download(target_filename
, {'url': combine_url(base_url
, target_url
)}) 
  50                     down
, target_sanitized 
= sanitize_open(target_filename
, 'rb') 
  51                     ctx
['dest_stream'].write(down
.read()) 
  53                     segments_filenames
.append(target_sanitized
) 
  55                 except (compat_urllib_error
.HTTPError
, ) as err
: 
  56                     # YouTube may often return 404 HTTP error for a fragment causing the 
  57                     # whole download to fail. However if the same fragment is immediately 
  58                     # retried with the same request data this usually succeeds (1-2 attemps 
  59                     # is usually enough) thus allowing to download the whole file successfully. 
  60                     # So, we will retry all fragments that fail with 404 HTTP error for now. 
  65                     if count 
<= fragment_retries
: 
  66                         self
.report_retry_fragment(segment_name
, count
, fragment_retries
) 
  67             if count 
> fragment_retries
: 
  68                 self
.report_error('giving up after %s fragment retries' % fragment_retries
) 
  71         if initialization_url
: 
  72             append_url_to_file(initialization_url
, ctx
['tmpfilename'], 'Init') 
  73         for i
, segment_url 
in enumerate(segment_urls
): 
  74             append_url_to_file(segment_url
, ctx
['tmpfilename'], 'Seg%d' % i
) 
  76         self
._finish
_frag
_download
(ctx
) 
  78         for segment_file 
in segments_filenames
: 
  79             os
.remove(encodeFilename(segment_file
))