From: Armaan Bhojwani Date: Sun, 28 Nov 2021 17:50:40 +0000 (-0500) Subject: Add a distribution framework X-Git-Tag: 0.1 X-Git-Url: https://git.armaanb.net/?p=bettersearch.git;a=commitdiff_plain;h=f5c4822a930c5856e49d0dd89fc0c7eea9c32c87 Add a distribution framework --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6b915b1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +bettersearch diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..15d8f92 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +dist: clean + raco exe bettersearch.rkt + +clean: + rm -rf bettersearch diff --git a/README b/README index 88e5c09..ea5d485 100644 --- a/README +++ b/README @@ -1,3 +1,9 @@ Web search that sucks a little bit less +Written in racket. Build an executable with 'make' and reverse proxy as you +wish. Runs on port 8000 by default. + +You must set the SEARX_INSTANCE environment variable to a searx instance like +"https://search.trom.tf". + https://search.armaanb.net diff --git a/TODO b/TODO index ad2c40a..e69de29 100644 --- a/TODO +++ b/TODO @@ -1 +0,0 @@ -* Customizeable searx instance diff --git a/bettersearch.rkt b/bettersearch.rkt new file mode 100644 index 0000000..4fc695e --- /dev/null +++ b/bettersearch.rkt @@ -0,0 +1,95 @@ +#lang racket + +(require json) +(require web-server/servlet) +(require web-server/servlet-env) +(require web-server/templates) + +(require "blacklist.rkt") + +(define (member-match? itm lst) + (ormap (lambda (i) (regexp-match? (regexp i) itm)) lst)) + +(define-values (dispatch generate-url) + (dispatch-rules + [("") do-index] + [("search") do-search] + )) + +(define (do-head title) + (include-template "templates/head.html")) + +(define (do-footer) + (include-template "templates/footer.html")) + +(define (do-index req) + (http-response (string-append + (do-head "Web Search") + (include-template "templates/index.html") + (do-footer)))) + +(define (search query pageno) + (define engine (string->url + (string-append + (getenv "SEARX_INSTANCE") + "/search?format=json&q=" + query + "&pageno=" + pageno + ))) + (define response (get-pure-port engine)) + (define json-raw (port->string response)) + (close-input-port response) + (with-input-from-string json-raw (lambda () (read-json)))) + +(define (http-response content) + (response/full + 200 + #"OK" + (current-seconds) + TEXT/HTML-MIME-TYPE + '() + (list + (string->bytes/utf-8 content)))) + +(define (do-search req) + (define binds (request-bindings req)) + (define query (if (exists-binding? 'q binds) + (extract-binding/single 'q binds) + "")) + + (if (non-empty-string? query) + (let () + (define pageno (if (exists-binding? 'pageno binds) + (extract-binding/single 'pageno binds) + "1")) + (define results + (foldr cons '() + (filter hash? + (map (lambda (i) + (define result-host + (url-host (string->url + (hash-ref i 'url "")))) + (define result-url (hash-ref i 'url "")) + (define result-title (hash-ref i 'title "")) + (define result-content (hash-ref i 'content "")) + (define ht (make-hash)) + (unless (member-match? result-host blacklist) + (let () + (hash-set! ht "title" result-title) + (hash-set! ht "url" result-url) + (hash-set! ht "content" result-content) + ) + ht + )) + (hash-ref (search query pageno) 'results))))) + (http-response (string-append + (do-head (string-append query " | Web Search")) + (include-template "templates/search.html") + (do-footer)))) + (redirect-to "/"))) + +(serve/servlet dispatch + #:command-line? #t + #:servlet-regexp #rx"" + #:extra-files-paths (list (build-path "./static"))) diff --git a/server.rkt b/server.rkt deleted file mode 100644 index 2b13b6c..0000000 --- a/server.rkt +++ /dev/null @@ -1,94 +0,0 @@ -#lang racket - -(require json) -(require web-server/servlet) -(require web-server/servlet-env) -(require web-server/templates) - -(require "blacklist.rkt") - -(define (member-match? itm lst) - (ormap (lambda (i) (regexp-match? (regexp i) itm)) lst)) - -(define-values (dispatch generate-url) - (dispatch-rules - [("") do-index] - [("search") do-search] - )) - -(define (do-head title) - (include-template "templates/head.html")) - -(define (do-footer) - (include-template "templates/footer.html")) - -(define (do-index req) - (http-response (string-append - (do-head "Web Search") - (include-template "templates/index.html") - (do-footer)))) - -(define (search query pageno) - (define engine (string->url - (string-append - "https://search.trom.tf/search?format=json&q=" - query - "&pageno=" - pageno - ))) - (define response (get-pure-port engine)) - (define json-raw (port->string response)) - (close-input-port response) - (with-input-from-string json-raw (lambda () (read-json)))) - -(define (http-response content) - (response/full - 200 - #"OK" - (current-seconds) - TEXT/HTML-MIME-TYPE - '() - (list - (string->bytes/utf-8 content)))) - -(define (do-search req) - (define binds (request-bindings req)) - (define query (if (exists-binding? 'q binds) - (extract-binding/single 'q binds) - "")) - - (if (non-empty-string? query) - (let () - (define pageno (if (exists-binding? 'pageno binds) - (extract-binding/single 'pageno binds) - "1")) - (define results - (foldr cons '() - (filter hash? - (map (lambda (i) - (define result-host - (url-host (string->url - (hash-ref i 'url "")))) - (define result-url (hash-ref i 'url "")) - (define result-title (hash-ref i 'title "")) - (define result-content (hash-ref i 'content "")) - (define ht (make-hash)) - (unless (member-match? result-host blacklist) - (let () - (hash-set! ht "title" result-title) - (hash-set! ht "url" result-url) - (hash-set! ht "content" result-content) - ) - ht - )) - (hash-ref (search query pageno) 'results))))) - (http-response (string-append - (do-head (string-append query " | Web Search")) - (include-template "templates/search.html") - (do-footer)))) - (redirect-to "/"))) - -(serve/servlet dispatch - #:command-line? #t - #:servlet-regexp #rx"" - #:extra-files-paths (list (build-path "./static")))