foscam-sort-0.0.3: src/Data/Foscam/Sort.hs
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 <> " <foscam-files-directory> <sort-output-directory>")
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)