
    dh                     Z    S SK JrJr  S SKrS SKJr  S SKJr  S SKJ	r	  Sr
 " S S\5      rg)	    )ListOptionalN)Document)
BaseLoader)WebBaseLoaderzhttps://www.ifixit.com/api/2.0c            	           \ rS rSrSrS\4S jrS\\   4S jr	\
SS\S\S\\   4S	 jj5       r SS\\   S\\   4S jjr SS\\   S\S\\   4S jjrSS\\   S\\   4S jjrSrg
)IFixitLoader   a  Load `iFixit` repair guides, device wikis and answers.

iFixit is the largest, open repair community on the web. The site contains nearly
100k repair manuals, 200k Questions & Answers on 42k devices, and all the data is
licensed under CC-BY.

This loader will allow you to download the text of a repair guide, text of Q&A's
and wikis from devices on iFixit using their open APIs and web scraping.
web_pathc                   ^ UR                  S5      (       d  [        S5      eUR                  SS5      m/ SQn [        U4S jU 5       5      (       d  [        S5      eTR	                  S5       Vs/ sH  o3(       d  M  UPM     nn US   S	:w  a  US   OS
U l        U R
                  S
:X  d  U R
                  S:X  a  US   U l        O
US   U l        Xl        gs  snf )zInitialize with a web path.zhttps://www.ifixit.comz1web path must start with 'https://www.ifixit.com' )z/Devicez/Guidez/Answersz	/Teardownc              3   D   >#    U H  nTR                  U5      v   M     g 7fN)
startswith).0allowed_pathpaths     c/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/document_loaders/ifixit.py	<genexpr>(IFixitLoader.__init__.<locals>.<genexpr>!   s     S]\4??<00]s    z?web path must start with /Device, /Guide, /Teardown or /Answers/r   TeardownGuideAnswers      N)r   
ValueErrorreplaceanysplit	page_typeidr   )selfr   allowed_pathsxpiecesr   s        @r   __init__IFixitLoader.__init__   s    ""#;<<PQQ 8"=FS]SSSQ  "ZZ_2_!_2;&,Qi:&=7>>W$)(CQiDGQiDG  3s   2	C?Creturnc                    U R                   S:X  a  U R                  5       $ U R                   S:X  d  U R                   S:X  a  U R                  5       $ U R                   S:X  a  U R                  5       $ [	        SU R                   -   5      e)NDevicer   r   r   zUnknown page type: )r!   load_device
load_guideload_questions_and_answersr   )r#   s    r   loadIFixitLoader.load2   sq    >>X%##%%^^w&$..J*F??$$^^y(22442T^^CDD    querydoc_typec                    [         R                  " [        S-   U -   S-   U-   5      nUR                  S:w  a"  [	        SU -   S-   UR                  5       -   5      eUR                  5       nUS   n/ nU HG  n [        US   5      nUR                  S:X  a  XWR                  S	S
9-  nM5  XWR                  5       -  nMI     U$ ! [         a     MZ  f = f)zLoad suggestions.

Args:
    query: A query string
    doc_type: The type of document to search for. Can be one of "all",
      "device", "guide", "teardown", "answer", "wiki".

Returns:

z	/suggest/z
?doctypes=   z Could not load suggestions for "z"
resultsurlr+   F)include_guides)
requestsgetIFIXIT_BASE_URLstatus_coder   jsonr	   r!   r,   r/   )r2   r3   resdatar6   outputresultloaders           r   load_suggestionsIFixitLoader.load_suggestions<   s     llk)E1L@8K
 ??c!2U:UBSXXZO  xxzy/F%fUm4##x/000FFFkkm+F    s   6/B?'B??
