Stream URL grabber

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

Från och med 2017-10-08. Se den senaste versionen.

// ==UserScript==
// @name Stream URL grabber
// @description Adds a button that gives you a .m3u8 file for a stream on Twitch or Hitbox.
// @include *://twitch.tv/*
// @include *.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 7
// ==/UserScript==

console.log("Loading streamgrabber...");

if (window.top != window.self) {
  //don't run on frames or iframes
    console.log("Skipping frame/iframe...");
    return;
}


var host = window.location.host;

function downloadm3u8(link, filename) {

    document.body.innerHTML = 'Link: ';

    var fileNameToSaveAs = filename + '.m3u8';

    var downloadLink = document.createElement("a");
    downloadLink.download = fileNameToSaveAs;
    downloadLink.innerHTML = fileNameToSaveAs;

    downloadLink.href = link;

    document.body.innerHTML = document.body.innerHTML + '<br>';
    document.body.appendChild(downloadLink);

    setTimeout(function() {
        downloadLink.click();
        setTimeout(function() {
            //window.close(); 
        }, 1000);
    }, 1000);
}

if (document.URL.split("grabber").length > 1) {
  console.log("Grab command detected...");
    if (host == "api.twitch.tv" || host == "www.api.twitch.tv") {
        //var text = document.body.textContent;
        var text = document.body.innerText;
      	if (document.body.children.length>0) {
          	text = document.body.children[0].innerText;
        }
      	
        
        var json = JSON.parse(text);
        var user = document.URL.split("api.twitch.tv/api/channels/")[1].split("/")[0];

        var token = json['token'] || '';
        var signature = json['sig'] || '';

        var randomp = Math.round(Math.random() * 9999999);

        var url = 'http://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;

        console.log("Encoding url...");
        var urle = encodeURI(url);

        console.log(urle);

        downloadm3u8(urle, user);

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

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

        if (retries > 0) {
            retries--;

            if (host.split("twitch.tv").length > 1) {
                var div = document.querySelectorAll('.channel-actions')[0];
              
              
                if (div == null) {
                    div = document.querySelectorAll('.channel-info-bar__action-container')[0];
                }
              
                if (div == null) {
                    div = document.querySelectorAll('.cn-metabar__more')[0];
                }
              
              if (div == null) {
                    div = document.querySelectorAll('.channel-header__right')[0];
                }


                if (div == null) {
                    setTimeout(function() {
                        hook(retries);
                    }, 1000);
                    return;
                }
                else
                 {
                   //do
                  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
                }
                else
                {
                  //do
                  var user = document.URL.split("hitbox.tv/")[1].split("/")[0];

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

                  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);
        }
    };
    
    //console.log("Attempting hooks...");
    var retries = 3;
    setTimeout(function() {
        hook(retries);
    }, 1000);
}