Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE DeriveGeneric #-}
- module Main where
- import Control.Lens
- import Data.Aeson
- import qualified Data.ByteString.Lazy as B
- import Data.Maybe
- import qualified Filesystem.Path.CurrentOS as F
- import GHC.Generics
- import Network.Wreq
- import qualified Network.Wreq.Session as S
- import System.Directory
- data Post =
- Post { no :: Int
- , now :: String
- , sub :: Maybe String
- , com :: Maybe String
- , tim :: Maybe Int
- , filename :: Maybe String
- , ext :: Maybe String
- } deriving (Show, Generic)
- data Posts =
- Posts { posts :: [Post] }
- deriving (Show, Generic)
- instance FromJSON Post
- instance FromJSON Posts
- mkUrl :: String -> String -> String
- mkUrl board threadnum
- = "https://a.4cdn.org/" <> board <> "/thread/" <> threadnum <> ".json"
- fetchPosts :: S.Session -> String -> String -> IO (Response Posts)
- fetchPosts sess b t = asJSON =<< (S.get sess $ mkUrl b t)
- mkImgUrlNamePair :: String -> Post -> Maybe (String, String)
- mkImgUrlNamePair b p = do
- t <- tim p
- e <- ext p
- n <- filename p
- return ("https://i.4cdn.org/" <> b <> "/" <> (show t) <> e, n <> e)
- saveImages :: S.Session -> F.FilePath -> [(String, String)] -> IO ()
- saveImages sess workdir = mapM_ $ \(url, name) -> do
- let p = F.append workdir (F.decodeString name)
- r <- S.get sess url
- B.writeFile (F.encodeString p) (r ^. responseBody)
- main :: IO ()
- main = S.withSession $ \sess -> do
- let board = "g"
- thread = "71692308"
- postsR <- fetchPosts sess board thread
- workdir <- getCurrentDirectory
- let p = posts $ postsR ^. responseBody
- p' = catMaybes $ map (mkImgUrlNamePair board) p
- saveImages sess (F.decodeString workdir) p'
- print "Download complete."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement