}L iYNddlZddlmZddlmZddlmZmZddlmZddl Z ddl m Z ddl m Z m Z ddlZdd lmZmZd Zd ZGd d eZGddeZy)N) lru_cache)requests)urlspliturljoin) BeautifulSoup) frozendict)utilscache)YFRateLimitErrorYFDataException@ctjfd}j|_j|_|S)z Decorator transforms mutable dictionary and list arguments into immutable types Needed so lru_cache can cache method calls what has dict or list arguments. c t|Dcgc]}t|tr t|n|!c}}|j Dcic]#\}}|t|tr t|n|%}}}t|Dcgc]}t|t r t|n|!c}}|j Dcic]#\}}|t|t r t|n|%}}}|i|Scc}wcc}}wcc}wcc}}wN)tuple isinstancedictritemslist)argskwargsargkvfuncs S/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/yfinance/data.pywrappedz%lru_cache_freezeargs..wrappedsSWXCC)>joCGXYMS\\^\TQ!jD&9Z]q@\\dSsJsD$9eCjsBSTHN W1!At!4U1X!;WWT$V$$ Y\SWs$C. (C3=$C9;(C>) functoolswraps cache_info cache_clear)rrs` rlru_cache_freezeargsr#sA __T%%G**G NcHeZdZdZiZej ZfdZxZ S) SingletonMetaz6 Metaclass that creates a Singleton instance. c|j5||jvrt| |i|}||j|<nd|vs|rFt |dkDr8d|vr|j dn|d}|j|j |d|vs|rFt |dkDr8d|vr|j dn|d}|j|j||j|cdddS#1swYyxYw)Nsessionrproxyr )_lock _instancessuper__call__lenget _set_session _set_proxy)clsrrinstancer(r) __class__s rr-zSingletonMeta.__call__/s YY '#..( 7+T>#& ' ' 's CC,,C5) __name__ __module__ __qualname____doc__r+ threadingLockr*r- __classcell__)r4s@rr&r&(s'J INN E ' 'r$r&cFeZdZdZddZdZddZddZejdZ ejdZ ejdd Z ejdd Z ejd Zejd Zejdd ZejddZejddZejddZejd dZeeeddZddZdedefdZdej<dedej<fdZ y)!YfDataz Have one place to retrieve data from Yahoo API in order to ease caching and speed up operations. Singleton means one session one cookie shared by all threads. Ncd|_d|_d|_tj|_d\|_|_|j|xstjd|j|y)NbasicNNchrome) impersonate) _crumb_cookie_cookie_strategyr9r: _cookie_lock_session_proxyr0rSessionr1)selfr(r)s r__init__zYfData.__init__Esc  !(&NN,%/" t{ 'KX%5%5(%KL r$c|y |jd|_td#t$r d|_YnwxYwt |t j jstdt|d|j5||_ |j|j|j_ dddy#1swYyxYw)NTzrequest_cache sessions don't work with curl_cffi, which is necessary now for Yahoo API. Solution: stop setting session, let YF handle.Fz)Yahoo API requires curl_cffi session not z0. Solution: stop setting session, let YF handle.) r _session_is_cachingr AttributeErrorrrr(rItyperFrGrHproxies)rJr(s rr0zYfData._set_sessionTs ?  l MM(,D $!#kl l -',D $ -'8#3#3#;#;<!$MdSZm_]M#NO O    4#DM{{&(,  % 4 4 4s #66/B99Cc|j5|t|tr||dn|}ni}||_||j_dddy#1swYyxYw)N)httphttps)rFrstrrHrGrP)rJr)s rr1zYfData._set_proxymsT    * ;EeS;Q7W\DK$)DMM !  * * *s 5A  AcL||jk(ry|s|jj |jdk(r]tjj d|jd|j jjd|_n8tjj d|jdd|_d|_ d|_ |s|jjyy#t$r|jjwxYw)Ncsrfztoggling cookie strategy z -> basicr?z -> csrf) rErFacquirer get_yf_loggerdebugrGcookiesclearrDrC Exceptionrelease)rJstrategy have_locks r_set_cookie_strategyzYfData._set_cookie_strategyvs t,, ,     % % ' $$.##%++.GH]H]G^^g,hi %%++-(/%##%++.GH]H]G^^f,gh(.%DLDK     % % '      % % '  s B2C>>%D#c|jy|jjjj}t |dk(ry|j Dcgc] }d|vs| }}t |dkDr|Dcgc] }d|vs| }}t |dkDr't jjd|yt |dk(ry|d}|||i}tjjd|ycc}wcc}w) NFryahoor consentz1Multiple Yahoo cookies, not sure which to cache: curlCffiT) rGrZjar_cookiesr.keysr rXrYr get_cookie_cachestore)rJrZr yh_domains yh_domain yh_cookies r_save_cookie_curlCffizYfData._save_cookie_curlCffis == --''++44 w<1 !(@A7aDidn't receive crumb crumb = '') rCr rXrYrrM _expire_afterrGr/text status_coder )rJrget_argscrumb_responses r_get_crumb_basiczYfData._get_crumb_basicsM ;; "    ! ' ' 8;; %%'G#   # #'+'9'9H^ $.T]]..::N.T]]..::N$))  % % ,0Ct{{0R    ! ' '*? }(M N"$ $ ;; (dkk"9    ! ' '(> ? ##i }A$>?{{r$cH|j|sy|j|Sr)rrrs r_get_cookie_and_crumb_basicz"YfData._get_cookie_and_crumb_basics$%%g.$$W--r$c|j$tjjdy|j r+tjjdd|_yd|i}i|ddi} |j r,|j |d<|jjdi|}n|jjdi|}t|jd }|jd d d i}|$tjjdy |d}tjjd||jd d di}|d} tjjd| d} d} ddgd| || | d} i|d| | d} i|d| | d} |j rW|j | d<|j |d<|jjdi| |jjdi|n8|jjdi| |jjdi|d|_|j!y#tjj$r&tjjdYy wxYw#tjj$r&tjjdYwxYw)NrTrrrzhttps://guce.yahoo.com/consentrzR_get_cookie_csrf() encountering requests.exceptions.ChunkedEncodingError, abortingF html.parserinputname csrfToken)attrsz&Failed to find "csrfToken" in responsevaluez csrfToken = sessionIdz sessionId='zhttps://finance.yahoo.com/rbagreedefault)r consentUUIDrroriginalDoneUrl namespacez6https://consent.yahoo.com/v2/collectConsent?sessionId=)rdataz-https://guce.yahoo.com/copyConsent?sessionId=r)rDr rXrYrrMrrGr/rrChunkedEncodingErrorrcontentfindpostrm)rJr base_argsrresponsesoupcsrfTokenInputrsessionIdInputrrrr post_argss r_get_cookie_csrfzYfData._get_cookie_csrfs << #    ! ' '(8 9  ' ' )    ! ' '(C DDL w JiI(HI ''+/+=+=(,4==,,8x8,4==,,8x8 X--}=76;2GH  !    ! ' '(P Q"7+  ##l9+$>?76;2GH"7+  ##k)$=>6 w'$""."  yKI;W iB9+N ~'',0,>,> .)+/+=+=(" ""/Y/! !!-H-" ""/Y/! !!-H-  ""$]""77     ! ' '(| } R""77 ~    ! ' '(| } ~s(9AI$1BJ*$AJ'&J'*AK-,K-c2|j/tjjd|jS|j |syd|d}|j r,|j |d<|jjd i|}n|jjd i|}|j|_|jdk(sd|jvr:tjjd|jt|jd|jvs|jd k(r$tjjd ytjjd |jd |jS)Nrz1https://query2.finance.yahoo.com/v1/test/getcrumb)rrrrrrrrrrr) rCr rXrYrrMrrGr/rrr )rJrrrs r_get_crumb_csrfzYfData._get_crumb_csrf9sU ;; "    ! ' ' 8;; $$W-G   # #'+'9'9H^ $! !!-H-A! !!-H-Aff ==C #6$++#E    ! ' '*? }(M N"$ $ ;; (dkk"9T[[B=N    ! ' '(> ? ##i }A$>?{{r$cd\}}tjjd|jd|j5|jdk(r7|j }|[|j dd|j|}n6|j|}|#|j dd|j }|j}ddd||fS#1swY||fSxYw)Nr@zcookie_mode = 'rrVr?T)r_)r rXrYrErFrr`r)rJrcrumbr^s r_get_cookie_and_crumbzYfData._get_cookie_and_crumbZs$x ##od6K6K5LA$NO    -$$.,,.=--g-F <    ! ' '$s4Cyk(= >    ! ' '$se 5 ##gfX$67 >F f ^_ _446x  u%FF**6* #'L !1L1 ##nX5I5I4J$KL   3 &7"))&1))'2"88AOE8.3L "7 +%5 5H    ! ' '.9M9M8N(O P##s*&((r$)maxsizec(|j|||Sr)r/)rJrrrs r cache_getzYfData.cache_getsxxVW--r$ctjjd||j|||}|j |j S)Nzget_raw_json(): )rr)r rXrYr/raise_for_statusrrs r get_raw_jsonzYfData.get_raw_jsonsM ##&6se$<=88C8@!!#}}r$ response_urlreturnc t|jxr$t|jjdS#t$rYywxYw)z Check if given response_url is consent page Args: response_url (str) : response.url Returns: True : This is cookie-consent page False : This is not cookie-consent page zconsent.yahoo.comF)rhostnameendswithr\)rJrs rrzYfData._is_this_consent_urlsL L)225x8hxx 34 5  s:= A A  consent_resprct|jd}|jd}|s|S|jdxs |j}t |j|} i}|j dD]}|jd}|s|jdxsdj} |jdxsd } | d vrCd |jvs$d |jvs|jd s| d k7r| nd||<| ||<|jD chc]} | j} } td| Dsd|d <d|ji} |jj||| |d}|Scc} w)a Click 'Accept all' to cookie-consent form and return response object. Args: consent_resp (requests.Response) : Response instance of cookie-consent page timeout (int) : Raise TimeoutError if post doesn't respond Returns: response (requests.Response) : Reponse instance received from the server after accepting cookie-consent post. rformactionrrrOrrr)checkboxradioracceptchecked1c30K|]}d|vxsd|vyw)rrNr).0rs r z.YfData._accept_consent_form..s DqGqL1HM1DsRefererT)rheadersrr) rrrr/rrfind_alllowerhas_attrrganyrGr)rJrrrrrrinprtypvalrloweredrrs rrzYfData._accept_consent_forms\.. >yy  (#7|'7'7))62 ==) !C776?D776?,f335C'''"(bC++tzz|+4::</||I.(+r sDJ T ! !&'+iik2177922DGDDDMl../==%% wQU& 3s$Fr@r)F))Nr)NNr)!r5r6r7r8rKr0r1r`r log_indent_decoratorrmrrrrrrrr/rrr#r cache_maxsizerrrTboolrrResponseintrrr$rr=r=?s 42*(.  (  ,  *  < . .  B BH  @  ,     w w . .`}%.&. $<$--<8;<   <r$r=) metaclass)rr curl_cffir urllib.parserrbs4rrurrr r r9rr r rr#rOr&r=rr$rrsG*!9 *'D'.N}Nr$