magnet-uri
Version:
Parse a magnet URI and return an object of keys/values
56 lines (44 loc) • 1.3 kB
JavaScript
var base32 = require('thirty-two')
/**
* Parse a magnet URI and return an object of keys/values
*
* @param {string} uri
* @return {Object} parsed uri
*/
module.exports = function (uri) {
var result = {}
var data = uri.split('magnet:?')[1]
if (!data || data.length === 0)
return result
var params = data.split('&')
params.forEach(function (param) {
var keyval = param.split('=')
// This keyval is invalid, skip it
if (keyval.length !== 2)
return
var key = keyval[0]
var val = keyval[1]
// Address tracker (tr) is an encoded URI, so decode it
if (key === 'tr')
val = decodeURIComponent(val)
// If there are repeated parameters, return an array of values
if (result[key]) {
if (Array.isArray(result[key])) {
result[key].push(val)
} else {
var old = result[key]
result[key] = [old, val]
}
} else {
result[key] = val
}
})
var m
if (result.xt && (m = result.xt.match(/^urn:btih:(.{40})/))) {
result.infoHash = new Buffer(m[1], 'hex').toString('hex')
} else if (result.xt && (m = result.xt.match(/^urn:btih:(.{32})/))) {
var decodedStr = base32.decode(m[1])
result.infoHash = new Buffer(decodedStr, 'binary').toString('hex');
}
return result
}