o
�J�h9W � @ s� d Z ddlZddlZddlmZ ddlZddlmZmZ ddlm Z m
Z
mZmZm
Z
mZ ddlmZ ddlmZ ddlmZ dd lmZmZ dd
lmZ ddlmZ ddlmZ dd
lmZ ddl m!Z! e�"e#�Z$G dd� d�Z%dS )a/
This module contains a container for stream manifest data.
A container object for the media stream (video only / audio only / video+audio
combined). This was referred to as ``Video`` in the legacy pytube version, but
has been renamed to accommodate DASH (which serves the audio and video
separately).
� N)�ceil)�datetime�timezone)�BinaryIO�Dict�Optional�Tuple�Iterator�Callable)� HTTPError)�parse_qs)�Path)�extract�request)�target_directory)�get_format_profile)� Monostate)�file_system_verify)�ServerAbrStreamc @ sz e Zd ZdZdedededefdd�Zede fd d
��Z
ede fdd��Zede fd
d��Zej
dd� �Zede fdd��Zede fdd��Zdeee ee f fdd�Zedefdd��Zedefdd��Zedefdd��Zedefdd��Zedefdd��Zedefd d!��Zedefd"d#��Zedefd$d%��Zedefd&d'��Zedefd(d)��Z * * * + * , *dNd-ee d.ee d/ee d0e d1ee d2ed3ee g e f dee fd4d5�Z! * * * 6dOd.ee d-ee d/ee d7edef
d8d9�Z"d:ede fd;d<�Z#d=e$dd*fd>d?�Z%d@e&dAe$dBefdCdD�Z'd:ee fdEdF�Z(defdGdH�Z)d@e&dBefdIdJ�Z*dPdKee de+e& fdLdM�Z,d*S )Q�Streamz#Container for stream manifest data.�stream� monostate�po_token�video_playback_ustreamer_configc C s� || _ |d | _t|d �| _d|v r|d nd| _t�|d �\| _| _| j� d�\| _
| _| �� \| _
| _|d | _|d | _t|�d d
��| _ttt|�d d
��d d �d �| _ttt|�d d
��d d d �d �| _ttt|�d d
��d d d d �d �| _t| j�}|d
| _|d | _d|v r�|d | _|d | _d|v r�|d nd| _d|v r�|d nd| _|d | _|d | _ |d | _!|�dd�| _"|�dd�| _#|d | _$|d | _%|| _&|| _'d|v | _(| j(�r*d|d d v | _)t*|d d ��+dd�| _,| j,� d �d
| _-t*|d d! �� d"�d
| _.| j.� d#�d
| _/dS | j0�o1| j1 | _)d| _,d| _-d| _.d| _/dS )$a Construct a :class:`Stream <Stream>`.
:param dict stream:
The unscrambled data extracted from YouTube.
:param dict monostate:
Dictionary of data shared across all instances of
:class:`Stream <Stream>`.
�url�itag�xtagsN�mimeType�/�is_otf�bitrateZ
contentLengthr � �� �is_dash�abr�fps�
resolution�width�height�is_3d�is_hdr�is_liveZisDrcF�is_sabrZapproxDurationMs�lastModifiedZ
audioTrack�originalZdisplayNamez original� � �id�.�-)2�
_monostater �intr r r Zmime_type_codec� mime_type�codecs�split�type�subtype�parse_codecs�video_codec�audio_codecr r �get� _filesize�floatr �_filesize_kb�_filesize_mb�_filesize_gbr r# r$ r% r&