Stream URL grabber

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

Od 16.07.2017.. Pogledajte najnovija verzija.

// ==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.8
// ==/UserScript==
// 
if (window.top != window.self) //don't run on frames or iframes
    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 > 0) {
    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 == "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;
                }

                //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
                }

                //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);
        }
    }

    var retries = 3;
    setTimeout(function() {
        hook(retries);
    }, 1000);
}
console.log("Loading streamgrabber...");