(Info(..)
, Metainfo(..)
, DynamicInfo(..)
+ , FileInfo(..)
, torrentToMetainfo
) where
import Prelude hiding (lookup)
import Data.ByteString.Char8 (ByteString, unpack)
import Data.Map as M ((!), lookup)
+import Data.List (intercalate)
import Crypto.Hash.SHA1 (hash)
import Data.Maybe (maybeToList)
, dyninfo :: !DynamicInfo
} deriving (Eq, Show)
-data DynamicInfo = SingleFileInfo { name :: String
- , lengthInBytes :: Integer
- , md5sum :: Maybe String
- }
+data DynamicInfo = SingleFileInfo { file :: FileInfo }
| MultiFileInfo { dname :: String
, files :: [FileInfo]
}
, infoHash :: !ByteString
} deriving (Eq, Show)
+mkPath :: [BVal] -> String
+mkPath xs = intercalate "/" $ map (\b -> let (Just s) = bstrToString b in s) xs
+
mkInfo :: BVal -> Maybe Info
mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
(Bstr pieces') = m ! "pieces"
files =
map (\(Bdict f) ->
let (Just len') = bValToInteger (f ! "length")
- (Bstr s') = f ! "path"
+ (Blist ds) = f ! "path"
+ path' = mkPath ds
in
FileInfo { lengthInBytes = len',
md5sum = Nothing,
- path = unpack s'
+ path = path'
})
files' }
}
, pieces = pieces'
, private = private'
, dyninfo = SingleFileInfo {
- name = unpack name',
- lengthInBytes = length',
- md5sum = md5sum'}
+ file = FileInfo {
+ path = unpack name',
+ lengthInBytes = length',
+ md5sum = md5sum'
+ }
+ }
}
mkInfo _ = Nothing