(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
import Test.Hspec
-import FuncTorrent.Metainfo (Info(..), Metainfo(..), DynamicInfo(..), torrentToMetainfo)
+import FuncTorrent.Metainfo (Info(..), Metainfo(..), DynamicInfo(..), FileInfo(..), torrentToMetainfo)
import qualified Data.ByteString.Lazy.Char8 as BC (readFile, toStrict)
import qualified Data.ByteString as B
length (announceList m) `shouldBe` 1
pieceLength (info m) `shouldBe` 524288
pieces (info m) `shouldSatisfy` (\p -> B.length p `mod` 20 == 0)
- let (SingleFileInfo name' _ _) = dyninfo $ info m
+ let (SingleFileInfo file') = dyninfo $ info m
+ (FileInfo _ _ name') = file'
+ name' `shouldNotBe` ""
+ it "torrent-file-2" $ do
+ c <- BC.readFile "data/test2.torrent"
+ let (Right m) = torrentToMetainfo (BC.toStrict c)
+ (SingleFileInfo file') = dyninfo $ info m
+ (FileInfo _ _ name') = file'
+ name' `shouldNotBe` ""
+ it "torrent-file-3" $ do
+ c <- BC.readFile "data/test3.torrent"
+ let (Right m) = torrentToMetainfo (BC.toStrict c)
+ (SingleFileInfo file') = dyninfo $ info m
+ (FileInfo _ _ name') = file'
name' `shouldNotBe` ""
it "torrent-file-4" $ do
c <- BC.readFile "data/test4.torrent"
let (Right m) = torrentToMetainfo (BC.toStrict c)
length (announceList m) `shouldBe` 3
- let (MultiFileInfo _ files') = dyninfo $ info m
- length files' `shouldNotBe` 1
+ let (MultiFileInfo dname' files') = dyninfo $ info m
+ length files' `shouldBe` 9 -- 9 files in the torrent
+ dname' `shouldBe` "NASA_NTRS_Archive_19740027163"