
    8'h<                         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Zd Z G d	 d
e      Z G d de      Zy)    N)	lru_cache)BeautifulSoup)
frozendict   )utilscache@   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        I/var/www/html/trade_iq/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__,   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                   v   e Zd ZdZdd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.
    z
User-AgentzxMozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36Nc                     d | _         d | _        d| _        t        j                         | _        | j                  |xs t        j                                y )Nbasic)	_crumb_cookie_cookie_strategyr/   r0   _cookie_lockr'   requestsSession)selfsessions     r   __init__zYfData.__init__>   sG     !( &NN,'7X%5%5%78r   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)r9   _sessionr   _session_is_cachingrequests_cacher@   _expire_afterAttributeError)r<   r=   r@   s      r   r'   zYfData._set_sessionK   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	 -> basicr5   z -> csrf)r8   r9   acquirer   get_yf_loggerdebugrA   cookiesclearr7   r6   	Exceptionrelease)r<   strategy	have_locks      r   _set_cookie_strategyzYfData._set_cookie_strategy^   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)NrG   FT)r   get_cookie_cachestorerA   rK   rM   )r<   s    r   _save_session_cookieszYfData._save_session_cookiesu   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 )NrG   Fager   dayscookieloaded persistent cookie)r   rS   lookupdatetime	timedeltarA   rK   updater   rI   rJ   r<   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)Nr5   FT)r   rS   rT   rM   )r<   rZ   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 )Nr5   rW   r   rX   r[   rZ   )r   rS   r\   r]   r^   r   rI   rJ   r`   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 = )r7   r   rI   rJ   rf   rA   getuser_agent_headersrK   r   rd   )r<   proxyrl   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)ri   rj   rK   rk   rl   rm   expire_after<html>Didn't receive crumb	crumb = '' )r6   r   rI   rJ   rs   rp   namevaluerB   rD   rA   ro   text)r<   rq   rl   rZ   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   )rs   r   )r<   rq   rl   rZ   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)Nrh   Tzreusing persistent cookie)rj   rk   rl   ri   zhttps://guce.yahoo.com/consentrv   zhtml.parserinputr|   	csrfToken)attrsz&Failed to find "csrfToken" in responseFr}   zcsrfToken = 	sessionIdzsessionId='zhttps://finance.yahoo.com/yahooagreedefault)r   consentUUIDr   r   originalDoneUrl	namespacez6https://consent.yahoo.com/v2/collectConsent?sessionId=)ri   dataz-https://guce.yahoo.com/copyConsent?sessionId=r{   )r7   r   rI   rJ   rb   rp   rB   rD   rA   ro   r   contentfindpostrU   )r<   rq   rl   	base_argsr   rr   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##'+'9'9H^$(t}}((484H(t}}((484HX--}=76;2GH!!''(PQ"7+	##l9+$>?76;2GH"7+	##k)$=>6	w'$""."
y KI;W	i B9+N ##(,(:(:In%'+'9'9H^$DMM++DMM))DMM++DMM))""$r   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 )Nru   z1https://query2.finance.yahoo.com/v1/test/getcrumb)ri   rj   rk   rl   rv   rw   rn   rx   ry   rz   r{   )r6   r   rI   rJ   r   rp   rB   rD   rA   ro   r~   )r<   rq   rl   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 = 'rz   rG   r5   T)rP   )r   rI   rJ   r8   r9   r   rQ   r   )r<   rq   rl   rZ   r   rO   s         r   _get_cookie_and_crumbzYfData._get_cookie_and_crumb4  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_methodrp   paramsrq   rl   )_make_requestrA   ro   r<   ri   rp   r   rq   rl   s         r   ro   z
YfData.getK  s<    !!#8I8I^py  HM  W^!  _  	_r   c           	      Z    | j                  || j                  j                  |||||      S )N)r   rp   bodyr   rq   rl   )r   rA   r   )r<   ri   r   rp   r   rq   rl   s          r   r   zYfData.postO  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                          |S )N   zurl=z...zparams=r   z@Don't manually add 'crumb' to params dict, let data.py handle itr5   )ri   r   rK   rk   rl   rj   jsonzresponse code=i  rG   r   rK   r{   )lenr   rI   rJ   
_get_proxyrM   r   r|   r}   rp   status_coderQ   )r<   ri   r   rp   r   r   rq   rl   rZ   r   rO   crumbsrK   request_argsrr   s                  r   r   zYfData._make_requestS  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r   )maxsizec                 ,    | j                  |||||      S r   )ro   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   )r<   rq   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(): )rp   r   rq   rl   )r   rI   rJ   ro   raise_for_statusr   )r<   ri   rp   r   rq   rl   rr   s          r   get_raw_jsonzYfData.get_raw_json  sT    ##&6se$<=88C4Fv]bls8t!!#}}r   r   )F)N   )NNNr   )NNNNr   )r+   r,   r-   r.   rp   r>   r'   rQ   rU   rb   rd   rf   rs   r   r   log_indent_decoratorr   r   r   r   ro   r   r   r   r   cache_maxsizer   r   r   r{   r   r   r3   r3   6   s   
 	  QR9.&(.@%:>   
;z   < '  ', _  _ k  k 5  5n }%I & Ir   r3   )	metaclass)r   r   r:   bs4r   r]   r   rn   r   r   r/   r   r   typer!   r3   r{   r   r   <module>r      sA         !  *'D '"f} fr   