Changes between Version 72 and Version 73 of HashSourceCodes


Ignore:
Timestamp:
Feb 4, 2024, 5:39:26 PM (3 months ago)
Author:
os
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • HashSourceCodes

    v72 v73  
    379379== Python ==
    380380
    381 https://gist.github.com/henryjfry/82c490ca8415a13fd6d388230835e448
     381https://gist.github.com/henryjfry/f857ceae9cb1e5625f9c485e65da1d4d
    382382* supports local and remote files
    383383
     
    385385#!python
    386386import struct, os
    387 import urllib
    388387__64k = 65536
    389388__longlong_format_char = 'q'
     
    404403        return False
    405404
    406 
    407 def hashFile_url(filepath):
     405def hash_size_File_url(filepath):
    408406        #https://trac.opensubtitles.org/projects/opensubtitles/wiki/HashSourceCodes
    409407        #filehash = filesize + 64bit sum of the first and last 64k of the file
     
    415413
    416414        if local_file == False:
    417                 from urllib import request
    418415                f = None
    419                 opener = None
    420416                url = name
    421                 request.urlcleanup()
    422 
    423                 f = request.urlopen(url)
    424 
    425                 filesize = int(f.headers['Content-Length'])
     417                import requests
     418
     419                response = requests.head(url)#, verify=False)
     420                filesize = int(response.headers['content-length'])
     421
    426422                if filesize < __64k * 2:
    427                         try: filesize = int(str(f.headers['Content-Range']).split('/')[1])
     423                        try: filesize = int(str(response.headers['content-range']).split('/')[1])
    428424                        except: pass
    429425
    430                 opener = request.build_opener()
    431                 bytes_range = ('bytes=0-%s') % (str(__64k))
    432                 opener.addheaders = [('Range',bytes_range)]
    433426
    434427                first_64kb = temp_file()
    435428                last_64kb = temp_file()
    436429
    437                 request.install_opener(opener)
    438                 request.urlretrieve(url, first_64kb)
    439                 opener = request.build_opener()
    440 
     430                headers = {"Range": 'bytes=0-%s' % (str(__64k -1 ))}
     431                r = requests.get(url, headers=headers)#, verify=False)
     432                with open(first_64kb, 'wb') as f:
     433                        for chunk in r.iter_content(chunk_size=1024):
     434                                if chunk: # filter out keep-alive new chunks
     435                                        f.write(chunk)
    441436
    442437                if filesize > 0:
    443                         opener.addheaders = [('Range', 'bytes=%s-%s' % (filesize - __64k, filesize))]
     438                        headers = {"Range": 'bytes=%s-%s' % (filesize - __64k, filesize-1)}
    444439                else:
    445440                        f.close()
    446441                        os.remove(first_64kb)
    447                         return "SizeError" 
     442                        return "SizeError", 0
    448443
    449444                try:
    450                         request.install_opener(opener)
    451                         request.urlretrieve(url, last_64kb)
     445                        r = requests.get(url, headers=headers)#, verify=False)
     446                        with open(last_64kb, 'wb') as f:
     447                                for chunk in r.iter_content(chunk_size=1024):
     448                                        if chunk: # filter out keep-alive new chunks
     449                                                f.write(chunk)
    452450                except:
    453451                        f.close()
    454452                        if os.path.exists(last_64kb):
    455453                                os.remove(last_64kb)
    456                         os.remove(first_64kb)
    457                         return 'IOError'
     454                        if os.path.exists(first_64kb):
     455                                os.remove(first_64kb)
     456                        return 'IOError', 0
    458457                f = open(first_64kb, 'rb')
    459458
    460459        try:
    461                
    462460                longlongformat = '<q'  # little-endian long long
    463461                bytesize = struct.calcsize(longlongformat)
    464                
     462
    465463                if local_file:
    466464                        f = open(name, "rb")
    467465                        filesize = os.path.getsize(name)
    468466                hash = filesize
    469                
     467
    470468                if filesize < __64k * 2:
    471469                        f.close()
     
    473471                                os.remove(last_64kb)
    474472                                os.remove(first_64kb)
    475                         return "SizeError" 
     473                        return "SizeError", 0
    476474
    477475                range_value = __64k / __byte_size
     
    500498                        os.remove(first_64kb)
    501499                returnedhash =  "%016x" % hash
    502                 return returnedhash
     500                return returnedhash, filesize
    503501
    504502        except(IOError):
     
    506504                        os.remove(last_64kb)
    507505                        os.remove(first_64kb)
    508                 return 'IOError'
     506                return 'IOError', 0
    509507
    510508'''