Netflix Keyboard Shortcuts

By DustinLuck Last update Apr 18, 2012 — Installed 2,461 times.

There are 7 previous versions of this script.

// ==UserScript==
// @name           Netflix Keyboard Shortcuts
// @namespace      http://userscripts.org/users/109864
// @description    Adds keyboard shortcuts to the Netflix web site
// @match          *://*.netflix.com/*
// @version        1.10.2012.418
// ==/UserScript==

var elemsListContainers;
var currListContainer = -1;
var elemsNPList;
var currListItem = -1;

function getElementsByClassName(className, parentNode)
{
    var elements = [];
    var parent = parentNode;
    if (parentNode == undefined) {
        parent = document.body;
    }
    if (parent.getElementsByClassName != undefined) {
        return parent.getElementsByClassName(className);
    }

    if (parent.getElementsByTagName == undefined) {
        return elements;
    }
    var children = parent.getElementsByTagName('*');
    for (var i = 0; i < children.length; i ++) {
        var child = children[i];
        if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) {
            elements[elements.length] = child;
        }
    }
    return elements;
}

function SimulateEvent(elem, event)
{
    if(document.createEvent && elem) {
        var e = document.createEvent("MouseEvents");
        e.initEvent(event, true, true);
        elem.dispatchEvent(e);
    }
}

function SimulateClick(elem)
{
    if (elem) {
        SimulateEvent(elem, "mouseover");
        SimulateEvent(elem, "click");
    }
}

function ListHasItems(list)
{
    if (list) {
        if (list.length > 0) {
            return true;
        }
    }
    return false;
}

function RateMovie(rating)
{
    switch (rating) {
    case "`":
        rating = "clear";
        break;
    case "0":
        rating = "norec";
        break;
    default:
        break;
    }

    var elemRatingContainer;
    if (elemsNPList) {
        elemRatingContainer = elemsNPList[currListItem];
    }
    if (!elemRatingContainer) {
        elemRatingContainer = document.getElementById("mdp-boxshot");
    }
    if (!elemRatingContainer) {
        elemRatingContainer = document.getElementById("sdp-action-area");
    }
    if (elemRatingContainer) {
        var elemRating = getElementsByClassName("rv" + rating, elemRatingContainer);
        if (elemRating && (elemRating.length > 0)) {
            SimulateClick(elemRating[0]);
        }
    }
}

function WatchOrQueueMovie(action)
{
    var actionRegEx;
    switch (action) {
    case " ":
        actionRegEx = /Play/;
        break;
    case "*":
    case "Shift+*":
        actionRegEx = /to Instant/;
        break;
    case "+":
    case "Shift++":
        actionRegEx = /Add to DVD Queue|Add Season|^Add$|Save|Add All/;
        break;
    default:
        return;
    }
    
    var elemActionContainer;
    if (elemsNPList) {
        elemActionContainer = elemsNPList[currListItem];
    }
    if (!elemActionContainer) {
        elemActionContainer = document.getElementById("mdp-actions");
    }
    if (!elemActionContainer) {
        if (action.substr(-1) == "+") {
            elemActionContainer = document.getElementById("seasonMetaData");
        }else{
            elemActionContainer = document.getElementById("sdp-actions");
        }
    }
    if (elemActionContainer) {
        var elemActionList = getElementsByClassName("btn", elemActionContainer);
        for (var i = 0; i < elemActionList.length; i++) {
            var child = elemActionList[i];
            if (child.getElementsByTagName("span")[0].innerHTML.match(actionRegEx)) {
                SimulateClick(child);
                return;
            }
        }
    }

}

function NextPreviousListPage(direction)
{
    var strBtnClass;
    switch (direction) {
    case 1:
        strBtnClass = "next";
        break;
    case -1:
        strBtnClass = "prev";
        break;
    default:
        return;
        break;
    }
    SimulateClick(getElementsByClassName(strBtnClass)[0]);
}

function NextPreviousListContainer(direction)
{
    if (!ListHasItems(elemsListContainers)) {
        NextPreviousListPage(direction);
        return;
    }
    
    currListContainer += direction;
    if (currListContainer < 0) {
        currListContainer = 0;
    } else if (currListContainer > elemsListContainers.length - 1) {
        currListContainer = elemsListContainers.length - 1;
    } else {
        NextPreviousListItem(0);
        currElem = elemsListContainers[currListContainer];
        currElem.scrollIntoView(true);
        elemsNPList = getElementsByClassName("agMovie", currElem);
        currListItem = -1;
        NextPreviousListItem(1);
    }

}

