U
    y^R                     @   s   d dl mZ d dlZd dlZddlmZ ddlmZmZm	Z	m
Z
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mZ G dd	 d	eZG d
d deZdS )    )unicode_literalsN   )InfoExtractor   )compat_etree_fromstringcompat_http_clientcompat_urllib_errorcompat_urllib_parse_unquote compat_urllib_parse_unquote_plus)
clean_htmlerror_to_compat_strExtractorErrorget_element_by_idint_or_none
js_to_jsonlimit_lengthparse_countsanitized_Requesttry_geturlencode_postdatac                   @   s  e Zd ZdZdZdZdZdZdZdZ	dZ
dd	d
dddd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%d&d'd(dd)d*d+d,dd-d.d/dd0d1d+d,dd2d3d4d5dd6dd7d8d9d:d;d<d=d>dd?d@dAdBdedCdDdEdFddGdHdIdJdKdLdMidNdOdPddQdRdSdTddUdLdMidNdVdWddXdYdZd[dKdLdMidNd\dMd]d^dMd]d_dMd]d`dMd]dadMd]dbdMd]dcdMd]dddMd]dedfddgdhd+dLdMidNgZedidj Zdkdl Zdmdn ZdtdodpZdqdr ZdsS )u
FacebookIEa  (?x)
                (?:
                    https?://
                        (?:[\w-]+\.)?(?:facebook\.com|facebookcorewwwi\.onion)/
                        (?:[^#]*?\#!/)?
                        (?:
                            (?:
                                video/video\.php|
                                photo\.php|
                                video\.php|
                                video/embed|
                                story\.php
                            )\?(?:.*?)(?:v|video_id|story_fbid)=|
                            [^/]+/videos/(?:[^/]+/)?|
                            [^/]+/posts/|
                            groups/[^/]+/permalink/
                        )|
                    facebook:
                )
                (?P<id>[0-9]+)
                z\https://www.facebook.com/login.php?next=http%3A%2F%2Ffacebook.com%2Fhome.php&login_attempt=1z]https://www.facebook.com/checkpoint/?next=http%3A%2F%2Ffacebook.com%2Fhome.php&_fb_noscript=1facebookzhMozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.97 Safari/537.36z-https://www.facebook.com/video/video.php?v=%szZhttps://www.facebook.com/video/tahoe/async/%s/?chain=true&isvideo=true&payloadtype=primaryz<https://www.facebook.com/video.php?v=637842556329505&fref=nfZ 6a40d33c0eccbb1af76cf0485a052659Z637842556329505mp4zOre:Did you know Kei Nishikori is the first Asian man to ever reach a Grand SlamzTennis on FacebookZ20140908iTidexttitleuploaderupload_date	timestampzRequires logging in)urlmd5	info_dictskipz4https://www.facebook.com/video.php?v=274175099429670Z274175099429670z"re:^Asif Nawab Butt posted a videozAsif Nawab ButtZ20140506iV"iSzre:^https?://.*)r   r   r   r   r   r   	thumbnailr   )r    r"   expected_warningszVideo with DASH manifestz4https://www.facebook.com/video.php?v=957955867617029Z b2c28d528273b323abe5c6ab59f0f030Z957955867617029zPWhen you post epic content on instagram.com/433 8 million followers, this is ...zDemy de ZeeuwZ20160110iYV)noter    r!   r"   r#   z8https://www.facebook.com/maxlayn/posts/10153807558977570Z 037b1fa7f3c2d02b7a0d7bc16031ecc6Z544765982287235z)"What are you doing running in the snow?"ZFailArmy)r   r   r   r   z
Video gonezOhttps://m.facebook.com/story.php?story_fbid=1035862816472149&id=116132035111903Z 1deb90b6ac27f7efcf6d747c8a27f5e3Z1035862816472149z;What the Flock Is Going On In New Zealand  Credit: ViralHogzS. Saintzswf params escapedz<https://www.facebook.com/barackobama/posts/10153664894881749Z 97ba073838964d12c70566e0085c2b91Z10153664894881749zPAverage time to confirm recent Supreme Court nominees: 67 days Longest it's t...i,VZ20160223zBarack Obama)r   r   r   r$   r   r   r   )r&   r    r!   r"   z6https://www.facebook.com/cnn/videos/10155529876156509/Z 9571fae53d4165bbbadb17a94651dcdcZ10155529876156509uT   She survived the holocaust — and years later, she’s getting her citizenship s...iXZ20161030ZCNN)r   r   r   r   r   r   r$   
view_count)r    r!   r"   zAhttps://www.facebook.com/yaroslav.korpan/videos/1417995061575415/Z1417995061575415z$md5:1db063d6a8c13faa8da727817339c857isXZ20170209zYaroslav Korpan)r   r   r   r   r   r   skip_downloadT)r    r"   paramsz>https://www.facebook.com/LaGuiaDelVaron/posts/1072691702860471Z1072691702860471z$md5:ae2d22a93fbb12dad20dc393a869739diX20161024u   La Guía Del Varón)r   r   r   r   r   r   r$   zLhttps://www.facebook.com/groups/1024490957622648/permalink/1396382447100162/Z1396382447100162z$md5:19a428bbde91364e3de815383b54a235i&XZ20170202zElisabeth Ahtnz6https://www.facebook.com/video.php?v=10204634152394104r    only_matchingzAhttps://www.facebook.com/amogood/videos/1618742068337349/?fref=nfzbhttps://www.facebook.com/ChristyClarkForBC/videos/vb.22819070941/10153870694020942/?type=2&theaterzfacebook:544765982287235zJhttps://www.facebook.com/groups/164828000315060/permalink/764967300301124/z@https://zh-hk.facebook.com/peoplespower/videos/1135894589806027/z>https://www.facebookcorewwwi.onion/video.php?v=274175099429670zIhttps://www.facebook.com/onlycleverentertainment/videos/1947995502095005/z<https://www.facebook.com/WatchESLOne/videos/359649331226507/Z359649331226507z?#ESLOne VoD - Birmingham Finals Day#1 Fnatic vs. @Evil GeniuseszESL One Dota 2c                 C   sL   g }t d| D ]}||d qt d| D ]}||d q2|S )Nzd<iframe[^>]+?src=(["\'])(?P<url>https?://www\.facebook\.com/(?:video/embed|plugins/video\.php).+?)\1r    z(?x)<div[^>]+
                class=(?P<q1>[\'"])[^\'"]*\bfb-(?:video|post)\b[^\'"]*(?P=q1)[^>]+
                data-href=(?P<q2>[\'"])(?P<url>(?:https?:)?//(?:www\.)?facebook.com/.+?)(?P=q2))refinditerappendgroup)webpageurlsmobj r4   PC:\Users\TaGoRe\Desktop\beinconnect-dl\binaries\youtube_dl\extractor\facebook.py_extract_urls   s    zFacebookIE._extract_urlsc              
   C   s  |   \}}|d krd S t| j}| ddd | j|d ddd}| d|d}| d	|d
}||||dddddd	}t| jt|}|dd z| j|d ddd}	t	d|	d k	r| j
d|	dd dd}
|
rtd|
 dd| jd W d S | jd|	dd d}| jd |	d!d d}|r |s&W d S ||d"d#}t| jt|}|dd | j|d d$d%}t	d&|d k	r|| jd' W nJ tjtjtjfk
