Advertisement
Guest User

Untitled

a guest
Jul 2nd, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE DeriveGeneric #-}
  2.  
  3. module Main where
  4.  
  5. import           Control.Lens
  6. import           Data.Aeson
  7. import qualified Data.ByteString.Lazy      as B
  8. import           Data.Maybe
  9. import qualified Filesystem.Path.CurrentOS as F
  10. import           GHC.Generics
  11. import           Network.Wreq
  12. import qualified Network.Wreq.Session      as S
  13. import           System.Directory
  14.  
  15. data Post =
  16.     Post { no       :: Int
  17.          , now      :: String
  18.          , sub      :: Maybe String
  19.          , com      :: Maybe String
  20.          , tim      :: Maybe Int
  21.          , filename :: Maybe String
  22.          , ext      :: Maybe String
  23.          } deriving (Show, Generic)
  24.  
  25. data Posts =
  26.     Posts { posts :: [Post] }
  27.     deriving (Show, Generic)
  28.  
  29. instance FromJSON Post
  30. instance FromJSON Posts
  31.  
  32. mkUrl :: String -> String -> String
  33. mkUrl board threadnum
  34.     = "https://a.4cdn.org/" <> board <> "/thread/" <> threadnum <> ".json"
  35.  
  36. fetchPosts :: S.Session -> String -> String -> IO (Response Posts)
  37. fetchPosts sess b t = asJSON =<< (S.get sess $ mkUrl b t)
  38.  
  39. mkImgUrlNamePair :: String -> Post -> Maybe (String, String)
  40. mkImgUrlNamePair b p = do
  41.     t <- tim p
  42.     e <- ext p
  43.     n <- filename p
  44.     return ("https://i.4cdn.org/" <> b <> "/" <> (show t) <> e, n <> e)
  45.  
  46. saveImages :: S.Session -> F.FilePath -> [(String, String)] -> IO ()
  47. saveImages sess workdir = mapM_ $ \(url, name) -> do
  48.     let p = F.append workdir (F.decodeString name)
  49.     r <- S.get sess url
  50.     B.writeFile (F.encodeString p) (r ^. responseBody)
  51.  
  52. main :: IO ()
  53. main = S.withSession $ \sess -> do
  54.     let board  = "g"
  55.         thread = "71692308"
  56.     postsR <- fetchPosts sess board thread
  57.     workdir <- getCurrentDirectory
  58.     let p  = posts $ postsR ^. responseBody
  59.         p' = catMaybes $ map (mkImgUrlNamePair board) p
  60.    saveImages sess (F.decodeString workdir) p'
  61.     print "Download complete."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement