Compare commits

..

1 commit

Author SHA1 Message Date
0c0b970a95
Hide slideshows 2024-08-12 23:25:00 +10:00
3 changed files with 16 additions and 59 deletions

View file

@ -1,16 +1,12 @@
#lang typed/racket/base #lang typed/racket/base
(require racket/format (require "config.rkt"
racket/string
"config.rkt"
"../lib/url-utils.rkt") "../lib/url-utils.rkt")
(define-type Headers (HashTable Symbol (U Bytes String))) (define-type Headers (HashTable Symbol (U Bytes String)))
(require/typed net/http-easy (require/typed net/http-easy
[#:opaque Timeout-Config timeout-config?] [#:opaque Timeout-Config timeout-config?]
[#:opaque Response response?] [#:opaque Response response?]
[#:opaque Session session?] [#:opaque Session session?]
[response-status-code (Response -> Natural)]
[current-session (Parameter Session)] [current-session (Parameter Session)]
[current-user-agent (Parameter (U Bytes String))]
[make-timeout-config ([#:lease Positive-Real] [#:connect Positive-Real] -> Timeout-Config)] [make-timeout-config ([#:lease Positive-Real] [#:connect Positive-Real] -> Timeout-Config)]
[get ((U Bytes String) [get ((U Bytes String)
[#:close? Boolean] [#:close? Boolean]
@ -26,41 +22,19 @@
fandom-get-api fandom-get-api
timeouts) timeouts)
(unless (string-contains? (~a (current-user-agent)) "BreezeWiki")
(current-user-agent
(format "BreezeWiki/1.0 (~a) ~a"
(if (config-true? 'canonical_origin)
(config-get 'canonical_origin)
"local")
(current-user-agent))))
(define timeouts (make-timeout-config #:lease 5 #:connect 5)) (define timeouts (make-timeout-config #:lease 5 #:connect 5))
(: last-failure Flonum)
(define last-failure 0.0)
(: stored-failure (Option Response))
(define stored-failure #f)
(define failure-persist-time 30000)
(: no-headers Headers) (: no-headers Headers)
(define no-headers '#hasheq()) (define no-headers '#hasheq())
(: fandom-get (String String [#:headers (Option Headers)] -> Response)) (: fandom-get (String String [#:headers (Option Headers)] -> Response))
(define (fandom-get wikiname path #:headers [headers #f]) (define (fandom-get wikiname path #:headers [headers #f])
(or (define dest-url (string-append "https://www.fandom.com" path))
(and ((current-inexact-milliseconds) . < . (+ last-failure failure-persist-time)) stored-failure) (define host (string-append wikiname ".fandom.com"))
(let () (log-outgoing wikiname path)
(define dest-url (string-append "https://www.fandom.com" path)) (get dest-url
(define host (string-append wikiname ".fandom.com")) #:timeouts timeouts
(log-outgoing wikiname path) #:headers (hash-set (or headers no-headers) 'Host host)))
(define res
(get dest-url
#:timeouts timeouts
#:headers (hash-set (or headers no-headers) 'Host host)))
(when (memq (response-status-code res) '(403 406))
(set! last-failure (current-inexact-milliseconds))
(set! stored-failure res))
res)))
(: fandom-get-api (String (Listof (Pair String String)) [#:headers (Option Headers)] -> Response)) (: fandom-get-api (String (Listof (Pair String String)) [#:headers (Option Headers)] -> Response))
(define (fandom-get-api wikiname params #:headers [headers #f]) (define (fandom-get-api wikiname params #:headers [headers #f])

View file

@ -18,7 +18,6 @@
"config.rkt" "config.rkt"
"data.rkt" "data.rkt"
"fandom-request.rkt" "fandom-request.rkt"
"../lib/archive-file-mappings.rkt"
"../lib/pure-utils.rkt" "../lib/pure-utils.rkt"
"../lib/syntax.rkt" "../lib/syntax.rkt"
"../lib/thread-utils.rkt" "../lib/thread-utils.rkt"
@ -38,9 +37,8 @@
(define (page-wiki req) (define (page-wiki req)
(define wikiname (path/param-path (first (url-path (request-uri req))))) (define wikiname (path/param-path (first (url-path (request-uri req)))))
(define segments (map path/param-path (cdr (url-path (request-uri req)))))
(define user-cookies (user-cookies-getter req)) (define user-cookies (user-cookies-getter req))
(define path (string-join (cdr segments) "/")) (define path (string-join (map path/param-path (cddr (url-path (request-uri req)))) "/"))
(define source-url (format "https://~a.fandom.com/wiki/~a" wikiname path)) (define source-url (format "https://~a.fandom.com/wiki/~a" wikiname path))
(define-values (dest-res siteinfo) (define-values (dest-res siteinfo)
@ -103,31 +101,9 @@
(write-html body out))))))] (write-html body out))))))]
[(eq? 404 (easy:response-status-code dest-res)) [(eq? 404 (easy:response-status-code dest-res))
(next-dispatcher)] (next-dispatcher)]
[(memq (easy:response-status-code dest-res) '(403 406))
(response-handler
(define body
(generate-wiki-page
`(div
(p "Sorry! Fandom isn't allowing BreezeWiki to show pages right now.")
(p "We'll automatically try again in 30 seconds, so please stay on this page and be patient.")
(p (small "In a hurry? " (a (@ (href ,source-url)) "Click here to read the page on Fandom."))))
#:req req
#:source-url source-url
#:wikiname wikiname
#:title (url-segments->guess-title segments)
#:siteinfo siteinfo))
(response/output
#:code 503
#:headers (build-headers
always-headers
(header #"Retry-After" #"30")
(header #"Cache-Control" #"max-age=30, public")
(header #"Refresh" #"35"))
(λ (out)
(write-html body out))))]
[else [else
(response-handler (response-handler
(error 'page-wiki "Tried to load page ~a/~a~nSadly, the page didn't load because Fandom returned status code ~a with response:~n~a" (error 'page-wiki "Tried to load page ~a/~v~nSadly, the page didn't load because Fandom returned status code ~a with response:~n~a"
wikiname wikiname
path path
(easy:response-status-code dest-res) (easy:response-status-code dest-res)

View file

@ -218,6 +218,13 @@ a.ext-audiobutton { /* see hearthstone/wiki/Diablo_(Duels_hero) */
display: inline !important; display: inline !important;
} }
/* hide slideshows since they're broken
* example: ben10/wiki/Celestialsapien_(Classic)#Powers_and_Abilities
*/
.wikia-slideshow {
display: none;
}
/* animated slots */ /* animated slots */
#mw-content-text .animated > :not(.animated-active), #mw-content-text .animated > .animated-subframe > :not(.animated-active) { #mw-content-text .animated > :not(.animated-active), #mw-content-text .animated > .animated-subframe > :not(.animated-active) {
display: inline-block; display: inline-block;