{"version":3,"sources":["jsdelivr-header.js","/npm/os-torrent-hash@0.0.9/index.js"],"names":[],"mappings":"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","file":"/npm/os-torrent-hash@0.0.9/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/os-torrent-hash@0.0.9/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var readTorrent = require('read-torrent');\nvar Q = require('q');\nvar _ = require('underscore');\n\n/**\n * read 64 bits from buffer starting at offset as LITTLE ENDIAN hex\n *\n * @param buffer\n * @param offset\n * @return {String}\n */\nvar read64LE = function(buffer, offset) {\n    var ret_64_be = buffer.toString('hex', offset*8, ((offset+1)*8));\n    var t = [];\n    for(var i=0; i<8; i++) {\n        t.push(ret_64_be.substr(i*2, 2));\n    }\n    t.reverse();\n    return t.join('');\n};\n\n/**\n * compute checksum of the buffer splitting by chunk of lengths bits\n *\n * @param buf\n * @param length\n */\nvar checksumBuffer = function(buf, length) {\n    var checksum = 0, checksum_hex = 0;\n    for(var i=0; i<(buf.length/length); i++) {\n        checksum_hex = read64LE(buf, i);\n        checksum = sumHex64bits(checksum.toString(), checksum_hex).substr(-16);\n    }\n    return checksum;\n};\n\n/**\n* calculate hex sum between 2 64bits hex numbers\n*\n* @param n1\n* @param n2\n* @return {String}\n*/\nvar sumHex64bits = function(n1, n2) {\n    if(n1.length < 16) n1 = padLeft(n1, '0', 16);\n    if(n2.length < 16) n2 = padLeft(n2, '0', 16);\n\n    // 1st 32 bits\n    var n1_0 = n1.substr(0, 8);\n    var n2_0 = n2.substr(0, 8);\n    var i_0 = parseInt(n1_0, 16) + parseInt(n2_0, 16);\n\n    // 2nd 32 bits\n    var n1_1 = n1.substr(8, 8);\n    var n2_1 = n2.substr(8, 8);\n    var i_1 = parseInt(n1_1, 16) + parseInt(n2_1, 16);\n\n    // back to hex\n    var h_1 = i_1.toString(16);\n    var i_1_over = 0;\n    if(h_1.length > 8) {\n        i_1_over = parseInt(h_1.substr(0, h_1.length - 8), 16);\n    } else {\n        h_1 = padLeft(h_1, '0', 8);\n    }\n\n    var h_0 = (i_1_over + i_0).toString(16);\n\n    return h_0 + h_1.substr(-8);\n};\n\n/**\n * pad left with c up to length characters\n *\n * @param str\n * @param c\n * @param length\n * @return {String}\n */\nvar padLeft = function(str, c, length) {\n    while(str.length < length) {\n        str = c.toString() + str;\n    }\n    return str;\n};\n\n\n/**\n * compute a torrent's movie hash\n *\n * @param torrentUrl\n * @param engine\n * @return {Q.Promise}\n */\nvar computeMovieHash = function(torrentUrl, engine){\n    var deferred = Q.defer();\n\n    var chunk_size = 65536;\n    var buf_pad = new Buffer(chunk_size);\n    var file_size = 0;\n    var file_name = null;\n    var t_chksum = [];\n\n    function addChecksum (chksum_part) {\n        t_chksum.push(chksum_part);\n        if(t_chksum.length == 3) {\n            var chksum = sumHex64bits(t_chksum[0], t_chksum[1]);\n            chksum = sumHex64bits(chksum, t_chksum[2]);\n            chksum = chksum.substr(-16);\n            deferred.resolve({\n                movieHash: padLeft(chksum, '0', 16), \n                fileSize: file_size,\n                fileName: file_name\n            });\n        }\n    }\n\n    readTorrent(torrentUrl, function(err, torrent) {\n        if(err) {\n            deferred.reject(new Error(err));\n        } else {\n            function whenEngineReady () {\n                // Video file is the biggest one within the torrent\n                var file = _.sortBy(engine.files, function(file){\n                    return -file.length;\n                })[0];\n\n                // Get file meta-data\n                file_name = file.name;\n                file_size = file.length;\n                addChecksum(file_size.toString(16), \"filesize\");\n\n                var stbuf=[],enbuf=[];\n\n                // Opening chunk\n                var openingStream = file.createReadStream({\n                    start: 0,\n                    end: chunk_size-1\n                });\n\n                function onDataOpeningStream (data) {\n                    stbuf.push(data);\n                    openingStream.removeListener('data', onDataOpeningStream);\n                }\n\n                function onEndOpeningStream () {  // done\n                    stbuf = Buffer.concat(stbuf);\n                    var buffer = Buffer.concat([stbuf, buf_pad]);\n                    addChecksum(checksumBuffer(buffer, 16));\n                    openingStream.removeListener('end', onEndOpeningStream);\n                }\n\n                openingStream.on('data', onDataOpeningStream);\n                openingStream.on('end', onEndOpeningStream);\n\n                // Closing chunk\n                var closingStream = file.createReadStream({\n                    start: file_size - chunk_size,\n                    end: file_size -1\n                });\n\n                function onDataClosingStream (data) {\n                    enbuf.push(data);\n                    closingStream.removeListener('data', onDataClosingStream)\n                }\n\n                function onEndClosingStream () {\n                    enbuf = Buffer.concat(enbuf);\n                    var buffer = Buffer.concat([enbuf, buf_pad]);\n                    addChecksum(checksumBuffer(buffer, 16));\n                    closingStream.removeListener('end', onEndClosingStream);\n                }\n\n                closingStream.on('data', onDataClosingStream);\n                closingStream.on('end', onEndClosingStream);\n            }\n\n            if(engine.files && engine.files.length > 0){\n                whenEngineReady();\n            } else {\n                engine.on('ready', function() {\n                    whenEngineReady()\n                });\n            }\n        }\n    });\n\n    return deferred.promise;\n}\n\nexports.computeHash = function(torrentUrl, engine) {\n    return computeMovieHash(torrentUrl, engine);\n}"]}