U
    ga?                     @   s   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
mZmZmZmZmZ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dS )    N   )InfoExtractor   )	HTTPError)
ExtractorErrordetermine_extextract_attributesint_or_nonemerge_dictsparse_iso8601strip_or_nonetraverse_objurl_or_noneurljoinc                   @   s&   e Zd Zdd Zdd Zd	ddZdS )
	IGNBaseIEc                 C   s"   |  d| j d| j d| |S )Nzhttp://apis.ign.com/z/v3/zs/slug/)Z_download_json
_PAGE_TYPE)selfslug r   8/tmp/pip-unpacked-wheel-q5ljy6pj/yt_dlp/extractor/ign.py	_call_api   s     zIGNBaseIE._call_apic              
   C   s   z|  |W S  tk
r| } zRt|jtrj|jjdkrj|jjpT|jjj|jj|jj	g|j_td|jdd W 5 d }~X Y nX d S )N  Content not found: expired?Tcauseexpected)
r   r   
isinstancer   r   statusargsresponseurlreasonr   r   er   r   r   _checked_call_api   s       zIGNBaseIE._checked_call_apiTc                 C   s  |d }g }t |dtdpi }t|d}|rL|| j||ddddd	 t|d
}|rv|| j||ddd |dpg D ]X}t|d}	|	sq||	t|ddt|dt|dt|dd qt |dtd}
|
r|t	|
ddd|
d t |ddddiftd}t |ddd d}t |dtdpHi }t |dd d!d"d d}||t
|d#t|d$t|d%|||d&S )'NZvideoIdrefsZexpected_typeZm3uUrlmp4Zm3u8_nativeZhlsF)Zm3u8_idfatalZf4mUrlZhds)Zf4m_idr(   Zassetsr    Zbitratei  Z
frame_rateheightwidth)r    ZtbrZfpsr)   r*   )systemZmezzanineUrlZ	mezzaniner   )extZ	format_idZqualityr    
thumbnails.)tags.ZdisplayNamec                 S   s   |   p
d S Nstripxr   r   r   <lambda>P       z/IGNBaseIE._extract_video_info.<locals>.<lambda>metadataZ	longTitletitlenamec                 S   s   |   p
d S r/   r0   r2   r   r   r   r4   U   r5   descriptionZpublishDateduration)idr7   r9   	timestampr:   r-   formatsr.   )r   dictr   getextendZ_extract_m3u8_formatsZ_extract_f4m_formatsappendr	   r   r   r   )r   videor(   video_idr=   r%   Zm3u8_urlZf4m_urlZassetZ	asset_urlZmezzanine_urlr-   r.   r6   r7   r   r   r   _extract_video_info%   s           
        zIGNBaseIE._extract_video_infoN)T)__name__
__module____qualname__r   r$   rD   r   r   r   r   r      s   r   c                   @   s   e Zd ZdZdZdZdded efZdZ	dZ
d	d
ddddddddddd
ddidddddddddd d!d"d#d$dd%gZed&d' Zd(d) Zd*d+ Zd,d- Zd.S )/IGNIEz
    Extractor for some of the IGN sites, like www.ign.com, es.ign.com de.ign.com.
    Some videos of it.ign.com are also supported
    z#/(?:\d{4}/\d{2}/\d{2}/)?(?P<id>.+?)z(?:/?\?(?P<filt>[^&#]+))?z2https?://(?:.+?\.ign|www\.pcmag)\.com/videos(?:{})|z(?:[/?&#]|$)zign.comrB   z:http://www.ign.com/videos/2013/06/05/the-last-of-us-reviewZ d2e1586d9987d40fad7867bf96a018eaZ 8f862beef863986b2785559b9e1aa599r'   zThe Last of Us Reviewz$md5:c8946d4260a4d43a00d5ae8ed998870ci`DQZ20130605zcount:9zthe-last-of-us-reviewzShttps://assets1.ignimgs.com/vid/thumbnails/user/2014/03/26/lastofusreviewmimig2.jpgi  )