r } z| jd(t|  W Y d S d }~X Y nX d S ))Nzfacebook.comlocaleen_USzDownloading login pagezUnable to download login page)r&   errnotez/<input type="hidden" name="lsd" value="([^"]*)"lsdzname="lgnrnd" value="([^"]*?)"lgnrndzhttp://facebook.com/home.php01z-60)	emailpassr:   r;   nextZdefault_persistentZlegacy_returntimezoneZtrynumContent-Type!application/x-www-form-urlencodedz
Logging inzunable to fetch login pagez <form(.*)name="login"(.*)</form>zh(?s)<div[^>]+class=(["\']).*?login_error_box.*?\1[^>]*><div[^>]*>.*?</div><div[^>]*>(?P<error>.+?)</div>zlogin errorerror)defaultr0   zUnable to login: %sTexpectedzjunable to log in: bad username/password, or exceeded login rate limit (~3/min). Check credentials or wait.zname="fb_dtsg" value="(.+?)"fb_dtsgrE   z.name="h"\s+(?:\w+="[^"]+"\s+)*?value="([^"]+)"hZ	dont_save)rH   rJ   Zname_action_selectedzConfirming login)r&   zid="checkpointSubmitButton"zSUnable to confirm login, you have to login in your browser and authorize the login.zunable to log in: %s)_get_login_infor   
_LOGIN_URL_set_cookie_download_webpage_search_regexr   
add_headerr-   search_html_search_regexr   _downloaderreport_warning_CHECKPOINT_URLr   URLErrorr   HTTPExceptionsocketrD   r   )selfZ	useremailpasswordZlogin_page_req
login_pager:   r;   
login_formrequestZlogin_resultsrD   rH   rJ   Z
check_formZ	check_reqZcheck_responseerrr4   r4   r5   _login   s    
           zFacebookIE._loginc                 C   s   |    d S N)r_   rY   r4   r4   r5   _real_initialize1  s    zFacebookIE._real_initializec                    s  t |}|d| j | ||}d }dd  | j| jd|ddd|dd	}|r` |d
g } fdd}|s| j| jd|ddd|tdd}||}|s`|s|dfS t	d|}	|	d k	rt
d|	d ddnd|kr|   | j| j| |td| jd|ddd| jd|ddd| jd|ddddd d!id"}
| j| jd#|
d$dd|dd	}||}|snt
d%i }g }|D ]}|d& }|rt|tr|g}|rzt|tsqzd'D ]n}d(D ]b}|d) d*||f }|r|d+krd,nd)}|d-kr|d.7 }|d/|||f ||d0 qq|d) d1}|rV|| tt| |d) d2}|rz|d3g d4|i qz|st
d5|D ]}d6|d7i d< q| | | jd8|d9d d}|s| jd:|d;d d}|s| jd<|d9d d}|rt|d=}nd>| }ttd?|pD| jd@|dAd dpD| j|dd	}t| jdB|dCd d}| dDdEg|}t | jdF|dGd d}||||||||dH}||fS )INz
User-Agentc                 S   s@   | D ]6}|d d dkr|d d }| dr|d   S qd S )Nr   r   ZVideoConfigr   video_idZ	videoData)get)	instancesitemZ
video_itemr4   r4   r5   extract_video_data;  s
    
