Stream URL grabber

Adds a button that gives you a .m3u8 file for a stream on Twitch or Hitbox.

Fra 09.04.2017. Se den seneste versjonen.

// ==UserScript==
// @name Stream URL grabber
// @description Adds a button that gives you a .m3u8 file for a stream on Twitch or Hitbox.
// @include *://www.twitch.tv/*
// @include *://m.twitch.tv/*
// @include *://www.m.twitch.tv/*
// @include *://player.twitch.tv/*
// @include *://www.player.twitch.tv/*
// @include *://www.hitbox.tv/*
// @include	*://api.twitch.tv/*?grabber
// @include	*://api.twitch.tv/*&grabber
// @namespace https://greasyfork.org/users/3167
// @run-at      document-load
// @grant none
// @version 4
// ==/UserScript==

console.log("grabbing");

var host = window.location.host;
var grabbertest = document.URL.split("grabber")[1];

function downloadm3u8(link, filename)
{

	document.body.innerHTML = 'Link: ';

  	var fileNameToSaveAs = filename + '.m3u8';

	var downloadLink = document.createElement("a");
	downloadLink.download = fileNameToSaveAs;
	downloadLink.innerHTML = fileNameToSaveAs;
	
	// Firefox requires the link to be added to the DOM
	// before it can be clicked.
	downloadLink.href = link;
	//downloadLink.onclick = destroyClickedElement;
	//downloadLink.style.display = "none";
	document.body.innerHTML = document.body.innerHTML + '<br>';
	document.body.appendChild(downloadLink);
	
	downloadLink.click();
		setTimeout(function(){
			
			window.close(); 
		},1000)	
}

if (grabbertest!=undefined)
{
    
  Object.defineProperty(navigator, 'userAgent', {
    value: 'Mozilla/5.0 (Linux; U; Android 4.0; en-us; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
	});
    
	
  if (host=="api.twitch.tv" || host=="www.api.twitch.tv")
  {
          var text = document.body.textContent;
          var json = JSON.parse(text);
          var user = document.URL.split("api.twitch.tv/api/channels/")[1].split("/")[0];

          var token = json['token'];
    		console.log(token);

          var signature = json['sig'];
    console.log(signature);

    		var randomp = Math.round(Math.random()*9999999);
    		var url = location.protocol + '//usher.twitch.tv/api/channel/hls/' + user + '.m3u8?player=twitchweb&&token=' + token + '&sig=' + signature + '&allow_audio_only=true&allow_source=true&type=any&p=' + randomp;
              var urle = encodeURI(url);

          console.log("urle:" + urle);

              /*document.body.innerHTML = '<a href="' + urle + '">' + urle + '</a>';

              var link = document.createElement("a");
              link.download = urle;
              link.href = urle;

            	link.click();
                  //window.close(); */
              downloadm3u8(urle,user);

      console.log("Stream grab action on: " + host);

  }
    return;
}
else
{

  var hook = function(retries)
  {
      console.log("Hooking... Retries left: " + retries);
      var loaded = false;

      if (retries>0)
      {
        retries--;

        if (host=="www.twitch.tv")
        {
            var div = document.querySelectorAll('.channel-actions')[0];

              if (div==null) {
                div = document.querySelectorAll('.cn-metabar__more')[0];
              }

            if (div==null) {
                setTimeout(function(){hook(retries);},1000);
                return;
            }

            var user = document.URL.split("twitch.tv/")[1].split("/")[0];

          	var clientid = "rp5xf0lwwskmtt1nyuee68mgd0hthrw";
            var tokenurl = location.protocol + '//api.twitch.tv/api/channels/' + user + '/access_token?client_id=' + clientid + '&grabber';

          var isvideo = document.URL.split("/v/")[1];
          if (isvideo!=undefined)
          {
              tokenurl = location.protocol + '//player.twitch.tv/?!branding&!channelInfo&video=v' + isvideo + '&client_id=' + clientid + '&grabber';  
          }

           
            var clickaction = "window.open('" + tokenurl + "');";

            var newspan = document.createElement("span");
            newspan.innerHTML = '<div class="js-share-box balloon-wrapper inline-block"><span class="qa-share-box__button share-box__button button button--hollow mg-l-1" onclick="' + clickaction + '" style="cursor:pointer;">Grab stream link</span></div>';
            div.appendChild(newspan);  

            console.log("Stream link: " + tokenurl);

          loaded = true;
        }

        if (host=="www.hitbox.tv")
        {
            var div = document.querySelectorAll('.status')[0];
            if (div==null) {
                setTimeout(function(){hook(retries);},1000);
                return
            }

            var user = document.URL.split("hitbox.tv/")[1].split("/")[0];

            var url = location.protocol + '//api.hitbox.tv/player/hls/' + user + '.m3u8';

            //var temp = div.innerHTML;

            var clickaction = "window.open('" + url + "');";

            var newspan = document.createElement("span");
            newspan.innerHTML = '<span onclick="' + clickaction + '" style="cursor:pointer;"> Grab stream link</span>';
            div.appendChild(newspan);    

            console.log("Stream link: " + url);

          loaded = true;
        }
      }

      if (loaded)
      {
        console.log("Stream grabber loaded on host: " + host);
      }
      else
      {
        console.log("Something went wrong when loading on host: " + host);
      }
  }

  var retries = 10;
  hook(retries);
}