function NextPreviousListItem(direction)
{
    if (!ListHasItems(elemsNPList)) {
        return;
    }
    
    var currElem = elemsNPList[currListItem];
    var lastIndex = elemsNPList.length - 1;
    try {
        currElem.style.backgroundColor = "";
    } catch(err) {
        //ignore error
    }
    if (direction == 0) {
        return;
    }
    currListItem += direction;
    if (currListItem < 0) {
        currListItem = 0;
        NextPreviousListPage(-1);
    } else if (currListItem > lastIndex) {
        currListItem = lastIndex;
        NextPreviousListPage(1);
    } else {
        currElem = elemsNPList[currListItem];
        SimulateEvent(currElem, "mouseover");
        currElem.scrollIntoView(true);
    }
    currElem.style.backgroundColor = "LightCyan";
    var elemsLinks = currElem.getElementsByTagName("a");
    if (elemsLinks.length == 0) {
        switch (currListItem) {
        case 0:
            NextPreviousListItem(1);
            break;
        case lastIndex:
            NextPreviousListItem(-1);
            break;
        default:
            NextPreviousListItem(direction);
            break;
        }
        //NextPreviousListItem(-direction);
    }
}

function OpenCurrentLink()
{
    if (!ListHasItems(elemsNPList)) {
        return;
    }
    
    var elemsLinks = elemsNPList[currListItem].getElementsByTagName("a");
    if (elemsLinks.length > 0) {
        for (var i = 0; i < elemsLinks.length; i++) {
        var link = elemsLinks[i];
            if (link.href.match(/netflix\.com\/(Wi)?(Movie|RoleDisplay)/)) {
                window.location = link.href;
                break;
            }
        }
    }

}

function handleKeyPress(e)
{
    if (e.target.nodeName.match(/^(textarea|input)$/i)) {
        return;
    }
    var override = true;
    var keyCombo = String.fromCharCode(e.charCode||e.which).toLowerCase();
    if (e.altKey) { 
        keyCombo = "Alt+" + keyCombo;
    }
    if (e.ctrlKey) { 
        keyCombo = "Ctrl+" + keyCombo;
    }
    if (e.shiftKey) { 
        keyCombo = "Shift+" + keyCombo;
    }
    
    switch(keyCombo) {
    case " ":
    case "*":
    case "+":
    case "Shift+*":
    case "Shift++":
        WatchOrQueueMovie(keyCombo);
        break;
    case "`":
    case "0":
    case "1":
    case "2":
    case "3":
    case "4":
    case "5":
        RateMovie(keyCombo);
        break;
    case "/":
        var elem = document.getElementById("searchField");
        elem.focus();
        elem.select();
        break;
    case "?":
        window.location = "https://www2.netflix.com/Help";
        break;
    case "a":
        window.location = "http://www.netflix.com/ReturnedRentals";
        break;
    case "Shift+a":
        window.location = "http://account.netflix.com/WiViewingActivity?lnkctr=RRIQ";
        break;
    case "b":
        window.location = "http://movies.netflix.com/MemberHome";
        break;
    case "d":
        window.location = "https://www2.netflix.com/DVDDistribution";
        break;
    case "i":
        window.location = "http://movies.netflix.com/WiHome";
        break;
    case "k":
        window.location = "http://movies.netflix.com/Kids";
        break;
    case "n":
        NextPreviousListItem(1);
        break;
    case "Shift+n":
        NextPreviousListContainer(1);
        break;
    case "o":
        OpenCurrentLink();
        break;
    case "p":
        NextPreviousListItem(-1);
        break;
    case "Shift+p":
        NextPreviousListContainer(-1);
        break;
    case "q":
        window.location = "http://movies.netflix.com/Queue";
        break;
    case "Shift+q":
        window.location = "http://movies.netflix.com/Queue?qtype=ED";
        break;
    case "s":
        window.location = "http://movies.netflix.com/RecommendationsHome";
        break;
    case "y":
        window.location = "https://www2.netflix.com/YourAccount";
        break;
    default:
        return;
    }
    if (override) {
        e.preventDefault();
    }
}

var currURL = document.URL;
if (currURL.match(/netflix\.com\/(WiSearch|Search)/)) {
    elemsNPList = getElementsByClassName("mresultWrap");
} else if (currURL.match(/netflix\.com\/RoleDisplay/)) {
    elemsNPList = getElementsByClassName("agMovie", document.getElementById("yui-main"));
} else if (currURL.match(/netflix\.com\/(ReturnedRentals|RentalActivity)/)) {
    elemsNPList = document.getElementById("rhtable").getElementsByTagName("tr");
} else if (currURL.match(/netflix\.com\/Top100/)) {
    elemsNPList = document.getElementById("topmovers").getElementsByTagName("tr");
} else if (currURL.match(/netflix\.com\/WiViewingActivity/)) {
    elemsNPList = document.getElementById("rental-history").getElementsByTagName("tr");
} else if (currURL.match(/^(?=.*?netflix\.com\/(MemberHome|Genre|RecommendationsHome|NewReleases))((?!\?vt=|&vt=).)*$/)) {
    elemsListContainers = getElementsByClassName("mrow", document.getElementById("yui-main"));
    //window.location = currURL + "&vt=tg";
} else if (currURL.match(/netflix\.com\/((Sub)?Genre|Recs|Critic)/)) {
    elemsNPList = getElementsByClassName("agMovie", document.getElementById("yui-main"));
}

if (elemsNPList) {
    NextPreviousListItem(1);
}
if (elemsListContainers) {
    NextPreviousListContainer(1);
}

document.addEventListener('keypress', handleKeyPress, false);