o
    iF                     @   s   d dl Z ddlmZ ddlmZmZmZmZmZm	Z	m
Z
mZmZmZ ddlmZmZ G dd deZG d	d
 d
eZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZdS )    N   )InfoExtractor   )
UnsupportedErrorbool_or_nonedetermine_extint_or_none
js_to_jsonparse_qsstr_or_nonetry_getunified_timestampurl_or_none)subs_list_to_dicttraverse_objc                   @   sF   e Zd ZdddZdddZdddZdd	d
Zdd ZdddZdS )RutubeBaseIENc                 C   s,   |si }d|d< | j d| d|dd|dS )Njsonformatzhttps://rutube.ru/api/video//zDownloading video JSONzUnable to download video JSONquery)_download_jsonselfvideo_idr    r   K/home/ubuntu/.local/lib/python3.10/site-packages/yt_dlp/extractor/rutube.py_download_api_info   s   
zRutubeBaseIE._download_api_infoTc           
      C   s   |r|d n| d}| d}|d ur|du rdnd}t|dd }t|dd }| d	}t| d
}	|r?| dp>|n|d ||| d|	t|dd |rUt|nd t| d|ra|gnd |t| dt| dt| d| ||	dS )Ntitleis_adultT   r   c                 S      | d d S )Nauthoridr   xr   r   r   <lambda>'       z,RutubeBaseIE._extract_info.<locals>.<lambda>c                 S   r!   )Ncategorynamer   r$   r   r   r   r&   (   r'   descriptiondurationr#   thumbnail_urlc                 S   r!   )Nr"   r)   r   r$   r   r   r   r&   2   r'   
created_tshitscomments_countis_livestream)r#   r   r*   	thumbnailr+   uploaderuploader_id	timestamp
categories	age_limit
view_countcomment_countis_livechapters)getr   r   strr   r   "_extract_chapters_from_description)
r   videor   require_titler   r6   r3   r(   r*   r+   r   r   r   _extract_info    s2   

 
zRutubeBaseIE._extract_infoc                 C      |  | j||d|S Nr   )r@   r   r   r   r   r   _download_and_extract_info=      z'RutubeBaseIE._download_and_extract_infoc                 C   s2   |si }d|d< | j d| d|dd|  |dS )Nr   r   z#https://rutube.ru/api/play/options/r   zDownloading options JSONzUnable to download options JSON)headersr   )r   geo_verification_headersr   r   r   r   _download_api_optionsA   s   
z"RutubeBaseIE._download_api_optionsc              
   C   s  g }i }|d   D ]>\}}t|}|dkr/| j||d|dd\}}	|| | j|	|d q
|dkr@|| j|||dd q
|||d	 q
t|d
dddthfD ]}
| j|
|dddd\}}	|| | j|	|d qT| jt|dddddt	hfdt
tddhf|d ||fS )Nvideo_balancerm3u8mp4F)m3u8_idfatal)targetf4m)f4m_idrL   )url	format_idlive_streamshls.rP   )rL   rK   captionscodefile	langTitle)r#   rP   r)   ru)lang)itemsr   #_extract_m3u8_formats_and_subtitlesextend_merge_subtitles_extract_f4m_formatsappendr   r   r<   allr   )r   optionsr   formats	subtitlesrQ   
format_urlextfmtssubshls_urlr   r   r   _extract_formats_and_subtitlesK   sD   







z+RutubeBaseIE._extract_formats_and_subtitlesc                 C   rA   rB   )ri   rG   r   r   r   r   +_download_and_extract_formats_and_subtitlesi   rD   z8RutubeBaseIE._download_and_extract_formats_and_subtitlesN)NT)	__name__
__module____qualname__r   r@   rC   rG   ri   rj   r   r   r   r   r      s    

	


