From 15a4c10c990bb8d99e29a30d8d52638d3e3d8fe8 Mon Sep 17 00:00:00 2001 From: Cqoicebordel Date: Tue, 9 Dec 2014 19:19:39 +0100 Subject: [PATCH 1/3] First pass at Kickass Engine Parse and return results correctly. Pages numbers taken care of. Not done, and maybe to do : - 'content' : I don't know what it could be. Maybe votes ? - 'categories' : the results are not filtered by categories, because I don't see how to do it properly : there are too much categories on Kickass. Is 'video' only movies, or also tv show or porn ? So for now, the category is 'all'. - Favicon/icon : may be a good idea. --- searx/engines/kickass.py | 83 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 searx/engines/kickass.py diff --git a/searx/engines/kickass.py b/searx/engines/kickass.py new file mode 100644 index 000000000..640a18a56 --- /dev/null +++ b/searx/engines/kickass.py @@ -0,0 +1,83 @@ +## Kickass Torrent (Videos, Music, Files) +# +# @website https://kickass.so +# @provide-api no (nothing found) +# +# @using-api no +# @results HTML (using search portal) +# @stable yes (HTML can change) +# @parse url, title, content, seed, leech, magnetlink + +from urlparse import urljoin +from cgi import escape +from urllib import quote +from lxml import html +from operator import itemgetter + +# engine dependent config +categories = ['videos', 'music', 'files'] +paging = True + +# search-url +url = 'https://kickass.so/' +search_url = url + 'search/{search_term}/{pageno}/' + +# specific xpath variables +magnet_xpath = './/a[@title="Torrent magnet link"]' +#content_xpath = './/font[@class="detDesc"]//text()' + + +# do search-request +def request(query, params): + params['url'] = search_url.format(search_term=quote(query), + pageno=params['pageno']) + + return params + + +# get response from search-request +def response(resp): + results = [] + + dom = html.fromstring(resp.text) + + search_res = dom.xpath('//table[@class="data"]//tr') + + # return empty array if nothing is found + if not search_res: + return [] + + # parse results + for result in search_res[1:]: + link = result.xpath('.//a[@class="cellMainLink"]')[0] + href = urljoin(url, link.attrib['href']) + title = ' '.join(link.xpath('.//text()')) + #content = escape(' '.join(result.xpath(content_xpath))) + seed = result.xpath('.//td[contains(@class, "green")]/text()')[0] + leech = result.xpath('.//td[contains(@class, "red")]/text()')[0] + + # convert seed to int if possible + if seed.isdigit(): + seed = int(seed) + else: + seed = 0 + + # convert leech to int if possible + if leech.isdigit(): + leech = int(leech) + else: + leech = 0 + + magnetlink = result.xpath(magnet_xpath)[0].attrib['href'] + + # append result + results.append({'url': href, + 'title': title, + 'content': '', + 'seed': seed, + 'leech': leech, + 'magnetlink': magnetlink, + 'template': 'torrent.html'}) + + # return results sorted by seeder + return sorted(results, key=itemgetter('seed'), reverse=True) From 978b47602474575b2a6b36c874b4bb3df9b56c1f Mon Sep 17 00:00:00 2001 From: Cqoicebordel Date: Tue, 9 Dec 2014 19:21:35 +0100 Subject: [PATCH 2/3] Add KickAss engine --- searx/settings.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/searx/settings.yml b/searx/settings.yml index d64a23bf1..8f89c01d1 100644 --- a/searx/settings.yml +++ b/searx/settings.yml @@ -99,6 +99,10 @@ engines: engine : piratebay shortcut : tpb + - name : kickass + engine : kickass + shortcut : ka + - name : soundcloud engine : soundcloud shortcut : sc From e623ee593af95313c42c28e3db69a0e99974e692 Mon Sep 17 00:00:00 2001 From: Cqoicebordel Date: Sun, 14 Dec 2014 23:27:27 +0100 Subject: [PATCH 3/3] Add icons and badge for the themes Add kickass in engine list Add content for the result from kickass --- searx/engines/kickass.py | 5 +++-- searx/static/courgette/img/icon_kickass.ico | Bin 0 -> 1150 bytes searx/static/default/img/icon_kickass.ico | Bin 0 -> 1150 bytes searx/static/oscar/img/icons/kickass.png | Bin 0 -> 2019 bytes searx/webapp.py | 2 +- 5 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 searx/static/courgette/img/icon_kickass.ico create mode 100644 searx/static/default/img/icon_kickass.ico create mode 100644 searx/static/oscar/img/icons/kickass.png diff --git a/searx/engines/kickass.py b/searx/engines/kickass.py index 640a18a56..bd11a3b6b 100644 --- a/searx/engines/kickass.py +++ b/searx/engines/kickass.py @@ -13,6 +13,7 @@ from cgi import escape from urllib import quote from lxml import html from operator import itemgetter +from dateutil import parser # engine dependent config categories = ['videos', 'music', 'files'] @@ -52,7 +53,7 @@ def response(resp): link = result.xpath('.//a[@class="cellMainLink"]')[0] href = urljoin(url, link.attrib['href']) title = ' '.join(link.xpath('.//text()')) - #content = escape(' '.join(result.xpath(content_xpath))) + content = escape(html.tostring(result.xpath('.//span[@class="font11px lightgrey block"]')[0], method="text")) seed = result.xpath('.//td[contains(@class, "green")]/text()')[0] leech = result.xpath('.//td[contains(@class, "red")]/text()')[0] @@ -73,7 +74,7 @@ def response(resp): # append result results.append({'url': href, 'title': title, - 'content': '', + 'content': content, 'seed': seed, 'leech': leech, 'magnetlink': magnetlink, diff --git a/searx/static/courgette/img/icon_kickass.ico b/searx/static/courgette/img/icon_kickass.ico new file mode 100644 index 0000000000000000000000000000000000000000..4aa2c77a578d0322b42542e862e4dfdf77da920f GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x$gfiO1%0|*lXWF5VW6}`jvNn5+> z5u+ZaM$W-IQ7^gZhiP%^e;8H|NxUs%<0=bNgNs)2314Sk+V=$Z4sc>bFIjy3&oG4uR}zY31tcIaj(Ir|vfR&@SzsO|p`!m$$< z{Qvgz*MAUr^!nZZjG4>9;vhNWl%jX&`i)|3YM$;#}0cM7}o4>4k| z9}pP>((jN}el2p!vi~5QId9$n+51oZzxMPcSU-q3bmRX2d#~R9FIlz~tOlmmG%~pZ zq~AHG;!51iRsTV_bon;8K6J*^J;%XnU}`O*Q(Hj#oia-HCC^>|AB5BAZ~Wh}<R=_t- k@G~%cU}s=>z|6pK0E8JC7#ctrs0b?t%7N4zGiG1_0JW|9m;e9( literal 0 HcmV?d00001 diff --git a/searx/static/default/img/icon_kickass.ico b/searx/static/default/img/icon_kickass.ico new file mode 100644 index 0000000000000000000000000000000000000000..4aa2c77a578d0322b42542e862e4dfdf77da920f GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x$gfiO1%0|*lXWF5VW6}`jvNn5+> z5u+ZaM$W-IQ7^gZhiP%^e;8H|NxUs%<0=bNgNs)2314Sk+V=$Z4sc>bFIjy3&oG4uR}zY31tcIaj(Ir|vfR&@SzsO|p`!m$$< z{Qvgz*MAUr^!nZZjG4>9;vhNWl%jX&`i)|3YM$;#}0cM7}o4>4k| z9}pP>((jN}el2p!vi~5QId9$n+51oZzxMPcSU-q3bmRX2d#~R9FIlz~tOlmmG%~pZ zq~AHG;!51iRsTV_bon;8K6J*^J;%XnU}`O*Q(Hj#oia-HCC^>|AB5BAZ~Wh}<R=_t- k@G~%cU}s=>z|6pK0E8JC7#ctrs0b?t%7N4zGiG1_0JW|9m;e9( literal 0 HcmV?d00001 diff --git a/searx/static/oscar/img/icons/kickass.png b/searx/static/oscar/img/icons/kickass.png new file mode 100644 index 0000000000000000000000000000000000000000..59e809104f5a46d8cf428f644b41df9593f43584 GIT binary patch literal 2019 zcmV<92ORi`P)+655PnFqzutZCzS}=G`;te(5Bo>&%$>P=?z!K4?s?~Y z&si848&=g%Dz4eO@pi4X)>}8;t_8rRU*4o$*T%9U7y#L9KX*N_l}si>V00#$5L-9i zu7?VZbh?l4E%`m^bRX$-UqSlRnmYZ|nmP?20A6`^ap0H`0SAB;CcW=U$d8A{LOf*zlqhb-H zw7KK{mwfo@nGO8wA3O0paih`KpF>KU=Q`#C@Lb1ydOp~Wls2X*b{fsAyM&YyDJ1~5 zok!X>Qc9XvcYS68G<|E@9D#GWWksl{oXL@cd%17LF5$ZxU_(n&2(l7jdD}a_Tok{f zMtfJxxKjM{qwc#r&r4ZmXz`30GuM@tM)>ff56NaTUqOp}q@-le?AqCvy}$dtlI3l? zYzsi6ADvQFDKeQeR8OgTzKEX7o~7>QBv)SB%U^e_{iG;A{@G!wr%cWR!U8CZMb}Dc z12A#Q*QuNTD8cA3h?P&~^odUq!ndA|RrPfSfbta5v5}6=p-A`WOuO}TFtwqEF$YktB!|+mpP#y@ow|6EfDJ>t6x&g}`YTxzRpqCSk*OZ36 z_ll7{edb(lSlHq#_k6I8zrFSZ0G=oK$*OZc)8OZ7eB3nbhewJ~txcL+-x6HP=u9+{ zY-yUBOf+r;=t$I`Upd**NHWn>y`iNcXieh!=*2D)1MfFx&zh~ed%EphE?WbHOG~5s zYiHGBONZ|6eI1VD{K6388#OhT?>Ktwh`#U9KN~(kGSQ@`O|9~it?*vWFs3MM0C3>I zp|a+-U1vJxT>*yqE_CMR&w?I#Zx1qj}w1j&ugStCYepLPHJ}o0iB7aJFBWHpAUsBwAPFtKao%<%!%F;I8qXgMyaT%Ad^Y+`R6Bx zP^D({=y8lLFXz;$)1>?RF-?;R6D9!A+k4d4`}cuE&&FF*_XG)T<@IRcP98UI?BVj! zWqgsLl!J05p>Qce7#G#IZJVP`y1~T*aTSK{yM*Ez5au;SSd<5mvpf!bKG#- zdd5~v4|rnR?|z8Z-g(c3ER#^k`g`&5MxhclRE5K#iON%c9u%ii3fGZ1P96|gp(ut` z!lI>r3|ublG+UlnfKtvdi~ydeh{d9GtZJzBJ)kv{!(j{M2J^>}Sr*;9g_3CbMLiOZ zjN;B^fAW7HKiost%PTO=@NnI*iPpLX*lP{A!PL6&+8`@N*tTg&flif+)*d%5T1Q3Y z6~4~d(}#KWg$Ie0lrgG&B43_<4UuR$@BAf+5auwo+{&4`fvU(P=vI@?e zJjActuOpZHeDItuRN}nNTg|Ie28iqhYeBG>G;KEw_huoy5js_k>*Uc|V;Ck@C^AB{ z3p_WpFW%Nwn_M}Uc>9|dFGlC-bZ2SUE686GOM1FQ3xkF6)v4{5)ZBiNkxVpB0AAKw zeN$_Dpl=N$gn0l&eY`bwfd9uB+R7&rjsG*we*t8mX0OJ+&`tmV002ovPDHLkV1nSo B-h2Q6 literal 0 HcmV?d00001 diff --git a/searx/webapp.py b/searx/webapp.py index 541975573..a2a135e9a 100644 --- a/searx/webapp.py +++ b/searx/webapp.py @@ -70,7 +70,7 @@ babel = Babel(app) #TODO configurable via settings.yml favicons = ['wikipedia', 'youtube', 'vimeo', 'dailymotion', 'soundcloud', - 'twitter', 'stackoverflow', 'github', 'deviantart'] + 'twitter', 'stackoverflow', 'github', 'deviantart', 'kickass'] cookie_max_age = 60 * 60 * 24 * 365 * 23 # 23 years