|
@ -3,6 +3,7 @@ module M3U where |
|
|
|
|
|
|
|
|
import Types |
|
|
import Types |
|
|
import qualified Data.Text as TIO |
|
|
import qualified Data.Text as TIO |
|
|
|
|
|
import qualified Control.Monad as M (join) |
|
|
import Data.Text.Encoding |
|
|
import Data.Text.Encoding |
|
|
import Data.Maybe |
|
|
import Data.Maybe |
|
|
import Control.Applicative |
|
|
import Control.Applicative |
|
@ -12,6 +13,7 @@ import qualified Data.Attoparsec.Text as AT |
|
|
import Utils |
|
|
import Utils |
|
|
import Playlists |
|
|
import Playlists |
|
|
import Search |
|
|
import Search |
|
|
|
|
|
import Control.Concurrent.Async |
|
|
|
|
|
|
|
|
m3uHeader = "#EXTM3U" |
|
|
m3uHeader = "#EXTM3U" |
|
|
trackHeader = "#EXTINF" |
|
|
trackHeader = "#EXTINF" |
|
@ -29,15 +31,23 @@ toExtinf track = |
|
|
makeHeader (artist `mappend` " - " `mappend` title `mappend` "\n") |
|
|
makeHeader (artist `mappend` " - " `mappend` title `mappend` "\n") |
|
|
Left trackname -> makeHeader $ TIO.pack (trackname `mappend` "\n") |
|
|
Left trackname -> makeHeader $ TIO.pack (trackname `mappend` "\n") |
|
|
|
|
|
|
|
|
|
|
|
singleTrack :: SearchResult -> IO (Maybe TIO.Text) |
|
|
singleTrack track = do |
|
|
singleTrack track = do |
|
|
let extinf = toExtinf track |
|
|
let extinf = toExtinf track |
|
|
trackUrl <- TIO.pack <$> (getUrl $ url track) |
|
|
maybeUrl <- getUrl $ url track |
|
|
return $ extinf `mappend` trackUrl `mappend` "\n" |
|
|
case maybeUrl of |
|
|
|
|
|
(Just trackUrl) -> (return $ (Just extinf) `mappend` (Just $ TIO.pack trackUrl) `mappend` (Just "\n")) |
|
|
|
|
|
Nothing -> return Nothing |
|
|
|
|
|
|
|
|
genm3u :: [SearchResult] -> IO M3U |
|
|
genm3u :: [SearchResult] -> IO M3U |
|
|
genm3u srs = do |
|
|
genm3u srs = do |
|
|
tracks <- mapM singleTrack srs |
|
|
tracks <- (mapConcurrently singleTrack srs) |
|
|
return $ |
|
|
return $ |
|
|
M3U $ m3uHeader `mappend` |
|
|
M3U $ m3uHeader `mappend` |
|
|
"\n" `mappend` |
|
|
"\n" `mappend` |
|
|
(mconcat tracks) |
|
|
(mconcat $ catMaybes tracks) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
searchM3U term = do |
|
|
|
|
|
(M3U m3u) <- M.join (genm3u <$> search term) |
|
|
|
|
|
return m3u |
|
|