
    WgS@                         d dl Z d dlZd dl mZ d dlZd dlmZ d dlZd dlmZ ddlm	Z	m
Z
 d dlZddlmZ ddlmZ d	Zd
 Z G d de      Z G d de      Zy)    N)	lru_cache)BeautifulSoup)
frozendict   )utilscache)USER_AGENTS)YFRateLimitError@   c                      t        j                          fd       } 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        | D cg c]  }t        |t              rt        |      n|! c}      } |j	                         D ci c]#  \  }}|t        |t              rt        |      n|% }}}t        | D cg c]  }t        |t
              rt        |      n|! c}      } |j	                         D ci c]#  \  }}|t        |t
              rt        |      n|% }}} | i |S c c}w c c}}w c c}w c c}}w N)tuple
isinstancedictr   itemslist)argskwargsargkvfuncs        @/var/www/html/venv/lib/python3.12/site-packages/yfinance/data.pywrappedz%lru_cache_freezeargs.<locals>.wrapped   s    SWXCC)>joCGXYMS\\^\TQ!jD&9Z]q@\\dSsJsD$9eCjsBSTHNW1!At!4U1X!;WWT$V$$	 Y\SWs   $C.	(C3=$C9;(C>)	functoolswraps
cache_infocache_clear)r   r   s   ` r   lru_cache_freezeargsr       sA     __T% % G**GN    c                   H     e Zd ZdZi Z ej                         Z fdZ xZ	S )SingletonMetaz6
    Metaclass that creates a Singleton instance.
    c                     | j                   5  | | j                  vrt        |   |i |}|| j                  | <   n | j                  |    j                  |i | | j                  |    cd d d        S # 1 sw Y   y xY wr   )_lock
_instancessuper__call___set_session)clsr   r   instance	__class__s       r   r(   zSingletonMeta.__call__0   sw    YY 	'#..( 7+T<V<&.s#0s#00$A&A>>#&	' 	' 	's   AA33A<)
__name__
__module____qualname____doc__r&   	threadingLockr%   r(   __classcell__)r,   s   @r   r#   r#   )   s'     JINNE' 'r!   r#   c                      e Zd ZdZd ej
                  e      iZddZd Z	ddZ
d Zd Zd	 Zd
 ZddZddZej$                  d        Zd Zej$                  dd       Zej$                  dd       Zej$                  dd       Zej$                  dd       Zej$                  dd       Ze ee      dd              Zd ZddZ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.
    
User-AgentNc                    d | _         d | _        d| _        t        j                         | _        | j                  |xs t        j                                t        j                         j                  d| j                  d           y )NbasiczUsing User-Agent: r6   )_crumb_cookie_cookie_strategyr1   r2   _cookie_lockr)   requestsSessionr   get_yf_loggerdebuguser_agent_headers)selfsessions     r   __init__zYfData.__init__C   ss     !( &NN,'7X%5%5%78##&89P9PQ]9^8_$`ar!   c                     |y | j                   5  || _        d d d        	 | j                  j                   d| _        ddlm} || _        y # 1 sw Y   5xY w# t        $ r
 d| _        Y y w xY w)NTr   )DO_NOT_CACHEF)r<   _sessionr   _session_is_cachingrequests_cacherF   _expire_afterAttributeError)rB   rC   rF   s      r   r)   zYfData._set_sessionR   sn    ? 	$#DM	$	.MM (,D$3!-D	$ 	$
  	-',D$	-s   AA AA+*A+c                 L   || j                   k(  ry |s| j                  j                          	 | j                   dk(  r]t        j                         j                  d| j                    d       | j                  j                  j                          d| _         n8t        j                         j                  d| j                    d       d| _         d | _	        d | _
        |s| j                  j                          y y # t        $ r | j                  j                           w xY w)Ncsrfztoggling cookie strategy z	 -> basicr8   z -> csrf)r;   r<   acquirer   r?   r@   rG   cookiesclearr:   r9   	Exceptionrelease)rB   strategy	have_locks      r   _set_cookie_strategyzYfData._set_cookie_strategye   s   t,,,%%'	$$.##%++.GH]H]G^^g,hi%%++-(/%##%++.GH]H]G^^f,gh(.%DLDK
 %%' 	  	%%'	s   B2C> >%D#c                     	 t        j                         j                  d| j                  j                         y# t
        $ r Y yw xY w)NrM   FT)r   get_cookie_cachestorerG   rO   rQ   )rB   s    r   _save_session_cookieszYfData._save_session_cookies|   sC    	""$**64==3H3HI   		s   8; 	AAc                     t        j                         j                  d      }|y|d   t        j                  d      kD  ry| j
                  j                  j                  |d          t        j                         j                  d       y )NrM   Fager   dayscookieloaded persistent cookie)r   rW   lookupdatetime	timedeltarG   rO   updater   r?   r@   rB   cookie_dicts     r   _load_session_cookieszYfData._load_session_cookies   st    ,,.55f=u 2 2 ::$$[%:;##$>?r!   c                 l    	 t        j                         j                  d|       y# t        $ r Y yw xY w)Nr8   FT)r   rW   rX   rQ   )rB   r^   s     r   _save_cookie_basiczYfData._save_cookie_basic   s9    	""$**7F;   		s   $' 	33c                     t        j                         j                  d      }|y |d   t        j                  d      kD  ry t        j                         j                  d       |d   S )Nr8   r[   r   r\   r_   r^   )r   rW   r`   ra   rb   r   r?   r@   rd   s     r   _load_cookie_basiczYfData._load_cookie_basic   sb    ,,.55g>u 2 2 ::##$>?8$$r!   c                    | j                   /t        j                         j                  d       | j                   S | j	                         | _         | j                   | j                   S | j
                  j                  d| j                  ||d      }|j                  s$t        j                         j                  d       y t        |j                        d   | _         | j                   dk(  r$t        j                         j                  d       y | j                  | j                          t        j                         j                  d	| j                           | j                   S )
