
    i                     
   d Z ddlZddlmZmZ ddlm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mZ d
ddddddZdgZdZdZ	 dZ e
        e
d       e
d       e
d      dZdZddddZd Zd Zd ZdefdZy) zPeertube and :py:obj:`SepiaSearch <searx.engines.sepiasearch>` do share
(more or less) the same REST API and the schema of the JSON result is identical.

    N)datetime	timedelta)	urlencode)parse)relativedelta)EngineTraits)language_tag)html_to_texthumanize_numberzhttps://joinpeertube.org	Q50938515zWhttps://docs.joinpeertube.org/api-rest-reference.html#tag/Search/operation/searchVideosTFJSON)websitewikidata_idofficial_api_documentationuse_official_apirequire_api_keyresultsvideoszhttps://peer.tube)weeks)months)years)dayweekmonthyearbothfalse)r         c                    | syt         j                  |d   d      }t        j                  d      dz   t	        | dd|d   d	z
  d
z  d
dt
        |d      d      z   |d<   | |dxx   d|z   z  cc<   |dxx   d|z   z  cc<   |d   t        v rMt        j                         j                         t        |d      z   }|dxx   d|j                         z   z  cc<   |S )z%Assemble request for the Peertube APIFsearxng_localeN/z/api/v1/search/videos?zsearch-indexr   pagenor   
   z-match
safesearch)searchsearchTarget
resultTypestartcountsortnsfwurlz&languageOneOf[]=z&boostLanguages[]=
time_rangez&startDate=)traitsget_languagebase_urlrstripr   safesearch_tabletime_range_tabler   nowdate	isoformat)queryparamseng_langtimes       '/root/searxng/searx/engines/peertube.pyrequestr>   2   s     ""6*:#;TBH 	
"	#
 .& *Q."4 ()=>	
	
 5M" u,x77u-88l//||~""$'7|8L'MMu)999M    c                     t        |       S )N)video_response)resps    r=   responserC   W   s    $r?   c                 .   g }| j                         }d|vrg S |d   D ]n  }|j                  di       j                  d      |j                  di       j                  d      dz   |j                  di       j                  d      z   dj                  |j                  dg             fD cg c]  }|r| }}|j                  d	      }|rt        |
      }|j	                  |d   |d   t        |j                  d      xs d      |j                  di       j                  d      |t        |d         dt        |d         |j                  d      |j                  d      xs |j                  d      dj                  |      d       q |S c c}w )z=Parse video response from SepiaSearch and Peertube instances.datachanneldisplayNamename@host, tagsduration)secondsr.   description accountviewszvideos.htmlpublishedAtembedUrlthumbnailUrl
previewUrlz | )r.   titlecontentauthorlengthrR   templatepublishedDate
iframe_src	thumbnailmetadata)jsongetjoinr   appendr
   r   r   )rB   r   	json_dataresultxr_   rM   s          r=   rA   rA   [   s   G		IY	F# 
 

9b)--m<

9b)--f5;fjjTV>W>[>[\b>cc		&**VR01

  
 
 ::j) 2He}'

=(A(GRH **Y377F"(9)!&vm'<!=$jj4#ZZ7S6::l;S!JJx0	

> N=
s   +Fengine_traitsc           	         ddl m}  |dd      }|j                  st        d      t	        j
                  d|j                  t        j                        }|st        d       y	t	        j                  d
|j                  d            D ]  }|j                  d      }|dk(  r	 t        t        j                  j                  |            }| j                   j                  |      }|r||k7  rt        d|d|d|       z|| j                   |<    d| j                   d<   d| j                   d<   y	# t        j                  $ r t        d|z         Y w xY w)a  Fetch languages from peertube's search-index source code.

    See videoLanguages_ in commit `8ed5c729 - Refactor and redesign client`_

    .. _8ed5c729 - Refactor and redesign client:
       https://framagit.org/framasoft/peertube/search-index/-/commit/8ed5c729
    .. _videoLanguages:
       https://framagit.org/framasoft/peertube/search-index/-/commit/8ed5c729#3d8747f9a60695c367c70bb64efba8f403721fad_0_291
    r   )ra   zchttps://framagit.org/framasoft/peertube/search-index/-/raw/master/client/src/components/Filters.vue   )timeoutz!Response from Peertube is not OK.z videoLanguages \(\)[^\n]+(.*?)\]z.ERROR: can't determine languages from peertubeNz\{ id: '([a-z]+)', label:r   oczERROR: %s is unknown by babelzCONFLICT: babel z --> rK   zhzh_Hanszh_Hant)searx.networkra   okRuntimeErrorrer'   textDOTALLprintfinditergroupr	   babelLocaler   UnknownLocaleError	languages)rg   ra   rB   js_langlangeng_tagsxng_tagconflicts           r=   fetch_traitsr      s@    "mD 77>??ii;TYY		RG>?8'--:JK 4**Q-d? 	#ELL$6$6w$?@H
 !**..x87"8WUV,3)%4( *.MI&)-MI& '' 	1G;<	s   %(D44!EE)__doc__rr   r   r   urllib.parser   rx   dateutil.parserr   dateutil.relativedeltar   searx.enginelib.traitsr   searx.localesr	   searx.utilsr
   r   about
categoriespagingr2   time_range_supportr5   r&   r4   r>   rC   rA   r    r?   r=   <module>r      s   
 
 ( "  ! 0 / & 5 *"{	 Z
	
  ?#"%#	  
'g6 "J (V/. /.r?   