z8FacebookIE._extract_from_url.<locals>.extract_video_dataz handleServerJS\(({.+})(?:\);|,")zserver js dataz{}rI   F)fatalre   c                    s    | r t | dd tpg S d S )Nc                 S   s   | d d S )NZjsmodsre   r4   )xr4   r4   r5   <lambda>L      zUFacebookIE._extract_from_url.<locals>.extract_from_jsmods_instances.<locals>.<lambda>)r   list)Zjs_datarg   r4   r5   extract_from_jsmods_instancesI  s      zCFacebookIE._extract_from_url.<locals>.extract_from_jsmods_instanceszbigPipe\.onPageletArrive\(({.+?})\)\s*;\s*}\s*\)\s*,\s*["\']onPageletArrive\s+(?:pagelet_group_mall|permalink_video_pagelet|hyperfeed_story_id_\d+)zjs data)transform_sourcerh   z8class="[^"]*uiInterstitialContent[^"]*"><div>(.*?)</div>z/The video is not available, Facebook said: "%s"r   TrF   z>You must log in to continuez%pkg_cohort["\']\s*:\s*["\'](.+?)["\']z
pkg cohortzPHASED:DEFAULTz!client_revision["\']\s*:\s*(\d+),zclient revisionZ3944515z>"DTSGInitialData"\s*,\s*\[\]\s*,\s*{\s*"token"\s*:\s*"([^"]+)"z
dtsg token )Z__aZ__pcZ__revrH   rB   rC   )dataheaderszfor\s+\(\s*;\s*;\s*\)\s*;(.+)ztahoe js datazCannot parse datastream_type)sdhd)srcZsrc_no_ratelimitr   z%s_%sprogressiveiru      z%s_%s_%s)	format_idr    
preferencedash_manifestsubtitles_srcenr    zCannot find video formatszfacebookexternalhit/1.1http_headersz2<h2\s+[^>]*class="uiHeaderTitle"[^>]*>([^<]*)</h2>r   zf(?s)<span class="fbPhotosPhotoCaption".*?id="fbPhotoPageCaption"><span class="hasCaption">(.*?)</span>zalternative titledescriptionP   zFacebook video #%sZfbPhotoPageAuthorNamezownerName\s*:\s*"([^"]+)"r   z<abbr[^>]+data-utime=["\'](\d+)r   zog:imageztwitter:imagez \bviewCount\s*:\s*["\']([\d,.]+)z
view count)r   r   formatsr   r   r$   r'   	subtitles)!r   rP   _CHROME_USER_AGENTrN   _parse_jsonrO   rd   r   r-   rQ   r   r0   raise_login_required_VIDEO_PAGE_TAHOE_TEMPLATEr   
isinstancedictrl   r/   extend_parse_mpd_formatsr   r
   
