
    =ҐiS{                         d dl Z d dlZddlmZ ddlm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mZmZmZmZ dd	lmZmZmZmZ  G d
 de      Z G d de      Z G d de      Z y)    N   )InfoExtractor)VidsIoIE)VimeoIE   )	HTTPError)KNOWN_EXTENSIONSExtractorError
clean_htmldetermine_extextract_attributesfloat_or_noneint_or_nonemimetype2extparse_iso8601smuggle_urlstr_or_noneupdate_url_queryurl_or_noneurljoin)find_elementsrequiretraverse_objvaluec                   8    e Zd Zej                  d        ZddZy)PatreonBaseIEc                 F    | j                  d      j                  d      ryy)Nhttps://www.patreon.com/
session_idz1Patreon/72.2.28 (Android; Android 14; Scale/2.10)z0Patreon/7.6.28 (Android; Android 11; Scale/2.10))_get_cookiesget)selfs    Q/var/www/descvideos/venv/lib/python3.12/site-packages/yt_dlp/extractor/patreon.pypatreon_user_agentz PatreonBaseIE.patreon_user_agent!   s$     78<<\JFA    Nc                    |i }d|vr| j                   |d<   |r|j                  ddi       	 | j                  d| ||r|nd|||      S # t        $ r}t	        |j
                  t              r;t        |j
                  j                  j                  j                  d            dk7  r | j                  | j                  |j
                  j                  d |      |d	
      }t        |dd	      }	|	rt        d|	 d       d }~ww xY w)N
User-Agentjson-api-version      ?zhttps://www.patreon.com/api/zDownloading API JSON)notequeryfatalheaderszContent-TypejsonFr,   )errors.detailget_allzPatreon said: T)expected)r$   update_download_jsonr
   
isinstancecauser   r   responser-   r!   _parse_json_webpage_read_contentr   )
r"   epitem_idr+   r-   r,   r*   eerr_jsonerr_messages
             r#   	_call_apizPatreonBaseIE._call_api)   s   ?Gw&$($;$;GL!LL,c23	&&.rd3dd0F5' ' ; ;  	aggy1\!''BRBRBZBZB^B^_mBn5osy5y''(B(B177CSCSUY[b(celty'zH&x1JTYZK$~k]%CdSS	s   A 	D
