module Data.Foscam.Sort( foscamsort ) where import Control.Category(id, (.)) import Control.Lens((^.), (^?), _2) import Control.Monad((>>=), when, unless) import Data.Bool(Bool(True)) import Data.Either(either) import Data.Foldable(Foldable, mapM_) import Data.Foscam.Directory(getFoscamDirectoryContents, FoscamDirectoryFile, _FoscamDirectory, _FoscamFilename, _Is) import Data.Foscam.File(getFilename) import Data.Foscam.Sort.FilenamePath(FilenamePath, yyyy, mm, dd, hh, nn, deviceIdpath, aliaspath, (/<>/), (~/>)) import Data.Maybe(maybe) import Data.Monoid((<>)) import System.Directory(doesFileExist, getPermissions, readable, renameFile, doesFileExist, createDirectoryIfMissing) import System.Environment(getArgs, getProgName) import System.FilePath(FilePath, ()) import System.IO(IO, hPutStrLn, stderr) import System.Posix.Files(createSymbolicLink) foscamsort :: IO () foscamsort = do a <- getArgs case a of (i:o:_) -> getFoscamDirectoryContents i >>= mapM_ (move o (yyyy <> mm <> dd) [ yyyy <> mm <> dd , yyyy <> mm <> dd /<>/ hh <> nn , aliaspath /<>/ yyyy <> mm <> dd , aliaspath /<>/ yyyy <> mm <> dd /<>/ hh <> nn ]) _ -> do p <- getProgName hPutStrLn stderr ("Usage: " <> p <> " ") move :: Foldable t => FilePath -> FilenamePath -> t FilenamePath -> FoscamDirectoryFile -> IO () move base mvpath lnpaths q = let fname = q ^? _Is . _2 name = either id getFilename (q ^. _FoscamFilename) mv = base "move" maybe "unknown" (\n -> "date" mvpath ~/> n) fname mvto = mv name in do createDirectoryIfMissing True mv moveFile (q ^. _FoscamDirectory name) mvto mapM_ (\n -> mapM_ (\k -> let out = base "link" k ~/> n in do createDirectoryIfMissing True out createSymbolicLinkIfMissing mvto (out name)) lnpaths) fname moveFile :: FilePath -> FilePath -> IO () moveFile f t = do e <- doesFileExist f when e (do p <- getPermissions f when (readable p) (renameFile f t)) createSymbolicLinkIfMissing :: FilePath -> FilePath -> IO () createSymbolicLinkIfMissing file1 file2 = do s <- doesFileExist file2 unless s (createSymbolicLink file1 file2)