1 module FuncTorrent.Metainfo
12 import Prelude hiding (lookup)
13 import Data.ByteString.Char8 (ByteString, unpack)
14 import Data.Map as M ((!), lookup)
15 import Data.Maybe (maybeToList)
17 import FuncTorrent.Bencode (BVal(..), bstrToString)
19 -- only single file mode supported for the time being.
20 data Info = Info { pieceLength :: !Integer
21 , pieces :: !ByteString
22 , private :: !(Maybe Integer)
24 , lengthInBytes :: !Integer
25 , md5sum :: !(Maybe String)
28 data Metainfo = Metainfo { info :: !Info
29 , announceList :: ![String]
30 , creationDate :: !(Maybe String)
31 , comment :: !(Maybe String)
32 , createdBy :: !(Maybe String)
33 , encoding :: !(Maybe String)
36 mkInfo :: BVal -> Maybe Info
37 mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
38 (Bstr pieces') = m ! "pieces"
40 (Bstr name') = m ! "name"
41 (Bint length') = m ! "length"
43 in Just Info { pieceLength = pieceLength'
47 , lengthInBytes = length'
51 maybeBstrToString :: Maybe BVal -> Maybe String
52 maybeBstrToString Nothing = Nothing
53 maybeBstrToString (Just s) = let (Bstr bs) = s
56 mkMetaInfo :: BVal -> Maybe Metainfo
57 mkMetaInfo (Bdict m) = let (Just info') = mkInfo $ m ! "info"
58 announce' = lookup "announce" m
59 announceList' = lookup "announce-list" m
60 -- creationDate = lookup (Bstr (pack "creation date")) m
61 creationDate' = Nothing
62 comment' = lookup "comment" m
63 createdBy' = lookup "created by" m
64 encoding' = lookup "encoding" m
65 in Just Metainfo { info = info'
66 , announceList = maybeToList (announce' >>= bstrToString)
67 ++ getAnnounceList announceList'
68 , creationDate = creationDate'
69 , comment = maybeBstrToString comment'
70 , createdBy = maybeBstrToString createdBy'
71 , encoding = maybeBstrToString encoding'
73 mkMetaInfo _ = Nothing
75 getAnnounceList :: Maybe BVal -> [String]
76 getAnnounceList Nothing = []
77 getAnnounceList (Just (Bint _)) = []
78 getAnnounceList (Just (Bstr _)) = []
79 getAnnounceList (Just (Blist l)) = map (\s -> case s of
80 (Bstr s') -> unpack s'
81 (Blist s') -> case s' of
82 [Bstr s''] -> unpack s''
86 getAnnounceList (Just (Bdict _)) = []