module Clckwrks.Media.Preview where
import Control.Applicative ((<$>))
import Control.Monad (unless)
import Control.Monad.Reader (ask)
import Control.Monad.Trans (liftIO)
import Clckwrks (query)
import Clckwrks.IOThread (ioRequest)
import Clckwrks.Media.Acid (GetMediumById(..))
import Clckwrks.Media.Types (Medium(..), MediumId(..), MediumKind(..), PreviewSize(..))
import Graphics.GD (imageSize, loadJpegFile, resizeImage, saveJpegFile, withImage)
import qualified Graphics.GD as GD
import System.Directory (doesFileExist)
import System.FilePath ((</>), splitExtension)
jpgThumbnail :: PreviewSize -> FilePath -> FilePath -> IO ()
jpgThumbnail size inPath outPath =
withImage (loadJpegFile inPath) $ \image ->
do (w,h) <- imageSize image
let (w', h') =
if w > h
then (maxWidth, (h * maxWidth) `div` w)
else ((w * maxHeight) `div` h, maxHeight)
image' <- resizeImage w' h' image
saveJpegFile 60 outPath image'
where
maxWidth = case size of
Tall -> 200
Grande -> 300
Venti -> 400
maxHeight = maxWidth
mkThumbnail :: MediumKind -> PreviewSize -> FilePath -> FilePath -> IO ()
mkThumbnail JPEG = jpgThumbnail
applyTransforms :: FilePath -> FilePath -> (Medium, PreviewSize) -> IO FilePath
applyTransforms storageDir cacheDir (medium, size) =
let origFP = storageDir </> (mediumPath medium)
(name, ext) = splitExtension (mediumPath medium)
thumbFP = cacheDir </> name ++ "_" ++ (show size) ++ ext
in do e <- doesFileExist thumbFP
unless e (mkThumbnail (mediumKind medium) size origFP thumbFP)
return thumbFP