module FuncTorrent.Metainfo
(Info,
Metainfo,
+ announceList,
mkMetaInfo,
mkInfo,
- announce,
lengthInBytes,
info,
- name
+ name,
) where
import Prelude hiding (lookup)
import Data.ByteString.Char8 (ByteString, unpack)
import Data.Map as M ((!), lookup)
+import Data.Maybe (maybeToList)
-import FuncTorrent.Bencode (BVal(..))
+import FuncTorrent.Bencode (BVal(..), bstrToString)
-- only single file mode supported for the time being.
data Info = Info { pieceLength :: !Integer
} deriving (Eq, Show)
data Metainfo = Metainfo { info :: !Info
- , announce :: !String
- , announceList :: !(Maybe [[String]])
+ , announceList :: ![String]
, creationDate :: !(Maybe String)
, comment :: !(Maybe String)
, createdBy :: !(Maybe String)
mkInfo _ = Nothing
maybeBstrToString :: Maybe BVal -> Maybe String
-maybeBstrToString Nothing = Nothing
-maybeBstrToString (Just s) = let (Bstr bs) = s
- in Just (unpack bs)
+maybeBstrToString (Just (Bstr bs)) = Just $ unpack bs
+maybeBstrToString _ = Nothing
mkMetaInfo :: BVal -> Maybe Metainfo
mkMetaInfo (Bdict m) = let (Just info') = mkInfo $ m ! "info"
- (Bstr announce') = m ! "announce"
- -- announceList = lookup (Bstr (pack "announce list"))
- announceList' = Nothing
+ announce' = lookup "announce" m
+ announceList' = lookup "announce-list" m
-- creationDate = lookup (Bstr (pack "creation date")) m
creationDate' = Nothing
comment' = lookup "comment" m
createdBy' = lookup "created by" m
encoding' = lookup "encoding" m
in Just Metainfo { info = info'
- , announce = unpack announce'
- , announceList = announceList'
+ , announceList = maybeToList (announce' >>= bstrToString)
+ ++ getAnnounceList announceList'
, creationDate = creationDate'
, comment = maybeBstrToString comment'
, createdBy = maybeBstrToString createdBy'
, encoding = maybeBstrToString encoding'
}
mkMetaInfo _ = Nothing
+
+getAnnounceList :: Maybe BVal -> [String]
+getAnnounceList Nothing = []
+getAnnounceList (Just (Bint _)) = []
+getAnnounceList (Just (Bstr _)) = []
+getAnnounceList (Just (Blist l)) = map (\s -> case s of
+ (Bstr s') -> unpack s'
+ (Blist s') -> case s' of
+ [Bstr s''] -> unpack s''
+ _ -> ""
+ _ -> "") l
+
+getAnnounceList (Just (Bdict _)) = []