B0DD
)NNTN)__name__
__module____qualname__	functoolscached_propertyr$   rA    r%   r#   r   r       s!    B Br%   r   c                   t   e Zd ZdZdZddi ddddd	d
dddddddddddddddededdddddd ed!d"d#d$dd%ddeedd&d'd(d)i dd*dd+dd,dd-dddd.dd/dd0d1d2gd3d4d5ed6d7d8d9d:d-dd;d<d=ded>d?ed@dAed@dBdCdDdE
d@d@dFdGdHd@dIdJd@dIdKdLdMd+dNdOddPdQdRdSd'd(dTi ddUdd+deddVdeddWddXddddYddZdd[dd\d6d]dDgdd^ddYd ed_d`i ddadd+ddbddcdddddeddfddgdeddhddd ededdid6g djddcd'dkdli ddmdd+ddndeddoddpddqddd6drgddsded eddtdduddvddqd_dwdxd+dydzd{d|d}d~d}dddeeddddidgdddddddddddeddeeddd'dddd+ddededddddeddddd@idGddd+dddddddeeeddddd_gZdDZddiZd Z	d Z
d Zy)	PatreonIEpatreonzPhttps?://(?:www\.)?patreon\.com/(?:creation\?hid=|posts/(?:[\w-]+-)?)(?P<id>\d+)z*http://www.patreon.com/creation?hid=743933 e25505eec1053a6e6813b8ed369875ccid743933extmp3	alt_titlez	cd166.mp3titlez*Episode 166: David Smalley of Dogma Debatedescriptionz$md5:34d207dd29aa90e24f1b3f58841b81c7uploaderCognitive Dissonance Podcast	thumbnailre:^https?://.*$	timestampiSupload_date20140727uploader_id87145
like_countcomment_countuploader_url%https://www.patreon.com/dissonancepod
channel_id80642channel_urlchannel_follower_count)urlmd5	info_dictz*http://www.patreon.com/creation?hid=754133 3eb09345bf44bf60451b8b0b81759d0a754133zCD 167 Extra)rL   rN   rQ   rS   rU   r\   r]   r^   zPatron-only content)rd   re   rf   skipz,https://www.patreon.com/creation?hid=1682498SU4fj_aEMVwmp4zI'm on Patreon!TraciJHines20150211z$md5:8af6425f50bd46fbf29f3db0fc3a8364z@TraciHinesMusic
categoriesEntertainmentdurationi  
view_counttagszcount:39	age_limitr   channelz8https://www.youtube.com/channel/UCGLim4T2loE5rwCMdpCIPVglive_statusnot_liveUCGLim4T2loE5rwCMdpCIPVgpublicTz(https://www.youtube.com/@TraciHinesMusiczcount:4iTvideo)
r`   availabilityrc   playable_in_embedr^   r]   channel_is_verifiedchaptersrW   
media_type)
noplaylistskip_download)rd   rf   paramsz3https://www.patreon.com/posts/episode-166-of-743933rd   only_matchingz$https://www.patreon.com/posts/743933z6https://www.patreon.com/posts/kitchen-as-seen-51706779 96656690071f6d64895866008484251b	555089736z&KITCHEN AS SEEN ON DEEZ NUTS EXTENDED!z	Cold Ones20210526z$md5:557a409bd79d3898689419094934ba7914936315)rL   rN   rQ   rS   rU   rX   rR   rZ   z7https://www.patreon.com/posts/video-sketchbook-32452882324528824301314i|]20191218zhttps://www.patreon.com/loishz$md5:e2693e97ee299c8ece47ffdb67e7d9d2zVIDEO // sketchbook flipthroughLoish
sketchbook1641751)rd   rf   z5https://www.patreon.com/posts/premium-access-7028293170282931zD[Premium Access + Uncut] The Office - 2x6 The Fight - Group Reactionz"https://www.patreon.com/thenormies5733972929435zThe Normiesz$md5:79c9fd8778e2cef84049a94c058a5e2320220809iTeb)z
The Officezearly accessuncut)rd   rf   ri   z6https://www.patreon.com/posts/hunter-x-hunter-3400791334007913z-Hunter x Hunter | Kurapika DESTROYS Uvogin!!!
YaBoyRoshiiE^z"https://www.patreon.com/yaboyroshizHunter x Hunter14264111z!Kurapika is a walking cheat code!202002132147162z6https://www.patreon.com/posts/4k-spiderman-4k-96414599	902250943uY   ❤️(4K) Spiderman Girl Yeonhwa’s Gift ❤️(4K) 스파이더맨걸 연화의 선물uZ   ❤️(4K) Spiderman Girl Yeonhwa’s Gift 
❤️(4K) 스파이더맨걸 연화의 선물Npickyeonhwa90574422z"https://www.patreon.com/Yeonhwa72610237902F   iɆe20240113zre:^https?://.+)rL   rN   rQ   rR   rS   rZ   r^   r`   rb   rp   rW   rX   r]   r\   rU   r   m3u8z$Failed to parse XML: not well-formed)rd   rf   r   expected_warningsz7https://www.patreon.com/posts/holy-wars-solos-100601977   	100601977z<"Holy Wars" (Megadeth) Solos Transcription & Lesson/Analysisz$md5:d099ab976edfce6de2a65c2b169a88d3zBradley Hall24401883z)https://www.patreon.com/bradleyhallguitar3193932iee20240318)rL   rQ   rR   rS   rZ   r^   r`   rb   rc   rW   rX   r\   r]   rU   )rd   playlist_countrf   ri   z'https://www.patreon.com/posts/114721679	11472167920241025JapanalysiszKarasawa Part 2z@Part 2 of this video https://www.youtube.com/watch?v=Azms2-VTASkz#https://www.patreon.com/japanalysis80504268i7"g9346307)rL   rN   rX   rS   r\   rU   r]   rQ   rR   r^   rZ   rb   rc   rW   r`   getcommentsz2https://www.patreon.com/posts/scottfalco-146966245	146966245zscottfalco 1080z$md5:a3f29bbd0a46b4821ec3400957c98aa2
Insanimate2828146z"https://www.patreon.com/Insanimate6260877gԵ>UU@i(9Si20251230)rL   rN   rQ   rR   rS   rZ   r^   r`   rb   rc   r]   r\   rp   rW   rX   refererr   c                    t        | j                  d| |d      ddt        hf      }|sy t        |dd hfdt        hfd	d
t        hfd      }||d<   t        |d	ddt
        ht        f      }t        |dt
        hf      }|rt        |j                  d            dk(  r| j                  ||dd| j                        \  |d<   |d<   |d   D ]  }| j                  |d<    t        |d	dt
        hf      x}rO|d   j                  dg       j                  |dd       n'|s|r#|xs ||j                  d      dk7  rdnd dg|d<   |j                  d      sy |S )Nzmedia/Fr/   data
