A script to download 3D models in the 3D model viewer on Ikeas product pages.
// ==UserScript==
// @name Ikea 3D Model Downloader
// @version 1.2
// @include https://www.ikea.com*
// @grant none
// @author timonsku
// @license MIT
// @description A script to download 3D models in the 3D model viewer on Ikeas product pages.
// @namespace https://greasyfork.org/en/scripts/490780
// ==/UserScript==
window.addEventListener('load', function() {
let scriptTags = document.body.querySelectorAll('script[type="application/ld+json"]')
let modelList = []
for(const script of scriptTags) {
scriptJson = JSON.parse(script.innerHTML);
if(scriptJson["@type"] == "3DModel"){
console.log("found 3DModel list")
modelList = scriptJson.encoding
}
}
console.log(modelList)
if(modelList.length == 0){
console.log("Empty model list")
return
}
let favoredURL = ""
for(const model of modelList) {
let url = model.contentUrl
if(model.contentUrl.match(/\/glb\/.*iqp3.*/i) != null){
console.log("found IQP3 without draco")
favoredURL = url
}
}
if(favoredURL == ""){
console.log("could not find IQP3 checking for lower quality RQ3")
for(const model of modelList) {
let url = model.contentUrl
if(model.contentUrl.match(/\/glb\/.*rqp3.*/i) != null){
console.log("found RQP3 without draco")
favoredURL = url
}
}
}
if(favoredURL == ""){
console.log("no suitable model found, using first one in list")
favoredURL = modelList[0].contentUrl
}
let downloadButton = document.createElement("button");
downloadButton.onclick = function() {
window.location.href = favoredURL;
}
downloadButton.classList.add("pip-btn", "pip-btn--emphasised", "pip-btn--fluid");
// add span to button
let span = document.createElement("span");
span.classList.add("pip-btn__inner");
// add label to span
let label = document.createElement("span");
label.classList.add("pip-btn__label");
label.innerHTML = "Download 3D Model";
span.appendChild(label);
downloadButton.appendChild(span);
buttonSection = document.querySelector(".js-price-package.pip-price-package")
//append after buttonSection
buttonSection.parentNode.insertBefore(downloadButton, buttonSection.nextSibling);
}, false);