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 Search
import qualified Unsafe.Coerce as C
import qualified Data.Text as TIO
import Data.Text.Encoding
import System.Process
import qualified Data.ByteString.Char8 as BC
import qualified Data.ByteString as B
import Data.String.Utils
import Data.Maybe
import Control.Applicative
import Utils
import Playlists
{-
- unsafeCoerce is needed because the "Path"
@ -63,8 +62,9 @@ addSingle :: SearchResult -> IO (Response [B.ByteString])
addSingle track = do
let trackUrl = url 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
--downUrl trackUrl
either (const $ changeTitle trackDesc newId)
(changeBoth newId)
(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 Data.List
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 M3U
main = do
args <- getArgs
let mode = head args
let searchTerm = intercalate " " $ tail args
case mode of
"single" -> M.join (addSingle <$> firstResult searchTerm) >> return ()
"all" -> M.join (mapM_ addSingle <$> search searchTerm) >> return ()
--"single" -> M.join (addSingle <$> firstResult searchTerm) >> return ()
"all" -> do
m3ulist <- (M.join (genm3u <$> search searchTerm))
let (M3U filecontents) = m3ulist
TIO.putStr filecontents
_ -> 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.Text as T
import qualified Data.Map as M
import qualified Data.String as S
data URL = URL { jurl :: T.Text }
deriving (Show, Eq)
@ -38,6 +39,12 @@ data SearchResult = SearchResult {
}
deriving (Show, Eq)
data M3U = M3U T.Text
deriving (Show)
instance S.IsString M3U where
fromString = M3U . T.pack
instance FromJSON URL where
parseJSON (Object v) = URL <$> v .: "url"
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"