attributes	file_namec                 *    | j                  d      d   S )N.r   )
rpartition)xs    r#   <lambda>z3PatreonIE._extract_from_media_api.<locals>.<lambda>A  s    all3.?.B r%   
created_atdisplayrp   )rQ   rW   rp   rL   )Nviewer_playback_datard   download_urlmimetyper   rk   )r,   r-   formats	subtitleshttp_headerstranscript_urlenvtt)rd   rN   r~   ry   none)rd   vcodec)r   rA   dictr   r   r   anyr   r!   #_extract_m3u8_formats_and_subtitles_HTTP_HEADERS
setdefaultappend)r"   media_idr   rf   playback_urlr   fr   s           r#   _extract_from_media_apiz!PatreonIE._extract_from_media_api9  s   !NNVH:.NF\D6*,
  !$B#CD&8"J@.
 	
 #	$#$BEK=Z]^`#J+0OPL
)CDN;?;c;chUDDVDV <d <X8Ii )K"8y) 7$($6$6.!7!-j9FVYdXe:f!gg~g+&11$;BB) D  \ $3|$.NN<$@G$K&QU% $Ii  }}Y'r%   c                 
   | j                  |      }| j                  d| |dddddddd	
      }|d   d   }t        |dt        j                  hfdt
        hfddt        ht        fdt        hfdt        hfdt        hfd      }t               }g }d}t        |dd f      D ]  }	|	d   }
