diff --git a/breezewiki.rkt b/breezewiki.rkt index 3fc9b8f..dfb405e 100644 --- a/breezewiki.rkt +++ b/breezewiki.rkt @@ -19,7 +19,6 @@ (require-reloadable "src/page-static.rkt" static-dispatcher) (require-reloadable "src/page-subdomain.rkt" subdomain-dispatcher) (require-reloadable "src/page-wiki.rkt" page-wiki) -(require-reloadable "src/page-file.rkt" page-file) (reload!) @@ -39,7 +38,6 @@ page-proxy page-search page-wiki - page-file redirect-wiki-home static-dispatcher subdomain-dispatcher)))) diff --git a/dist.rkt b/dist.rkt index 805df48..a626695 100644 --- a/dist.rkt +++ b/dist.rkt @@ -13,7 +13,6 @@ (require (only-in "src/page-static.rkt" static-dispatcher)) (require (only-in "src/page-subdomain.rkt" subdomain-dispatcher)) (require (only-in "src/page-wiki.rkt" page-wiki)) -(require (only-in "src/page-file.rkt" page-file)) (serve/launch/wait #:listen-ip (if (config-true? 'debug) "127.0.0.1" #f) @@ -28,7 +27,6 @@ page-proxy page-search page-wiki - page-file redirect-wiki-home static-dispatcher subdomain-dispatcher))) diff --git a/src/dispatcher-tree.rkt b/src/dispatcher-tree.rkt index b68cf9c..f2c1412 100644 --- a/src/dispatcher-tree.rkt +++ b/src/dispatcher-tree.rkt @@ -45,7 +45,6 @@ (pathprocedure:make "/proxy" (hash-ref ds 'page-proxy)) (pathprocedure:make "/search" (hash-ref ds 'page-global-search)) (filter:make (pregexp (format "^/~a/wiki/Category:.+$" px-wikiname)) (lift:make (hash-ref ds 'page-category))) - (filter:make (pregexp (format "^/~a/wiki/File:.+$" px-wikiname)) (lift:make (hash-ref ds 'page-file))) (filter:make (pregexp (format "^/~a/wiki/.+$" px-wikiname)) (lift:make (hash-ref ds 'page-wiki))) (filter:make (pregexp (format "^/~a/search$" px-wikiname)) (lift:make (hash-ref ds 'page-search))) (filter:make (pregexp (format "^/~a(/(wiki(/)?)?)?$" px-wikiname)) (lift:make (hash-ref ds 'redirect-wiki-home))) diff --git a/src/page-file.rkt b/src/page-file.rkt deleted file mode 100644 index a8a41a8..0000000 --- a/src/page-file.rkt +++ /dev/null @@ -1,167 +0,0 @@ -#lang racket/base -(require racket/dict - racket/list - racket/match - racket/string - (prefix-in easy: net/http-easy) - ; html libs - html-parsing - html-writing - ; web server libs - net/url - web-server/http - (only-in web-server/dispatchers/dispatch next-dispatcher) - #;(only-in web-server/http/redirect redirect-to) - "application-globals.rkt" - "config.rkt" - "data.rkt" - "page-wiki.rkt" - "syntax.rkt" - "url-utils.rkt" - "xexpr-utils.rkt") - -(provide page-file) - -(module+ test - (require rackunit) - (define test-media-detail - '#hasheq((fileTitle . "Example file") - (videoEmbedCode . "") - (imageUrl . "https://static.wikia.nocookie.net/examplefile") - (rawImageUrl . "https://static.wikia.nocookie.net/examplefile") - (userName . "blankie") - (isPostedIn . #t) - (smallerArticleList . (#hasheq((title . "Example_article") - (titleText . "Example article")))) - (articleListIsSmaller . 0) - (exists . #t) - (imageDescription . #f)))) - -(define (url-content-type url) - (log-outgoing url) - (define dest-res (easy:head url #:timeouts timeouts)) - (easy:response-headers-ref dest-res 'content-type)) - -(define (get-media-html url content-type) - (define maybe-proxied-url (if (config-true? 'strict_proxy) (u-proxy-url url) url)) - (cond - [(eq? content-type #f) `""] - [(regexp-match? #rx"(?i:^image/)" content-type) `(img (@ (src ,maybe-proxied-url)))] - [(regexp-match? #rx"(?i:^audio/|^application/ogg(;|$))" content-type) - `(audio (@ (src ,maybe-proxied-url) (controls)))] - [(regexp-match? #rx"(?i:^video/)" content-type) `(video (@ (src ,maybe-proxied-url) (controls)))] - [else `""])) - -(define (generate-results-page #:source-url source-url - #:wikiname wikiname - #:title title - #:media-detail media-detail - #:image-content-type image-content-type - #:siteinfo [siteinfo #f]) - (define video-embed-code (jp "/videoEmbedCode" media-detail "")) - (define raw-image-url (jp "/rawImageUrl" media-detail)) - (define image-url (jp "/imageUrl" media-detail raw-image-url)) - (define username (jp "/userName" media-detail)) - (define is-posted-in (jp "/isPostedIn" media-detail #f)) - (define smaller-article-list (jp "/smallerArticleList" media-detail)) - (define article-list-is-smaller (jp "/articleListIsSmaller" media-detail)) - (define image-description (jp "/imageDescription" media-detail #f)) - (define maybe-proxied-raw-image-url - (if (config-true? 'strict_proxy) (u-proxy-url raw-image-url) raw-image-url)) - (generate-wiki-page - #:source-url source-url - #:wikiname wikiname - #:title title - #:siteinfo siteinfo - `(div ,(if (non-empty-string? video-embed-code) - (update-tree-wiki (html->xexp (preprocess-html-wiki video-embed-code)) wikiname) - (get-media-html image-url image-content-type)) - (p ,(if (non-empty-string? video-embed-code) - `"" - `(span (a (@ (href ,maybe-proxied-raw-image-url)) "View original file") ". ")) - "Uploaded by " - (a (@ (href ,(format "/~a/wiki/User:~a" wikiname username))) ,username) - ".") - ,(if (string? image-description) - (update-tree-wiki (html->xexp (preprocess-html-wiki image-description)) wikiname) - ; file license info might be displayed in the description, example: /lgbtqia/wiki/File:Rainbow_Flag1.svg - `(p "This file is likely protected by copyright. Consider the file's license and fair use law before reusing it.")) - ,(if is-posted-in - `(p "This file is used in " - ,@(map (λ (article) - (define page-path (jp "/title" article)) - (define title (jp "/titleText" article page-path)) - `(span ,(if (eq? (car smaller-article-list) article) "" ", ") - (a (@ (href ,(format "/~a/wiki/~a" wikiname page-path))) - ,title))) - smaller-article-list) - ,(if (eq? article-list-is-smaller 1) "…" ".")) - `"")))) - -(define (page-file req) - (define wikiname (path/param-path (first (url-path (request-uri req))))) - (define prefixed-title (path/param-path (caddr (url-path (request-uri req))))) - (define origin (format "https://~a.fandom.com" wikiname)) - (define source-url (format "~a/wiki/~a" origin prefixed-title)) - - (thread-let ([media-detail - (define dest-url - (format "~a/wikia.php?~a" - origin - (params->query `(("format" . "json") ("controller" . "Lightbox") - ("method" . "getMediaDetail") - ("fileTitle" . ,prefixed-title))))) - (log-outgoing dest-url) - (define dest-res (easy:get dest-url #:timeouts timeouts)) - (easy:response-json dest-res)] - [siteinfo (siteinfo-fetch wikiname)]) - (if (not (jp "/exists" media-detail #f)) - (next-dispatcher) - (response-handler - (define file-title (jp "/fileTitle" media-detail "")) - (define title - (if (non-empty-string? file-title) (format "File:~a" file-title) prefixed-title)) - (define image-content-type - (if (non-empty-string? (jp "/videoEmbedCode" media-detail "")) - #f - (url-content-type (jp "/imageUrl" media-detail)))) - (define body - (generate-results-page #:source-url source-url - #:wikiname wikiname - #:title title - #:media-detail media-detail - #:image-content-type image-content-type - #:siteinfo siteinfo)) - (when (config-true? 'debug) - ; used for its side effects - ; convert to string with error checking, error will be raised if xexp is invalid - (xexp->html body)) - (response/output #:code 200 - #:headers (build-headers always-headers) - (λ (out) (write-html body out))))))) -(module+ test - (parameterize ([(config-parameter 'strict_proxy) "true"]) - (check-equal? (get-media-html "https://static.wikia.nocookie.net/a" "image/jpeg") - `(img (@ (src "/proxy?dest=https%3A%2F%2Fstatic.wikia.nocookie.net%2Fa")))) - (check-equal? (get-media-html "https://static.wikia.nocookie.net/b" "audio/mp3") - `(audio (@ (src "/proxy?dest=https%3A%2F%2Fstatic.wikia.nocookie.net%2Fb") - (controls))))) - (parameterize ([(config-parameter 'strict_proxy) "false"]) - (check-equal? (get-media-html "https://static.wikia.nocookie.net/c" "application/ogg") - `(audio (@ (src "https://static.wikia.nocookie.net/c") - (controls)))) - (check-equal? (get-media-html "https://static.wikia.nocookie.net/d" "video/mp4") - `(video (@ (src "https://static.wikia.nocookie.net/d") - (controls))))) - (check-equal? (get-media-html "https://example.com" "who knows") `"") - (check-equal? (get-media-html "https://example.com" #f) `"")) -(module+ test - (parameterize ([(config-parameter 'strict_proxy) "true"]) - (check-not-false - ((query-selector - (attribute-selector 'src "/proxy?dest=https%3A%2F%2Fstatic.wikia.nocookie.net%2Fexamplefile") - (generate-results-page #:source-url "" - #:wikiname "test" - #:title "File:Example file" - #:media-detail test-media-detail - #:image-content-type "image/jpeg")))))) diff --git a/src/page-wiki.rkt b/src/page-wiki.rkt index 07f2f81..effa40a 100644 --- a/src/page-wiki.rkt +++ b/src/page-wiki.rkt @@ -51,17 +51,6 @@ (p "Another page link: " (a (@ (data-test-wikilink) (href "https://test.fandom.com/wiki/Another_Page") (title "Another Page")) "Another Page")))) - (figure (@ (class "thumb tnone")) - (a (@ (href "https://static.wikia.nocookie.net/nice-image.png") (class "image")) - (img (@ (src "data:image/gif;base64,R0lGODlhAQABAIABAAAAAP///yH5BAEAAAEALAAAAAABAAEAQAICTAEAOw%3D%3D") - (data-src "https://static.wikia.nocookie.net/nice-image-thumbnail.png") - (class "thumbimage lazyload")))) - (noscript - (a (@ (href "https://static.wikia.nocookie.net/nice-image.png") (class "image")) - (img (@ (src "https://static.wikia.nocookie.net/nice-image-thumbnail.png") - (data-src "https://static.wikia.nocookie.net/nice-image-thumbnail.png") - (class "thumbimage"))))) - (figcaption "Test figure!")) (iframe (@ (src "https://example.com/iframe-src"))))))) (define (preprocess-html-wiki html) @@ -119,15 +108,6 @@ `(a ((class "iframe-alternative") (href ,src)) (,(format "Embedded media: ~a" src)))] - ; remove noscript versions of images because they are likely lower quality than the script versions - [(and (eq? element-type 'noscript) - (match children - ; either the noscript has a.image as a first child... - [(list (list 'a (list '@ a-att ...) _)) (has-class? "image" a-att)] - ; or the noscript has img as a first child - [(list (list 'img _)) #t] - [_ #f])) - return-no-element] [#t (list element-type ;; attributes @@ -253,9 +233,7 @@ ((query-selector (λ (t a c) (and (eq? t 'a) (has-class? "image-thumbnail" a))) transformed)))) - "/proxy?dest=https%3A%2F%2Fstatic.wikia.nocookie.net%2Fnice-image.png") - ; check that noscript images are removed - (check-equal? ((query-selector (λ (t a c) (eq? t 'noscript)) transformed)) #f)) + "/proxy?dest=https%3A%2F%2Fstatic.wikia.nocookie.net%2Fnice-image.png")) (define (page-wiki req) (define wikiname (path/param-path (first (url-path (request-uri req)))))