module HOPS.Download (download) where
import Numeric
import qualified Data.ByteString.Char8 as B
import Data.Conduit hiding (($$))
import Data.Conduit.Zlib (ungzip)
import qualified Data.Conduit.Binary as CB
import Network.HTTP.Conduit hiding (Proxy)
import Network.HTTP.Types (hContentLength)
import Control.Monad.IO.Class (liftIO)
import HOPS.OEIS (URL)
import System.Console.ANSI
import System.IO
import Control.Monad.Trans.Resource (runResourceT)
download :: Int -> URL -> FilePath -> IO ()
download col url fpath = do
req <- liftIO $ parseUrlThrow url
man <- newManager tlsManagerSettings
runResourceT $ do
response <- http req man
let Just cl = lookup hContentLength (responseHeaders response)
let n = read (B.unpack cl) :: Int
responseBody response $$+- progress n 0 =$ ungzip =$ CB.sinkFile fpath
where
progress total acc = await >>= maybe (return ()) (\chunk -> do
let acc' = acc + B.length chunk
let percent = fromIntegral (100*acc') / fromIntegral total :: Double
liftIO $ setCursorColumn col
liftIO $ putStr $ showFFloat (Just 2) percent "" ++ "%"
liftIO $ hFlush stdout
yield chunk
progress total acc')