Nreusing cookiezhttps://fc.yahoo.comT)urlheadersproxiestimeoutallow_redirectszresponse.cookies = Noner    zlist(response.cookies)[0] = ''zfetched basic cookie = )r:   r   r?   r@   rj   rG   getrA   rO   r   rh   )rB   proxyrp   responses       r   _get_cookie_basiczYfData._get_cookie_basic   s%   <<#!''(89<<..0<<#<< ==$$&++  % " !''(ABH,,-a0<<2!''(HI-##&=dll^$LM||r!   c                    | j                   /t        j                         j                  d       | j                   S | j	                         }|y d| j
                  |j                  |j                  i||dd}| j                  r,| j                  |d<    | j                  j                  d
i |}n | j                  j                  d
i |}|j                  | _         | j                   d| j                   v r$t        j                         j                  d       y t        j                         j                  d| j                    d	       | j                   S )Nreusing crumbz1https://query1.finance.yahoo.com/v1/test/getcrumbT)rm   rn   rO   ro   rp   rq   expire_after<html>Didn't receive crumb	crumb = '' )r9   r   r?   r@   rv   rA   namevaluerH   rJ   rG   rs   text)rB   rt   rp   r^   get_argscrumb_responses         r   _get_crumb_basiczYfData._get_crumb_basic   s*   ;;"!''8;;'')> G..V\\2#
 ##'+'9'9H^$.T]]..::N.T]]..::N$));;(dkk"9!''(>?##i}A$>?{{r!   c                 R    | j                  ||      }| j                  ||      }||fS r   )rv   r   )rB   rt   rp   r^   crumbs        r   _get_cookie_and_crumb_basicz"YfData._get_cookie_and_crumb_basic   s0    ''w7%%eW5u}r!   c                    | j                   $t        j                         j                  d       y| j	                         r+t        j                         j                  d       d| _         y| j
                  ||d}i |ddi}	 | j                  r,| j                  |d<    | j                  j                  di |}n | j                  j                  di |}t        |j                  d
      }|j                  dddi      }|$t        j                         j                  d       y	|d   }t        j                         j                  d|        |j                  dddi      }	|	d   }
t        j                         j                  d|
        d}d}ddgd|
|||d}i |d|
 |d}i |d|
 |d}	 | j                  rW| j                  |d<   | j                  |d<    | j                  j                   di |  | j                  j                  di | n8 | j                  j                   di |  | j                  j                  di | d| _         | j#                          y# t        j                  j                  $ r& t        j                         j                  d       Y y	w xY w# t        j                  j                  $ r& t        j                         j                  d       Y w xY w)Nrl   Tzreusing persistent cookie)rn   ro   rp   rm   zhttps://guce.yahoo.com/consentry   zR_get_cookie_csrf() encountering requests.exceptions.ChunkedEncodingError, abortingFzhtml.parserinputr   	csrfToken)attrsz&Failed to find "csrfToken" in responser   zcsrfToken = 	sessionIdzsessionId='zhttps://finance.yahoo.com/yahooagreedefault)r   consentUUIDr   r   originalDoneUrl	namespacez6https://consent.yahoo.com/v2/collectConsent?sessionId=)rm   dataz-https://guce.yahoo.com/copyConsent?sessionId=r~   )r:   r   r?   r@   rf   rA   rH   rJ   rG   rs   r=   
