Browse Source

updates

master
wes 9 years ago
parent
commit
9caa1f3086
  1. 6
      Database.hs
  2. 43
      M3U.hs
  3. 10
      Main.hs
  4. 21
      Playlists.hs
  5. 7
      Types.hs
  6. 22
      WebServer.hs

6
Database.hs

@ -7,15 +7,14 @@ import Network.MPD.Core
import Types import Types
import Search import Search
import qualified Unsafe.Coerce as C import qualified Unsafe.Coerce as C
import qualified Data.Text as TIO
import Data.Text.Encoding import Data.Text.Encoding
import System.Process
import qualified Data.ByteString.Char8 as BC import qualified Data.ByteString.Char8 as BC
import qualified Data.ByteString as B import qualified Data.ByteString as B
import Data.String.Utils import Data.String.Utils
import Data.Maybe import Data.Maybe
import Control.Applicative import Control.Applicative
import Utils import Utils
import Playlists
{- {-
- unsafeCoerce is needed because the "Path" - unsafeCoerce is needed because the "Path"
@ -63,8 +62,9 @@ addSingle :: SearchResult -> IO (Response [B.ByteString])
addSingle track = do addSingle track = do
let trackUrl = url track let trackUrl = url track
let trackDesc = title track let trackDesc = title track
fullUrl <- readProcess "youtube-dl" ["-g", "-f", "bestaudio", (TIO.unpack trackUrl)] "" fullUrl <- getUrl trackUrl
newId <- MP.withMPD $ MP.addId (toPath fullUrl) Nothing newId <- MP.withMPD $ MP.addId (toPath fullUrl) Nothing
--downUrl trackUrl
either (const $ changeTitle trackDesc newId) either (const $ changeTitle trackDesc newId)
(changeBoth newId) (changeBoth newId)
(parseTrack trackDesc) (parseTrack trackDesc)

43
M3U.hs

@ -0,0 +1,43 @@
{-# LANGUAGE OverloadedStrings #-}
module M3U where
import Types
import qualified Data.Text as TIO
import Data.Text.Encoding
import Data.Maybe
import Control.Applicative
import Data.Monoid
import Data.Attoparsec.Text
import qualified Data.Attoparsec.Text as AT
import Utils
import Playlists
import Search
m3uHeader = "#EXTM3U"
trackHeader = "#EXTINF"
makeHeader title =
mconcat [trackHeader,
":-1,",
title]
--toExtinf :: SearchResult -> TIO.Text
toExtinf track =
let trackTitle = title track
in case parseTrack trackTitle of
Right (artist, title) ->
makeHeader (artist `mappend` " - " `mappend` title `mappend` "\n")
Left trackname -> makeHeader $ TIO.pack (trackname `mappend` "\n")
singleTrack track = do
let extinf = toExtinf track
trackUrl <- TIO.pack <$> (getUrl $ url track)
return $ extinf `mappend` trackUrl `mappend` "\n"
genm3u :: [SearchResult] -> IO M3U
genm3u srs = do
tracks <- mapM singleTrack srs
return $
M3U $ m3uHeader `mappend`
"\n" `mappend`
(mconcat tracks)

10
Main.hs

@ -6,14 +6,18 @@ import Types
import Database import Database
import Data.List import Data.List
import System.Environment (getArgs) import System.Environment (getArgs)
import qualified Data.Text.IO as TIO (putStrLn) import qualified Data.Text.IO as TIO (putStrLn, putStr)
import qualified Control.Monad as M import qualified Control.Monad as M
import M3U
main = do main = do
args <- getArgs args <- getArgs
let mode = head args let mode = head args
let searchTerm = intercalate " " $ tail args let searchTerm = intercalate " " $ tail args
case mode of case mode of
"single" -> M.join (addSingle <$> firstResult searchTerm) >> return () --"single" -> M.join (addSingle <$> firstResult searchTerm) >> return ()
"all" -> M.join (mapM_ addSingle <$> search searchTerm) >> return () "all" -> do
m3ulist <- (M.join (genm3u <$> search searchTerm))
let (M3U filecontents) = m3ulist
TIO.putStr filecontents
_ -> error "unknown mode" _ -> error "unknown mode"

21
Playlists.hs

@ -0,0 +1,21 @@
module Playlists where
import qualified Data.Text as TIO
import System.Process (readProcess)
import Utils
getUrl :: TIO.Text -> IO String
-- Gets a direct url using youtube-dl
-- (if it is installed, otherwise we might fallback to some shitty code)
getUrl yourl = readProcess "youtube-dl"
["-g",
"-f",
"bestaudio",
TIO.unpack yourl,
"--no-cache-dir"] ""
downUrl yourl = readProcess "youtube-dl"
["-f",
"bestaudio",
TIO.unpack yourl,
"--no-cache-dir"] ""

7
Types.hs

@ -4,6 +4,7 @@ import Data.Aeson
import qualified Data.ByteString.Lazy.Char8 as BL import qualified Data.ByteString.Lazy.Char8 as BL
import qualified Data.Text as T import qualified Data.Text as T
import qualified Data.Map as M import qualified Data.Map as M
import qualified Data.String as S
data URL = URL { jurl :: T.Text } data URL = URL { jurl :: T.Text }
deriving (Show, Eq) deriving (Show, Eq)
@ -38,6 +39,12 @@ data SearchResult = SearchResult {
} }
deriving (Show, Eq) deriving (Show, Eq)
data M3U = M3U T.Text
deriving (Show)
instance S.IsString M3U where
fromString = M3U . T.pack
instance FromJSON URL where instance FromJSON URL where
parseJSON (Object v) = URL <$> v .: "url" parseJSON (Object v) = URL <$> v .: "url"
parseJSON _ = error "invalid parse" parseJSON _ = error "invalid parse"

22
WebServer.hs

@ -0,0 +1,22 @@
module WebServer where
import Search
import Network.MPD.Applicative.CurrentPlaylist
import Types
import Database
import Data.List
import System.Environment (getArgs)
import qualified Data.Text.IO as TIO (putStrLn, putStr)
import qualified Control.Monad as M
import M3U
getPlaylist args = do
let mode = head args
let searchTerm = intercalate " " $ tail args
case mode of
--"single" -> M.join (addSingle <$> firstResult searchTerm) >> return ()
"all" -> do
m3ulist <- (M.join (genm3u <$> search searchTerm))
let (M3U filecontents) = m3ulist
return filecontents
_ -> error "unknown mode"