|
dk(  rt        |	dt        hf      xs i }t        |j                  d            }t        |j                  d            }t        |j                  d            }|r<|t        v r4|2|dz  }|j                  | d| |||t        |dt        hf      d        t        |	d!t        hf      x}s|j!                  |       |
d"k(  r8|j#                  t        |	dd#t        hfd!t$        hfdd$t        hfd%             |
d&k(  r;t        |	ddt        hf      x}s3|j'                  d'g       j                  |       V|
d(k(  s]|j#                  t        |	ddt        hfd!t$        hfdd$t        hfdd)t        hfd*              t        |d+d$t        hf      x}r| j)                  d,|d-d.d/0      \  }}|rt+        d1| d2|xs g i      }t-        j.                  |      r:| j1                  t-        j2                  || j4                  d3         t,        d45      }n%| j1                  t7        || j4                              }| j9                  ||d6| j4                  d7d7d89      x}r5t;        j.                  |      s|j<                  d:k7  r|j                  |       t        |d;t        hf      }|r|j                  d<      }t?        |      }|t        v r|j                  |||d$   d=       nq|d>k(  st?        |j                  d$            d?k(  rO| jA                  |d$   || j4                  @      \  }}|D ]  }| j4                  |dA<    |j                  |||dB       t        |dCtB        ht$        hf      x}r|j!                  |       t        |dtE        dDdEd4d4F      hdGtF        hdDf      D ]=  }||v r| jI                  |      x}s|j                  |       |j!                  |       ? t        |dH      }d }|r"|j                  d      r| jK                  |      }|s|d7u r| jM                  dI|d4J       nj|s| jM                  dK|d4J       nStO        |      dk(  r|j#                  |d          n0|D ]  }|j#                  |         | jP                  ||fi |dL|iS ||d!<   ||dL<   |S )MNposts/z*download_url,mimetype,size_bytes,file_namez_comment_count,content,embed,image,like_count,post_file,published_at,title,current_user_can_viewfull_name,urlr   zurl,name,patron_countfalsez7audio,user,user_defined_tags,campaign,attachments_media)zfields[media]fields[post]fields[user]zfields[post_tag]fields[campaign]json-api-use-default-includesinclude)r+   r   r   rQ   contentimage)	large_urlrd   published_atr\   r]   )rQ   rR   rU   rW   r\   r]   r   includedc                     |d   S )NtyperG   _vs     r#   r   z)PatreonIE._real_extract.<locals>.<lambda>z  s
    AfI r%   r   mediar   r   
size_bytesr   -r   )rL   rN   filesizerd   rP   rL   user	full_namerd   )rS   rZ   r^   post_tagrr   campaignpatron_count)rt   r`   rb   rc   embedz"//vimeo\.com/(\d+)(?:/([\da-f]+))?zvimeo id)r   r   )NN)groupdefaultzhttps://player.vimeo.com/video/hr   T)url_transparentzChecking embed URLF)  i  )r-   r,   errnoteexpected_statusr   	post_filename)rL   rN   rd   ry   r   r-   r   )rL   r   r   r   zdata-media-idz\d+)attrr   regexhtml.current_user_can_viewz#You do not have access to this post)video_idr4   z%No supported media found in this post__post_extractor))	_match_idrA   r   strstripr   r   r   r   r   setr   r!   r   r	   r   addr5   r   r   _search_regexr   r   suitable
url_result_smuggle_referrerr   r   _request_webpager   statusr   r   intr   r   r   extract_commentsraise_no_formatslenplaylist_result)r"   rd   r   postr   infoseen_media_idsentriesidxr   include_typemedia_attributesr   rN   r   r   r   	embed_urlvimeo_id
vimeo_hashentryurlhr   r   r   r   r   r   can_view_postcommentss                                 r#   _real_extractzPatreonIE._real_extracta  s'   >>#&~~XJ!M !B /$+$;18T2  	 &\,/
J		{+%
|4!#7+L(=/:'+7-}=)
  #D:7M*NO '	G"6?Lw&#/,9O#P#VTV *+;+?+?+OP"#3#7#7
#CD ))9)=)=l)KL
C+;$;
@V1HCNN!)
!C51"$.+%12B[SVRWDX%Y$   ,GdSE]CC8C"&&x0'L!-{SE B$(;-#8%15;-$H3   ++GlGcU5STT8TOOFB/66x@+L ,gu=#'+"7$0%+#G/;^k].[	3  E'	R %Z'5;-1PQQ9Q#'#5#55y&, $6 $@ Hj ,5hZ@**+-	 	*--i9K9KI9VWT ( 3 It?Q?Q(RS,,8%94CUCUUJ -  t 
 $$Y/4;;#3ENN5) kD6-BC	==(D%C&&"$U+  
 M)--2F$G6$Q%)%M%Me$h8J8J &N &L"  ;A(,(:(:An%;"&!*  
 (	J}3UVVxV""8,$Z?&PT[_`a$%2
  		-H
 >)44X>>u>u%""8,		- %Z1HITXXo6,,X6H=E1!!"GRZei!j!!"IT\gk!l\QKK
#  #T"#'4'']T]T\]]T
#+ r%   c              #   F  K   d }d}dddddddd	d
}t        j                  d      D ]  }|j                  |rd|ini        | j                  d| d||d|       }d }t	        |dd f      D ]  }|dz  }t	        |d      i t	        |dt
        hfddt        hfddt        hfddddt        d      hft        ht        fddt        hfd      t	        |dfddd t        hfd!t        hfd"fd#$      d%i  |t	        |d&      k  rt	        |d'      }| y  y w)(Nr   2   a`  parent.commenter.campaign,parent.post.user,parent.post.campaign.creator,parent.replies.parent,parent.replies.commenter.campaign,parent.replies.post.user,parent.replies.post.campaign.creator,commenter.campaign,post.user,post.campaign.creator,replies.parent,replies.commenter.campaign,replies.post.user,replies.post.campaign.creator,on_behalf_of_campaignzbody,created,is_by_creatorzimage_url,full_name,urlzimage_tiny_url,namez-createdr)   r   )zpage[count]r   zfields[comment]r   zfilter[flair]sortr(   r   r   page[cursor]r   z	/commentszDownloading comments page r+   r*   )r   r   c                      |d   dk(  xr |d   S )Nr   commentrL   rG   r   s     r#   r   z)PatreonIE._get_comments.<locals>.<lambda>  s    VWX^V_clVlVxqrswqx r%   )relationships	commenterr   rL   rL   r   bodycreatedr%  parentr   rootis_by_creator)rL   textrW   r)  author_is_uploaderr   c                 (    |d   k(  xr |d   dk(  S )NrL   r   r   rG   )r   r   	author_ids     r#   r   z)PatreonIE._get_comments.<locals>.<lambda>  s    4I1E1]!F)W]J] r%   r   	image_url)authorauthor_thumbnailFr2   r/  )metacount)r   rL   )	itertoolsr4  r5   rA   r   r   r   r   r   r   boolr   )	r"   post_idcursorr4  r   pager9   r$  r/  s	           @r#   _get_commentszPatreonIE._get_comments  s     z;52 #-4	
 OOA& 	DMMf>62"E~~	+WFKefjekIl & nH F'3GIx2yz 
