#lang racket/base (require irc/bot irc/clean racket/string racket/format racket/function net/url net/uri-codec json) (provide (all-defined-out)) (define (youtube-query url) (call/input-url (string->url (format "https://noembed.com/embed?url=~a" (uri-encode (url->string url)))) get-pure-port read-json)) (define (string->maybe-url s) (with-handlers ([url-exception? (const #f)]) (string->url s))) ; catch youtube.com and youtu.be (define (extract-youtube-url s) (define (is-yt-url u) (and u (url-host u) (string-contains? (url-host u) "youtu"))) (let* ([urls (map (compose1 string->maybe-url clean-control) (string-split s))]) (findf is-yt-url urls))) (on (and (command-is 'PRIVMSG) (context-is "#code")) (let ([url (extract-youtube-url (suffix))]) (when url (let* ([response (youtube-query url)] [title (hash-ref response 'title)]) (reply (~v title)))))) ;(format "\"~a\"" title))))))