Allows you to search for videos on youtube and automatically add the audio URLs to an MPD playlist
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.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

54 lines
1.4 KiB

9 years ago
{-# LANGUAGE OverloadedStrings #-}
module M3U where
import Types
import qualified Data.Text as TIO
import qualified Control.Monad as M (join)
9 years ago
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
9 years ago
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)
9 years ago
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
9 years ago
genm3u :: [SearchResult] -> IO M3U
genm3u srs = do
tracks <- (mapConcurrently singleTrack srs)
9 years ago
return $
M3U $ m3uHeader `mappend`
"\n" `mappend`
(mconcat $ catMaybes tracks)
searchM3U term = do
(M3U m3u) <- M.join (genm3u <$> search term)
return m3u