photoname-5.0: src/lib/Photoname/Exif.hs
{-# LANGUAGE FlexibleContexts #-}
module Photoname.Exif
( getExifDate
)
where
import Control.Monad.Except ( MonadIO, liftIO )
import Control.Newtype.Generics ( ala )
import qualified Data.Map as M
import Data.Monoid ( First (..) )
import Graphics.HsExif ( ExifTag, ExifValue, dateTime, dateTimeDigitized,
dateTimeOriginal, parseFileExif )
import Photoname.Common ( SrcPath (..) )
{-
Load EXIF information from filepath, or evaluate to Nothing
-}
getExifDate :: MonadIO m => SrcPath -> m (Maybe String)
getExifDate (SrcPath fp) = liftIO $ extractDate <$> parseFileExif fp
{-
Extract the date from the passed in EXIF data, if we got any from the file.
Evaluate to Nothing if we can't locate a date at all.
-}
extractDate :: Either String (M.Map ExifTag ExifValue) -> Maybe String
extractDate (Left _) = Nothing
extractDate (Right exifMap) =
-- Find the first date available in the Map
show <$> ( ala First foldMap $ map (flip M.lookup exifMap)
[dateTimeOriginal, dateTimeDigitized, dateTime] )