You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.4 KiB
53 lines
1.4 KiB
{-# LANGUAGE OverloadedStrings #-}
|
|
module M3U where
|
|
|
|
import Types
|
|
import qualified Data.Text as TIO
|
|
import qualified Control.Monad as M (join)
|
|
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
|
|
import Control.Concurrent.Async
|
|
|
|
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 :: SearchResult -> IO (Maybe TIO.Text)
|
|
singleTrack track = do
|
|
let extinf = toExtinf track
|
|
maybeUrl <- getUrl $ url track
|
|
case maybeUrl of
|
|
(Just trackUrl) -> (return $ (Just extinf) `mappend` (Just $ TIO.pack trackUrl) `mappend` (Just "\n"))
|
|
Nothing -> return Nothing
|
|
|
|
genm3u :: [SearchResult] -> IO M3U
|
|
genm3u srs = do
|
|
tracks <- (mapConcurrently singleTrack srs)
|
|
return $
|
|
M3U $ m3uHeader `mappend`
|
|
"\n" `mappend`
|
|
(mconcat $ catMaybes tracks)
|
|
|
|
|
|
searchM3U term = do
|
|
(M3U m3u) <- M.join (genm3u <$> search term)
|
|
return m3u
|
|
|