{-# LANGUAGE OverloadedStrings #-} module Sound.MusicDirTrans.Directory ( copyToNewPath , getTracksInDir , genArtistPathFromTracks , mkNewDirs , mkRevertFile , mkRevertArtistPath , revertFile ) where import Data.Monoid import Data.List import Data.Text ( Text , append , pack ) import Control.Monad.IO.Class import Distribution.Simple.Utils import Distribution.Verbosity import Sound.MusicDirTrans.File import Sound.MusicDirTrans.Type import Sound.HTagLib import System.Directory import System.FilePath.Glob import System.FilePath.Posix revertFile :: FilePath revertFile = "dir.orig.name.txt" getTracksInDir :: FilePath -> IO [AudioTrack] getTracksInDir path = map AudioTrack <$> (concat <$> globDir trackFilePatterns path) mkNewDirs :: ArtistPath -> IO () mkNewDirs (ArtistPath _ p c) = createDirectoryIfMissing False p >> createDirectoryIfMissing False (p ++ "/" ++ c) genArtistPathFromTracks :: FilePath -> IO ArtistPath genArtistPathFromTracks path = do ats <- getTracksInDir path metadata <- mapM (getMetadata . currentPath) ats return $ mkArtistPath path metadata copyToNewPath :: ArtistPath -> IO () copyToNewPath ap = copyDirectoryRecursive verbosity (rootPath ap) (newPath ap) where verbosity = normal mkRevertFile :: ArtistPath -> IO () mkRevertFile ap = writeFile filePath fileContent where filePath = newPath ap ++ revertFile fileContent = last $ splitDirectories $ rootPath ap mkRevertArtistPath :: FilePath -> FilePath -> ArtistPath mkRevertArtistPath p op = ArtistPath p "" rp where rrp = intercalate "/" . init $ splitDirectories p rp = rrp ++ "/" ++ op