3 from .fragment
import FragmentFD
4 from ..downloader
import get_suitable_downloader
5 from ..utils
import urljoin
8 class DashSegmentsFD(FragmentFD
):
10 Download segments in a DASH manifest. External downloaders can take over
11 the fragment downloads by supporting the 'dash_frag_urls' protocol
14 FD_NAME
= 'dashsegments'
16 def real_download(self
, filename
, info_dict
):
17 if info_dict
.get('is_live') and set(info_dict
['protocol'].split('+')) != {'http_dash_segments_generator'}
:
18 self
.report_error('Live DASH videos are not supported')
20 real_start
= time
.time()
21 real_downloader
= get_suitable_downloader(
22 info_dict
, self
.params
, None, protocol
='dash_frag_urls', to_stdout
=(filename
== '-'))
24 requested_formats
= [{**info_dict, **fmt}
for fmt
in info_dict
.get('requested_formats', [])]
26 for fmt
in requested_formats
or [info_dict
]:
28 fragment_count
= 1 if self
.params
.get('test') else len(fmt
['fragments'])
32 'filename': fmt
.get('filepath') or filename
,
33 'live': 'is_from_start' if fmt
.get('is_from_start') else fmt
.get('is_live'),
34 'total_frags': fragment_count
,
38 self
._prepare
_external
_frag
_download
(ctx
)
40 self
._prepare
_and
_start
_frag
_download
(ctx
, fmt
)
41 ctx
['start'] = real_start
43 fragments_to_download
= self
._get
_fragments
(fmt
, ctx
)
47 f
'[{self.FD_NAME}] Fragment downloads will be delegated to {real_downloader.get_basename()}')
48 info_dict
['fragments'] = list(fragments_to_download
)
49 fd
= real_downloader(self
.ydl
, self
.params
)
50 return fd
.real_download(filename
, info_dict
)
52 args
.append([ctx
, fragments_to_download
, fmt
])
54 return self
.download_and_append_fragments_multiple(*args
)
56 def _resolve_fragments(self
, fragments
, ctx
):
57 fragments
= fragments(ctx
) if callable(fragments
) else fragments
58 return [next(iter(fragments
))] if self
.params
.get('test') else fragments
60 def _get_fragments(self
, fmt
, ctx
):
61 fragment_base_url
= fmt
.get('fragment_base_url')
62 fragments
= self
._resolve
_fragments
(fmt
['fragments'], ctx
)
65 for i
, fragment
in enumerate(fragments
):
67 if frag_index
<= ctx
['fragment_index']:
69 fragment_url
= fragment
.get('url')
71 assert fragment_base_url
72 fragment_url
= urljoin(fragment_base_url
, fragment
['path'])
75 'frag_index': frag_index
,