<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <!-- Generated by HsColour, http://code.haskell.org/~malcolm/hscolour/ --> <title>Network/MPD.hs</title> <link type='text/css' rel='stylesheet' href='hscolour.css' /> </head> <body> <pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE CPP #-}</span> <a name="line-2"></a><span class='hs-comment'>-- | Module : Network.MPD</span> <a name="line-3"></a><span class='hs-comment'>-- Copyright : (c) Ben Sinclair 2005-2009, Joachim Fasting 2010</span> <a name="line-4"></a><span class='hs-comment'>-- License : LGPL (see LICENSE)</span> <a name="line-5"></a><span class='hs-comment'>-- Maintainer : Joachim Fasting <joachim.fasting@gmail.com></span> <a name="line-6"></a><span class='hs-comment'>-- Stability : alpha</span> <a name="line-7"></a><span class='hs-comment'>--</span> <a name="line-8"></a><span class='hs-comment'>-- An MPD client library. MPD is a daemon for playing music that is</span> <a name="line-9"></a><span class='hs-comment'>-- controlled over a network socket. Its site is at <<a href="http://www.musicpd.org/">http://www.musicpd.org/</a>>.</span> <a name="line-10"></a><span class='hs-comment'>--</span> <a name="line-11"></a><span class='hs-comment'>-- To use the library, do:</span> <a name="line-12"></a><span class='hs-comment'>-- </span> <a name="line-13"></a><span class='hs-comment'>-- > {-# LANGUAGE OverloadedStrings #-}</span> <a name="line-14"></a><span class='hs-comment'>-- > import qualified Network.MPD as MPD</span> <a name="line-15"></a> <a name="line-16"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>MPD</span> <span class='hs-layout'>(</span> <a name="line-17"></a> <span class='hs-comment'>-- * Basic data types</span> <a name="line-18"></a> <span class='hs-conid'>MonadMPD</span><span class='hs-layout'>,</span> <span class='hs-conid'>MPD</span><span class='hs-layout'>,</span> <span class='hs-conid'>MPDError</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>ACKType</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>Response</span><span class='hs-layout'>,</span> <a name="line-19"></a> <span class='hs-conid'>Host</span><span class='hs-layout'>,</span> <span class='hs-conid'>Port</span><span class='hs-layout'>,</span> <span class='hs-conid'>Password</span><span class='hs-layout'>,</span> <a name="line-20"></a> <span class='hs-comment'>-- * Connections</span> <a name="line-21"></a> <span class='hs-varid'>withMPD</span><span class='hs-layout'>,</span> <span class='hs-varid'>withMPD_</span><span class='hs-layout'>,</span> <span class='hs-varid'>withMPDEx</span><span class='hs-layout'>,</span> <a name="line-22"></a> <span class='hs-keyword'>module</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>MPD</span><span class='hs-varop'>.</span><span class='hs-conid'>Commands</span><span class='hs-layout'>,</span> <a name="line-23"></a><span class='hs-cpp'>#ifdef TEST</span> <a name="line-24"></a> <span class='hs-varid'>getConnectionSettings</span><span class='hs-layout'>,</span> <span class='hs-varid'>getEnvDefault</span> <a name="line-25"></a><span class='hs-cpp'>#endif</span> <a name="line-26"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-27"></a> <a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Exception</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>E</span> <a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>MPD</span><span class='hs-varop'>.</span><span class='hs-conid'>Commands</span> <a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Network</span><span class='hs-varop'>.</span><span class='hs-conid'>MPD</span><span class='hs-varop'>.</span><span class='hs-conid'>Core</span> <a name="line-32"></a> <a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Environment</span> <span class='hs-layout'>(</span><span class='hs-varid'>getEnv</span><span class='hs-layout'>)</span> <a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>IO</span><span class='hs-varop'>.</span><span class='hs-conid'>Error</span> <span class='hs-layout'>(</span><span class='hs-varid'>isDoesNotExistError</span><span class='hs-layout'>)</span> <a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>listToMaybe</span><span class='hs-layout'>)</span> <a name="line-36"></a> <a name="line-37"></a><a name="withMPD"></a><span class='hs-comment'>-- | A wrapper for 'withMPDEx' that uses localhost:6600 as the default</span> <a name="line-38"></a><span class='hs-comment'>-- host:port, or whatever is found in the environment variables MPD_HOST and</span> <a name="line-39"></a><span class='hs-comment'>-- MPD_PORT. If MPD_HOST is of the form \"password\@host\" the password</span> <a name="line-40"></a><span class='hs-comment'>-- will be supplied as well.</span> <a name="line-41"></a><span class='hs-comment'>--</span> <a name="line-42"></a><span class='hs-comment'>-- Examples:</span> <a name="line-43"></a><span class='hs-comment'>--</span> <a name="line-44"></a><span class='hs-comment'>-- > withMPD $ play Nothing</span> <a name="line-45"></a><span class='hs-comment'>-- > withMPD $ add_ "tool" >> play Nothing >> currentSong</span> <a name="line-46"></a><span class='hs-definition'>withMPD</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MPD</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Response</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-47"></a><span class='hs-definition'>withMPD</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>withMPD_</span> <span class='hs-conid'>Nothing</span> <span class='hs-conid'>Nothing</span> <a name="line-48"></a> <a name="line-49"></a><a name="withMPD_"></a><span class='hs-comment'>-- | Same as `withMPD`, but takes optional arguments that override MPD_HOST and</span> <a name="line-50"></a><span class='hs-comment'>-- MPD_PORT.</span> <a name="line-51"></a><span class='hs-comment'>--</span> <a name="line-52"></a><span class='hs-comment'>-- This is e.g. useful for clients that optionally take @--port@ and @--host@</span> <a name="line-53"></a><span class='hs-comment'>-- as command line arguments, and fall back to `withMPD`'s defaults if those</span> <a name="line-54"></a><span class='hs-comment'>-- arguments are not given.</span> <a name="line-55"></a><span class='hs-definition'>withMPD_</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ optional override for MPD_HOST</span> <a name="line-56"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>String</span> <span class='hs-comment'>-- ^ optional override for MPD_PORT</span> <a name="line-57"></a> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>MPD</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Response</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <a name="line-58"></a><span class='hs-definition'>withMPD_</span> <span class='hs-varid'>mHost</span> <span class='hs-varid'>mPort</span> <span class='hs-varid'>action</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <a name="line-59"></a> <span class='hs-varid'>settings</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>getConnectionSettings</span> <span class='hs-varid'>mHost</span> <span class='hs-varid'>mPort</span> <a name="line-60"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>settings</span> <span class='hs-keyword'>of</span> <a name="line-61"></a> <span class='hs-conid'>Right</span> <span class='hs-layout'>(</span><span class='hs-varid'>host</span><span class='hs-layout'>,</span> <span class='hs-varid'>port</span><span class='hs-layout'>,</span> <span class='hs-varid'>pw</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-varid'>withMPDEx</span> <span class='hs-varid'>host</span> <span class='hs-varid'>port</span> <span class='hs-varid'>pw</span> <span class='hs-varid'>action</span> <a name="line-62"></a> <span class='hs-conid'>Left</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Left</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Custom</span><span class='hs-layout'>)</span> <span class='hs-varid'>err</span> <a name="line-63"></a> <a name="line-64"></a><a name="getConnectionSettings"></a><span class='hs-definition'>getConnectionSettings</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Either</span> <span class='hs-conid'>String</span> <span class='hs-layout'>(</span><span class='hs-conid'>Host</span><span class='hs-layout'>,</span> <span class='hs-conid'>Port</span><span class='hs-layout'>,</span> <span class='hs-conid'>Password</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <a name="line-65"></a><span class='hs-definition'>getConnectionSettings</span> <span class='hs-varid'>mHost</span> <span class='hs-varid'>mPort</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <a name="line-66"></a> <span class='hs-layout'>(</span><span class='hs-varid'>host</span><span class='hs-layout'>,</span> <span class='hs-varid'>pw</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>parseHost</span> <span class='hs-varop'>`fmap`</span> <a name="line-67"></a> <span class='hs-varid'>maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>getEnvDefault</span> <span class='hs-str'>"MPD_HOST"</span> <span class='hs-str'>"localhost"</span><span class='hs-layout'>)</span> <span class='hs-varid'>return</span> <span class='hs-varid'>mHost</span> <a name="line-68"></a> <span class='hs-varid'>port</span> <span class='hs-keyglyph'><-</span> <span class='hs-varid'>maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>getEnvDefault</span> <span class='hs-str'>"MPD_PORT"</span> <span class='hs-str'>"6600"</span><span class='hs-layout'>)</span> <span class='hs-varid'>return</span> <span class='hs-varid'>mPort</span> <a name="line-69"></a> <span class='hs-keyword'>case</span> <span class='hs-varid'>maybeRead</span> <span class='hs-varid'>port</span> <span class='hs-keyword'>of</span> <a name="line-70"></a> <span class='hs-conid'>Just</span> <span class='hs-varid'>p</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Right</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>host</span><span class='hs-layout'>,</span> <span class='hs-varid'>p</span><span class='hs-layout'>,</span> <span class='hs-varid'>pw</span><span class='hs-layout'>)</span> <a name="line-71"></a> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-conid'>Left</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>port</span> <span class='hs-varop'>++</span> <span class='hs-str'>" is not a valid port!"</span><span class='hs-layout'>)</span> <a name="line-72"></a> <span class='hs-keyword'>where</span> <a name="line-73"></a> <span class='hs-varid'>parseHost</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>breakChar</span> <span class='hs-chr'>'@'</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>of</span> <a name="line-74"></a> <span class='hs-layout'>(</span><span class='hs-varid'>host</span><span class='hs-layout'>,</span> <span class='hs-str'>""</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>host</span><span class='hs-layout'>,</span> <span class='hs-str'>""</span><span class='hs-layout'>)</span> <a name="line-75"></a> <span class='hs-layout'>(</span><span class='hs-varid'>pw</span><span class='hs-layout'>,</span> <span class='hs-varid'>host</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-varid'>host</span><span class='hs-layout'>,</span> <span class='hs-varid'>pw</span><span class='hs-layout'>)</span> <a name="line-76"></a> <a name="line-77"></a><a name="getEnvDefault"></a><span class='hs-definition'>getEnvDefault</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>IO</span> <span class='hs-conid'>String</span> <a name="line-78"></a><span class='hs-definition'>getEnvDefault</span> <span class='hs-varid'>x</span> <span class='hs-varid'>dflt</span> <span class='hs-keyglyph'>=</span> <a name="line-79"></a> <span class='hs-conid'>E</span><span class='hs-varop'>.</span><span class='hs-varid'>catch</span> <span class='hs-layout'>(</span><span class='hs-varid'>getEnv</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-></span> <span class='hs-keyword'>if</span> <span class='hs-varid'>isDoesNotExistError</span> <span class='hs-varid'>e</span> <a name="line-80"></a> <span class='hs-keyword'>then</span> <span class='hs-varid'>return</span> <span class='hs-varid'>dflt</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>ioError</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <a name="line-81"></a> <a name="line-82"></a><a name="breakChar"></a><span class='hs-comment'>-- Break a string by character, removing the separator.</span> <a name="line-83"></a><span class='hs-definition'>breakChar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Char</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-layout'>(</span><span class='hs-conid'>String</span><span class='hs-layout'>,</span> <span class='hs-conid'>String</span><span class='hs-layout'>)</span> <a name="line-84"></a><span class='hs-definition'>breakChar</span> <span class='hs-varid'>c</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>break</span> <span class='hs-layout'>(</span><span class='hs-varop'>==</span> <span class='hs-varid'>c</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span> <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varid'>y</span><span class='hs-layout'>)</span> <a name="line-85"></a> <a name="line-86"></a><a name="maybeRead"></a><span class='hs-definition'>maybeRead</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Read</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=></span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span> <a name="line-87"></a><span class='hs-definition'>maybeRead</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>fst</span> <span class='hs-varop'>.</span> <span class='hs-varid'>listToMaybe</span> <span class='hs-varop'>.</span> <span class='hs-varid'>reads</span> </pre></body> </html>