// ==UserScript==
// @name 아브자막 다운로더
// @namespace 아브자막 다운로더
// @version 1.71
// @description 아브자막 다운로더 도우미
// @author DandyClubs
// @include /avjamak\.(net|com)/
// @require https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js
// @connect *
// @grant GM_xmlhttpRequest
// @grant window.close
// @grant GM_addStyle
// @grant GM_openInTab
// @grant unsafeWindow
// @grant GM_setValue
// @grant GM_getValue
// @license MIT
// @run-at document-end
// ==/UserScript==
(function() { var css = document.createElement('link'); css.href = 'https://use.fontawesome.com/releases/v5.15.4/css/all.css'; css.rel = 'stylesheet'; css.type = 'text/css'; document.getElementsByTagName('head')[0].appendChild(css); })();
GM_addStyle (`
.IconSet {
position: absolute;
visibility: hidden;
}
.OnOff, .OpenIcon, .NextPage {
cursor: pointer;
color: dodgerblue !important;
font-size: 1.5rem;
z-index: 999;
}
`);
const PageURL = window.location !== window.parent.location ? document.referrer : document.location.href;
var filename, i, LinkUrl
var OnOff = GM_getValue("OnOff", 'On')
Start()
$( document ).ready(function() {
if(!/wr_id/.test(PageURL) && /jamakbos|jamakuser|bigsub|jamak_sujung|jamakfreer/.test(PageURL)){
MakeIcon()
}
})
async function Start(){
if(!/wr_id/.test(PageURL) && /jamakbos|jamakuser|bigsub|jamak_sujung|jamakfreer/.test(PageURL)){
document.querySelector('.panel-heading').insertAdjacentHTML('beforeend', '<div class="IconSet"></>')
document.querySelector('.IconSet').insertAdjacentHTML('beforeend', '<i class="OnOff fas fa-power-off"></>')
document.querySelector('.IconSet').insertAdjacentHTML('beforeend', ' <i class="OpenIcon fas fa-external-link-alt"></>')
document.querySelector('.IconSet').insertAdjacentHTML('beforeend', ' <i class="NextPage fas fa-arrow-circle-right"></>')
document.querySelector('.panel-heading').style.setProperty('position', 'relative')
document.querySelector('.OnOff').addEventListener("click", function(event) {
event.preventDefault()
event.stopPropagation()
event.stopImmediatePropagation()
if(OnOff == 'On'){
document.querySelector('.OnOff').style.setProperty('color', 'Gray', 'important');
document.querySelector('.OpenIcon').style.visibility = "hidden"
OnOff = GM_setValue("OnOff", 'Off')
OnOff = GM_getValue("OnOff")
}
else{
document.querySelector('.OnOff').style.setProperty('color', 'dodgerblue', 'important');
document.querySelector('.OpenIcon').style.visibility = "visible"
OnOff = GM_setValue("OnOff", 'On')
OnOff = GM_getValue("OnOff")
}
})
document.querySelector('.OpenIcon').addEventListener("click", function(event) {
event.preventDefault()
event.stopPropagation()
event.stopImmediatePropagation()
OpenLinks(LinkDB)
})
document.querySelector('i.NextPage').addEventListener("click", function(event) {
event.preventDefault()
event.stopPropagation()
event.stopImmediatePropagation()
var pageNumber = document.location.href.match(/(.*page=)(\d+)/) ? Number(document.location.href.match(/(.*page=)(\d+)/)[2]) + 1 : '&page=2'
var PreURL = document.location.href.match(/(.*page=)(\d+)/) ? document.location.href.match(/(.*page=)(\d+)/)[1] : document.location.href
window.location = PreURL + pageNumber
})
window.addEventListener("resize", function(e) {
MakeIcon()
})
/*
window.addEventListener('scroll', function () {
if(inViewport(document.querySelector('.panel-heading'))){
MakeIcon()
}
}, {
passive: true
})
*/
var Linksitems = document.querySelectorAll('div.list-container > div.list-row > div.list-item > h2 > a')
let filtered = [...Linksitems].filter(n => n.textContent.length >= 4)
var LinkDB = []
if(/jamakbos|jamakuser|bigsub/.test(PageURL)){
for (i = 0; i < filtered.length; i++) {
var last = [...filtered[i].closest('div.list-item').querySelectorAll('.list-details.text-muted .pull-right')].pop()
MP = last && last.textContent.match(/(\d+)/) ? Number(last.textContent.match(/(\d+)/).pop()) : ''
if(!MP || MP <=1){
//console.log(filtered[i])
LinkDB.push(filtered[i])
}
}
console.log(LinkDB)
}
else {
LinkDB = Linksitems
}
}
else if(/wr_id/.test(PageURL) && /jamakbos|jamakuser|bigsub|jamak_sujung|jamakfreer/.test(PageURL) && OnOff == 'On'){
var links = document.querySelectorAll('a[href*="download.php"]')
var MP = document.querySelector('.fa.fa-bell.red') ? document.querySelector('.fa.fa-bell.red').closest('a.list-group-item').querySelector('b').textContent : ''
const getUriWithParam = (baseUrl, params) => {
//console.log(baseUrl)
const Url = new URL(baseUrl);
const urlParams = new URLSearchParams(Url.search);
for (const key in params) {
if (params[key] !== undefined) {
urlParams.set(key, params[key]);
}
}
Url.search = urlParams.toString();
return Url.toString();
};
for (var i = 0; i < links.length; ++i) {
links[i].href = await getUriWithParam(links[i].href, {ds: "1"})
links[i].href = await getUriWithParam(links[i].href, {js: "on"})
}
links = document.querySelectorAll('a[href*="download.php"]')
if(!links?.length){
await sleep(5000)
window.close()
}
else{
for (var j = 0; j < links.length; ++j) {
if(!MP){
DownloadFile(links[j].href, links[j])
}
else if( MP > 0){
DownloadFile(links[j].href, links[j])
}
else{
await sleep(5000)
window.close()
}
}
}
}
}
function MakeIcon() {
document.querySelector(".IconSet").style.visibility = "visible"
if(OnOff == 'On'){
document.querySelector('.OnOff').style.setProperty('color', 'dodgerblue', 'important');
document.querySelector('.OpenIcon').style.visibility = "visible"
}
else{
document.querySelector('.OnOff').style.setProperty('color', 'Gray', 'important');
document.querySelector('.OpenIcon').style.visibility = "hidden"
}
let TitlePostion = getOffset(document.querySelector('.panel-heading'))
let IconPostion = getOffset(document.querySelector(".IconSet"))
$('.IconSet').css({
"top": 10
,"left": '95%'
})
}
function DownloadFile(url, target) {
target.querySelector('i.fa').classList.remove('fa-download')
target.querySelector('i.fa').classList.add('fa-spinner')
target.querySelector('i.fa').style.setProperty('color', 'White', 'important');
fetch(url,{
credentials: 'include',
})
.then(async res => {
var disposition = await res.headers.get('Content-Disposition')
console.log(disposition)
target.querySelector('i.fa').style.setProperty('color', 'Orange', 'important');
if(typeof disposition !== 'undefined' && disposition !== null){
filename = disposition.split(/;(.+)/)[1].split(/=(.+)/)[1].replace("utf-8''", '').replace(/['"]/g, '').replace(/\+/g, '%20')
filename = decodeURIComponent(filename)
//console.log(filename)
return res.blob()
}
})
.then(async blob => {
await saveAs(blob, filename)
target.querySelector('i.fa').classList.remove('fa-spinner')
target.querySelector('i.fa').classList.add('fa-check-square')
await sleep(10000)
window.close()
})
.catch((error) => {
console.error('Downloading Error', error);
});
}
function inViewport (element) {
if (!element) return false;
if (1 !== element.nodeType) return false;
var html = document.documentElement;
var rect = element.getBoundingClientRect();
return !!rect &&
rect.bottom >= 0 &&
rect.right >= 0 &&
rect.left <= html.clientWidth &&
rect.top <= html.clientHeight;
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
function getOffset(el) {
const rect = el.getBoundingClientRect();
return {
left: rect.left + window.scrollX,
top: rect.top + window.scrollY,
right: rect.right + window.scrollX,
width: rect.width,
height: rect.height
};
}
async function OpenLinks(LinkDB){
document.querySelector('.OpenIcon').style.setProperty("color", "Orange", "important")
for (var i = 0; i < LinkDB.length; i++) {
LinkUrl = LinkDB[i].href
console.log(LinkUrl)
await GM_openInTab( LinkUrl , { active: false, insert: true } )
await sleep(100)
}
}
addJS_Node (null, null, overrideSelectNativeJS_Functions)
function overrideSelectNativeJS_Functions () {
window.confirm = function alert (message) { return true; }
}
function addJS_Node (text, s_URL, funcToRun) {
var D = document;
var scriptNode = D.createElement ('script');
scriptNode.type = "text/javascript";
if (text) scriptNode.textContent = text;
if (s_URL) scriptNode.src = s_URL;
if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
targ.appendChild (scriptNode);
}