setdefault_sort_formatsrR   _html_search_metar   r   r   _og_search_titler   r   )rY   r    rc   fatal_if_no_videoreqr1   
video_dataZserver_js_datarn   Zm_msgZ
tahoe_dataZtahoe_js_datar   r   fry   qualitysrc_typerv   rz   r{   r|   video_titler   r   r$   r'   r"   r4   rm   r5   _extract_from_url4  s\                     



              zFacebookIE._extract_from_urlc              	      s     |}|dr j| n|} j||dd\}}|r>|S d|krz fdd  jd|dd	d
|D } ||S  j j| |dd\}}|S d S )Nz	facebook:F)r   z/posts/c                    s    g | ]}  d | t qS )zfacebook:%s)
url_resultr   ie_key).0vidra   r4   r5   
<listcomp>  s   z,FacebookIE._real_extract.<locals>.<listcomp>z)(["\'])video_ids\1\s*:\s*(?P<ids>\[.+?\])z	video idsids)r0   T)	_match_id
startswith_VIDEO_PAGE_TEMPLATEr   r   rO   playlist_result)rY   r    rc   real_urlr1   r"   entries_r4   ra   r5   _real_extract  s0    

   
zFacebookIE._real_extractN)T)__name__
__module____qualname__
_VALID_URLrL   rU   _NETRC_MACHINEIE_NAMEr   r   r   int_TESTSstaticmethodr6   r_   rb   r   r   r4   r4   r4   r5   r      sL  
	 
 	    &
?
 r   c                	   @   sL   e Zd ZdZdddddddd	d
e gdddddddgZdd ZdS )FacebookPluginsVideoIEzQhttps?://(?:[\w-]+\.)?facebook\.com/plugins/video\.php\?.*?\bhref=(?P<id>https.+)zhttps://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2Fgov.sg%2Fvideos%2F10154383743583686%2F&show_text=0&width=560Z 5954e92cdfe51fe5782ae9bda7058a07Z10154383743583686r   zWhat to do during the haze?zGov.sgZ20160826iWr   )r    r!   r"   add_iezrhttps://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2Fvideo.php%3Fv%3D10204634152394104Tr+   zhttps://www.facebook.com/plugins/video.php?href=https://www.facebook.com/gov.sg/videos/10154383743583686/&show_text=0&width=560c                 C   s   |  t| |t S r`   )r   r	   r   r   r   )rY   r    r4   r4   r5   r     s    z$FacebookPluginsVideoIE._real_extractN)r   r   r   r   r   r   r   r   r4   r4   r4   r5   r     s(   r   )
__future__r   r-   rX   commonr   compatr   r   r   r	   r
   utilsr   r   r   r   r   r   r   r   r   r   r   r   r   r4   r4   r4   r5   <module>   s   4   J