change filelocation, edit readme
This commit is contained in:
		
							parent
							
								
									63a1d64293
								
							
						
					
					
						commit
						74fa5cb880
					
				
					 3 changed files with 62 additions and 44 deletions
				
			
		
							
								
								
									
										11
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								README.md
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -5,4 +5,15 @@ Alternative client for the [WebNowPlaying-BrowserExtension](https://github.com/t
 | 
			
		|||
 | 
			
		||||
Requires [websocketd](https://github.com/joewalnes/websocketd).
 | 
			
		||||
 | 
			
		||||
Run it with:
 | 
			
		||||
`websocketd --port=8974 wnpClient`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The information is stored in a text file: `~/.wnpClient/wnpClient.txt`.
 | 
			
		||||
 | 
			
		||||
From there you can read it with whatever application you want to use.
 | 
			
		||||
For example with [Executor](https://extensions.gnome.org/extension/2932/executor/) for the gnome desktop environment.
 | 
			
		||||
`head  ~/.wnpClient/wnpClient.txt -n 2 | sed ':a;N;$!ba;s/\n/ by /g'`
 | 
			
		||||
 | 
			
		||||
The cover of the current song is also downloaded to `~/.wnpClient/cover.jpg`.
 | 
			
		||||
							
								
								
									
										74
									
								
								app/Main.hs
									
										
									
									
									
								
							
							
						
						
									
										74
									
								
								app/Main.hs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,61 +1,67 @@
 | 
			
		|||
module Main where
 | 
			
		||||
 | 
			
		||||
import Control.Monad
 | 
			
		||||
import Control.Exception
 | 
			
		||||
import System.IO
 | 
			
		||||
import System.Directory
 | 
			
		||||
import Network.HTTP.Client
 | 
			
		||||
import Network.HTTP.Simple
 | 
			
		||||
import Network.URI
 | 
			
		||||
import Control.Monad
 | 
			
		||||
import qualified Data.ByteString.Char8 as B8
 | 
			
		||||
import GHC.IO.Encoding (setLocaleEncoding)
 | 
			
		||||
import Lib
 | 
			
		||||
import Network.HTTP.Client
 | 
			
		||||
import Network.HTTP.Simple
 | 
			
		||||
import Network.URI
 | 
			
		||||
import System.Directory
 | 
			
		||||
import System.FilePath
 | 
			
		||||
import System.IO
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main = do
 | 
			
		||||
  setLocaleEncoding utf8
 | 
			
		||||
  createDirectoryIfMissing False =<< workingDir
 | 
			
		||||
  join $ (writeFile <$> fileName) <*> pure ""
 | 
			
		||||
  forever $ do
 | 
			
		||||
    line <- getLine
 | 
			
		||||
    dispatch line
 | 
			
		||||
 | 
			
		||||
dispatch :: String -> IO ()
 | 
			
		||||
dispatch ('T':'I':'T':'L':'E':':':title) = writeToFile title 0
 | 
			
		||||
dispatch ('A':'R':'T':'I':'S':'T':':':artist) = writeToFile artist 1
 | 
			
		||||
dispatch ('A':'L':'B':'U':'M':':':album) = writeToFile album 2
 | 
			
		||||
dispatch ('C':'O':'V':'E':'R':':':cover) = handleCover cover
 | 
			
		||||
dispatch ('T' : 'I' : 'T' : 'L' : 'E' : ':' : title) = writeToFile title 0
 | 
			
		||||
dispatch ('A' : 'R' : 'T' : 'I' : 'S' : 'T' : ':' : artist) = writeToFile artist 1
 | 
			
		||||
dispatch ('A' : 'L' : 'B' : 'U' : 'M' : ':' : album) = writeToFile album 2
 | 
			
		||||
dispatch ('C' : 'O' : 'V' : 'E' : 'R' : ':' : cover) = handleCover cover
 | 
			
		||||
dispatch _ = return ()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
writeToFile:: String -> Int  -> IO()
 | 
			
		||||
writeToFile text position= do  
 | 
			
		||||
    contents <- lines <$> readFile filename
 | 
			
		||||
    let newContent = unlines $ take position contents ++ [text] ++ drop (position+1) contents
 | 
			
		||||
    bracketOnError (openTempFile "." "temp") 
 | 
			
		||||
        (\(tempName,tempHandle) -> do
 | 
			
		||||
writeToFile :: String -> Int -> IO ()
 | 
			
		||||
writeToFile text position = do
 | 
			
		||||
  contents <- lines <$> (readFile =<< fileName)
 | 
			
		||||
  let newContent = unlines $ take position contents ++ [text] ++ drop (position + 1) contents
 | 
			
		||||
  bracketOnError
 | 
			
		||||
    (openTempFile "." "temp")
 | 
			
		||||
    ( \(tempName, tempHandle) -> do
 | 
			
		||||
        hClose tempHandle
 | 
			
		||||
            removeFile tempName)
 | 
			
		||||
        (\(tempName,tempHandle) -> do
 | 
			
		||||
        removeFile tempName
 | 
			
		||||
    )
 | 
			
		||||
    ( \(tempName, tempHandle) -> do
 | 
			
		||||
        hPutStr tempHandle newContent
 | 
			
		||||
        hClose tempHandle
 | 
			
		||||
            renameFile tempName filename)
 | 
			
		||||
 | 
			
		||||
        renameFile tempName =<< fileName
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
handleCover :: String -> IO ()
 | 
			
		||||
handleCover url= do
 | 
			
		||||
        contents <- lines <$> readFile filename
 | 
			
		||||
        when ((contents !! 3 ) /= url && url /= "") $ do
 | 
			
		||||
            writeToFile (url) 3
 | 
			
		||||
handleCover url = do
 | 
			
		||||
  contents <- lines <$> (readFile =<< fileName)
 | 
			
		||||
  if length contents > 3 && (contents !! 3) /= url && url /= ""
 | 
			
		||||
    then do
 | 
			
		||||
      writeToFile url 3
 | 
			
		||||
      request <- parseRequest url
 | 
			
		||||
            let fileName = Prelude.last . pathSegments . getUri $ request
 | 
			
		||||
            resp <- httpBS request
 | 
			
		||||
            B8.writeFile coverName  $ getResponseBody resp
 | 
			
		||||
      let coverFileName = Prelude.last . pathSegments . getUri $ request
 | 
			
		||||
      join $ B8.writeFile <$> coverName <*> (getResponseBody <$> httpBS request)
 | 
			
		||||
    else writeToFile url 3
 | 
			
		||||
 | 
			
		||||
-- B8.writeFile coverName $ getResponseBody resp
 | 
			
		||||
 | 
			
		||||
filename :: FilePath 
 | 
			
		||||
filename= "wnpClient.txt"
 | 
			
		||||
fileName :: IO FilePath
 | 
			
		||||
fileName = (</> "wnpClient.txt") <$> workingDir
 | 
			
		||||
 | 
			
		||||
coverName :: IO FilePath
 | 
			
		||||
coverName = (</> "cover.jpg") <$> workingDir
 | 
			
		||||
 | 
			
		||||
coverName :: FilePath 
 | 
			
		||||
coverName="cover.jpg"
 | 
			
		||||
workingDir :: IO FilePath
 | 
			
		||||
workingDir = (</> ".wnpClient") <$> getHomeDirectory
 | 
			
		||||
| 
						 | 
				
			
			@ -51,6 +51,7 @@ executable wnpClient
 | 
			
		|||
    , network-uri
 | 
			
		||||
    , http-conduit
 | 
			
		||||
    , bytestring
 | 
			
		||||
    , filepath
 | 
			
		||||
  default-language: Haskell2010
 | 
			
		||||
 | 
			
		||||
test-suite wnpClient-test
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue