Netflix Plans Fetcher

Get Netflix prices of all countries

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Netflix Plans Fetcher
// @description  Get Netflix prices of all countries
// @author       /u/Wilcooo
// @include      https://www.netflix.com/*
// @grant        GM_getValue
// @grant        GM_setValue
// @run-at       document-start
// @version      1
// @namespace    /u/Wilcooo
// ==/UserScript==

var data = GM_getValue('data',{});


if (location.pathname.startsWith('/signup')) {

    // Getting the prices & current country whenever the Netflix site is opened

    document.addEventListener("DOMContentLoaded", function(event) {

        var geo = netflix.reactContext.models.signupContext.data.geo.requestCountry,
            options = netflix.reactContext.models.signupContext.data.flow.fields.planChoice.options;

        data[geo.id] = {geo:geo, options:options};
        GM_setValue('data',data);

        // Get the exchange rates (used later)
        var exchange_rates = jQuery.getJSON("https://www.floatrates.com/daily/usd.json");


        // Write the result info:

        document.body.innerHTML =
            'Done! You can select another country now.<br><br>' +
            'You can disable this userscript in your userscript manager (f.e. Tampermonkey). You can usually find its icon in the top right.<br><br>' +
            'This is all collected data so far, you can copypasta this table right into EXCEL<br>' +
            'Click <a href="#" onclick="NPFclear()">here</a> to remove everything.<br>'+
            'For more details, type NPFdata in the JS console.<br><br>';


        // Create the table:

        var table = document.createElement('table');
        document.body.appendChild(table);
        table.innerHTML = "<tr><th>Country</th><th>Currency</th><th>Basic</th><th>Standard</th><th>Premium</th><th>Basic (USD)</th><th>Standard (USD)</th><th>Premium (USD)</th></tr>"


        // Add all entries to the table

        Object.keys(data).forEach(function(k) {

            var currency = data[k].options[0].fields.planPriceCurrency.value;
            var prices = data[k].options.map(o => o.fields.planPriceAmount.value || o.fields.planPrice.value.match(/[\d.,]+/)[0] );

            var tr = data[k].tr = document.createElement("tr");
            table.appendChild(tr);
            tr.innerHTML = [data[k].geo.countryName, currency, ...prices].map( x => "<td>" + x + "</td>").join('');


            // Once the exchange rates (requested before) are loaded, calculate & add the converted prices:

            exchange_rates.done(function(exchange_rates) {
                try {
                    var pricesUSD = prices.map( price => (price / exchange_rates[currency.toLowerCase()].rate).toFixed(2) );
                    tr.innerHTML += pricesUSD.map( x => "<td>" + x + "</td>").join('');
                } catch(e){
                    if (currency.toLowerCase() == "usd") {
                        tr.innerHTML += prices.map( x => "<td>" + x + "</td>").join('');
                    } else tr.innerHTML += "<td>Error getting Exchange Rate</td>";
                }
            });
        });

    });

} else location.href = 'https://www.netflix.com/signup/';


// The function that clears all entries

window.NPFclear = function() {
    if (confirm("Ara you sure you want to delete everything???")) {
        GM_setValue('data',{});
        location.href = 'https://www.netflix.com/signup/';
    }
}


// Some styling (CSS) of the table

var style = document.createElement('style');
document.head.appendChild(style);
style.sheet.insertRule(` td { border: 1px solid black; width: 80px; }`);


// Make the data accessible in the JS console
window.NPFdata = data;