r;   r,   r7   r9   r<   upload_dater.   
display_id	thumbnailr:   ZnocheckcertificateT)r    md5	info_dictparamszYhttp://www.pcmag.com/videos/2015/01/06/010615-whats-new-now-is-gogo-snooping-on-your-dataZ f1581a6fe8c5121be5b807684aeac3f6Z ee10d774b508c9b8ec07e763b9125b91z.What's New Now: Is GoGo Snooping on Your Data?z$md5:817a20299de610bd56f13175386da6fai2TZ20150106zcount:4)r;   r,   r7   r9   r<   rJ   r.   z404 Not Found)r    rM   rN   skipzOhttps://www.ign.com/videos/is-a-resident-evil-4-remake-on-the-way-ign-daily-fixr    Zonly_matchingc                    sB   t d|}td  fddt d| j d|r6|d ndD S )Nzg(?s)<section\b[^>]+\bclass\s*=\s*['"](?:[\w-]+\s+)*?content-feed-grid(?!\B|-)[^>]+>(.+?)</section[^>]*>c                 3   s   | ]}t  |d V  qdS )pathN)r   group).0mr    r   r   	<genexpr>   s     z,IGNIE._extract_embed_urls.<locals>.<genexpr>z+<a\b[^>]+\bhref\s*=\s*('|")(?P<path>/videosz)\1r    )refindallfilterfinditer_VIDEO_PATH_RE)clsr    webpageZgridsr   rV   r   _extract_embed_urls   s     zIGNIE._extract_embed_urlsc                 C   s6   |  |dd\}}|r&| ||S | ||p2dS )Nr;   filtall)Z_match_valid_urlrS   _extract_video_extract_playlist)r   r    rK   ra   r   r   r   _real_extract   s    zIGNIE._real_extractc                    s0     ||} j fdd ||D |dS )Nc                 3   s   | ]}  |  V  qd S r/   )
url_resultie_key)rT   ur   r   r   rW      s   z*IGNIE._extract_playlist.<locals>.<genexpr>)playlist_id)_download_webpageplaylist_resultr`   )r   r    rK   r_   r   ri   r   rd      s    

zIGNIE._extract_playlistc                 C   s"   |  |}| |}td|i|S )NrK   )r$   rD   r
   )r   r    rK   rB   infor   r   r   rc      s    

 zIGNIE._extract_videoN)rE   rF   rG   __doc__r]   Z_PLAYLIST_PATH_REformatjoin
_VALID_URLZIE_NAMEr   _TESTSclassmethodr`   re   rd   rc   r   r   r   r   rH   c   sZ    	$
	rH   c                   @   s`   e Zd ZdZdddddddd	d
dddd
dgdddddddddddddgZdd ZdS )
IGNVideoIEzIhttps?://.+?\.ign\.com/(?:[a-z]{2}/)?[^/]+/(?P<id>\d+)/(?:video|trailer)/z[http://me.ign.com/en/videos/112203/video/how-hitman-aims-to-be-different-than-every-other-sZ dd9aca7ed2657c4e118d8b261e5e9de1Z e9be7ea899a9bbfc0674accc22a36cc8r'   zIHow Hitman Aims to Be Different Than Every Other Stealth Game - NYCC 2015zGTaking out assassination targets in Hitman has never been more stylish.i VZ20151012Z112203zhhttps://sm.ign.com/ign_me/video/h/how-hitman/how-hitman-aims-to-be-different-than-every-other-s_8z14.jpgi*  zcount:13)
r;   r,   r7   r9   r<   rJ   rK   rL   r:   r.   zHTTP Error 400: Bad Request)r    rM   rN   expected_warningszNhttp://me.ign.com/ar/angry-birds-2/106533/video/lrd-ldyy-lwl-lfylm-angry-birdsTrQ   zChttps://me.ign.com/ar/ratchet-clank-rift-apart/144327/trailer/embedz9http://adria.ign.com/sherlock-season-4/9687/trailer/embedz.https://kr.ign.com/bic-2018/3307/trailer/embedc                 C   s   |  |}tj|}tj|j|jddd d d}| ||\}}|j	}tj
tj|jdd gd }|r| |t S | jd|d	d
d}	|	s||krtd| | |S t|	}	|	dpd}
| |
|d }
| |
}td|i|S )N/r   r   z/embed)rR   r    z)(<div\b[^>]+\bdata-video-id\s*=\s*[^>]+>)zvideo elementFr(   zRedirect loop: zdata-settingsz{}rB   rK   )	_match_idurllibparseurlparse
urlunparse_replacerR   rsplitZ_download_webpage_handler    parse_qsqueryr?   rf   rH   rg   _search_regexr   r   Z_parse_jsonrD   r
   )r   r    rC   
parsed_urlZ	embed_urlr_   Zurlhnew_urlZign_urlrB   Z
video_datarm   r   r   r   re      s@    
 

 zIGNVideoIE._real_extractN)rE   rF   rG   rq   rr   re   r   r   r   r   rt      s<   !rt   c                   @   s   e Zd ZdZdZddddddd	d
dddddddd
iddd	ddddddddd
igddidgd d!d"d#dd$dgd%d&dd'd(dd'd)dd'd*dd'd+dd'gZd,d- Zd.d/ Zd0S )1IGNArticleIEzrhttps?://.+?\.ign\.com/(?:articles(?:/\d{4}/\d{2}/\d{2})?|(?:[a-z]{2}/)?(?:[\w-]+/)*?feature/\d+)/(?P<id>[^/?&#]+)articlezVhttp://me.ign.com/en/feature/15775/100-little-things-in-gta-5-that-will-blow-your-mindZ72113z3100 Little Things in GTA 5 That Will Blow Your Mind)r;   r7   rN   Z 5ebbd138523268b93c9141af17bec937r'   zGrand Theft Auto V Video ReviewzhRockstar drops the mic on this generation of games. Watch our review of the masterly Grand Theft Auto V.ih7RZ20130916zcount:12zchttps://assets1.ignimgs.com/thumbs/userUploaded/2021/8/16/gta-v-heistsjpg-e94705-1629138553533.jpegzgrand-theft-auto-v-video-reviewi  )
r;   r,   r7   r9   r<   rJ   r.   rL   rK   r:   Z 638672ee848ae4ff108df2a296418ee2zGTA 5 In Slow Motionz4The twisted beauty of GTA 5 in stunning slow motion.idRZ20131212   zcount:25zgta-5-in-slow-motionzKhttps://assets1.ignimgs.com/vid/thumbnails/user/2013/11/03/GTA-SLO-MO-1.jpg)
r;   r,   r7   r9   r<   rJ   r:   r.   rK   rL   Zskip_downloadTzBackend fetch failed)r    rN   ZplaylistrO   ru   zVhttp://www.ign.com/articles/2014/08/15/rewind-theater-wild-trailer-gamescom-2014?watchZ53ee806780a81ec46e0790f8z+Rewind Theater - Wild Trailer Gamescom 2014r   )r    rN   Zplaylist_countru   z`http://www.ign.com/articles/2017/06/08/new-ducktales-short-donalds-birthday-doesnt-go-as-plannedrQ   z>https://www.ign.com/articles/2021-mvp-named-in-puppy-bowl-xviizLhttps://www.ign.com/articles/2014/08/07/sons-of-anarchy-final-season-trailerzihttps://www.ign.com/articles/2017/09/20/marvels-the-punisher-watch-the-new-trailer-for-the-netflix-seriesz`https://www.ign.com/articles/2016/01/16/supergirl-goes-flying-with-martian-manhunter-in-new-clipc              
   C   s   z|  |W S  tk