(2^_	"7#k]3!-vu =&2I%O#2HfteTZm_F]`c_dfi"j/;_tf.U-  #8"$]_k'2SE&:1<{m0Ln. %*	+   	( |H.?@@%h0BC~?	s   DD!D!N)rB   rC   rD   IE_NAME
_VALID_URLr
  _TESTS_RETURN_TYPEr   r   r  r;  rG   r%   r#   rI   rI   @   s0   GdJ;1
(
5
 
 A	

 A
 6
 +
 
 :
 7
 #
 S
 C
 '
 B
  %c!
, <1#6+ C	
 & >
-
5
 '
 	

 +
 :
 A
 -
 ?+
 
 #
 J
 
 }
 U
  :!
" ##
$ 5$&)!%F #'!#!7
< !
?#H E 6 H1=#+%A%	
 &  I
*
5
 S
 9	

 #
 
 :
 ,
 ;
 A
 6
 
 \7+
 )
 :
  %c!
. G
*
5
 [
 ?	

 (
 9
 
 A
 S
 :
 ,
 %c
 #
 
 ;
  @!
$ &+0 H
*
5
 D
 #	

 
 
 ?
 ,
 &'
 :
 S
 %c
 >
 :
 )
  @!
. Hpx&%@$?#% +
" #F+DE+0 ISA&%G#F&)#% +
  &). 9%%+ &]A%@&)##
" !$'). D&A$$@#?&)  #%
unF^ L 	-M&PN`-r%   rI   c                       e Zd ZdZdZdddddddde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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(d)d*d+d,d-d.d/d0d1d2d.d-d2edd'd3d4dd5d6d7d8d6d7d9d6d7d:d6d7d;d6d7g
Zd< Zd= Zy>)?PatreonCampaignIEzpatreon:campaignz(?x)
        https?://(?:www\.)?patreon\.com/(?:
            (?:m|api/campaigns)/(?P<campaign_id>\d+)|
            (?:cw?/)?(?P<vanity>(?!creation[?/]|posts/|rss[?/])[\w-]+)
        )(?:/posts)?/?(?:$|[?#])z&https://www.patreon.com/dissonancepod/rT   r_   ra   zfre:(?s).*We produce a weekly news podcast focusing on stories that deal with skepticism and religion.*r   r[   rV   )rQ   rb   rL   rR   r`   rt   rs   rc   rZ   r^   rS   rU   D   )rd   rf   playlist_mincountz'https://www.patreon.com/m/4767637/postszNot Just Bikes4767637z$https://www.patreon.com/notjustbikesz]re:(?s).*Not Just Bikes started as a way to explain why we chose to live in the Netherlands.*Jason37306634)rQ   rL   r`   rb   rR   rs   rt   r^   rS   rZ   rU   G   z3https://www.patreon.com/api/campaigns/4243769/postszSecond Thought4243769z%https://www.patreon.com/secondthoughtz;re:(?s).*Second Thought is an educational YouTube channel.*z
