window.onload = async () => {
insertJQuery('https://stuk.github.io/jszip/vendor/FileSaver.js')
insertJQuery('https://stuk.github.io/jszip/dist/jszip.js')
insertJQuery('https://stuk.github.io/jszip-utils/dist/jszip-utils.js')
const props = getData()
if (!props) {
return
}
getProductImage()
await getProductInfoPage(props)
}
function insertJQuery (url) {
let script = document.createElement('script')
script.src = url
document.head.appendChild(script)
return script
}
function getPicture (url) {
return new Promise((resolve, reject) => {
fetch(url, {
method: 'get',
responseType: 'arraybuffer'
}).then(data => {
return data.blob()
}).then(data => {
resolve(data)
}).catch(error => {
reject(error)
})
})
}
function download (images, folderName) {
const zip = new JSZip()
const folder = zip.folder(folderName)
const promises = images.map((image, i) => {
return getPicture(image).then(data => {
const name = image.split('/')[image.split('/').length - 1]
var FileExt = image.replace(/.+\./, '')
folder.file((i + 1).toString() + '.' + FileExt, data, { binary: true })
})
})
Promise.all(promises).then(() => {
zip.generateAsync({ type: 'blob' }).then(content => {
saveAs(content, folderName + '.zip')
})
})
}
function getData () {
const props = {}
const i = location.href.indexOf('.html')
if (i) {
let k = 5
while (location.href[i - k - 1] !== '/' && k < 20) {
k++
}
props.id = location.href.substr(i - k, k)
return props
}
}
function getProductImage (props) {
let imgList = document.getElementsByClassName('img-list-wrapper')[0]
const editForm = document
.getElementById('vbar-main')
const downButton = document.createElement('div')
downButton.className = 'tab-li first de-selected'
downButton.innerHTML = `<button type="button">主图</button>`
const imgArr = []
for (let k = 0; k < imgList.getElementsByTagName('div').length; k++) {
let src = imgList
.getElementsByTagName('div')
[k]?.getElementsByTagName('img')?.[0]?.src
if (src) {
imgArr.push(src)
}
}
downButton.onclick = () => {
download(imgArr, '主图')
}
editForm.insertBefore(downButton, editForm?.getElementsByTagName('div')?.[0])
const style =
'cursor:pointer; margin:5px; padding:0 5px; border:1px solid black; font-size:20px; color:red; fontweight:bold;'
const video = document
.getElementById('detail-main-video-content')
.getElementsByClassName('lib-video')?.[0]
?.getElementsByTagName('video')?.[0]?.src
if (video) {
const downVideo = document.createElement('div')
downVideo.className = 'tab-li first de-selected'
downVideo.innerHTML = `<button type="button">视频</button>`
downVideo.onclick = () => {
GM_download(video, `${props.id}_视频_$`)
}
editForm.insertBefore(downVideo, editForm?.getElementsByTagName('div')?.[0])
}
return imgArr
}
function getProductInfoPage (props) {
const editForm = document
.getElementById('vbar-main')
const downButton = document.createElement('div')
downButton.className = 'tab-li first de-selected'
downButton.innerHTML = `<button type="button">详情</button>`
downButton.onclick = () => {
const imgList = document.getElementById('detailContentContainer')?.childNodes
if (!imgList) return
const imgArr = []
const mapChild = list => {
list.forEach(i => {
if (i?.src) {
imgArr.push(i.src)
}
if (i.childNodes.length !== 0) {
mapChild(i.childNodes)
}
})
}
mapChild(imgList)
download(imgArr, '详情图')
}
editForm.insertBefore(downButton, editForm?.getElementsByTagName('div')?.[0])
}