info hash calculation
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Thu, 12 Feb 2015 14:34:05 +0000 (20:04 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Thu, 12 Feb 2015 14:34:05 +0000 (20:04 +0530)
deluge.cabal
src/Main.hs
src/Metainfo.hs

index 5b5741bb74918f71f358c1ddcf58e74b4749fd41..4ae419b7ae1f68674d78694e6a81b5f3cd3fc8a0 100644 (file)
@@ -25,7 +25,8 @@ executable deluge
                        time ==1.4.2,
                        bytestring,
                        doctest,
-                       HTTP >=4000.2.1
+                       HTTP >=4000.2.1,
+                       cryptohash
   hs-source-dirs:      src
   ghc-options:         -Wall -fwarn-incomplete-patterns
   default-language:    Haskell2010
\ No newline at end of file
index 16b2ca5b9f3a0e82b5c8def0e4a3e2f59b61ea45..12d35151f68dcb39c435cc6425b74fdd4560accb 100644 (file)
@@ -16,6 +16,9 @@ main = do
   case (Benc.decode torrentStr) of
    Right d -> case (MInfo.mkMetaInfo d) of
                Nothing -> putStrLn "parse error"
-               Just m -> putStrLn (show m)
+               Just m -> do
+                 let (Benc.Bdict d') = d
+                 putStrLn (show m)
+                 putStrLn (MInfo.infoHash d')
    Left e -> printError e
   putStrLn "done"
index 22df5f61b498db3d6cd9b637d07201b0d5abb8e3..bf1c1de1dbe8860721931950eddbf7170a13e758 100644 (file)
@@ -3,6 +3,8 @@ module Metainfo where
 import qualified Bencode as Benc
 import qualified Data.ByteString.Char8 as BC
 import qualified Data.Map as M
+import qualified Crypto.Hash as H
+import qualified Crypto.Hash.SHA1 as SHA1
 import Data.Time.Clock
 
 -- only single file mode supported for the time being.
@@ -63,3 +65,6 @@ mkMetaInfo (Benc.Bdict m) = let (Just info') = mkInfo (m M.! (Benc.Bstr (BC.pack
                                              , encoding = maybeBstrToString encoding' }
 mkMetaInfo _ = Nothing
 
+infoHash :: (M.Map Benc.BVal Benc.BVal) -> String
+infoHash m = let info = m M.! (Benc.Bstr (BC.pack "info"))
+             in show $ SHA1.hash $ BC.pack $ Benc.encode info