├── readme.md └── ed2k.py /readme.md: -------------------------------------------------------------------------------- 1 | ed2k 2 | ==== 3 | 4 | Python port of https://gist.github.com/ubercow/6807214 5 | 6 | Usage 7 | ----- 8 | 9 | ``` 10 | ./ed2k.py [files] 11 | ``` 12 | -------------------------------------------------------------------------------- /ed2k.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hashlib 4 | import os, sys 5 | from Crypto.Hash import MD4 6 | 7 | if len(sys.argv) == 1: 8 | print("This quickly gets ed2k links for anidb crequing.") 9 | print("Usage: %s [files]" % sys.argv[0]) 10 | exit() 11 | 12 | def md4(x): 13 | h = MD4.new() 14 | h.update(x) 15 | return h 16 | 17 | def ed2k(file_name): 18 | ed2k_block = 9500 * 1024 19 | ed2k_hash = b'' 20 | file_size = None 21 | with open(file_name, 'rb') as f: 22 | file_size = os.fstat(f.fileno()).st_size #while at it, fetch the size of the file 23 | while True: 24 | block = f.read(ed2k_block) 25 | if not block: 26 | break 27 | 28 | #hashes are concatenated md4 per block size for ed2k hash 29 | ed2k_hash += md4(block).digest() 30 | #on size of modulo block size, append another md4 hash of a blank string 31 | if file_size % ed2k_block == 0: 32 | ed2k_hash += md4('').digest() 33 | 34 | #finally 35 | ed2k_hash = md4(ed2k_hash).hexdigest() 36 | return [ file_size, ed2k_hash ] 37 | 38 | 39 | # ed2k sample link: ed2k://|file|The_Two_Towers-The_Purist_Edit-Trailer.avi|14997504|965c013e991ee246d63d45ea71954c4d|/ 40 | for file in sys.argv[1:]: 41 | filebase = os.path.basename(file) 42 | size, hash = ed2k(file) 43 | print("ed2k://|file|{filebase}|{size}|{hash}|/".format(filebase = filebase, size = size, hash = hash)) 44 | 45 | --------------------------------------------------------------------------------