r   c                   @   sl  e Zd ZdZdZdZdgZddddd	d
dddddeddgg dddiddddddddddddddddddd d!d"d#d$ded%d&gg dddidd'd(dd)d*gd+dd,dd-d.ed/d0d1d2ddidd3d4dd5gd6dd7dd8d9ed:ed;d<d=d>d?d@ddd6dAg dBdCdDdEdedFdGgdHddiddIdddJddgZ	dKdLddMddNgg dOdPddQdRdSdTedUddidgZ
dVdW ZdXS )YRutubeIErutubezRutube videoszXhttps?://rutube\.ru/(?:(?:live/)?video(?:/private)?|(?:play/)?embed)/(?P<id>[\da-z]{32})zZ<iframe[^>]+?src=(["\'])(?P<url>(?:https?:)?//rutube\.ru/(?:play/)?embed/[\da-z]{32}.*?)\1z9https://rutube.ru/video/3eac3b4561676c17df9132a9a1e62e3e/ 3eac3b4561676c17df9132a9a1e62e3erJ   u>   Раненный кенгуру забежал в аптекуzhttp://www.ntdtv.ru Q   
NTDRussian29790i2^R20131016r   5re:https?://pic\.rutubelist\.ru/video/.+\.(?:jpg|png)u   Новости и СМИ)r#   re   r   r*   r+   r2   r3   r4   upload_dater6   r7   r1   r5   r:   skip_downloadrI   rP   	info_dictparamsz=https://rutube.ru/play/embed/a10e53b86e8f349080f718582ce4c661TrP   only_matchingz8https://rutube.ru/embed/a10e53b86e8f349080f718582ce4c661zDhttps://rutube.ru/video/3eac3b4561676c17df9132a9a1e62e3e/?pl_id=4252zHhttps://rutube.ru/video/10b3a03fc01d5bbcc632a2f3514e8aab/?pl_type=sourcezZhttps://rutube.ru/video/private/884fb55f07a97ab673c7d654553e0f48/?p=x2QojCumHTS3rsKHWXN8Lg 884fb55f07a97ab673c7d654553e0f48u   Яцуноками, Nioh2uE   Nioh2: финал сражения с боссом Яцуноками   mexus24222106i	c20221210zJhttps://pic.rutubelist.ru/video/f2/d4/f2d42b54be0a6e69c1c22539e3152156.jpgu   Видеоигрыz9https://rutube.ru/video/c65b465ad0c98c89f3b25cb03dcc87c6/ c65b465ad0c98c89f3b25cb03dcc87c6zcount:4u6   Бизнес и предпринимательствоz$md5:252feac1305257d8c1bab215cedde75di  23491359i1Tc20230223u   Бизнес с нуля: найм сотрудников. Интервью с директором строительной компании #1u   Стас Быков)r#   re   r:   r5   r*   r1   r+   r6   r3   r4   r7   rw   r   r2   z>https://rutube.ru/live/video/c58f502c7bb34a8fcdd976b221fca292/ c58f502c7bb34a8fcdd976b221fca292u   Телепередачи r9   23460655i]b20220519u   Первый канал)r#   re   r5   r*   r1   live_statusr6   r3   r4   r7   rw   r   r2   zInvalid URL)rP   rz   skipz>https://rutube.ru/play/embed/03a9cb54bac3376af4c5cb0f18444e01/ 03a9cb54bac3376af4c5cb0f18444e01uY   Церемония начала торгов акциями ПАО «ЕвроТранс»20240829i%  u&   MOEX - Московская биржаiĘf38420507u   Интервью)r#   re   r6   r*   r   r:   rw   r+   r2   r4   r1   r7   r3   r5   z9https://rutube.ru/video/5ab908fccfac5bb43ef2b1e4182256b0/zFhttps://rutube.ru/live/video/private/c58f502c7bb34a8fcdd976b221fca292/z%https://novate.ru/blogs/170625/73644/ b0c96c75a4e5b274721bbced6ed8fb64u   Где в России находится единственная в своем роде скальная торпедная батареяu
   Наукаz$md5:2ed82e6b81958a43da6fb4d56f949e1f   iNh20250615Novate24044809)r#   re   r   r6   r5   r:   r*   r+   r1   r4   rw   r2   r3   r7   c                 C   s@   |  |}t|}| ||}| ||\}}i |||dS )N)rb   rc   )	_match_idr
   rC   rj   )r   rP   r   r   inforb   rc   r   r   r   _real_extract   s   
zRutubeIE._real_extractN)rl   rm   rn   IE_NAMEIE_DESC
_VALID_URL_EMBED_REGEXintr<   _TESTS_WEBPAGE_TESTSr   r   r   r   r   ro   n   s   rro   c                   @   sb   e Zd ZdZdZdZdddddd	d
dddg deddgdddidddddddgZdd ZdS )RutubeEmbedIEzrutube:embedzRutube embedded videoszBhttps?://rutube\.ru/(?:video|play)/embed/(?P<id>[0-9]+)(?:[?#/]|$)z;https://rutube.ru/video/embed/6722881?vk_puid37=&vk_puid38= a10e53b86e8f349080f718582ce4c661rJ   i6R20131223297833zsubziro89 ILyaud   Мистический городок Эйри в Индиан 5 серия озвучка subziro89r   is  z$md5:a5acea57bbc3ccdc3cacd1f11a014b5brv   u   Сериалы)r#   re   r4   rw   r3   r2   r   r6   r+   r:   r*   r7   r1   r5   rx   rI   ry   z$https://rutube.ru/play/embed/8083783Tr|   z>https://rutube.ru/play/embed/10631925?p=IbAigKqWd1do4mjaM5XLIQc           	      C   sX   |  |}t|}| ||}|d }| ||\}}| ||}|d||d |S )Neffective_videoRutube)extractor_keyrb   rc   )r   r
   rG   ri   rC   update)	r   rP   embed_idr   ra   r   rb   rc   r   r   r   r   r   '  s   
