packages feed

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] )