1(import mpd socketserver2 [mpd.exceptions [*]]3 [mpd.parser [parse-command]])4(require [hy.contrib.walk [let]])56(defclass Handler [socketserver.BaseRequestHandler]7 (defn send-resp [self resp]8 (self.request.sendall (.encode (+ (str resp) mpd.DELIMITER))))910 (defn dispatch-single [self cmd]11 (let [resp (self.server.handler cmd)]12 (if resp (self.send-resp resp))))1314 (defn dispatch-list [self list]15 (setv ok-list? (= list.name "command_list_ok_begin"))16 ;; TODO: Response can be combined into a single packet17 (for [cmd list.args]18 (self.dispatch-single cmd)19 (if ok-list? (self.send-resp "list_OK"))))2021 (defn dispatch [self input]22 (try23 (setv cmd (parse-command input))24 (except [ValueError]25 (self.send-resp (MPDException ACKError.UNKNOWN "syntax error"))26 (return)))27 (try28 (if (cmd.list?)29 (self.dispatch-list cmd)30 (self.dispatch-single cmd))31 (except [e MPDException]32 (self.send-resp e))33 (else (self.send-resp "OK"))))3435 (defn handle [self]36 (self.send-resp (% "OK MPD %s" mpd.VERSION))37 (with [file (self.request.makefile)]38 (for [input (iter (mpd.util.Reader file) "")]39 (self.dispatch input)))))4041(defclass Server [socketserver.ThreadingTCPServer]42 (defn __init__ [self addr handler]43 (.__init__ socketserver.ThreadingTCPServer self addr Handler)44 (setv self.daemon_threads True)45 (setv self.handler handler)))