module Data.Classify.Rank ( selectBest , sortByRank , sortByRank' ) where import Data.Classify.DataTypes import Data.List import Data.Char import Data.Ord -- For testing import qualified Data.Map as Map import qualified Data.Classify.Parser as P import Control.Monad -- import Utils selectBest :: [Element] -> Element selectBest = last . sortByRank sortByRank :: [Element] -> [Element] sortByRank = map fst . sortByRank' sortByRank' elts = concatMap (sortBy (comparing (length.name.fst))) $ groupBy (\a b -> snd a == snd b) $ sortBy (comparing snd) $ zip elts (map getRank elts) getRank elt = sum [ score elt, cleanExtension ==> 2, cleanTitle ==> 1, unrealVersion (version elt) ] where cleanExtension = all isAlpha (lastname elt) cleanTitle = all isAlpha (title elt) unrealVersion (Version season episode) = sum [ episode > 0 ==> 1 , episode > 50 ==> negate 2 , season > 0 ==> 1 , season > 30 ==> negate 1 ] unrealVersion (DateVersion year month day) = 0 infix 2 ==> True ==> n = n False ==> _ = 0 -------------------------------------------------------------- -- Tests -------------------------------------------------------------- testSeries = Map.fromList [ (P.trunc t,t) | (_,t,_) <- testData] testData = [ ("24.S06E01.6AM.TO.7AM.PROPER.DVDRip.XviD-MEMETiC.avi", "24", Version 6 1) , ("The.Simpsons.S18E09.PROPER.PDTV.XviD-2HD.avi", "The Simpsons", Version 18 9) , ("30.Rock.S01E09.HDTV.XviD-NoTV.avi", "30 Rock", Version 1 9) , ("Cops.S19E32.HDTV.XviD-2HD.avi", "Cops", Version 19 32) , ("The.4400.S04E02.DSR.XviD-ORENJi.avi", "The 4400", Version 4 2) , ("Jay.Leno.2007.06.25.John.Edwards.HDTV.XViD-STFU.avi", "Jay Leno", DateVersion 2007 6 25) , ("the.daily.show.06.21.07.dsr.xvid-crimson.[VTV].avi", "The Daily Show", DateVersion 2007 6 21) , ("the.colbert.report.06.21.07.dsr.xvid-w4f.[VTV].avi", "The Colbert Report", DateVersion 2007 6 21) , ("hidden.palms.0107-yestv.[VTV].avi", "Hidden Palms", Version 1 7) , ("hidden.palms.0108-yestv.[VTV].avi", "Hidden Palms", Version 1 8) , ("hidden.palms.0109-yestv.[VTV].avi", "Hidden Palms", Version 1 9) , ("hidden.palms.0110-yestv.[VTV].avi", "Hidden Palms", Version 1 10) , ("hidden.palms.0111-yestv.[VTV].avi", "Hidden Palms", Version 1 11) ] runTests = flip mapM_ testData $ \(str, series, expectedVersion) -> let elts = P.run (P.parseElement testSeries) str in if null elts then do putStrLn $ "Failed to parse: " ++ str putStrLn $ "Expected: " ++ show (series, expectedVersion) else let best = selectBest elts v = version best in when (version best /= expectedVersion) $ do forM (sortByRank elts) $ \elt -> putStrLn $ "Erroneous parse: " ++ show (str, title elt, version elt) putStrLn $ "Expected: " ++ show (series, expectedVersion)