
    im#                        U d Z 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 ddlmZ dd	lmZmZmZmZ ej*                  rdd
lmZ ddlmZ dddddddZeeej:                  f   ed<   ddgZdZ e!ed<   g Z"e#e   ez  ed<   	 dZ$eed<   	 dZ%eed<   	 dZ&eed<   	 deeej:                  f   de!fdZ'defdZ(ded d!ddfd"Z)d#d$defd%Z*d&e	d'edeeej:                  f   dz  fd(Z+d)eddfd*Z,y)+a  `Anna's Archive`_ is a free non-profit online shadow library metasearch
engine providing access to a variety of book resources (also via IPFS), created
by a team of anonymous archivists (AnnaArchivist_).

.. _Anna's Archive: https://annas-archive.gl/
.. _AnnaArchivist: https://software.annas-archive.gl/AnnaArchivist/annas-archive

Configuration
=============

The engine has the following additional settings:

- :py:obj:`aa_content`
- :py:obj:`aa_ext`
- :py:obj:`aa_sort`

With this options a SearXNG maintainer is able to configure **additional**
engines for specific searches in Anna's Archive.  For example a engine to search
for *newest* articles and journals (PDF) / by shortcut ``!aaa <search-term>``.

.. code:: yaml

  - name: annas articles
    engine: annas_archive
    categories = ["general", "articles"]
    shortcut: aaa
    aa_content: "magazine"
    aa_ext: "pdf"
    aa_sort: "newest"


Implementations
===============

    N)	urlencode)html)ElementBase)ENGINE_TRAITS)EngineTraits)EngineResults)
eval_xpatheval_xpath_getindexeval_xpath_listextract_text)SXNG_Response)OnlineParamszhttps://annas-archive.gl/
Q115288326FHTML)websitewikidata_idofficial_api_documentationuse_official_apirequire_api_keyresultsaboutfilesbooksTpagingbase_url 
aa_contentaa_sortaa_ext_engine_settingsreturnc                 X   t        d
i t        d   }t        st        d      t        r't        |j
                  d   vrt        dt               t        r't        |j
                  d   vrt        dt               t        r't        |j
                  d   vrt        dt               y	)zCheck of engine's settings.zannas archivez"missing required config `base_url`contentzinvalid setting content: sortzinvalid setting sort: extzinvalid setting ext: T )r   r   r   
ValueErrorr   customr   r   )r    traitss     ,/root/searxng/searx/engines/annas_archive.pysetupr+   c   s     (I-*HIF=>>ji(@@4ZLABB7&--"771';<<&e 4409::    c                  h    t        t        t              rt        j                  t              S t        S N)
isinstancer   listrandomchoicer&   r,   r*   _get_base_url_choicer3   w   s     (D!}}X&&Or,   queryparamsr   c                    t         j                  |d   t         j                        }|t        t        t
        | |d   d}t        d |j                         D              }t               |d<   |d    dt        |       |d<   y )Nsearxng_localepageno)langr#   r%   r$   qpagec              3   0   K   | ]  \  }}|s	||f  y wr.   r&   ).0kvs      r*   	<genexpr>zrequest.<locals>.<genexpr>   s     >DAqA!Q>s   
	r   z/search?url)
