augur-2008.10.19: src/Storage.hs
module Storage
( addSerie
, removeSerie
, getTitles
, lookupSerieName
, listAllSeries
) where
import System.Directory
import System.FilePath
import Control.Monad
import System.Exit
import System.Directory
import System.IO
import System.IO.Unsafe
import Data.List
import Utils
import Types
import Epguide
import Config
{-
$DATA/.augur/serie.titles
-}
addSerie :: SerieName -> IO ()
addSerie name
= do file <- getTitlesFile name
mbSerie <- lookupSerieName name
case mbSerie of
Nothing -> writeFile file "[]"
Just serie -> do hPutStrLn stderr $ "Serie already exist: " ++ serie
exitWith $ ExitFailure 1
removeSerie :: SerieName -> IO ()
removeSerie name
= do mbSerie <- lookupSerieName name
case mbSerie of
Nothing -> do hPutStrLn stderr $ "Unknown serie: " ++ name
Just serie -> do file <- getTitlesFile serie
removeFile file
getTitles :: Config -> SerieName -> IO [(LocalEpisodeIndex, String)]
getTitles cfg name
= do mbSerie <- lookupSerieName name
case mbSerie of
Nothing -> return []
Just serie -> do lst <- fmap read . readFile =<< getTitlesFile serie
let lazyFetch = unsafePerformIO $
do extra <- fetchTitles cfg serie
let newElts = extra \\ lst
unless (confDryRun cfg) $ setTitles serie extra
return newElts
return $ lst ++ lazyFetch
setTitles :: SerieName -> [(LocalEpisodeIndex, String)] -> IO ()
setTitles serie lst
= do tmp <- getTemporaryDirectory
(path, handle) <- openTempFile tmp "titles.txt"
hPrint handle lst
hClose handle
destPath <- getTitlesFile serie
renameFile path destPath
-- trunc name -> name
lookupSerieName :: SerieName -> IO (Maybe SerieName)
lookupSerieName name
= do series <- listAllSeries
return $ lookup (trunc name) [ (trunc s, s) | s <- series ]
listAllSeries :: IO [SerieName]
listAllSeries =
do dir <- getAppUserDataDirectory "augur"
contents <- getDirectoryContents dir
return $ nub $ map takeBaseName $ filter (`notElem` [".",".."]) contents
getTitlesFile :: SerieName -> IO FilePath
getTitlesFile name
= do dir <- getAppUserDataDirectory "augur"
createDirectoryIfMissing True dir
return $ dir </> name <.> "titles"