Browse Source

Proper JSON parsing, remove random number in socket

Josh Bicking 6 years ago
parent
commit
e078d648bf
2 changed files with 69 additions and 21 deletions
  1. 66 21
      app/Main.hs
  2. 3 0
      package.yaml

+ 66 - 21
app/Main.hs

@@ -1,4 +1,6 @@
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric #-}
+
 module Main where
 
 import Lib
@@ -25,32 +27,75 @@ import Network.Socket.ByteString(send, recv)
 
 import Data.ByteString(breakSubstring)
 
+import Data.Aeson
+import GHC.Generics
+import Data.Text
+import qualified Data.Vector as V
+
+import qualified Data.ByteString.Lazy as DBSL
+import qualified Data.ByteString as DBS
+
+data Command = Command
+  { command :: Array
+  } deriving (Generic, Show)
+
+instance ToJSON Command where
+    toJSON (Command command) =
+        object ["command" .= command]
+
+    -- this encodes directly to a bytestring Builder
+    toEncoding (Command command) =
+        pairs ("command" .= command)
+
+mpvSocket :: String
+mpvSocket = "/tmp/haskell-jukebox-mpv-socket"
+
 main :: IO ()
 main = do
-  num <- (randomIO :: IO Integer)
-  let socket = "/tmp/mpvsocket" ++ (show num)
-    in do
-    putStrLn ("MPV listening at " ++ socket)
-    (_, _, _, p) <- createProcess (proc "mpv" ["--input-ipc-server=" ++ socket, "/home/josh/'IS THAT A MAN RIDING A SHRIMP'-9p_QW_HsKPI.mp3"]){ std_in = NoStream, std_out = NoStream, std_err = NoStream}
-    threadDelay 2000000
-    togglePause socket
-    threadDelay 2000000
-    togglePause socket
-    waitForProcess p
-    return ()
-
-togglePause :: String -> IO ()
-togglePause ipcloc = do
+  putStrLn ("MPV listening at " ++ mpvSocket)
+  (_, _, _, p) <- createProcess (proc "mpv"
+                                  [ "--input-ipc-server=" ++ mpvSocket
+                                  , "/home/josh/shrimp.mp3"
+                                  ]) { std_in = NoStream
+                                     , std_out = NoStream
+                                     , std_err = NoStream}
+  threadDelay 2000000
+  putStrLn "sending pause"
+  togglePause
+  threadDelay 2000000
+  putStrLn "sending pause"
+  togglePause
+  waitForProcess p
+  return ()
+
+togglePause :: IO ()
+togglePause = do
+  received <- sendToMPV Command { command = V.fromList
+                                  [ "get_property"
+                                  , "pause"
+                                  ]}
+  sendToMPV Command { command = V.fromList
+                      [ "set_property"
+                      , "pause"
+                      , case snd $ breakSubstring "true" received of
+                         "" -> Bool True
+                         otherwise -> Bool False
+                      ]}
+  return ()
+
+sendToMPV :: Command -> IO DBS.ByteString
+sendToMPV c = do
+  putStrLn ("Connected to Socket: " ++ mpvSocket)
   soc <- socket AF_UNIX Stream 0
-  connect soc (SockAddrUnix ipcloc)
-  send soc "{ \"command\": [\"get_property\", \"pause\"] }\n"
+  connect soc (SockAddrUnix mpvSocket)
+  send soc toSend
+  putStrLn "Sending: "
+  print toSend
   received <- recv soc 4096
-  putStrLn ("Recieved from MPV: " ++ (show received))
-  send soc $
-    case snd $ breakSubstring "true" received of
-      "" -> "{ \"command\": [\"set_property\", \"pause\", true] }\n"
-      otherwise -> "{ \"command\": [\"set_property\", \"pause\", false] }\n"
+  putStrLn ("Received from MPV: " ++ (show received))
   close soc
+  return received
+  where toSend = (DBSL.toStrict ((encode (c)) `DBSL.append` "\n"))
 
 oldmain :: IO ()
 oldmain = scotty 3000 $ do

+ 3 - 0
package.yaml

@@ -28,6 +28,9 @@ dependencies:
 - process
 - bytestring
 - network
+- text
+- aeson
+- vector
 
 library:
   source-dirs: src