exceptionsChunkedEncodingErrorr   contentfindpostrY   )rB   rt   rp   	base_argsr   ru   soupcsrfTokenInputr   sessionIdInputr   r   r   r   	post_argss                  r   _get_cookie_csrfzYfData._get_cookie_csrf   s    <<#!''(89'')!''(CDDL .. 	
 JiI(HI		''+/+=+=(,4==,,8x8,4==,,8x8 X--}=76;2GH!!''(PQ"7+	##l9+$>?76;2GH"7+	##k)$=>6	w'$""."
y KI;W	i B9+N	~'',0,>,>	.)+/+=+=("""/Y/!!!-H-"""/Y/!!!-H- ""$] ""77 	!''(|}	R ""77 	~!''(|}	~s(   AI0 =BJ6 0A J32J36A K98K9c                    | j                   /t        j                         j                  d       | j                   S | j	                  ||      sy d| j
                  ||d}| j                  r,| j                  |d<    | j                  j                  d
i |}n | j                  j                  d
i |}|j                  | _         | j                   d| j                   v s| j                   dk(  r$t        j                         j                  d       y t        j                         j                  d| j                    d	       | j                   S )Nrx   z1https://query2.finance.yahoo.com/v1/test/getcrumb)rm   rn   ro   rp   ry   rz   rr   r{   r|   r}   r~   )r9   r   r?   r@   r   rA   rH   rJ   rG   rs   r   )rB   rt   rp   r   rs        r   _get_crumb_csrfzYfData._get_crumb_csrf%  s    ;;"!''8;;$$UG4 G..	 
 ##'+'9'9H^$!!!-H-A!!!-H-Aff;;(dkk"9T[[B=N!''(>?##i}A$>?{{r!   c                    d\  }}}t        j                         j                  d| j                   d       | j                  5  | j                  dk(  r;| j                         }|e| j                  dd       | j                  ||      \  }}n<| j                  ||      \  }}||#| j                  dd       | j                         }| j                  }d d d        |||fS # 1 sw Y   xY w)N)NNNzcookie_mode = 'r}   rM   r8   T)rT   )r   r?   r@   r;   r<   r   rU   r   )rB   rt   rp   r^   r   rS   s         r   _get_cookie_and_crumbzYfData._get_cookie_and_crumbD  s    "2x##od6K6K5LA$NO 	-$$.,,.=--g-F$($D$DUG$TMFE !% @ @ P>U]--f-E 002E,,H	- uh&&	- 	-s   BC$$C-c                 X    | j                  || j                  j                  ||||      S )N)request_methodrA   paramsrt   rp   )_make_requestrG   rs   rB   rm   rA   r   rt   rp   s         r   rs   z
YfData.get[  s<    !!#8I8I^py  HM  W^!  _  	_r!   c           	      Z    | j                  || j                  j                  |||||      S )N)r   rA   bodyr   rt   rp   )r   rG   r   )rB   rm   r   rA   r   rt   rp   s          r   r   zYfData.post_  sC    !!#8J8J_qx|  FL  TY  cj!  k  	kr!   c                    t        |      dkD  r+t        j                         j                  d|d d  d       n&t        j                         j                  d|        t        j                         j                  d|        | j	                  |      }|i }d|v rt        d      | j                         \  }}	}
|	d|	i}ni }|
dk(  r||j                  |j                  i}nd }|i ||||||xs | j                  d}|r||d	<    |di |}t        j                         j                  d
|j                          |j                  dk\  r|
dk(  r| j                  d       n| j                  d       | j                  ||      \  }}	}
|	|d   d<   |
dk(  r|j                  |j                  i|d<    |di |}t        j                         j                  d
|j                          |j                  dk(  r
t               |S )N   zurl=z...zparams=r   z@Don't manually add 'crumb' to params dict, let data.py handle itr8   )rm   r   rO   ro   rp   rn   jsonzresponse code=i  rM   r   rO   i  r~   )lenr   r?   r@   
_get_proxyrQ   r   r   r   rA   status_coderU   r
   )rB   rm   r   rA   r   r   rt   rp   r^   r   rS   crumbsrO   request_argsru   s                  r   r   zYfData._make_requestc  s$    s8c>!''$s4Cyk(=>!''$se5##gfX$67&>Ff^__"&"<"<">xu%FFw6#5{{FLL1GG **6*)DT-D-D
 #'L !1L1##nX5I5I4J$KL3&7"))&1))'2&*&@&@&P#FE8.3L"7+7"+1;;*EY'%55H!''.9M9M8N(OP ##s*&((r!   )maxsizec                 ,    | j                  |||||      S r   )rs   r   s         r   	cache_getzYfData.cache_get  s     xx/HHr!   c                 P    |#t        |t        t        f      r	d|v r|d   }d|i}|S )Nhttps)r   r   r   )rB   rt   s     r   r   zYfData._get_proxy  s6    %$
!34E9Ige$Er!   c                     t        j                         j                  d|        | j                  |||||      }|j	                          |j                         S )Nzget_raw_json(): )rA   r   rt   rp   )r   r?   r@   rs   raise_for_statusr   )rB   rm   rA   r   rt   rp   ru   s          r   get_raw_jsonzYfData.get_raw_json  sT    ##&6se$<=88C4Fv]bls8t!!#}}r!   r   )F)N   )NNNr   )NNNNr   ) r-   r.   r/   r0   randomchoicer	   rA   rD   r)   rU   rY   rf   rh   rj   rv   r   r   log_indent_decoratorr   r   r   r   rs   r   r   r    r   cache_maxsizer   r   r   r~   r!   r   r5   r5   :   s%   
 	mfmmK0b.&(.@%:>   
DL   < '  ', _  _ k  k 9  9v }%I & Ir!   r5   )	metaclass)r   r   r   r=   bs4r   ra   r   rr   r   r   r1   constr	   r   r
   r   r    typer#   r5   r~   r!   r   <module>r      sJ          !    (*'D '"v} vr!   