CCNurl_overridec                    [        Uc  U R                  OU5      nUR                  5       n/ nUR                  SS5      R                  nUR                  SU-   5        UR                  UR                  S5      R                  R                  5       5        UR                  SS5      nU(       a,  UR                  SUR                  R                  5       -   5        UR                  S5       H  nUR                  S	5      (       a  S
US	   ;   a  UR                  S5        O,SUS   ;   a  UR                  S5        OUR                  S5        UUR                  S5       Vs/ sH  oR                  R                  5       PM     sn-  nUR                  S5        M     SR                  U5      R                  5       n	U R                  US.n
[        XS9/$ s  snf )z|Load a list of questions and answers.

Args:
    url_override: A URL to override the default URL.

Returns: List[Document]

h1z
post-title# z.post-content .post-textdivzpost-answers-headerz
## z".js-answers-list .post.post-answeritempropacceptedAnswerz
### Accepted Answerzpost-helpfulclassz
### Most Helpful Answerz
### Other Answer
sourcetitlepage_contentmetadata)r   r   scrapefindtextappend
select_onestripselecthas_attrjoinr   )r#   rE   rB   soupr@   rP   answersHeaderanswerarV   rS   s              r   r.   'IFixitLoader.load_questions_and_answersb   s    0Dt}},W}}		$-22dUl#doo&@AFFLLNO		%)>?MM'M$6$6$<$<$>>?kk"FGFz**/?6*CU/U566'?29:23(.6P(Q(Q1(Q F MM$ H yy &&("mme<d>??s   "Gr8   c                 
   / nUc  [         S-   U R                  -   nOUn[        R                  " U5      nUR	                  5       nSR                  S Vs/ sH  nXv;   d  M
  Xg   PM     sn5      R                  5       nU R                  US   S.n	UR                  [        XS95        U(       aK   US    V
s/ sH  oS   PM	     nn
U H.  nUR                  [        U5      R                  5       S	   5        M0     U$ s  snf s  sn
f )
zLoads a device

Args:
    url_override: A URL to override the default URL.
    include_guides: Whether to include guides linked to from the device.
      Defaults to True.

Returns:

z/wikis/CATEGORY/rM   )rP   descriptioncontents_rawrP   rN   rQ   guidesr7   r   )r;   r"   r9   r:   r=   r\   rY   r   rW   r   r	   r/   )r#   rE   r8   	documentsr7   r>   r?   keyrV   rS   guide
guide_urls	guide_urls                r   r,   IFixitLoader.load_device   s    	!$66@CCll3xxzyy DCC; 	C
 %' 	 #mmd7mDtGHT48NCN5,NJC'	  i!8!=!=!?!BC ( ! Ds   C; C;6D c                    Uc  [         S-   U R                  -   nOUn[        R                  " U5      nUR                  S:w  a,  [        SU R                  -   S-   UR                  5       -   5      eUR                  5       nSUS   -   US   /nUR                  S5        [        US	   5      S
:X  a  UR                  S5        O#US	    H  nUR                  SUS   -   5        M     UR                  S5        [        US   5      S
:X  a  UR                  S5        O#US    H  nUR                  SUS   -   5        M     US    HW  nUR                  SUS   S:w  a  US   OSR                  US   5      -   5        US    H  n	UR                  U	S   5        M     MY     UR                  US   5        SR                  U5      n
U R                  US   S.n[        XS9/$ )zcLoad a guide

Args:
    url_override: A URL to override the default URL.

Returns: List[Document]

z/guides/r5   zCould not load guide: rM   rH   rP   introduction_rawz

###Tools Required:toolsr   z
 - Nonez
 - rV   z

###Parts Required:partsstepsz

## r   zStep {}orderbylinestext_rawconclusion_rawrN   rQ   )r;   r"   r9   r:   r<   r   r   r=   rW   lenformatr\   r   )r#   rE   r7   r>   r?   	doc_partstoolpartrowlinerV   rS   s               r   r-   IFixitLoader.load_guide   s    !J.8CCll3??c!(4==84?#((*L  xxzDM)40B+CD	12tG}"[)W  4<!78 & 	12tG}"[)W  4<!78 & =C 7|r) L"))#i.9	 G  j!12 % ! 	./0yy#"mmd7mDd>??r1   )r"   r!   r   )r   allr   )NT)__name__
__module____qualname____firstlineno____doc__strr'   r   r   r/   staticmethodrC   r   r.   boolr,   r-   __static_attributes__ r1   r   r	   r	      s    ! !6Ed8n E # #C #DN # #L -1*@$SM*@	h*@Z JN&$SM&BF&	h&P:@x} :@X :@ :@r1   r	   )typingr   r   r9   langchain_core.documentsr   )langchain_community.document_loaders.baser   -langchain_community.document_loaders.web_baser   r;   r	   r   r1   r   <module>r      s)    !  - @ G2d@: d@r1   