module FuncTorrent.Metainfo
(Info(..)
, Metainfo(..)
- , DynamicInfo(..)
, FileInfo(..)
, torrentToMetainfo
) where
data Info = Info { pieceLength :: !Integer
, pieces :: !ByteString
, private :: !(Maybe Integer)
- , dyninfo :: !DynamicInfo
+ , files :: ![FileInfo]
} deriving (Eq, Show)
-data DynamicInfo = SingleFileInfo { file :: FileInfo }
- | MultiFileInfo { dname :: String
- , files :: [FileInfo]
- }
- deriving (Eq, Show)
-
data FileInfo = FileInfo { lengthInBytes :: Integer
, md5sum :: Maybe String
, path :: String
, infoHash :: !ByteString
} deriving (Eq, Show)
-mkPath :: [BVal] -> String
-mkPath xs = intercalate "/" $ map (\b -> let (Just s) = bstrToString b in s) xs
+mkPath :: String -> [BVal] -> String
+mkPath base xs = base ++ "/" ++ (intercalate "/" $ map (\b -> let (Just s) = bstrToString b in s) xs)
mkInfo :: BVal -> Maybe Info
mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
case bdictfiles of
Just fs -> let (Blist files') = fs
(Bstr name') = m ! "name"
+ dname' = unpack name'
in
Just Info { pieceLength = pieceLength'
, pieces = pieces'
, private = private'
- , dyninfo = MultiFileInfo {
- dname = unpack name',
- files =
- map (\(Bdict f) ->
- let (Just len') = bValToInteger (f ! "length")
- (Blist ds) = f ! "path"
- path' = mkPath ds
- in
- FileInfo { lengthInBytes = len',
- md5sum = Nothing,
- path = path'
- })
- files' }
- }
+ , files =
+ map (\(Bdict f) ->
+ let (Just len') = bValToInteger (f ! "length")
+ (Blist ds) = f ! "path"
+ path' = mkPath dname' ds
+ in
+ FileInfo { lengthInBytes = len',
+ md5sum = Nothing,
+ path = path'
+ })
+ files' }
Nothing -> let (Bstr name') = m ! "name"
(Bint length') = m ! "length"
md5sum' = Nothing
Just Info { pieceLength = pieceLength'
, pieces = pieces'
, private = private'
- , dyninfo = SingleFileInfo {
- file = FileInfo {
- path = unpack name',
- lengthInBytes = length',
- md5sum = md5sum'
- }
- }
+ , files = [ FileInfo {
+ path = unpack name',
+ lengthInBytes = length',
+ md5sum = md5sum'
+ }
+ ]
}
mkInfo _ = Nothing