a
    hF                     @   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   L/mnt/pikpak/tmp/myenv/lib/python3.9/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r8|du r4dnd}t|dd }t|dd }| d	}t| d
}	|r~| dp|n|d ||| d|	t|dd |rt|nd t| d|r|gnd |t| dt| dt| d| ||	dS )NtitleZis_adultT   r   c                 S   s   | d d S )Nauthoridr   xr   r   r   <lambda>'       z,RutubeBaseIE._extract_info.<locals>.<lambda>c                 S   s   | d d S )Ncategorynamer   r"   r   r   r   r$   (   r%   descriptiondurationr!   Zthumbnail_urlc                 S   s   | d d S )Nr    r'   r   r"   r   r   r   r$   2   r%   Z
created_tshitsZcomments_countZis_livestream)r!   r   r(   	thumbnailr)   uploaderuploader_id	timestamp
categories	age_limit
view_countZcomment_countis_livechapters)getr   r   strr   r   Z"_extract_chapters_from_description)
r   videor   require_titler   r0   r-   r&   r(   r)   r   r   r   _extract_info    s.    


zRutubeBaseIE._extract_infoc                 C   s   |  | j||d|S Nr   )r8   r   r   r   r   r   _download_and_extract_info=   s    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   Z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 ]4}
| j|
|dddd\}}	|| | j|	|d q| jt|dddddt	hfdt
tddhf|d ||fS )NZvideo_balancerm3u8mp4F)m3u8_idfatal)targetZf4m)Zf4m_idr@   )url	format_idZlive_streamsZhls.rB   )r@   r?   ZcaptionscodefileZ	langTitle)r!   rB   r'   ru)lang)itemsr   Z#_extract_m3u8_formats_and_subtitlesextendZ_merge_subtitlesZ_extract_f4m_formatsappendr   r   r5   allr   )r   optionsr   formats	subtitlesrC   Z
format_urlextZfmtssubsZhls_urlr   r   r   _extract_formats_and_subtitlesK   sD    

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


z+RutubeBaseIE._extract_formats_and_subtitlesc                 C   s   |  | j||d|S r9   )rQ   r<   r   r   r   r   +_download_and_extract_formats_and_subtitlesi   s    z8RutubeBaseIE._download_and_extract_formats_and_subtitles)N)NT)N)N)N)	__name__
__module____qualname__r   r8   r:   r<   rQ   rR   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RutubeIEZ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/Z 3eac3b4561676c17df9132a9a1e62e3er>   u>   Раненный кенгуру забежал в аптекуzhttp://www.ntdtv.ru Q   Z
NTDRussianZ29790i2^RZ20131016r   5re:https?://pic\.rutubelist\.ru/video/.+\.(?:jpg|png)u   Новости и СМИ)r!   rO   r   r(   r)   r,   r-   r.   upload_dater0   r1   r+   r/   r3   skip_downloadr=   rB   	info_dictparamsz=https://rutube.ru/play/embed/a10e53b86e8f349080f718582ce4c661TrB   Z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=x2QojCumHTS3rsKHWXN8LgZ 884fb55f07a97ab673c7d654553e0f48u   Яцуноками, Nioh2uE   Nioh2: финал сражения с боссом Яцуноками   ZmexusZ24222106i	cZ20221210zJhttps://pic.rutubelist.ru/video/f2/d4/f2d42b54be0a6e69c1c22539e3152156.jpgu   Видеоигрыz9https://rutube.ru/video/c65b465ad0c98c89f3b25cb03dcc87c6/Z c65b465ad0c98c89f3b25cb03dcc87c6zcount:4u6   Бизнес и предпринимательствоz$md5:252feac1305257d8c1bab215cedde75di  Z23491359i1TcZ20230223u   Бизнес с нуля: найм сотрудников. Интервью с директором строительной компании #1u   Стас Быков)r!   rO   r3   r/   r(   r+   r)   r0   r-   r.   r1   rY   r   r,   z>https://rutube.ru/live/video/c58f502c7bb34a8fcdd976b221fca292/Z c58f502c7bb34a8fcdd976b221fca292u   Телепередачи r2   Z23460655i]bZ20220519u   Первый канал)r!   rO   r/   r(   r+   Zlive_statusr0   r-   r.   r1   rY   r   r,   zInvalid URL)rB   r\   skipz>https://rutube.ru/play/embed/03a9cb54bac3376af4c5cb0f18444e01/Z 03a9cb54bac3376af4c5cb0f18444e01uY   Церемония начала торгов акциями ПАО «ЕвроТранс»Z20240829i%  u&   MOEX - Московская биржаiĘfZ38420507u   Интервью)r!   rO   r0   r(   r   r3   rY   r)   r,   r.   r+   r1   r-   r/   z9https://rutube.ru/video/5ab908fccfac5bb43ef2b1e4182256b0/zFhttps://rutube.ru/live/video/private/c58f502c7bb34a8fcdd976b221fca292/z%https://novate.ru/blogs/170625/73644/Z b0c96c75a4e5b274721bbced6ed8fb64u   Где в России находится единственная в своем роде скальная торпедная батареяu
   Наукаz$md5:2ed82e6b81958a43da6fb4d56f949e1f   iNhZ20250615ZNovateZ24044809)r!   rO   r   r0   r/   r3   r(   r)   r+   r.   rY   r,   r-   r1   c                 C   s@   |  |}t|}| ||}| ||\}}i |||dS )N)rM   rN   )	_match_idr
   r:   rR   )r   rB   r   r   inforM   rN   r   r   r   _real_extract   s    
