// ==UserScript==
// @name AppStore QR code
// @namespace https://www.iplaysoft.com
// @version 1.32
// @description Add QRCode to iTunes AppStore page.
// @author X-Force
// @match https://apps.apple.com/*
// @grant none
// @require https://cdn.staticfile.org/jquery/3.6.3/jquery.min.js
// @require https://cdn.staticfile.org/qrious/4.0.2/qrious.min.js
// @run-at document-start
// ==/UserScript==
//https://gist.github.com/BrockA/2625891#file-waitforkeyelements-js
//function waitForKeyElements(e,t,n,a){(o=void 0===a?$(e):$(a).contents().find(e))&&o.length>0?(l=!0,o.each((function(){var e=$(this);!e.data("alreadyFound")&&(t(e)?l=!1:e.data("alreadyFound",!0))}))):l=!1;var o,l,r=waitForKeyElements.controlObj||{},i=e.replace(/[^\w]/g,"_"),c=r[i];l&&n&&c?(clearInterval(c),delete r[i]):c||(c=setInterval((function(){waitForKeyElements(e,t,n,a)}),300),r[i]=c),waitForKeyElements.controlObj=r}
function waitForKeyElements(selectorTxt,actionFunction,bWaitOnce,iframeSelector){var targetNodes,btargetsFound;(targetNodes=void 0===iframeSelector?$(selectorTxt):$(iframeSelector).contents().find(selectorTxt))&&targetNodes.length>0?(btargetsFound=!0,targetNodes.each((function(){var jThis=$(this);jThis.data("alreadyFound")||!1||(actionFunction(jThis)?btargetsFound=!1:jThis.data("alreadyFound",!0))}))):btargetsFound=!1;var controlObj=waitForKeyElements.controlObj||{},controlKey=selectorTxt.replace(/[^\w]/g,"_"),timeControl=controlObj[controlKey];btargetsFound&&bWaitOnce&&timeControl?(clearInterval(timeControl),delete controlObj[controlKey]):timeControl||(timeControl=setInterval((function(){waitForKeyElements(selectorTxt,actionFunction,bWaitOnce,iframeSelector)}),300),controlObj[controlKey]=timeControl),waitForKeyElements.controlObj=controlObj}
console.log("Begin");
var $ = window.jQuery;
var runOnce=false;
var foundVideo=false;
var foundImage=false;
(function() {
'use strict';
//Story 下载标题图片
var url = window.location.href;
var matchStory = url.match(/https?:\/\/apps\.apple\.com\/.+?\/story\/id([0-9]+)/);
if(matchStory!==null){
//waitForKeyElements(".story-card--video>.story-card__content",addVideoDownloadLink)
waitForKeyElements(".video-player--opaque",getVideoLink);
//由于图片是 Lazy Load 的,所以需要用这个函数监视
waitForKeyElements(".story-card .we-artwork__image--lazyload",getImgLink);
}else{
//添加 QR 代码
// https://greasyfork.org/scripts/5392-waitforkeyelements/code/WaitForKeyElements.js?version=115012
waitForKeyElements (".we-banner", addQR);
}
/*
jquery 的函数在这里没用
$(document).ready(function(){
console.log("xxxcxcxcxcx");
});
*/
})();
function getVideoLink(){
foundVideo=true;
if(runOnce){return;}
runOnce=true;
// var myImgButton = document.createElement("div");
//myImgButton.innerHTML = "xxxxxxxx";
//insertAfter(myImgButton,document.getElementsByClassName("story-card")[0]);
var stroyVideoCard=$(".story-card--video")[0];
console.log(stroyVideoCard);
if(stroyVideoCard!=undefined){
var stroyVideoCardCSS=$(".story-card--video>.story-card__content")[0].style.cssText;
stroyVideoCardCSS=decodeURI(stroyVideoCardCSS).replace(/\\/g, '');
console.log("CSS: "+stroyVideoCardCSS);
var re=/url\((.+?)\)/gm
var matches = re.exec(stroyVideoCardCSS);
if(matches && matches[1]){
console.log(matches);
var imgUrl= decodeURI(matches[1]);
//addDownloadLinks(imgUrl);
}
var videoUrl=$(".story-card__video>.background-video")[0].shadowRoot.querySelector("div > video").src;
console.log(videoUrl);
addDownloadLinks(imgUrl,videoUrl);
}
}
function getImgLink(){
if(foundVideo || runOnce){
return;
}
runOnce=true;
console.log("Found Story ");
// var imgSrcset=$(".story-card>.we-artwork>source[type='image/png']");
var imgSrcset=$(".story-card>.we-artwork>source")[0];
if(imgSrcset!=null){
console.log(imgSrcset);
var imgUrlStr=$(imgSrcset).attr('srcset').split(',').pop().trim().split(' ')[0];
if(imgUrlStr!==null){
var imgMatch=imgUrlStr.match(/(https?:\/\/.+?.(jpg|webp))\s*/);
if(imgMatch!==null && imgMatch[1]!==null){
var imgUrl = imgMatch[1];
console.log(imgUrl);
addDownloadLinks(imgUrl,null);
}
}
}
}
function addDownloadLinks(imgUrl,videoUrl){
var imgUrlDefault = imgUrl.replace(/\.(jpg|webp)/,".jpg");
var imgUrlVertical = imgUrl.replace(/\/(\d+)x(\d+)(\w+?)\.(jpg|webp)/,"/0x4096h.jpg");
var imgUrlHorizon = imgUrl.replace(/\/(\d+)x(\d+)(\w+?)\.(jpg|webp)/,"/4096x0w.jpg");
var linkHtml='<a style="margin:0 auto;display:inline-block" target="_blank" href="'+imgUrlHorizon+'">下载封面图片 (横向)</a> | ';
linkHtml=linkHtml+'<a style="margin:20px auto;display:inline-block" target="_blank" href="'+imgUrlVertical+'">下载竖向</a> | ';
linkHtml=linkHtml+'<a style="margin:20px auto;display:inline-block" target="_blank" href="'+imgUrlDefault+'">封面图</a>';
if(videoUrl!=null){
linkHtml=linkHtml+' | ';
linkHtml=linkHtml+'<a style="margin:20px auto;display:inline-block" target="_blank" href="'+videoUrl+'">下载视频</a>';
}
var myImgButton = document.createElement("div");
myImgButton.innerHTML = linkHtml;
insertAfter(myImgButton,document.getElementsByClassName("story-card")[0]);
}
function insertAfter(newNode, referenceNode) {
referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
}
function addQR(){
var url = location.href.split('#')[0];
//iTunes 页面增加 QR Code
if(document.title.match("Mac App Store")==null && url.match("\/app\/")){
var regex = /\/id([0-9]+)/;
var match = url.match(regex);
var id = null;
if(match!==null){
id = match[1];
}
if(id!==null){
var xurl = "itmss://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id="+id+"&mt=8&at=10laHZ";
var mydiv = document.createElement("div");
var html = '<style>#xf_itunes_link{display: inline-block;padding: 8px 22px;background: #228fff;color: #fff;font-size: 16px;border-radius: 6px;}#xf_itunes_link:hover{text-decoration:none}</style>';
html = html + '<a id="xf_itunes_link" href="'+xurl+'">在 iTunes 中查看</a>';
html = html + '<canvas id="qrcode" style="position:absolute;right:2px;top:64px;width:200px;height:200px"></canvas>';
mydiv.innerHTML = html;
document.getElementsByClassName("product-header")[0].appendChild(mydiv);
document.getElementsByClassName("product-hero")[0].style.position="relative";
var qrious = new QRious({
element: document.getElementById('qrcode'),
value: url,
size: 400
});
}
}
}