o
    i`                     @   sP   d dl Z d dlZddlmZ ddlmZ ddlmZm	Z	m
Z
 G dd deZdS )	    N   )get_suitable_downloader)
FragmentFD   )ReExtractInfoupdate_url_queryurljoinc                   @   s,   e Zd ZdZdZdd Zdd Zdd Zd	S )
DashSegmentsFDz
    Download segments in a DASH manifest. External downloaders can take over
    the fragment downloads by supporting the 'dash_frag_urls' protocol
    dashsegmentsc              	      s  d d  dv rd }n dr| d t | jd d|dkd}t } fd	d
 dg D }g }|p9 gD ]}t|d trItdddz| jdrRdnt	|d }W n t
yd   d }Y nw |dpk||drrdn|d|d}	|r| |	 n| |	| ||	d< d }
 d}|rtj|}
| ||	|
}|r| d| j d|   t| d< || j| j}||   S ||	||g q:| j|ddd iS )Nhttp_dash_segments_generatorprotocol+is_livez"Live DASH videos are not supporteddash_frag_urls-)r   	to_stdoutc                    s   g | ]}i  |qS  r   ).0fmt	info_dictr   J/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/downloader/dash.py
<listcomp>   s    z0DashSegmentsFD.real_download.<locals>.<listcomp>requested_formats	fragmentsz#the stream needs to be re-extractedT)expectedtestr   filepathis_from_start)filenamelivetotal_fragsstartextra_param_to_segment_url[z*] Fragment downloads will be delegated to is_fatalc                 S   s   | dkS )Nr   r   )idxr   r   r   <lambda>D   s    z.DashSegmentsFD.real_download.<locals>.<lambda>)splitgetreport_errorr   paramstime
isinstancestrr   len	TypeError_prepare_external_frag_download _prepare_and_start_frag_downloadurllibparseparse_qs_get_fragments	to_screenFD_NAMEget_basenamelistydlreal_downloadappend&download_and_append_fragments_multiple)selfr   r   real_downloader
real_startr   argsr   fragment_countctxextra_queryr#   fragments_to_downloadfdr   r   r   r<      sP   

 
zDashSegmentsFD.real_downloadc                 C   s2   t |r||n|}| jdrtt|gS |S )Nr   )callabler+   r)   nextiter)r?   r   rD   r   r   r   _resolve_fragmentsF   s   z!DashSegmentsFD._resolve_fragmentsc           
      c   s    | d}| |d |}d}t|D ]3\}}|d7 }||d kr#q| d}	|	s5|s.J t||d }	|r<t|	|}	|| d||	d	V  qd S )
Nfragment_base_urlr   r   r   fragment_indexurlpathrC   )
frag_indexrC   indexrN   )r)   rK   	enumerater   r   )
r?   r   rD   rE   rL   r   rP   ifragmentfragment_urlr   r   r   r6   J   s(   



zDashSegmentsFD._get_fragmentsN)__name__
__module____qualname____doc__r8   r<   rK   r6   r   r   r   r   r	   	   s    5r	   )r,   urllib.parser3    r   rT   r   utilsr   r   r   r	   r   r   r   r   <module>   s    