zRutubeIE._real_extractN)rS   rT   rU   IE_NAMEIE_DESC
_VALID_URLZ_EMBED_REGEXintr5   _TESTSZ_WEBPAGE_TESTSre   r   r   r   r   rV   n   s  rrV   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=Z a10e53b86e8f349080f718582ce4c661r>   i6RZ20131223Z297833zsubziro89 ILyaud   Мистический городок Эйри в Индиан 5 серия озвучка subziro89r   is  z$md5:a5acea57bbc3ccdc3cacd1f11a014b5brX   u   Сериалы)r!   rO   r.   rY   r-   r,   r   r0   r)   r3   r(   r1   r+   r/   rZ   r=   r[   z$https://rutube.ru/play/embed/8083783Tr^   z>https://rutube.ru/play/embed/10631925?p=IbAigKqWd1do4mjaM5XLIQc           	      C   sX   |  |}t|}| ||}|d }| ||\}}| ||}|d||d |S )NZeffective_videoZRutube)Zextractor_keyrM   rN   )rc   r
   r<   rQ   r:   update)	r   rB   Zembed_idr   rL   r   rM   rN   rd   r   r   r   re   '  s    
zRutubeEmbedIE._real_extractN)	rS   rT   rU   rf   rg   rh   ri   rj   re   r   r   r   r   rk     s:   rk   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 N)_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 ]}| |p2| j||g|R i ||d| }|d}|rXt|ts\ q|D ]B}t|d}	|	sxq`| j|dd}
|
	d|	t
 d |
V  q`|d	}|r|d
s qqd S )Nr   zDownloading page results	video_urlF)r7   rB   )_typerB   ie_keynextZhas_next)	itertoolscountr   rt   r4   
isinstancelistr   r8   rl   rV   rx   )r   rq   rr   rs   Znext_page_urlZpagenumpageru   resultrv   entryr   r   r   _entries<  s:    


zRutubePlaylistBaseIE._entriesc                 O   s(   |  | j|g|R i |||dS )Nplaylist_name)Zplaylist_resultr   r4   )r   rq   rr   rs   r   r   r   _extract_playlistX  s    
z&RutubePlaylistBaseIE._extract_playlistc                 C   s   |  | |S rn   )r   rc   )r   rB   r   r   r   re   ]  s    z"RutubePlaylistBaseIE._real_extractN)rS   rT   rU   rt   r   r   re   r   r   r   r   rm   8  s   rm   c                   @   s.   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!   Z1800D   rB   r\   Zplaylist_mincountz8https://rutube.ru/api/tags/video/%s/?page=%s&format=jsonNrS   rT   rU   rf   rg   rh   rj   ro   r   r   r   r   r   a  s   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   )rc   r   _MOVIE_TEMPLATEr   r4   )r   rB   Zmovie_idZmovier   r   r   re   x  s    


zRutubeMovieIE._real_extractN)	rS   rT   rU   rf   rg   rh   r   ro   re   r   r   r   r   r   p  s   r   c                   @   s.   e Zd ZdZdZdZdddiddgZd	Zd
S )RutubePersonIEzrutube:personzRutube person videosz,https?://rutube\.ru/video/person/(?P<id>\d+)z&https://rutube.ru/video/person/313878/r!   Z313878$   r   z:https://rutube.ru/api/video/person/%s/?page=%s&format=jsonNr   r   r   r   r   r     s   r   c                   @   s.   e Zd ZdZdZdZdddiddgZd	Zd
S )RutubePlaylistIEzrutube:playlistzRutube playlistsz$https?://rutube\.ru/plst/(?P<id>\d+)zhttps://rutube.ru/plst/308547/r!   Z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!   Z639184_videos   r   z*https://rutube.ru/channel/25902603/shorts/Z25902603_shortsi  z#https://rutube.ru/channel/25902603/Z25902603i  z"https://rutube.ru/u/rutube/videos/Z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,rspaZrshortsr`   )ZvideosZshortsN)r4   ro   )r   rp   rq   sectionZorigin_typer   r   r   rt     s    zRutubeChannelIE._next_page_urlc              
   C   s   |  |ddd\}}}|dkr*t||rp| ||}| jd|d|td}t|dd	d
d ddththt	f}| j
||d}|r| d| |d< |S )Nr!   slugr   Z	playlistszwindow\.reduxState\s*=zredux state)Ztransform_sourceapiZqueriesc                 S   s
   |  dS )NZchannelIdBySlug)
startswith)k_r   r   r   r$     r%   z/RutubeChannelIE._real_extract.<locals>.<lambda>dataZ
channel_id)r   r   )Z_match_valid_urlgroupr   Z_download_webpageZ_search_jsonr	   r   ri   r   anyr   )r   rB   rq   r   r   ZwebpageZredux_stateZplaylistr   r   r   re     s     

zRutubeChannelIE._real_extractN)
rS   rT   rU   rf   rg   rh   rj   ro   rt   re   r   r   r   r   r     s6   r   )rz   commonr   utilsr   r   r   r   r	   r
   r   r   r   r   Zutils.traversalr   r   r   rV   rk   rm   r   r   r   r   r   r   r   r   r   <module>   s   0X 2)