JT Chapman32718287)rQ   rc   rL   r`   rb   rR   rs   rt   r^   rS   rZ   rU      zhttps://www.patreon.com/c/OgSog8504388OGSoGzHre:(?s)Hello and welcome to our Patreon page. We are Mari, Lasercorn, .+zhttps://www.patreon.com/OgSog72323575z
David Mosszre:https?://.+/.+)rL   rQ   rR   rt   r`   rb   r^   rZ   rS   rU   rc   rs   iK  zChannel removed)rd   rf   rC  ri   z,https://www.patreon.com/c/anythingelse/posts9631148zAnything Else?z$md5:2ee1db4aed2f9460c2b295825a24aa08zdan 13852412z$https://www.patreon.com/anythingelse)rL   rQ   rR   rS   rZ   r^   rt   r`   rb   rc   rs   rU      z'https://www.patreon.com/cw/anythingelseTr   z%https://www.patreon.com/c/OgSog/postsz+https://www.patreon.com/dissonancepod/postsz!https://www.patreon.com/m/5932659z-https://www.patreon.com/api/campaigns/4243769c              #   8  K   d }d|dddd}t        j                  d      D ]t  }|j                  |rd|ini        | j                  d||d| 	      }t	        |d
      }t	        |d      D ]$  }| j                  t        d|      t               & |t y  y w)Nzpatreon_url,urlr   z-published_at)r   zfilter[campaign_id]zfilter[is_draft]r   r   r   r!  postszDownloading posts page r"  )r3  
paginationcursorsnext)r   .r   patreon_urlr   )r6  r4  r5   rA   r   r  r   rI   )r"   campaign_idr9  r   r:  
posts_jsonpost_urls          r#   _entrieszPatreonCampaignIE._entries  s     -#. '#-4
 OOA& 
	DMMf>62"EFSjkojpQqrJ!*.WXF(5_` `oog.H(&SU^__` ~
	s   BBBc                 ^   | j                  |      j                  dd      \  }}|| j                  ||d| j                  i      }t	        | j                  ||d       dddd	d
ddt        hf      }|s7t	        | j                  ||      dd fdt        ht        t        d      hf      }ddddd}| j                  d| |dd|      xs i }|j                  d      xs i }t	        |d      }t	        |dd fi t        d      }	d||| j                  |      t        t	        |d            t	        |d      t        t	        |d             ||t	        |	d      t!        |	j                  d            t	        |	d!      t	        |d"      t	        |d#      rd$nd%t#        t	        |d&            d'S )(NrW  vanityr'   r   )r   props	pagePropsbootstrapEnvelopepageBootstrapr   r   rL   ).r   r   r   c                     |d   dk(  S )Nr   r   rG   r   s     r#   r   z1PatreonCampaignIE._real_extract.<locals>.<lambda>  s    aiS]F] r%   zcampaign IDr   r   zEname,summary,url,patron_count,creation_count,is_nsfw,avatar_photo_urlcreator)r   r   r   r   z
campaigns/zDownloading campaign infoF)r*   r,   r+   )r   r   r   c                     |d   dk(  S )Nr   r   rG   r   s     r#   r   z1PatreonCampaignIE._real_extract.<locals>.<lambda>  s    6f9L r%   )r   expected_typer3   playlist)r   summary)r   rd   )r   r   )r   r   )r   creation_count)r   is_nsfw   r   )r   avatar_photo_url)_typerL   rQ   r  rR   rb   rc   r`   rt   r^   rZ   rS   r   rs   rU   )_match_valid_urlr   _download_webpager$   r   _search_nextjs_datar   _search_nextjs_v13_datar   r   rA   r!   r   rZ  r   r   r   r   )
r"   rd   rW  r\  webpager   campaign_responsecampaign_infochannel_name	user_infos
             r#   r  zPatreonCampaignIE._real_extract  s   "33C8>>}hWV,,S&<QUQhQhBi,jG&t'?'?Y]'?'^&9?JX^`dgjfkam nK*4+G+GQW+X79]^3%w}'=&>[@ A
 .5+ g 	
 !NN&,E +      	
 *--f5;#M3IJ 
,LMdE;	
  !}}[1%l=B[&\]'7LM&1,}Nl2m&n%#(4IJ&y}}T':;$Y0KL*=:Z[+M;TU[\$\-Ac%de
 	
r%   N)	rB   rC   rD   r<  r=  r
  r>  rZ  r  rG   r%   r#   rA  rA  !  s    G$J 83B E!5&)"C6,
  !$ 9%#A{'B%,
  " E%&)#BY'C$%,
 !!$ 1f#:;%$-&)
 !!#( >%A%B'#A&)-
 !#& 9 7 = 3 ?EeFN,.
r%   rA  )!rE   r6  commonr   sproutvideor   vimeor   networking.exceptionsr   utilsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   utils.traversalr   r   r   r   r   rI   rA  rG   r%   r#   <module>r{     s_      ! !  -     M @^ ^Br
 r
r%   