zRutubeEmbedIE._real_extractN)	rl   rm   rn   r   r   r   r   r   r   r   r   r   r   r     s<    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
RutubePlaylistBaseIEc                 O   s   | j ||f S rk   )_PAGE_TEMPLATE)r   page_numplaylist_idargskwargsr   r   r   _next_page_url9  s   z#RutubePlaylistBaseIE._next_page_urlc                 o   s    d }t dD ][}| |p| j||g|R i ||d| }|d}|r-t|ts0 d S |D ]!}t|d}	|	s>q2| j|dd}
|
	d|	t
 d |
V  q2|d	}|r`|d
sc d S qd S )Nr   zDownloading page results	video_urlF)r?   rP   )_typerP   ie_keynexthas_next)	itertoolscountr   r   r;   
isinstancelistr   r@   r   ro   r   )r   r   r   r   next_page_urlpagenumpager   resultr   entryr   r   r   _entries<  s@   


zRutubePlaylistBaseIE._entriesc                 O   s(   |  | j|g|R i |||dS )Nplaylist_name)playlist_resultr   r;   )r   r   r   r   r   r   r   _extract_playlistX  s   
z&RutubePlaylistBaseIE._extract_playlistc                 C   s   |  | |S rk   )r   r   )r   rP   r   r   r   r   ]  s   z"RutubePlaylistBaseIE._real_extractN)rl   rm   rn   r   r   r   r   r   r   r   r   r   8  s
    r   c                   @   .   e Zd ZdZdZdZdddiddgZd	Zd
S )RutubeTagsIEzrutube:tagszRutube tagsz*https?://rutube\.ru/tags/video/(?P<id>\d+)z"https://rutube.ru/tags/video/1800/r#   1800D   rP   rz   playlist_mincountz8https://rutube.ru/api/tags/video/%s/?page=%s&format=jsonNrl   rm   rn   r   r   r   r   r   r   r   r   r   r   a      r   c                   @   s(   e Zd ZdZdZdZdZdZdd ZdS )	RutubeMovieIEzrutube:moviezRutube moviesz+https?://rutube\.ru/metainfo/tv/(?P<id>\d+)z1https://rutube.ru/api/metainfo/tv/%s/?format=jsonz>https://rutube.ru/api/metainfo/tv/%s/video?page=%s&format=jsonc                 C   s2   |  |}| | j| |d}| j||ddS )NzDownloading movie JSONr)   )r   )r   r   _MOVIE_TEMPLATEr   r;   )r   rP   movie_idmovier   r   r   r   x  s   


zRutubeMovieIE._real_extractN)	rl   rm   rn   r   r   r   r   r   r   r   r   r   r   r   p  s    r   c                   @   r   )RutubePersonIEzrutube:personzRutube person videosz,https?://rutube\.ru/video/person/(?P<id>\d+)z&https://rutube.ru/video/person/313878/r#   313878$   r   z:https://rutube.ru/api/video/person/%s/?page=%s&format=jsonNr   r   r   r   r   r     r   r   c                   @   r   )RutubePlaylistIEzrutube:playlistzRutube playlistsz$https?://rutube\.ru/plst/(?P<id>\d+)zhttps://rutube.ru/plst/308547/r#   308547   r   zChttps://rutube.ru/api/playlist/custom/%s/videos?page=%s&format=jsonNr   r   r   r   r   r     s    r   c                   @   sh   e Zd ZdZdZdZdddiddd	dd
idddddidddddiddgZdZdd Zdd Z	dS )RutubeChannelIEzrutube:channelzRutube channelzehttps?://rutube\.ru/(?:channel/(?P<id>\d+)|u/(?P<slug>\w+))(?:/(?P<section>videos|shorts|playlists))?z(https://rutube.ru/channel/639184/videos/r#   639184_videos   r   z*https://rutube.ru/channel/25902603/shorts/25902603_shortsi  z#https://rutube.ru/channel/25902603/25902603i  z"https://rutube.ru/u/rutube/videos/23704195_videosq   zJhttps://rutube.ru/api/video/person/%s/?page=%s&format=json&origin__type=%sc                 C   s"   dddd |}| j|||f S )Nzrtb,rst,ifrm,rsparshortsr   )videosshortsN)r;   r   )r   r   r   sectionorigin_typer   r   r   r     s   zRutubeChannelIE._next_page_urlc              
   C   s   |  |ddd\}}}|dkrt||r8| ||}| jd|d|td}t|dd	d
d ddththt	f}| j
||d}|rJ| d| |d< |S )Nr#   slugr   	playlistszwindow\.reduxState\s*=zredux state)transform_sourceapiqueriesc                 S   s
   |  dS )NchannelIdBySlug)
startswith)k_r   r   r   r&     s   
 z/RutubeChannelIE._real_extract.<locals>.<lambda>data
channel_id)r   r   )_match_valid_urlgroupr   _download_webpage_search_jsonr	   r   r   r   anyr   )r   rP   r   r   r   webpageredux_stateplaylistr   r   r   r     s    

zRutubeChannelIE._real_extractN)
rl   rm   rn   r   r   r   r   r   r   r   r   r   r   r   r     s8    r   )r   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   utils.traversalr   r   r   ro   r   r   r   r   r   r   r   r   r   r   r   <module>   s    0X 2)