1 module FuncTorrent.Metainfo
13 import Prelude hiding (lookup)
14 import Data.ByteString.Char8 (ByteString, unpack)
15 import Data.Map as M ((!), lookup)
17 import FuncTorrent.Bencode (BVal(..))
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 , announce :: !(Maybe String)
30 , announceList :: ![String]
31 , creationDate :: !(Maybe String)
32 , comment :: !(Maybe String)
33 , createdBy :: !(Maybe String)
34 , encoding :: !(Maybe String)
37 mkInfo :: BVal -> Maybe Info
38 mkInfo (Bdict m) = let (Bint pieceLength') = m ! "piece length"
39 (Bstr pieces') = m ! "pieces"
41 (Bstr name') = m ! "name"
42 (Bint length') = m ! "length"
44 in Just Info { pieceLength = pieceLength'
48 , lengthInBytes = length'
52 maybeBstrToString :: Maybe BVal -> Maybe String
53 maybeBstrToString Nothing = Nothing
54 maybeBstrToString (Just s) = let (Bstr bs) = s
57 mkMetaInfo :: BVal -> Maybe Metainfo
58 mkMetaInfo (Bdict m) = let (Just info') = mkInfo $ m ! "info"
59 announce' = lookup "announce" m
60 announceList' = lookup "announce-list" m
61 -- creationDate = lookup (Bstr (pack "creation date")) m
62 creationDate' = Nothing
63 comment' = lookup "comment" m
64 createdBy' = lookup "created by" m
65 encoding' = lookup "encoding" m
66 in Just Metainfo { info = info'
67 , announce = announce'
70 , announceList = getAnnounceList announceList'
71 , creationDate = creationDate'
72 , comment = maybeBstrToString comment'
73 , createdBy = maybeBstrToString createdBy'
74 , encoding = maybeBstrToString encoding'
76 mkMetaInfo _ = Nothing
78 getAnnounceList :: Maybe BVal -> [String]
79 getAnnounceList Nothing = []
80 getAnnounceList (Just (Bint _)) = []
81 getAnnounceList (Just (Bstr _)) = []
82 getAnnounceList (Just (Blist l)) = map (\s -> case s of
83 (Bstr s') -> unpack s'
84 (Blist s') -> case s' of
85 [Bstr s''] -> unpack s''
89 getAnnounceList (Just (Bdict _)) = []
91 getTrackers :: Metainfo -> [String]
92 getTrackers m = case announce m of
93 Nothing -> announceList m
94 Just a -> a : announceList m