r } zzt|jtr|jjpH|jjj|jj|jj	g|j_|jjdkrltd|jddn&|jjdkr| 
t|j W Y 
d S  W 5 d }~X Y nX d S )Nr   r   Tr   i  )r   r   r   r   r   r   r   r    r   r!   Zreport_warningstrr"   r   r   r   r$   <  s&       
zIGNArticleIE._checked_call_apic                    s    |  rJ fdd}|  dt ddd dS |jdd d	}|rzfd
d}n0jdddd d}fdd}| |pt	
ddjdd	pd S )Nc                  3   sb   t  dtd} | r$| t V   dp0g D ]*}td|D ]}t|rB|V  qBq2d S )N)ZmediaRelationsr   Zmediar6   r    r&   contentzD(?:\[(?:ignvideo\s+url|youtube\s+clip_id)|<iframe[^>]+src)="([^"]+)")r   r   rf   rH   rg   r?   rY   rZ   )Z	media_urlr   Z	video_url)r   r   r   r   entriesR  s     z+IGNArticleIE._real_extract.<locals>.entriesZ	articleId)r6   Zheadlinec                 S   s   |   p
d S r/   r0   r2   r   r   r   r4   a  r5   z,IGNArticleIE._real_extract.<locals>.<lambda>r&   zdable:item_iddefaultc                  3   sp   t dD ]^}  jd| dddd}tjt|dp>d}t	|dpRd gd	 }|r 
|V  qd S )
NzS(?s)<object\b[^>]+\bclass\s*=\s*("|')ign-videoplayer\1[^>]*>(?P<params>.+?)</objectz2(<param\b[^>]+\bname\s*=\s*("|')flashvars\2[^>]*>)rO   	flashvarsrX   r   valuer    rw   )rY   r\   r   rS   rz   r{   r   r   r?   r   rf   )rU   r   Zv_url)r   r_   r   r   r   h  s      z,\bdata-post-id\s*=\s*("|')(?P<id>[\da-f]+)\1r;   )rS   r   c               	   3   sz   t ddddd dfD ]\} t dd| ddftd	r:qt dd| ftd	pPi }j|d
d}|rtd i|V  qd S )NpropsZapolloStateZ
ROOT_QUERYc                 S   s
   |  dS )NzvideoPlayerProps()
startswith)k_r   r   r   r4   }  r5   z=IGNArticleIE._real_extract.<locals>.entries.<locals>.<lambda>Z__refZPlayerPropsZModernContentr&   Frx   rK   )r   replacer>   rD   r
   )ZplayerrB   rm   )rK   nextjs_datar   r   r   r   z  s$     z\s+-\s+IGN\s*$rX   )ry   r$   rl   r?   r   rk   Z_html_search_metar   Z_search_nextjs_datarY   subZ_og_search_title)r   r    r   rj   r   )r   rK   r   r   r_   r   re   L  s>    

      zIGNArticleIE._real_extractN)rE   rF   rG   rq   r   rr   r$   re   r   r   r   r   r      s~    )
Fr   )rY   urllib.parserz   commonr   Znetworking.exceptionsr   utilsr   r   r   r	   r
   r   r   r   r   r   r   rH   rt   r   r   r   r   r   <module>   s   0OR>