import System.IO (readFile, FilePath(..))
-import System.Environment (getArgs)
+import System.Directory (
+ getDirectoryContents
+ , doesDirectoryExist
+ )
+import System.FilePath ((</>))
+import System.Environment (getArgs, getProgName)
import Data.List
+import Text.Printf (printf)
import Text.XML.Light
+import Control.Monad (foldM)
type Movies = [Movie]
, url :: String
} deriving (Show)
-data Args = Args {
- xml :: String
- , moviesDir :: FilePath
-} deriving (Show)
+data Arg = XML | MovieDir deriving (Show, Eq)
+type Args = [(Arg, String)]
-test = do
+main = do
args <- getArgs
- case readArgs args of
- Left mess -> print mess
- Right args -> do
- paths <- moviePaths $ moviesDir args
- file <- readFile "../xml/test.xml"
- print $ parseXMLDoc file
+ progName <- getProgName
+ case checkArgs $ readArgs args of
+ Nothing -> printf usage progName
+ Just args -> do
+ let Just dir = lookup MovieDir args
+ let Just xmlFile = lookup XML args
+ paths <- moviePaths dir
+ movies <- readXMLFile xmlFile
+ print movies
+ print paths
movieExtenstions = ["avi", "mkv", "rmvb", "ogm", "divx"]
-
-readArgs :: [String] -> Either String Args
-readArgs plop = undefined
-{--readArgs (name:value:rest) = case name of
- "-x" -> { xml = value }
- "-d" -> { moviesDir = value }--}
+usage = "Usage : %s -d <Movies dir> -x <XML file>\n"
+
+checkArgs :: Maybe Args -> Maybe Args
+checkArgs Nothing = Nothing
+checkArgs (Just args) =
+ case (lookup XML args, lookup MovieDir args) of
+ (Just _, Just _) -> Just args
+ otherwise -> Nothing
+
+readArgs :: [String] -> Maybe Args
+readArgs (name:value:rest)
+ | name == "-x" = (XML, value) <:> readArgs rest
+ | name == "-d" = (MovieDir, value) <:> readArgs rest
+ | otherwise = Nothing
+ where
+ _ <:> Nothing = Nothing
+ arg <:> Just args = Just $ arg : args
+readArgs (_:[]) = Nothing
+readArgs (_) = Just []
moviePaths :: FilePath -> IO [FilePath]
-moviePaths dir = undefined
+moviePaths dir = do
+ paths <- filePaths (\filename ->
+ any (`isSuffixOf` filename) movieExtenstions) dir
+ -- Keep only the relative path.
+ return $ map (drop $ Data.List.length dir + 1) paths
+
+filePaths :: (String -> Bool) -> FilePath -> IO [FilePath]
+filePaths predicat baseDir = do
+ processDir baseDir
+ where
+ processDir dir = do
+ contents <- getDirectoryContents dir
+ foldM (\acc entry -> do
+ let absDir = dir </> entry
+ doesDirectoryExist absDir >>= \exists ->
+ if exists
+ then do
+ paths <- processDir absDir
+ return (paths ++ acc)
+ else
+ if predicat entry
+ then
+ return (absDir : acc)
+ else
+ return acc)
+ []
+ (contents \\ ["..", "."])
+
readXMLFile :: FilePath -> IO Movies
readXMLFile file = undefined
-
-
+{-
+ file <- readFile "../xml/test.xml"
+ --print $ parseXMLDoc file
+-}
writeXMLFile :: Movies -> FilePath -> IO ()
writeXMLFile movies file = undefined