- // ==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);
- }