r)   get_language
all_localer   r   r   dictitemsr3   r   )r4   r5   r9   argsfiltered_argss        r*   requestrH   ~   s    v&679J9JKDx D >DJJL>>M-/F:j)*(9]3K2LMF5Mr,   respr   c                    t               }t        j                  | j                        }t	        |d      D ]I  }t        || j                  d         }||j                   |j                  j                  di |       K |S )NzU//main//div[contains(@class, 'js-aarecord-list-outer')]/div[contains(@class, 'flex')]r   r&   )
r   r   
fromstringtextr   _get_resultsearch_paramsaddtypesPaper)rI   resdomitemresults        r*   responserV      s{    
/C
//$))
$C
  _ / T4#5#5j#ABGGOCIIOO-f-./ Jr,   rT   base_url_choicec                 4   | j                  d      }|sy t        t        | d      d      }|sy ||d   z   |d}t        t        | ddd       d      |d	<   t        | d
dd       |d<   t        t        | ddd       d      g|d<   t        t        | ddd       d      |d<   t        t        | ddd       d      }|rS|j	                  d      d   j	                  d      D cg c]#  }|j                         s|j                         % c}|d<   |S c c}w )Nz	./a/@hrefz&.//a[contains(@class, 'js-vim-focus')]T)xpath_results
allow_noner   )rA   titlez=.//div[@class='relative']/div[contains(@class, 'line-clamp')])element
xpath_specindexdefaultr#   z.//img/@src	thumbnailz8.//a[.//span[contains(@class, 'icon-[mdi--user-edit]')]]authorsz6.//a[.//span[contains(@class, 'icon-[mdi--company]')]]	publisherz).//div[contains(@class, 'font-semibold')]Save   ·tags)xpathr   r	   r
   splitstrip)rT   rW   href_els
title_textrU   	tags_texttags          r*   rM   rM      se   zz+&H  'OPJ  !, F
 %)V
 	F9 . F; 	-U 		
F9 ')O
 	F; )B
 	I 1:1H1K1Q1QRV1Wg#[^[d[d[f#))+gvM hs   %D;Dengine_traitsc           	      `   ddl }ddlm} ddlm} d| _        g | j                  d<   g | j                  d<   g | j                  d<    |t               d	z   d
      }|j                  st        d      t        j                  |j                        }i }t        |d      D ]  }|j	                  d      }|dv s|j                  d      r*	 |j                  j!                  |j	                  ||      d      }	 ||	      }
| j$                  j	                  |
      }|r||k7  rt'        d|
d|d|       || j$                  |
<    t        |d      D ]P  }|j	                  d      j                  d      r$| j                  d   j)                  |j	                  d             R t        |d      D ]P  }|j	                  d      j                  d      r$| j                  d   j)                  |j	                  d             R t        |d      D ]/  }| j                  d   j)                  |j	                  d             1 | j                  d   j+                          | j                  d   j+                          | j                  d   j+                          y# |j"                  $ r Y w xY w)zCFetch languages and other search arguments from Anna's search form.r   N)language_tag)getr   r#   r%   r$   z/search   )timeoutz'Response from Anna's Archive is not OK.z//form//input[@name='lang']value)r   _emptyznl-BEundanti__-)sepzCONFLICT: babel z --> z, z//form//input[@name='content']z//form//input[@name='ext']z$//form//select[@name='sort']//option)babelsearx.localesro   searx.networkrp   rC   r(   r3   okRuntimeErrorr   rK   rL   r   
startswithLocaleparseUnknownLocaleError	languagesprintappendr$   )rm   ry   ro   rp   rI   rS   lang_mapxeng_langlocale	sxng_langconflicts               r*   fetch_traitsr      sz    *!!M&(M#"$M#%M #%	11=D77DEE
//$))
$C  "HS"?@ 655>559L9LX9V	\\''Xx(Hc'RF
 !(	 **..y98#HhWX-5	*!6$ S"BC CuuW~((2  +22155>BC S">? ?uuW~((2  '..quuW~>? S"HI <V$++AEE'N;< #((*$$& %%'5 '' 	 	s   	-JJ-,J-)-__doc__r1   typingturllib.parser   lxmlr   
lxml.etreer   
searx.datar   searx.enginelib.traitsr   searx.result_typesr   searx.utilsr	   r
   r   r   TYPE_CHECKINGsearx.extended_typesr   searx.search.processorsr   r   rD   strAny__annotations__
categoriesr   boolr   r0   r   r   r   r+   r3   rH   rV   rM   r   r&   r,   r*   <module>r      sf  "H   "  " $ / , V V??24 +"&tCJ  w
  $s)c/  D
C   =  Daee,  (c N3 N N4 N"? } $Kk KC KDaee<Lt<S K\6( 6( 6(r,   