PS Store fix

取得出来る場合に限り、全製品でサイズ/スクリーンショット/動画/関連製品のリンクを表示、PS4の製品で評価(星)情報を表示

当前为 2021-04-25 提交的版本,查看 最新版本

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         PS Store fix
// @namespace    http://tampermonkey.net/
// @version      0.6.0
// @description  取得出来る場合に限り、全製品でサイズ/スクリーンショット/動画/関連製品のリンクを表示、PS4の製品で評価(星)情報を表示
// @author       kood
// @match        https://store.playstation.com/*
// @require http://code.jquery.com/jquery-latest.js
// @require  https://greasyfork.org/scripts/2199-waitforkeyelements/code/waitForKeyElements.js?version=6349
// ==/UserScript==

$(function(){

    /*
        by TropicalSalad
        https://www.resetera.com/threads/a-look-at-the-new-playstation-store-website.309355/page-13#post-49319173
    */
    waitForKeyElements('div.pdp-background-image', addScreenshots);
    function addScreenshots(jNode) {
        var json = JSON.parse(jNode.find("script").html());
        var medias = json['cache']['Product:'+json['args']['productId']]['media'];
        var video = medias.filter(m => m.role === 'PREVIEW' && m.type === 'VIDEO');
        if(medias)
            addGameScreenshots(medias.filter(m => m.role === 'SCREENSHOT'), video);
    }
    function addGameScreenshots(medias, video) {
        var screenshots = '';
        medias.forEach(m => {
            screenshots = screenshots + buildScreenshot(m);
        });
        if(video && video.length > 0)
            screenshots = '<video controls style="width:100%"><source src="'+video[0].url+'"></video>' + screenshots;
        $('.game-overview-container').append('<div style="width:100%">'+screenshots+'</div>');
    }
    function buildScreenshot(screenshot) {
        return '<img style="flex: 1;width:50%; height:auto;" src="'+screenshot.url+'">';
    }

    /*
        by kood
    */
    waitForKeyElements("div.pdp-overview", addInfo);
    var tid;
    var cid;
    var console_name;
    var overview;
    var prod_lc;
    var chihiro_cl;
    var chihiro_url;
    function addInfo(){
        (function(){
            var def = $.Deferred();
            getChihiroJson(def);
            return def.promise();
        }()).then(
            function(data){
                if(console_name=="ps4"){
                    outInfoPs4(data);
                }else if(console_name=="ps5"){
                    outInfoPs5(data);
                }
            },function(){}
        );
    };

    function getChihiroJson(def){
        overview = $("div.pdp-overview").find(".psw-root" + ".psw-dark-theme").find(".psw-bg-0");
        const url = location.href;
        const tid_reg = /[a-zA-Z]{4}\d{5}/;
        const cid_reg = /[a-zA-Z]{2}\d{4}-[a-zA-Z]{4}\d{5}_(\d{2}|[a-zA-Z]{2})-[a-zA-Z0-9]{16}/;
        cid = url.match(cid_reg)[0];
        tid = cid.match(tid_reg)[0];
        if(overview.length==1 && (tid.indexOf("CUSA")>-1 || tid.indexOf("PPSA")>-1)){
            const lc_reg = /\/[a-zA-Z]{2}-([a-zA-Z]{4}-)?[a-zA-Z]{2}\//;
            prod_lc = url.match(lc_reg)[0];
            prod_lc = prod_lc.replace(/\//g,"");
            var lang = prod_lc.slice(0,prod_lc.match(/-[a-zA-Z]{2}$/)["index"]);
            var country = prod_lc.match(/-[a-zA-Z]{2}$/)[0];
            country = country.replace(/-/,"");
            if(lang=="zh-hant"){
                lang = "ch";
            }else if(lang=="zh-hans"){
                lang = "zh";
            }
            chihiro_cl = country + "/" + lang;
            if(!chihiro_cl.match(/[a-zA-Z]{2}\/[a-zA-Z]{2}/)){
                chihiro_cl = "us/en";
            }
            chihiro_url = "https://store.playstation.com/store/api/chihiro/00_09_000/container/";
            if(tid.indexOf("CUSA")>-1){
                console_name = "ps4";
                chihiro_url = chihiro_url + chihiro_cl + "/999/" + cid;
            }else if(tid.indexOf("PPSA")>-1){
                console_name ="ps5";
                const nptid = tid + "_00";
                chihiro_url = chihiro_url + chihiro_cl + "/999/" + nptid;
            }
            chihiro_url += "?size=999";
            getData(chihiro_url).then(
                function(data){
                    def.resolve(data);
                },function(){
                    def.reject();
                }
            );
        }else{
            def.reject();
        }
    }

    function getData(ajax_url){
        var def = $.Deferred();
        $.ajax({
            type: "GET",
            dataType: "json",
            url: ajax_url
        }).done(function(data){
            def.resolve(data);
        }).fail(function(){
            def.reject();
        });
        return def.promise();
    }

    function outInfoPs4(data){
        var elem_array = [];
        // コンテンツのサイズを取得
        if(data.default_sku!=undefined){
            const size_elem = getSize(data.default_sku.entitlements);
            if(size_elem!=null){
                elem_array.push(size_elem);
            }
        }
        // 評価(星)の数を取得
        const star = data.star_rating;
        var total_elem, ave_elem, count_elem;
        if(star.total!=null){
            total_elem = "<div class='chihiro_star_total'>Star (Total) : " + star.total + "</div>"
            elem_array.push(total_elem);
            ave_elem = "<div class='chihiro_star_average'>Star (Average) : " + star.score + "</div>"
            elem_array.push(ave_elem);
            var count_array = [];
            for(var x in star.count){
                const star_n = 5 - x;
                const star_c = 4 - x;
                const count_str = "☆" + star_n + "(" + star.count[star_c].count + ")";
                count_array.push(count_str)
            }
            if(count_array.length>0){
                count_elem = "<div class='chihiro_star_count'>Star (Count) : " + count_array.join(", ") + "</div>"
                elem_array.push(count_elem);
            }
        }
        // 上で取得した情報の出力
        if(elem_array.length>0){
            overview.prepend(elem_array.join("") + "<br><br>");
        }
        // 関連製品のリンクと価格を出力
        const links = data.links;
        const relation_array = [];
        $.each(links,function(i,item){
                if(item.id!=undefined && item.id!=null && item.name!=undefined && item.name!=null){
                    var relation_url = "https://store.playstation.com/" + prod_lc + "/product/" + item.id;
                    var relation_link = "<a href='"+ relation_url + "' target='_blank'>" + item.name + "</a>";
                    var price = "";
                    if(item.default_sku!=undefined){
                        price = item.default_sku.display_price;
                        relation_link += " (" + price + ")";
                    }
                    const relation_elem = "<li>" + relation_link + "</li>";
                    relation_array.push(relation_elem);
                }
        })
        if(relation_array.length>0 && $(".game-overview-container").length==1){
            const relation_elem = "<br><div class='chihiro_links'><ul>" + relation_array.join("") + "</ul></div>"
            $(".game-overview-container").append(relation_elem);
            setRelationElemStyle();
        }
        // DLCのページの場合に、親製品のリンクを出力
        if(data.parent_links!=undefined && data.parent_links.length>0){
            const parent_links = data.parent_links;
            var parent_name, parent_cid;
            if(parent_links[0].name!=undefined && parent_links[0].name.length>0){
                parent_name = parent_links[0].name;
            }
            if(parent_links[0].id!=undefined){
                parent_cid = parent_links[0].id;
            }
            if(parent_name!=undefined && parent_cid!=undefined){
                const parent_url = "https://store.playstation.com/" + prod_lc + "/product/" + parent_cid;
                const parent_link = "<a href='" + parent_url + "' target='_blank'>" + parent_name + "</a>";
                const parent_elem = "<div class='chihiro_parent'>Parent : " + parent_link + "</a>";
                overview.prepend(parent_elem + "<br><br>");
                $(".chihiro_parent").find("a").css("color","green");
            }
        }

    }

    function outInfoPs5(data){
        const links = data.links;
        const relation_array = [];
        $.each(links, function(i, item){
            if(item.default_sku!=undefined){
                if(cid==item.id){
                    const size_elem = getSize(item.default_sku.entitlements);
                    if(size_elem!=null){
                        overview.prepend(size_elem + "<br><br>");
                    }
                }else{
                    // 関連製品
                    if(item.name!=undefined && item.name!=null){
                        const relation_url = "https://store.playstation.com/" + prod_lc + "/product/" + item.id;
                        var relation_link = "<a href='"+ relation_url + "' target='_blank'>" + item.name + "</a>";
                        const price = item.default_sku.display_price;
                        relation_link += " (" + price + ")";
                        const relation_elem = "<li>" + relation_link + "</li>";
                        relation_array.push(relation_elem);
                    }
                }
            }
        })
        if(relation_array.length>0 && $(".game-overview-container").length==1){
            const relation_elem = "<br><div class='chihiro_links'><ul>" + relation_array.join("") + "</ul></div>"
            $(".game-overview-container").append(relation_elem);
            setRelationElemStyle();
        }
    }

    // entitlementsからサイズを取得
    function getSize(entitlements){
        var size = 0;
        try{
            for(var i in entitlements){
                if(entitlements[i].drms!=undefined && entitlements[i].drms.length>0){
                    size = size + entitlements[i].drms[0].size;
                }
                if(entitlements[i].packages!=undefined && entitlements[i].packages.length>0){
                    size = size + entitlements[i].packages[0].size;
                }
            }
        }catch(e){}
        if(size>0){
            size = sizeCalc(size);
            const size_elem = "<div class='chihiro_size'>Size : " + size + "</div>";
            return size_elem;
        }else{
            return null;
        }
    }

    // バイト単位のサイズを変換 (旧ストアは1000バイト=1KBで計算しているのでここでは1000を設定)
    function sizeCalc(size){
        const unit_array = ["Byte","KB","MB","GB","TB"];
        var unit_i = 0;
        for(size; size>=1000; size=Math.floor((size/1000)*100)/100){
            unit_i++;
        }
        return size.toString() + unit_array[unit_i];
    }

    // 関連製品のCSSを調整
    function setRelationElemStyle(){
        $(".chihiro_links").find("a").css("color","green");
        $(".chihiro_links").css("font-size","0.9rem");
        $(".chihiro_links").find("a").css("font-size","0.9rem");
        $(".ul_indent").css({"padding-left": "0", "margin-left": "1em"});
    }

});