{"version":3,"sources":["../lib/00-start.js","../lib/magnet-protocolhandler.js","../lib/~~-end.js"],"names":["init","options","require","protocolLoadFallbackHandler","WebTorrent","self","webtorrent","addOrGetTorrent","uri","callback","torrent","get","ready","on","add","setHandler","[object Object]","sos","match","substr","split","map","x","slice","filter","so","length","concat","join","PFHUtils","parseRange","i","files","Array","from","Uint32Array","Promise","resolve","reject","this","getSelection","getBlobURL","bloburl","ProtocolLoadFallbackHandlerError","element","renderToHelper","f","e","c","autoplay","preload","renderTo","HTMLSourceElement","parentElement","HTMLMediaElement","subtitles","name","index","lang","ext","medias","pictures","poster","picture","test","replace","track","querySelectorAll","src","removeChild","subtitle","document","createElement","appendChild","srclang","label","$sourcelock","error","module","exports"],"mappings":"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","file":"magnet-protocolhandler.min.js","sourcesContent":["\"use strict\";\n\n(function(){\nif(typeof module != \"undefined\"){\n  module.exports = (...x)=>module.exports.init(...x)\n  module.exports.init = init;\n}else{\n  init();\n}\nfunction init(options){\n\noptions = options || {};\n\nif(typeof require != \"undefined\"){\n  if(typeof protocolLoadFallbackHandler == \"undefined\")\n    require(\"protocolloadfallbackhandler\")(options);\n}\n\nvar WebTorrent = self.WebTorrent || require(\"webtorrent\");\nvar webtorrent = options.webtorrent || self.webtorrent || new WebTorrent();\n\n// See ~~-end.js for the end of the function that wraps everything\n","\nfunction addOrGetTorrent(uri,callback){\n  var torrent = webtorrent.get(uri);\n  if(torrent){\n    if(torrent.ready){\n      callback(torrent);\n    }else{\n      torrent.on(\"ready\",()=>callback(torrent));\n    }\n  }else{\n    webtorrent.add(uri,callback);\n  }\n}\n\nprotocolLoadFallbackHandler.setHandler(\"magnet\",{\n  getSelection(torrent,uri){\n    var params = uri.match(/\\?.*$/)[0].substr(1).split('&').map(x=>x.match(/^([^=]*)=(.*)$/).slice(1));\n    var sos = params.filter(x=>x[0]=='so');\n    var so = null;\n    if(sos.length){\n      so = [];\n      for( let x of sos.map(x=>x[1]) )\n        so = so.concat(x);\n      so = so.join(',');\n    }\n    if(!so){\n      return Array.from(new Uint32Array(torrent.files.length)).map((x,i)=>i);\n    }else{\n      return PFHUtils.parseRange(so).filter(i=>i<torrent.files.length);\n    }\n  },\n  makeVirtualURI(uri){\n    return new Promise((resolve,reject)=>{\n      addOrGetTorrent(uri,torrent=>{\n        var so = this.getSelection(torrent,uri);\n        if( so.length != 1 ){\n          reject(new ProtocolLoadFallbackHandlerError(\"More or less than one file selected or selection out of range. Use &so= to select a speciffic file.\"));\n          return;\n        }\n        var file = torrent.files[so[0]];\n        file.getBlobURL((x,bloburl)=>resolve(bloburl));\n      });\n    });\n  },\n  renderTo(element,uri){\n    function renderToHelper(f,e,c){\n      if(e.autoplay)\n        e.preload = \"auto\";\n      try {\n        return f.renderTo(e,c);\n      } catch(e) {\n        c(e);\n      }\n      return;\n    }\n    return new Promise((resolve,reject)=>{\n      addOrGetTorrent(uri,torrent=>{\n        var so = this.getSelection(torrent,uri);\n        if(so.length<1){\n          reject(new ProtocolLoadFallbackHandlerError(\"No files selected\"));\n          return;\n        }\n        if(so.length == 1){\n          renderToHelper(torrent.files[so[0]],element,error=>{\n            if(error){\n              reject(new ProtocolLoadFallbackHandlerError(error,true));\n            }else{\n              resolve();\n            }\n          });\n          return;\n        }else{\n          if( element instanceof HTMLSourceElement\n           && element.parentElement\n           && element.parentElement instanceof HTMLMediaElement\n          ) element = element.parentElement;\n          var subtitles = torrent.files.map(\n            (x,i)=>[i,x.name.match(/\\.([a-zA-Z]{2,3})\\.(aqt|gsub|jss|sub|ttxt|pjs|psb|rt|smi|slt|ssf|srt|ssa|ass|usf|idx|vtt)$/i)]\n          ).filter(x=>x[1]).map(x=>({index:x[0],lang:x[1][1],ext:x[1][2]}));\n          var medias = torrent.files.map(\n            (x,i)=>[i,x.name.match(/\\.(mp4|m4v|webm|mkv|gifv|ogv|ogg|mov|mpg|mpv|mp2|mpeg|mpe|mp3|m4a|wav|flac)$/i)]\n          ).filter(x=>x[1]).map(x=>x[0]);\n          var pictures = torrent.files.map(\n            (x,i)=>[x.name.match(/\\.(svg|png|jpg|jpeg|gif|bmp)$/i),i,x]\n          ).filter(x=>x[1]).map(x=>x.slice(1));\n          if(!medias.length){\n            reject(new ProtocolLoadFallbackHandlerError(\"No media source found\"));\n            return;\n          }\n          if(element instanceof HTMLMediaElement){\n            if(!element.poster && pictures.length){\n              let picture = pictures.filter(x=>/poster/i.test(x[1].name))[0] || pictures[0];\n              element.poster = uri.replace(/(&|\\?)so(=[^&]*)?/g,'')+'&so=' + picture[0];\n            }\n            for( let track of element.querySelectorAll(\"track\") ){\n              if(track.src != uri)\n                continue;\n              track.parentElement.removeChild(track);\n            }\n            for( let subtitle of subtitles ){\n              let track = document.createElement(\"track\");\n              element.appendChild(track);\n              track.srclang = subtitle.lang;\n              track.label = subtitle.lang;\n              track.src = uri.replace(/(&|\\?)so(=[^&]*)?/g,'')+'&so='+subtitle.index;\n            }\n          }\n          element.$sourcelock = true;\n          renderToHelper(torrent.files[medias[0]],element,error=>{\n            element.$sourcelock = false;\n            if(error){\n              reject(error);\n            }else{\n              resolve();\n            }\n          });\n        }\n      });\n    });\n  }\n});\n","return init;\n}\nreturn init;\n})(); // see 00-start for the start of these functions.\n"]}