{"version":3,"sources":["../lib/00-start.js","../lib/magnet-protocolhandler.js","../lib/~~-end.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"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxHA;AACA;AACA;AACA;","file":"magnet-protocolhandler.js"}