diff --git a/Database.hs b/Database.hs index e3cc247..246f36c 100644 --- a/Database.hs +++ b/Database.hs @@ -62,7 +62,7 @@ addSingle :: SearchResult -> IO (Response [B.ByteString]) addSingle track = do let trackUrl = url track let trackDesc = title track - fullUrl <- getUrl trackUrl + (Just fullUrl) <- getUrl trackUrl newId <- MP.withMPD $ MP.addId (toPath fullUrl) Nothing --downUrl trackUrl either (const $ changeTitle trackDesc newId) diff --git a/M3U.hs b/M3U.hs index 1b65ace..12fd41a 100644 --- a/M3U.hs +++ b/M3U.hs @@ -3,6 +3,7 @@ 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 @@ -12,6 +13,7 @@ import qualified Data.Attoparsec.Text as AT import Utils import Playlists import Search +import Control.Concurrent.Async m3uHeader = "#EXTM3U" trackHeader = "#EXTINF" @@ -29,15 +31,23 @@ toExtinf track = 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 - trackUrl <- TIO.pack <$> (getUrl $ url track) - return $ extinf `mappend` trackUrl `mappend` "\n" + 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 <- mapM singleTrack srs + tracks <- (mapConcurrently singleTrack srs) return $ M3U $ m3uHeader `mappend` "\n" `mappend` - (mconcat tracks) + (mconcat $ catMaybes tracks) + + +searchM3U term = do + (M3U m3u) <- M.join (genm3u <$> search term) + return m3u diff --git a/Main.hs b/Main.hs index a707358..9d6eaa4 100644 --- a/Main.hs +++ b/Main.hs @@ -6,7 +6,7 @@ import Types import Database import Data.List import System.Environment (getArgs) -import qualified Data.Text.IO as TIO (putStrLn, putStr) +import qualified Data.Text.IO as TIO (putStrLn, putStr, writeFile) import qualified Control.Monad as M import M3U diff --git a/Playlists.hs b/Playlists.hs index bd83e4d..1973f8e 100644 --- a/Playlists.hs +++ b/Playlists.hs @@ -2,18 +2,22 @@ module Playlists where import qualified Data.Text as TIO import System.Process (readProcess) +import Control.Concurrent.Async +import Control.Exception import Utils +import Control.Monad -getUrl :: TIO.Text -> IO String +getUrls = mapConcurrently getUrl + +getUrl :: TIO.Text -> IO (Maybe 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"] "" +getUrl yourl = + let url = catch (Just <$> (readProcess "youtube-dl" + ["-g", "-f", "bestaudio", TIO.unpack yourl, "--no-cache-dir"] "")) ((\e -> return Nothing) :: SomeException -> IO (Maybe String)) + in url + downUrl yourl = readProcess "youtube-dl" ["-f", "bestaudio", diff --git a/Search.hs b/Search.hs index 73712a2..5a42dc0 100644 --- a/Search.hs +++ b/Search.hs @@ -17,7 +17,7 @@ import Control.Exception import Network.HTTP.Base (urlEncode, urlDecode) import Types -maxResults = 10 +maxResults = 50 makeURL :: T.Text -> T.Text makeURL vid = "https://youtube.com/watch?v=" `T.append` vid