
    iB                         U d Z 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m	Z	 ddl
mZ ddlmZ dd	d
ddddZdZddgZdZg Z	 e	ed<   	 d Zdee   fdZd Zd ZdefdZy)zSearch radio stations from RadioBrowser by `Advanced station search API`_.

.. _Advanced station search API:
   https://de1.api.radio-browser.info/#Advanced_station_search

    N)	urlencode)gettext)EngineCache)EngineTraits)language_tagzhttps://www.radio-browser.info/
Q111664849z#https://de1.api.radio-browser.info/TFJSON)websitewikidata_idofficial_api_documentationuse_official_apirequire_api_keyresultsmusicradio
   CACHEc                 .    t        d      at                y )Nradio_browser)r   r   server_list)_s    ,/root/searxng/searx/engines/radio_browser.pyinitr   ;   s    (EM    returnc                  p   t         j                  dg       } | r| S t        j                  ddddt        j                        }|D ]>  }|d   d   }	 t        j
                  |      d   }d|z   }|| vs.| j                  |       @ t         j                  d| d       | S # t        j                  $ r Y pw xY w)	Nserverszall.api.radio-browser.infoP   r      https://iQ )keyvalueexpire)	r   getsocketgetaddrinfoIPPROTO_TCPgethostbyaddrherrorappendset)r   ipsip_tuple_ipurlsrvs         r   r   r   A   s    ii	2&G 

92q!VEWEW
XC 	 A;q>	&&s+A.C 3gNN3	  
II)7<I@N }} 		s   BB54B5c                    t               }|st        j                  d       d |d<   y t        j                  |      }| d|d   dz
  t
        z  t
        ddd}dt        v rt        j                  |d	         }|r||d<   d
t        v r_t        |d	   j                  d            dkD  r?|d	   j                  d      d   j                         }|t        j                  d   v r||d
<   | dt        |       |d<   y )NzFetched server list is empty!r/   votespageno   true)nameorderoffsetlimit
hidebrokenreverselanguagesearxng_localecountrycode-countrycodesz/json/stations/search?)r   loggererrorrandomchoicenumber_of_resultsstation_filterstraitsget_languagelensplituppercustomr   )queryparamsr   serverargslangr>   s          r   requestrS   Z   s
   mG45u]]7#F (#a'+<<"D _$""6*:#;<#D'v&'--c23a7 !1288=bAGGIKfmmN;;&1]#h4Yt_4EFF5Mr   c                    g }| j                         }|D ]  }|d   }|s|d   }g }dj                  |j                  dd      j                  d            }|r|j	                  |       dD ]@  }|j                  |      }|st        |      j                         }|j	                  |       B g }	|j                  d      }
|
r3|
j                         d	k7  r |	j	                  |
 d
t        d      z          t        d      dft        d      dft        d      dffD ]H  \  }}|j                  |      }|st        |      j                         }|	j	                  | d
|        J |j	                  ||d   |j                  dd      j                  dd      dj                  |      dj                  |	      |d   j                  dd      d        |S )Nhomepageurl_resolved, tags ,)statecountrycodecunknown r   bitrater2   clicks
clickcountr6   faviconzhttp://r    z | )r/   title	thumbnailcontentmetadata
iframe_src)
jsonjoinr$   rK   r*   strstriplowerr   replace)respr   	json_respresultr/   rf   rX   xvrg   r]   ys               r   responseru   {   s   G		I %
Z (CyyFB/55c:;NN4 % 	"A

1AFLLNq!		" 

7#U[[]i/OOugQK''*::;Y+Ww'X-
 	,DAq
 

1AFLLN1#Qqc
+	, 	#ZZ	26>>y*U ::g.!JJx0$^4<<Y
S		
9%
N Nr   engine_traitsc           	         t        d       ddlm} ddlm}  |d      j                         }t               d   } || dd      }|j                  st        d	      |j                         } || d
d      }|j                  st        d      |j                         }|D ]  }|j	                  d      }	|	s	 t        t        j                  j                  |	d            }
|d   }| j                  j	                  |
      }|r||k7  rt!        d|
d|d|       ~|| j                  |
<    t#               }|D ]=  }|d   j%                         }||vrt!        d|d    d       -|j'                  |       ? t)        |      }|j+                          || j,                  d<   y# t        j                  $ r Y w xY w)aZ  Fetch languages and countrycodes from RadioBrowser

    - ``traits.languages``: `list of languages API`_
    - ``traits.custom['countrycodes']``: `list of countries API`_

    .. _list of countries API: https://de1.api.radio-browser.info/#List_of_countries
    .. _list of languages API: https://de1.api.radio-browser.info/#List_of_languages
    Nr   )
get_global)r$   territory_languagesz/json/languages   )timeoutz0Response from radio-browser languages is not OK.z/json/countriesz0Response from radio-browser countries is not OK.iso_639r?   )sepr6   zCONFLICT: babel z --> rW   
iso_3166_1zERROR: region tag z is unknown by babelrA   )r   
babel.corerx   searx.networkr$   keysr   okRuntimeErrorri   r   babelLocaleparseUnknownLocaleError	languagesprintr+   rL   addlistsortrM   )rv   rx   r$   babel_reg_listrP   ro   language_listcountry_listrR   
babel_langsxng_tageng_tagconflictrA   region_regs                   r   fetch_traitsr      s    	J%! 56;;=N]1F(/"D 77MNNIIKM(/"D 77MNN99;L 4XXi(
 	#ELL$6$6zs$6$KLH
 v, **..x87"8WUV,3)%4( 5L l#))+~%&vl';&<<PQR %L+7M(/ '' 		s   =*F++GG)__doc__rD   r%   urllib.parser   r   flask_babelr   searx.enginelibr   searx.enginelib.traitsr   searx.localesr   aboutpaging
categoriesrF   rG   __annotations__r   r   rk   r   rS   ru   r    r   r   <module>r      s      "   ' / & 1"G	 
w
 (  T#Y 2GB,^E8 E8r   