您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
링크 복사
// ==UserScript== // @name Link Copy for Jdownloader // @version 1.01 // @description 링크 복사 // @author DandyClubs // @include /naughtyblog\.org/ // @include /maxjav\.com/ // @include /(8kcosplay\.com|blogjav\.net|thotsgirls\.com)/ // @include /top-modelz\.org/ // @include /wetholefans\.com/ // @include /pornchil\.com\/.*/ // @include /pornrips\.cc/ // @include /javpink\.com/ // @include /siteripbb\.org/ // @include /javfree\.me/ // @include /pornobunny\.org/ // @include /adult-porno\.org/ // @include /pornrip\.cc/ // @include /fhdporn\.video/ // @include /asianscan\.biz/ // @include /sharepornlink\.com\/.*/ // @include /javarchive\.com/ // @include /0xxx\.ws/ // @include /hpjav\.tv/ // @include /kbjme\.com\/\d+/ // @include /av18plus\.com/ // @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js // @require https://greasyfork.org/scripts/451572-rootdomain/code/RootDomain.js?version=1095109 // @require https://greasyfork.org/scripts/451573-copy-link-common-library/code/Copy%20Link%20Common%20Library.js?version=1095463 // @require https://greasyfork.org/scripts/451574-key-press/code/Key%20Press.js?version=1095111 // @grant GM_addStyle // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_listValues // @grant GM_setClipboard // @grant window.close // @grant GM_xmlhttpRequest // @run-at document-body // @noframes // @license MIT // @namespace https://greasyfork.org/users/15621 // ==/UserScript== (function() { var css = document.createElement('link'); css.href = 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css'; css.rel = 'stylesheet'; css.type = 'text/css'; document.getElementsByTagName('head')[0].appendChild(css); })(); GM_addStyle (` @import url('https://fonts.googleapis.com/css2?family=M+PLUS+Rounded+1c:wght@600&family=Noto+Sans+KR:wght@600&family=Noto+Sans:wght@600&display=swap'); .CloseIcon, .CopyIcon, .Minus, .GetTitle { text-align: center; cursor: pointer; color: dodgerblue !important; background-color:transparent !important; font-style: initial !important; } .IconSet { word-spacing: .5rem; white-space : nowrap; background-color:transparent !important; } .CopyNotice { font-family: 'Nanum Gothic', 'M PLUS Rounded 1c', 'Noto Sans', sans-serif !important; margin-left: auto; margin-right: auto; border-radius: 4px; color: white !important; background: rgba(255, 110, 0, 0.75) !important; padding: .25em 1em; white-space: pre; text-shadow: initial !important; text-align: left; line-height: 1.25em; font-weight: initial !important; font-style: initial !important; display: -webkit-box; -webkit-line-clamp: 15; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; -webkit-transition: height 0.3s ease-in-out; -o-transition: height 0.3s ease-in-out; transition: height 0.3s ease-in-out; } .CopyNotice:not(.active) { display: none; } .CenterBox { right: 50%; left: auto; top: 1px; margin: 0 auto; max-width: max-content; position: fixed !important; word-spacing: .5rem; padding: .25em; font-style: initial !important; text-align: center; color: dodgerblue !important; background-color:transparent !important; } .ToTop { font-style: initial !important; text-align: center; cursor: pointer; padding: .25em !important; border-radius: .25em !important; -webkit-box-sizing: border-box !important; box-sizing: border-box !important; background-color: rgba(255,255,255,0.5) !important; } .State { display: inline-block; font-weight: bold; text-align: right; vertical-align: middle; font-family: 'Noto Sans', sans-serif !important; background-color:transparent !important; font-style: italic !important; width: 5ch; } .CopyButton, .ClearButton { font-style: initial !important; background-color:transparent !important; word-spacing: .5rem; cursor: pointer; } `); var CopyLinks = [] var AllCopyLinks = [] var TmpLinksDB = [] var CopyLinksBackup, MakeIconTimer const PageURL = window.location !== window.parent.location ? document.referrer : document.location.href; const RootDomain = extractRootDomain(PageURL) //console.log('RootDomain: ', RootDomain) var RootDomainDB = JSON.parse(GM_getValue(RootDomain, "[]")) //console.log(RootDomainDB) var GetState, searchDB GetState = RootDomainDB //console.log(GetState) var MakerCfg = false var CfgReleaseDate = false var Maker = '', ReleaseDate = '' var GetDPI, DefaultFontSize var Target, DownloadArea, CopyTitle, CopyOffSetArea, InfoArea, Resolution = '', TitleLast = '', Series ='', Title, ID = '', TitleID, CopyTitleTmp, InfoTitleTmp, CoverImage, MatchWebRegExp, Gallery var UrlTitle = '' const SkipFilter = new RegExp('keep2share\.cc\/pr\/|demosaic|upgrade|javascript|SKIP|pixhost\.to\/gallery\/|imgchili\.net\/show|#$|^\/|^(?=.*' + window.location.origin + ')(?!.*\\?site).*$', 'i') //console.log(SkipFilter) const SkipClassNames = ['adead_link', 'autohyperlink', 'social-icon'] const JapaneseChar = /[\u3000-\u303f\u3040-\u309f\u30a0-\u30ff\uff00-\uff9f\u4e00-\u9faf\u3400-\u4dbf]/g const SearchID = /([a-zA-Z]{2,11}-?\d{2,6}[a-zA-Z]?|\d{2,4}[a-zA-Z]{2,7}-?\d{3,6}[a-zA-Z]?|[a-zA-Z]{1,2}-?\d{2}-?\d{2}|[a-zA-Z]{2,7}-?[a-zA-Z]{1,2}\d{2})(.*)/ const SearchFC2ID = /(^FC2.+\d{6})(.*)/ const SearchIDRegExp = /^(\[\s?)?(?=([a-zA-Z]{2,11}-?\d{2,6}[a-zA-Z]?|\d{2,4}[a-zA-Z]{2,7}-?\d{3,6}[a-zA-Z]?|[a-zA-Z]{1,2}-?\d{2}-?\d{2}|[a-zA-Z]{2,7}-?[a-zA-Z]{1,2}\d{2}))(?!(C_\d+|file\d+))(.*)$/ const K2SRegExp = /(.*k2s\.cc\/file\/)(.*\/?)/ async function Start() { GetDPI = window.devicePixelRatio DefaultFontSize = getDefaultFontSize() //console.log('GetDPI: ', GetDPI, 'DefaultFontSize: ', DefaultFontSize) document.querySelector("body").insertAdjacentHTML('afterbegin', '<div class="CenterBox" style="display: none"></>') document.querySelector("div.CenterBox").insertAdjacentHTML('beforeend', '<i class="ToTop fa-solid fa-circle-chevron-up"></>') document.querySelector("div.CenterBox").insertAdjacentHTML('beforeend', ' <i class="ClearButton far fa-minus-square"></>') document.querySelector("div.CenterBox").insertAdjacentHTML('beforeend', ' <i class="CopyButton fas fa-paste"></>') document.querySelector("div.CenterBox").insertAdjacentHTML('beforeend', '<i class="State"></>') document.querySelector(".ToTop").onclick = () => window.scrollTo({ top: 0, behavior: 'smooth' }) console.log('Link Copy Start!') let CneterBoxFontSize = Number(((1/(GetDPI/1.5))*(16/DefaultFontSize)).toFixed(2)) + 'rem' let CenterBoxZIndex = getMaxZIndex() + 1 let StateFontSize = Number(((1/(GetDPI/1.5))*0.65*(16/DefaultFontSize)).toFixed(2)) + 'rem' let StateLineHeight = Number(((1/(GetDPI/1.5))*(16/DefaultFontSize)).toFixed(2)) + 'rem' document.querySelector('.CenterBox').style.cssText = `font-size: ${CneterBoxFontSize}; z-index: ${CenterBoxZIndex}; display: block;` document.querySelector('.State').style.cssText = `font-size: ${StateFontSize}; line-height: ${StateLineHeight}` document.querySelector('.State').textContent = ' ' + GetState.length if(/naughtyblog\.org\/.+/.test(PageURL)){ CopyOffSetArea = document.querySelector('.post-title.entry-title') CopyTitle = CopyOffSetArea.innerText DownloadArea = document.querySelectorAll('div#download, div#downloadhidden') CoverImage = document.querySelector('div.post-content-single p a') ? document.querySelector('div.post-content-single p a').href : '' let MatchCast, InfoAreaCast, Title, Cast, SearchCast, SearchTitle, SearchWeb, FirstMatchCast, FirstMatchWeb, InfoCast, SearchWebPoint, SearchCastPoint, Released, ReleasedEn, Episode //CopyTitle에서 MatchWeb 찾기 let MatchWebPoint = CopyTitle.search(/\s-\s/) console.log('MatchWebPoint: ' + MatchWebPoint) let MatchWeb = MatchWebPoint !== -1 ? CopyTitle.substr(0, MatchWebPoint).replace(/\s/g, '') : CopyTitle MatchWebRegExp = new RegExp(MatchWeb.replaceAll("'", ""), 'i') console.log('MatchWeb: ' + MatchWeb) InfoArea = document.querySelector('div.post-content-single').innerText.replace(/(?:(?:\r\n|\r|\n)\s*){2}/gm, '\n').replace(/^(\s?(UPDATED|EARLY LEAK)\s?)/gim,'').split(/\n/) InfoArea = InfoArea.filter(function(e){return e}) InfoArea = InfoArea.filter((element) => !/^(http|Size|Download|Watch online|Spare links)/i.test(element)); console.log('InfoArea: ', InfoArea) InfoAreaCast = document.querySelector('div.post-content-single p strong').innerText.replace(/(?:(?:\r\n|\r|\n)\s*){2}/gm, '\n').replace(/^(\s?(UPDATED|EARLY LEAK)\s?)/gim,'').split(/\n/) InfoAreaCast = InfoAreaCast.filter(function(e){return e}) console.log(InfoAreaCast) if(CopyTitle.match(/Updates/i)){ CoverImage = '' MutilSubTitle(MatchWeb, MatchWebPoint, InfoAreaCast, DownloadArea) } else if(!CopyTitle.match(/Updates/i) && InfoAreaCast.length > 1 ){ console.log('Mutil SubTitle....') MutilSubTitle(MatchWeb, MatchWebPoint, InfoAreaCast, DownloadArea) } else if(!CopyTitle.match(/SITERIP|OnlyFans|Collection/i)){ //CopyTitle에서 배우명 찾기 MatchCast = MatchWebPoint !== -1 ? CopyTitle.substr(MatchWebPoint + 3).split(/&|\s|,|:/) : CopyTitle.match(/.+/) MatchCast = MatchCast ? MatchCast.filter(function(e){return e}) : [] MatchCast = MatchCast ? MatchCast.filter((entry) => isNaN(entry)) : []//숫자 및 단일글자 제거 MatchCast = MatchCast ? MatchCast.filter((entry) => entry.length > 1) : []//숫자 및 단일글자 제거 console.log('MatchCast: ' + MatchCast) let MatchTitle = MatchWebPoint !== -1 ? CopyTitle.substr(MatchWebPoint+3) : CopyTitle console.log('MatchTitle: ' + MatchTitle) for (let i = 0; i < InfoArea.length; i++) { if(!Cast){ Cast = InfoArea[i].match(/Cast\s?:/) ? InfoArea[i].match(/Cast\s?:(.+)/).pop() : '' console.log('Cast: ', Cast) } //배우명 작품타이틀 찾기 if(!FirstMatchCast && InfoArea[i].match(/-/g) && !Cast){ //배우명 찾기 SearchCastPoint = InfoArea[i].search(/\s-\s/) console.log('SearchCastPoint: ' + SearchCastPoint) SearchCast = SearchCastPoint !== -1 ? InfoArea[i].substr(0, SearchCastPoint).split(/\&|\s|,/) : new Array(InfoArea[i]) SearchCast = SearchCast ? SearchCast.filter(function(e){return e}) : ''//빈 배열값 제거 SearchCast = SearchCast ? SearchCast.filter((entry) => isNaN(entry)) : ''//숫자 제거 SearchCast = SearchCast ? SearchCast.filter((entry) => entry.length > 1) : ''//단일글자 제거 console.log('SearchCast: ' + SearchCast) MatchCast = MatchCast ? MatchCast.find((val) => { console.log('SearchingCast: ' + val) return SearchCast.includes(val) }) :'' console.log('MatchCast: ' + MatchCast) //배우명 없는 경우 작품 타이틀로 찾기 if(!MatchCast && !SearchTitle){ SearchTitle = SearchCastPoint !== -1 ? InfoArea[i].substr(SearchCastPoint + 3) : InfoArea[i] SearchTitle = InfoArea[i].toLowerCase().includes(SearchTitle.toLowerCase()) ? InfoArea[i] : '' console.log('SearchTitle: ' + SearchTitle) } FirstMatchCast = MatchCast ? MatchCast : '' SearchTitle = SearchTitle ? SearchTitle : '' InfoCast = MatchCast && !InfoCast ? InfoArea[i] : '' console.log('FirstMatchCast: ' + FirstMatchCast) console.log('InfoCast: ' + InfoCast) } //MatchWeb 찾기 if(!InfoArea[i].match(/^http/) && !FirstMatchWeb){ SearchWebPoint = InfoArea[i].match(/(.+)(\.\d+\.\d+.\d+\.)(.+)/) ? InfoArea[i].match(/(.+)(\.\d+\.\d+.\d+\.)(.+)/) : InfoArea[i].match(/(.+)(\.\d{4}\.)(.+)/) ? InfoArea[i].match(/(.+)(\.\d{4}\.)(.+)/) : '' console.log('SearchWebPoint:', InfoArea[i], InfoArea[i].match(/(.+)(\.\d+\.\d+.\d+\.)(.+)/), InfoArea[i].match(/(.+)(\.\d{4}\.)(.+)/)) if(SearchWebPoint){ SearchWeb = SearchWebPoint[1] && MatchWeb.toLowerCase().match(SearchWebPoint[1].toLowerCase()) ? MatchWeb : (MatchWeb.replace(/\!|'/g, '').toLowerCase()).match(SearchWebPoint[1].toLowerCase()) ? MatchWeb : (MatchWeb.replace(/-|\s|\./g, '').toLowerCase()).match(SearchWebPoint[1].toLowerCase()) ? SearchWebPoint[1] : (MatchWeb.toLowerCase()).match(SearchWebPoint[1].replace(/-|\s/g, '').toLowerCase()) ? SearchWebPoint[1] : MatchWeb + '(' + SearchWebPoint[1] + ')' console.log('SearchWeb: ' + SearchWeb) FirstMatchWeb = SearchWeb ? SearchWeb : '' console.log('FirstMatchWeb 1st: ' + FirstMatchWeb) } else{ FirstMatchWeb = CopyTitle === InfoArea[i] ? MatchWeb : InfoArea[i].match(MatchWeb) ? InfoArea[i].match(MatchWeb) : '' var EpisodeTmp = InfoArea[i].match(/^(?!.*S\d+)(?=.*E\d{2,5}).*$/) ? '.' + InfoArea[i].match(/E\d{2,5}/) : '' InfoCast = InfoCast && EpisodeTmp && InfoCast.match(/^(?!.*S\d+)(?=.*E\d{2,5}).*$/) ? InfoCast.replace(/-?\s?E\d{2,5}$/, '').trim() : InfoCast console.log('FirstMatchWeb 2nd: ', FirstMatchWeb, '\nEpisode: ', Episode) } } if(!Released){ Released = InfoArea[i].match(/(.+)(\.\d+\.\d+.\d+\.)(.+)/) ? InfoArea[i].match(/(\.\d+\.\d+.\d+\.)/).pop() : '' console.log('Released: ', Released) } if(!Episode){ Episode = InfoArea[i].match(/^(?!.*S\d+)(?=.*E\d{2,5}).*$/) ? '.' + InfoArea[i].match(/E\d{2,5}/) : EpisodeTmp ? EpisodeTmp : '' } if(!ReleasedEn){ ReleasedEn = InfoArea[i].match(/Released:(.+)/i) ? InfoArea[i].match(/Released:(.+)/i).pop() : '' console.log('ReleasedEn: ', ReleasedEn) ReleasedEn = ReleasedEn ? '.' + ReleasedEn.trim().replace(/,/g, '').replace(/\s/g, '.') + '.' : '' ReleasedEn = ReleasedEn && ReleasedEn.split('.')[1].match(/^[a-zA-Z]/) ? ReleasedEn.replace(ReleasedEn.split('.')[1], getNumericMonth(ReleasedEn.split('.')[1])) : '' } if(FirstMatchCast && FirstMatchWeb && Released){ CopyTitle = Released && InfoCast ? FirstMatchWeb + Episode + Released + InfoCast : Released && !InfoCast && MatchTitle ? FirstMatchWeb + Episode + Released + MatchTitle : FirstMatchWeb + Episode + Released + InfoCast console.log('All Match: ' + CopyTitle) break } else if(FirstMatchCast && FirstMatchWeb && ReleasedEn){ CopyTitle = InfoCast ? FirstMatchWeb + Episode + ReleasedEn + InfoCast : !InfoCast && FirstMatchCast ? FirstMatchWeb + Episode + ReleasedEn + FirstMatchCast : FirstMatchWeb + Episode + ReleasedEn + (InfoCast ? InfoCast : FirstMatchCast) console.log('Some Match: ' + CopyTitle) } else if(!FirstMatchCast && !FirstMatchWeb && Released){ if(CopyTitle === InfoArea[i]){ console.log('Same Title: ' + CopyTitle, InfoArea[i]) } } else if(MatchCast == MatchTitle && FirstMatchWeb && Released){ InfoCast = InfoCast ? InfoCast : Cast ? '(' + Cast.trim() + ')' : '' CopyTitle = FirstMatchWeb + Episode + Released + InfoCast console.log('MatchCast == MatchTitle: ' + CopyTitle) } else if(!FirstMatchCast && MatchWeb && FirstMatchWeb && Released && MatchCast){ CopyTitle = MatchWeb + "(" + FirstMatchWeb + ")" + Episode + Released + MatchCast.join(' ') console.log('MatchWeb VS FirstMatchWeb: ' + CopyTitle, InfoArea[i]) } else if(i == InfoArea.length -1){ console.log( MatchWeb, SearchWeb, Released, ReleasedEn, FirstMatchCast, Episode, InfoCast ) InfoCast = InfoCast ? InfoCast : Cast ? '(' + Cast.trim() + ')' : '' console.log('InfoCast: ', InfoCast) Released = Released ? Released : ReleasedEn ? ReleasedEn : '' CopyTitle = MatchWeb && Released && SearchWebPoint && InfoCast ? MatchWeb + '(' + SearchWebPoint[1] + ')' + Episode + Released + InfoCast : MatchWeb && Released && InfoCast ? MatchWeb + Episode + Released + InfoCast : MatchWeb && Released && FirstMatchCast ? MatchWeb + Episode + Released + FirstMatchCast : SearchWeb && !Released && SearchWebPoint && SearchWeb&& InfoCast ? SearchWeb + SearchWebPoint[2] + Episode + InfoCast : MatchWeb && Episode && MatchTitle && InfoCast ? MatchWeb + Episode + MatchTitle + InfoCast : MatchWeb && SearchTitle && !InfoCast && Released ? MatchWeb + Episode + Released + SearchTitle : MatchWeb && MatchTitle && !InfoCast && Released ? MatchWeb + Episode + Released + MatchTitle : MatchWeb && Released && InfoCast ? MatchWeb + Episode + Released + InfoCast : SearchWeb && InfoCast ? SearchWeb + Episode + InfoCast : CopyTitle + InfoCast console.log('End : ', CopyTitle) } } CopyTitle = CopyTitle.replace(/(S\d+):(E\d+)/i, '$1$2') CopyTitle = byteLengthOf(CopyTitle, 250) CopyTitle = FilenameConvert(CopyTitle) + Resolution console.log('CopyTitle: ' + CopyTitle) let LinkDB = [] for (let i = 0; i < DownloadArea.length; i++) { let Links = MatchRegex(DownloadArea[i], new RegExp('1080p', 'i'), 'href') console.log('1080p: ', Links) if(Links?.length > 0){ LinkDB.push(...Links) } else if(!Links?.length){ Links = MatchRegex(DownloadArea[i], new RegExp('2160p', 'i'), 'href') console.log('2160p: ', Links) if(Links?.length > 0){ LinkDB.push(...Links) } else if(!Links?.length){ Links = MatchRegex(DownloadArea[i], new RegExp('720p', 'i'), 'href') console.log('720p: ', Links) if(Links?.length > 0){ LinkDB.push(...Links) } else if(!Links?.length){ Links = MatchRegex(DownloadArea[i], new RegExp(MatchWeb + '|' + MatchCast, 'i'), 'href') console.log('Links: ', Links) LinkDB.push(...Links) } } } } LinkDB = LinkDB?.length > 0 ? LinkDB.map((entry) => entry.outerHTML) : '' console.log('LinkDB: ', LinkDB) let container = document.createElement("div") LinkDB.forEach((el, i) => { const fragment = document.createRange().createContextualFragment(el); console.log(fragment.children[0]); container.appendChild(fragment.children[0]); }) container.classList.add("DownloadArea") document.body.appendChild(container); DownloadArea = document.querySelectorAll('div.DownloadArea') console.log('DownloadArea: ', DownloadArea) } if(!document.querySelector('.GetTitle')){ document.querySelector("div#main-content.main-content-single div div.post-content-single p strong").insertAdjacentHTML('afterend', ' <i class="GetTitle fas fa-paste"></>') } document.querySelector('.GetTitle').addEventListener("click", async function(event){ event.preventDefault() event.target.style.setProperty('color', 'Orange', 'important') updateClipboard(CopyTitle) }) } else if(/maxjav.com\/\d+/.test(PageURL) && window.top === window.self){ CopyOffSetArea = document.querySelector('div#content > div > .title') CopyTitle = CopyOffSetArea.innerText CopyTitle = CopyTitle.match(/\[?.*Subtitle\]?(.+)/) ? CopyTitle.match(/\[.+Subtitle\](.+)/).pop() : CopyTitle CopyTitle = CopyTitle.replace(/amp;/g, '').replace(/(\s)?\/(\s)?/g, '/').replace(/(-|–)\sHD/, '').replace(/amp;|\(\s?ブルーレイ版\s?\)|\(ブルーレイディスク版\)|:/g, '').trim() console.log(CopyTitle) if(!CopyTitle.match(/^Collection/)){ InfoArea = document.querySelector('div#content > div > .entry > p').innerText.replace(/(?:(?:\r\n|\r|\n)\s*){2}/gm, '\n').split(/\n\n|\n/) InfoArea = InfoArea.filter(function(e){return e})//빈 배열값 제거 console.log(InfoArea) //Series = InfoArea.find(InfoSearch => InfoSearch.match(/シリーズ:?.*/)) ? InfoArea.find(InfoSearch => InfoSearch.match(/シリーズ:?.*/)).replace(/シリーズ:?/, '').trim() : '' for (let i = 0; i < InfoArea.length; i++) { if(!Title){ console.log(CopyTitle.match(SearchID)) CopyTitleTmp = CopyTitle.match(SearchIDRegExp) ? CopyTitle.match(SearchID).pop().trim() : '' InfoTitleTmp = InfoArea[i].match(SearchIDRegExp) ? InfoArea[i].match(SearchID).pop().trim() : '' console.log('CopyTitleTmp: ', CopyTitleTmp, '\nInfoTitleTmp: ', InfoTitleTmp) //CopyTitleTmp.match(/[\u3040-\u309f\u30a0-\u30ff]/g) 일본어 히라가나 카타가나 찾기 if(CopyTitleTmp && InfoTitleTmp){ Title = CopyTitleTmp.toLowerCase() === InfoTitleTmp.toLowerCase() ? CopyTitleTmp : (CopyTitleTmp.match(JapaneseChar) || []).length >= (InfoArea[i].match(JapaneseChar) || []).length ? CopyTitleTmp : (CopyTitleTmp.match(JapaneseChar) || []).length < (InfoArea[i].match(JapaneseChar) || []).length ? InfoTitleTmp : CopyTitleTmp Title = Title.trim() + ' ' console.log('Title 1st: ' + Title) } else{ Title = CopyTitleTmp && (CopyTitle.match(JapaneseChar) || []).length >= (InfoArea[i].match(JapaneseChar) || []).length ? CopyTitleTmp : InfoTitleTmp && InfoTitleTmp.match(JapaneseChar) && (CopyTitle.match(JapaneseChar) || []).length <= (InfoArea[i].match(JapaneseChar) || []).length ? InfoTitleTmp : (CopyTitle.match(JapaneseChar) || []).length < (InfoArea[i].match(JapaneseChar) || []).length ? InfoArea[i] : CopyTitle.match(JapaneseChar) ? CopyTitle : InfoArea[i].match(JapaneseChar) ? InfoArea[i] : CopyTitle Title = Title.trim() + ' ' Title = mbConvertKana(Title, 'rans') console.log('Title 2nd: ' + Title) } } if(!ID){ console.log(CopyTitle.match(SearchID), InfoArea[i].match(SearchID)) let TitleID = CopyTitle.match(SearchIDRegExp) ? CopyTitle.match(SearchID)[1] : CopyTitle.match(SearchFC2ID) ? CopyTitle.match(SearchFC2ID)[1] : '' let InfoID = InfoArea[i].match(SearchIDRegExp) ? InfoArea[i].match(SearchID)[1] : InfoArea[i].match(SearchFC2ID) ? InfoArea[i].match(SearchFC2ID)[1] : '' if(TitleID && InfoID && TitleID.replace(/-/g, '').trim().toLowerCase() === InfoID.replace(/-/g, '').trim().toLowerCase()){ ID = TitleID.match(/-/g) && InfoID.match(/-/g) ? TitleID : TitleID.match(/-/g) ? TitleID : InfoID.match(/-/g) ? InfoID.match(/-/g) : TitleID } else{ ID = TitleID ? TitleID : InfoID } console.log('ID: ' + ID) if(ID){ ID = ID.trim() + ' ' } } if(CfgReleaseDate && !ReleaseDate && InfoArea[i].match(/Release Date:/)){ ReleaseDate = InfoArea[i].match(/Release Date:(.+)/)[1].replace(/\//g, '-').trim() } if(MakerCfg && !Maker && InfoArea[i].match(/(Maker|Studio)\s?:(.+)/)){ Maker = InfoArea[i].match(/(Maker|Studio)\s?:(.+)/)[2].replace(/(\s)?\/(\s)?/g, '/').trim() } if(Title && ID && ReleaseDate){ break } } Maker = Maker ? '[' + Maker + '] ' : '' ReleaseDate = ReleaseDate ? '(' + ReleaseDate + ') ' : '' Title = Maker + ID + ReleaseDate + Title if(byteLengthOfCheck(Title) > 250){ let TitleLast = getLastText(Title) if(typeof TitleLast == 'undefined' || !TitleLast || TitleLast.length === 0 || TitleLast === "" || !/[^\s]/.test(TitleLast) || /^\s*$/.test(TitleLast) || TitleLast.replace(/\s/g,"") === ""){ CopyTitle = byteLengthOf(Title, 250).trim() } else{ Title = Title.split(TitleLast)[0].trim() Title = byteLengthOf(Title, 250 - byteLengthOfCheck(TitleLast)) console.log('Title: ', Title, TitleLast) CopyTitle = (Title + TitleLast).trim() } } else CopyTitle = Title.trim() console.log('Last Title: ' + CopyTitle) } //CopyTitle = CopyOffSetArea.textContent.replace(/\s–\s(UltraHD|Full|HD|SD)/, '').trim() DownloadArea = document.querySelectorAll('div#content > div > div.entry p') CoverImage = DownloadArea[0].querySelector('p img') ? DownloadArea[0].querySelector('p img').src : '' } else if(/javpink\.com\/\?p/.test(PageURL)){ CopyOffSetArea = document.querySelector('.item > .title') Title = CopyOffSetArea.textContent.trim() DownloadArea = document.querySelectorAll('.item > .content') CoverImage = DownloadArea[0].querySelector('p img') ? DownloadArea[0].querySelector('p img').src : '' for (let i = 0; i < DownloadArea.length; i++) { InfoArea = DownloadArea[i].innerText.replace(/(?:(?:\r\n|\r|\n)\s*){2}/gm, '\n').split(/\n\n|\n/) } InfoArea = InfoArea.filter(function(e){return e})//빈 배열값 제거 console.log(InfoArea) Series = InfoArea.find(InfoSearch => InfoSearch.match(/シリーズ:?.*/)) ? InfoArea.find(InfoSearch => InfoSearch.match(/シリーズ:?.*/)).replace(/シリーズ:?/, '').trim() : '' Title = mbConvertKana(Title, 'rans') if(byteLengthOfCheck(Title) > 250){ let TitleLast = getLastText(Title) if(typeof TitleLast == 'undefined' || !TitleLast || TitleLast.length === 0 || TitleLast === "" || !/[^\s]/.test(TitleLast) || /^\s*$/.test(TitleLast) || TitleLast.replace(/\s/g,"") === ""){ CopyTitle = byteLengthOf(Title, 250).trim() } else{ Title = Title.split(TitleLast)[0].trim() Title = byteLengthOf(Title, 250 - (byteLengthOfCheck(TitleLast))) console.log('Title: ', Title, TitleLast) CopyTitle = (Title + TitleLast).trim() } } else CopyTitle = Title.trim() } else if(/top-modelz.org\/.+html/.test(PageURL)){ CopyOffSetArea = document.querySelector('.news-detalis h2') Title = CopyOffSetArea.textContent.trim() DownloadArea = document.querySelectorAll('div#content div#l-content div#dle-content div.news-block div.newspad') CoverImage = DownloadArea[0].querySelector('p img') ? DownloadArea[0].querySelector('p img').src : '' for (let i = 0; i < DownloadArea.length; i++) { InfoArea = DownloadArea[i].innerText.replace(/(?:(?:\r\n|\r|\n)\s*){2}/gm, '\n').split(/\n\n|\n/) } InfoArea = InfoArea.filter(function(e){return e})//빈 배열값 제거 console.log(InfoArea) let Released for (let i = 0; i < InfoArea.length; i++) { if(!Released){ Released = InfoArea[i].match(/\d+-\d+-\d+/) ? InfoArea[i].match(/\d+-\d+-\d+/) + ' ' : '' } if(Released){ break } } CopyTitle = Released ? Released + Title : Title CopyTitle = CopyTitle CopyTitle = byteLengthOf(CopyTitle, 250) } else if(/(8kcosplay\.com|blogjav\.net|javfree\.me)\/\d+/.test(PageURL)){ CopyOffSetArea = document.querySelector('.entry-title') if(/javfree\.me/.test(PageURL)){ DownloadArea = document.querySelectorAll('.entry-content') //CoverImage = DownloadArea[0].querySelector('p img') ? DownloadArea[0].querySelector('p img').src : '' } else{ DownloadArea = document.querySelectorAll('.entry-content > p') CoverImage = DownloadArea[0].querySelector('p img') ? DownloadArea[0].querySelector('p img').src : '' } Title = CopyOffSetArea.textContent.replace(/\[([a-zA-Z]{2,11}-?\d{2,6}[a-zA-Z]?|\d{2,4}[a-zA-Z]{2,7}-?\d{3,6}[a-zA-Z]?|[a-zA-Z]{1,2}-?\d{2}-?\d{2}|[a-zA-Z]{2,7}-?[a-zA-Z]{1,2}\d{2})\]/, '$1') ID = Title.match(SearchFC2ID) ? Title.match(SearchFC2ID)[1] : '' console.log('ID: ', ID) Title = Title.replace(ID, '').trim() Title = Title.split(/\s/).filter(function(e){return e}) console.log('Title: ', Title) if(Title[0].match(/UNCENSORED/)){ Title.shift() Title = Title.join(' ') } else{ Title = Title.join(' ') } for (let i = 0; i < DownloadArea.length; i++) { InfoArea = DownloadArea[i].innerText.replace(/(?:(?:\r\n|\r|\n)\s*){2}/gm, '\n').split(/\n\n|\n/) } InfoArea = InfoArea.filter(function(e){return e})//빈 배열값 제거 console.log('InfoArea: ', InfoArea) Series = InfoArea.find(InfoSearch => InfoSearch.match(/シリーズ:?.*/)) ? InfoArea.find(InfoSearch => InfoSearch.match(/シリーズ:?.*/)).replace(/シリーズ:?/, '').trim() : '' console.log('Series: ', Series) Title = mbConvertKana(Title, 'rans') console.log(Title, ID) if(byteLengthOfCheck(Title) > 250 - byteLengthOfCheck(ID)){ let TitleLast = getLastText(Title) if(typeof TitleLast == 'undefined' || !TitleLast || TitleLast.length === 0 || TitleLast === "" || !/[^\s]/.test(TitleLast) || /^\s*$/.test(TitleLast) || TitleLast.replace(/\s/g,"") === ""){ CopyTitle = ID + byteLengthOf(Title, 250 - byteLengthOfCheck(ID)).trim() } else{ Title = Title.split(TitleLast)[0].trim() Title = byteLengthOf(Title, 250 - (byteLengthOfCheck(ID) + byteLengthOfCheck(TitleLast))) CopyTitle = (ID + Title + TitleLast).trim() if(byteLengthOfCheck(CopyTitle) > 250){ console.log('CopyTitle length: ', byteLengthOfCheck(CopyTitle)) } } } else CopyTitle = ID + Title.trim() console.log('CopyTitle: ', CopyTitle) } else if(/wetholefans.com\/.+/.test(PageURL)){ CopyOffSetArea = document.querySelector('.post-title #news-title h1') console.log(parseFloat(window.getComputedStyle(CopyOffSetArea).fontSize)) //console.log('CopyOffSetArea: ' + CopyOffSetArea) Resolution = !Resolution && CopyOffSetArea && CopyOffSetArea.innerText.match(/[0-9]{3,4}p/) ? ' ' + CopyOffSetArea.innerText.match(/[0-9]{3,4}p/)[0] : '' console.log(Resolution) CopyTitle = CopyOffSetArea.innerText.replace(/\((UltraHD|Full|HD|SD).+/, '').replace(/\s+/g, ' ').trim() CopyTitle = capitalize(CopyTitle) DownloadArea = CopyOffSetArea.closest('.story').querySelectorAll('.quote') let SearchLinks DownloadArea.forEach((LinkEntry) => { SearchLinks = LinkEntry.querySelectorAll('a') }) console.log(SearchLinks) for (let i = 0; i < SearchLinks.length; i++) { if(!ReleaseDate){ ReleaseDate = SearchLinks[i].textContent.match(/(.+)(\.\d+\.\d+.\d+\.)(.+)/) ? SearchLinks[i].textContent.match(/(\.\d+\.\d+.\d+\.)/).pop() : '' } else{ break } } let MatchWebPoint = CopyTitle.search(/\s-\s/) let MatchWeb = MatchWebPoint !== -1 ? CopyTitle.substr(0, MatchWebPoint).replace(/\s/g, '') : CopyTitle CopyTitle = ReleaseDate ? MatchWeb + ReleaseDate + CopyTitle.substr(MatchWebPoint+3) : CopyTitle console.log(CopyTitle) CopyTitle = CopyTitle.replace(/\*/g, '*').replace(/\?/g, '?') CopyTitle = byteLengthOf(CopyTitle, 250) } else{ if(/(pornchil\.com\/)(?!$).*$/.test(PageURL)){ CopyOffSetArea = document.querySelector('.inside-article > .entry-content').querySelector('strong > span') DownloadArea = document.querySelectorAll('.inside-article > div.entry-content') console.log(CopyOffSetArea) } else if(/javarchive\.com\/\d{4,6}/.test(PageURL)){ CopyOffSetArea = document.querySelector('div.news > div.first_des') || document.querySelector('.menudd > h1') DownloadArea = document.querySelectorAll('.link_archive_innew') CoverImage = document.querySelector('div.category_news_phai_chinh > div.news > div.fisrst_sc img:not([src^="data"])') ? document.querySelector('div.category_news_phai_chinh > div.news > div.fisrst_sc img').getAttribute('src') : document.querySelector('div.category_news_phai_chinh > div.news > div.fisrst_sc img').getAttribute('data-src') //console.log(CopyOffSetArea, DownloadArea, CoverImage) } else if(/kbjme\.com\/\d+/.test(PageURL)){ CopyOffSetArea = document.querySelector('.article_container h1') DownloadArea = document.querySelectorAll('div.article_container div.context div#post_content') console.log(DownloadArea) document.querySelector('.article_container a').href = '#' document.querySelector('.article_container a').removeAttribute('target') } else if(/hpjav.tv\/(ja\/)?\d+/.test(PageURL)){ CopyOffSetArea = document.querySelector('section div ol li.active') CoverImage = document.querySelector('#JKDiv_0') ? GetBackGroundUrl(document.querySelector('#JKDiv_0')) : '' let AddElementArea = document.querySelector('div#down_server') let observer = new MutationObserver(function(mutations) { if (document.querySelector('ul.pricing-table')) { DownloadArea = document.querySelectorAll('ul.pricing-table') console.log('DownloadArea: ', DownloadArea) if(DownloadArea){ observer.disconnect() window.scrollTo({ top: 0, behavior: 'auto' }) DownloadArea.forEach((LinkEntry) => { LinkEntry.querySelectorAll('a').forEach((aEntry) => { if( RootDomain !== (extractRootDomain(aEntry.href))){ aEntry.classList.remove("dbtn") aEntry.removeAttribute('type') aEntry.textContent = aEntry.href aEntry.insertAdjacentHTML('beforebegin', '<img src=https://www.google.com/s2/favicons?domain=' + extractRootDomain(aEntry.href) +' ></>') } }) }) keyvent.down('ctrl alt a') } } }) observer.observe(AddElementArea, { attributes: true, childList: true, subtree: true }); await sleep(1000) document.querySelector('#download_div.btn.btn-info').click() } else if(/0xxx\.ws\/articles\/\d+/.test(PageURL)){ CopyOffSetArea = document.querySelector('div.container table#detail-table tbody tr td.taj:not(.levo)') DownloadArea = document.querySelectorAll('div.container table#detail-table tbody tr td.dlinks.taj') console.log(DownloadArea) window.addEventListener('scroll', scrollToTop) } else if(/pornrips\.cc\/.+/.test(PageURL)){ CopyOffSetArea = document.querySelector('div#dle-content article div.head h1.title') DownloadArea = document.querySelectorAll('div#dle-content article div.story_cont .screenshots, div#dle-content article div.story_cont div.links') console.log(DownloadArea) } else if(/(thotsgirls\.com)\/.+/.test(PageURL)){ CopyOffSetArea = document.querySelector('.entry-title') DownloadArea = document.querySelectorAll('div.entry-content') console.log(DownloadArea) } else if(/fhdporn\.video\/.+/.test(PageURL)){ CopyOffSetArea = document.querySelector('h1.post-title') DownloadArea = document.querySelectorAll('div.post-content') console.log(DownloadArea) } else if(/av18plus\.com/.test(PageURL)){ CopyOffSetArea = document.querySelector('article.post > h1#post-title') DownloadArea = CopyOffSetArea ? CopyOffSetArea.closest('article').querySelectorAll('p') : '' console.log(DownloadArea) } else if(/siteripbb\.org\/.+/.test(PageURL)){ CopyOffSetArea = document.querySelector('.entry-title') DownloadArea = document.querySelectorAll('div.entry-content') console.log(DownloadArea) } else if(/asianscan\.biz\/.*\.html/.test(PageURL)){ CopyOffSetArea = document.querySelector('div div.content div#dle-content div.mainf3') DownloadArea = document.querySelectorAll('div.content div#dle-content div.sscn div.quote') console.log(DownloadArea) } else if(/adult-porno\.org\/.+/.test(PageURL)){ CopyOffSetArea = document.querySelector('div.full-in h1') DownloadArea = document.querySelectorAll('div.quote') console.log(DownloadArea) Resolution = !Resolution && CopyOffSetArea && CopyOffSetArea.innerText.match(/[0-9]{3,4}p/) ? ' ' + CopyOffSetArea.innerText.match(/[0-9]{3,4}p/)[0] : '' } else if(/(sharepornlink\.com\/)(?!($|page))(.*)$/.test(PageURL)){ CopyOffSetArea = document.querySelector('.main-title.title') DownloadArea = document.querySelectorAll('div.text p') console.log(DownloadArea) Resolution = !Resolution && CopyOffSetArea && CopyOffSetArea.innerText.match(/[0-9]{3,4}p/) ? ' ' + CopyOffSetArea.innerText.match(/[0-9]{3,4}p/)[0] : '' } else if(/pornobunny\.org\/.+/.test(PageURL)){ CopyOffSetArea = document.querySelector('.titlesf') document.querySelector('a.quote-hider-trigger').click() let AddElementArea = document.querySelector('div.sstory') let observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { for (var i = 0; i < mutation.addedNodes.length; i++) { if (mutation.addedNodes[i].nodeType === Node.ELEMENT_NODE) { if (mutation.addedNodes[i].classList.contains('quote')) { DownloadArea = document.querySelectorAll('div.quote') console.log('DownloadArea: ', DownloadArea) if(DownloadArea){ observer.disconnect() window.scrollTo({ top: 0, behavior: 'auto' }) } } } } }) }); observer.observe(AddElementArea, { childList: true, subtree: true }); Resolution = !Resolution && CopyOffSetArea && CopyOffSetArea.innerText.match(/[0-9]{3,4}p/) ? ' ' + CopyOffSetArea.innerText.match(/[0-9]{3,4}p/)[0] : '' } else if(/pornrip\.cc\/.+\.html/.test(PageURL)){ CopyOffSetArea = document.querySelector('.title.ularge') let AddElementArea = document.querySelector('article.main-article section.post-content') let observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { for (var i = 0; i < mutation.addedNodes.length; i++) { console.log(mutation.addedNodes[i]) if (mutation.addedNodes[i].nodeName === 'A') { DownloadArea = document.querySelectorAll('article.main-article > section.post-content > div > div.su-spoiler > div.su-spoiler-content') console.log('DownloadArea: ', DownloadArea) if(DownloadArea){ observer.disconnect() window.scrollTo({ top: 0, behavior: 'auto' }) document.querySelectorAll('a').forEach((aEntry) => { if(/\?site.+$/.test(aEntry.href)){ aEntry.setAttribute('href', aEntry.href.replace(/\?site.+$/, '')) } }) break } } } }) }); observer.observe(AddElementArea, { childList: true, subtree: true }) Resolution = !Resolution && CopyOffSetArea && CopyOffSetArea.innerText.match(/[0-9]{3,4}p/) ? ' ' + CopyOffSetArea.innerText.match(/[0-9]{3,4}p/)[0] : '' } if(CopyOffSetArea){ //console.log('InnerText: ', getDirectInnerText(CopyOffSetArea)) CopyTitle = getDirectInnerText(CopyOffSetArea).replace('–', '-').replace(/\s+/g, ' ').replace(/\[(UltraHD|FullHD|HD).+\].*/, '').replace(/^Japanese porn -|6000Kbps FHD/, '').trim() CopyTitle = CopyTitle.match(/(–\sSiterip)\s–.+/) ? CopyTitle.match(/(.+Siterip)\s–.+/)[1] : CopyTitle CopyTitle = capitalize(CopyTitle) if(byteLengthOfCheck(CopyTitle) > 250){ let TitleLast = getLastText(CopyTitle) if(typeof TitleLast == 'undefined' || !TitleLast || TitleLast.length === 0 || TitleLast === "" || !/[^\s]/.test(TitleLast) || /^\s*$/.test(TitleLast) || TitleLast.replace(/\s/g,"") === ""){ Title = byteLengthOf(CopyTitle, 250).trim() } else{ Title = CopyTitle.split(TitleLast)[0].trim() Title = byteLengthOf(Title, 250 - (byteLengthOfCheck(TitleLast))) console.log('Title: ', Title, TitleLast) Title = (Title + TitleLast).trim() } CopyTitle = Title.trim() } else CopyTitle = CopyTitle.trim() } } } document.addEventListener("DOMContentLoaded", async function(event) { if(!document.querySelector("div.CenterBox")){ await Start() } document.addEventListener("click", async (event) => { //console.log(event.target) if(event.target.classList.contains('ClearButton')){ event.preventDefault() await ClearUrls() } if(event.target.classList.contains('CopyButton')){ event.preventDefault() await ClipPaste() } if(event.target.classList.contains('CopyIcon')){ event.preventDefault() CopyGo() } if(event.target.classList.contains('CloseIcon')){ window.close() } if(event.target.classList.contains('Minus')){ event.preventDefault() event.target.style = "color: Orange !important;"; RemoveDB(listToDo(DownloadArea)) CheckDB(listToDo(DownloadArea)) } }) if(CopyOffSetArea && !document.querySelector(".IconSet")){ CopyOffSetArea.insertAdjacentHTML('afterend', '<div class="IconSet" style="top: auto; left: auto; max-width: max-content; visibility:hidden; position: absolute;"></>') document.querySelector(".IconSet").insertAdjacentHTML('beforeend', '<i class="CopyIcon far fa-clone" style ="color: dodgerblue !important; visibility:hidden;"></>') document.querySelector(".IconSet").insertAdjacentHTML('beforeend', ' <i class="CloseIcon fa-solid fa-square-xmark" style ="color: dodgerblue !important; visibility:hidden"></>') document.querySelector(".IconSet").insertAdjacentHTML('beforeend', ' <i class="Minus fa-solid fa-magnifying-glass-minus" style ="color: dodgerblue !important; visibility:hidden;"></>') document.body.insertAdjacentHTML('beforeend', '<div class="CopyNotice" style="visibility:hidden;"></>') document.querySelector(".IconSet").style.visibility = "hidden" if(document.hidden){ document.querySelector(".CopyIcon").style.visibility = "hidden" } let IconSetZIndex = MaxZIndexFromPoint('.IconSet') + 1 let IconSetFontSize = Number(((1/(GetDPI/1.5))*(16/DefaultFontSize)).toFixed(2)) + 'rem' //document.querySelector('.IconSet').style.cssText = `font-size: ${CneterBoxFontSize}; z-index: ${CenterBoxZIndex}; display: block;` Object.assign(document.querySelector('.IconSet').style, {fontSize: IconSetFontSize, zIndex: IconSetZIndex}); } if(CopyOffSetArea){ console.log('Make Icon') MakeIconTimer = setTimeout(() => MakeIcon(GetDPI), 2000) /* window.addEventListener("resize", function(e) { console.log(e.type) //GetDPI = window.devicePixelRatio //DefaultFontSize = getDefaultFontSize() //console.log('GetDPI: ', GetDPI, 'DefaultFontSize: ', DefaultFontSize) //document.querySelector('.CenterBox').style.setProperty('font-size', Number(((1/(GetDPI/1.5))*(16/DefaultFontSize)).toFixed(2)) + 'rem', 'important'); //document.querySelector('.State').style.setProperty('font-size', Number(((1/(GetDPI/1.5))*0.65*(16/DefaultFontSize)).toFixed(2)) + 'rem', 'important'); //document.querySelector('.State').style.setProperty('line-height', Number(((1/(GetDPI/1.5))*(16/DefaultFontSize)).toFixed(2)) + 'rem', 'important'); //document.querySelector('.CenterBox').style.setProperty('z-index', getMaxZIndex() + 1) //document.querySelector(".IconSet").style.setProperty('z-index', MaxZIndexFromPoint('.IconSet') + 1) MakeIcon(GetDPI) }) */ } }) document.addEventListener("visibilitychange", async function() { //console.log("window is active!" ) RootDomainDB = JSON.parse(await GM_getValue(RootDomain, '[]')) GetState = RootDomainDB if(document.querySelector('.CenterBox')){ document.querySelector('.State').textContent = ' ' + GetState.length document.querySelector('.ClearButton').style = "color: dodgerblue !important;"; document.querySelector('.CopyButton').style = "color: dodgerblue !important;"; } }) async function CopyGo() { let TitlePostion = getElementOffset(CopyOffSetArea) let TitleHeight = Math.max(TitlePostion.height, parseFloat(window.getComputedStyle(CopyOffSetArea).fontSize)) let FixTop = Number((TitlePostion.top + TitlePostion.height).toFixed(2)) let FixLeft = Number((TitlePostion.left + 2).toFixed(2)) if(/pornchil.com/.test(PageURL)){ FixLeft = getElementOffset(document.querySelector(".entry-content > h6")).left } else if(/pornrips\.cc/.test(PageURL)){ FixLeft = getElementOffset(document.querySelector(".meta_date > .masha_index")).left } else if(/naughtyblog/.test(PageURL)){ FixTop = getElementOffset(document.querySelector(".post-title.entry-title")).top + getElementOffset(document.querySelector(".post-title.entry-title")).height } $('.CopyNotice').css({ "fontSize": Number(((1/(GetDPI/1.5))*0.6*(16/DefaultFontSize)).toFixed(2)) + 'rem', "top": FixTop + window.scrollY ,"left": FixLeft + window.scrollX , "position": "absolute", "z-index": getMaxZIndex() + 1 }) event.target.style = "color: Orange !important;" await CopyLink() let container = document.querySelector('.CopyNotice') container.classList.add('active') container.style.height = 'auto' var height = container.clientHeight + 'px' container.style.height = '0px' setTimeout(function () { container.style.height = height; container.style.visibility = "visible" }, 0) await sleep(3000) container.style.height = '0px' container.addEventListener('transitionend', function () { container.classList.remove('active'); }, { once: true }); } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function getLastText(Text) { let byteCheck = '', SearchCharPoint, TitleLastTmp let ArrayDB = Text.split(/\s/).filter(function(e){return e})//빈 배열값 제거 let SeriesExp = new RegExp(Series + '.*') let ModelNameExp = new RegExp(/\((?!.*\().*\)/) let ModelName //console.log(JapaneseChar.test([ArrayDB.length -1]) , ArrayDB[ArrayDB.length -1], ArrayDB[ArrayDB.length -2] + ' ' + ArrayDB[ArrayDB.length -1]) if(ModelNameExp.test(Text)){ console.log('Model Name: ', Text.match(ModelNameExp)[0]) ModelName = Text.match(ModelNameExp) ? Text.match(ModelNameExp)[0] : '' Text = Text.replace(ModelNameExp, '').trim() console.log(Text) } if(Series && SeriesExp.test(Text)){ console.log(Series, SeriesExp) //console.log(Text.match(SeriesExp)) TitleLastTmp = Text.match(SeriesExp) ? Text.match(SeriesExp).pop() : '' } else if(/朝までハシゴ酒/.test(Text)){ TitleLastTmp = Text.match(/朝までハシゴ酒.*/)[0] } else if(/\d+/.test(ArrayDB[ArrayDB.length -1])){ console.log(ArrayDB[ArrayDB.length -1]) if(/ファイル\d+/.test(ArrayDB[ArrayDB.length -1])){ TitleLastTmp = ArrayDB[ArrayDB.length - 2] + ' ' + ArrayDB[ArrayDB.length - 1] console.log('1st Match:' , TitleLastTmp) } else if(JapaneseChar.test(ArrayDB[ArrayDB.length -1])){ TitleLastTmp = ArrayDB[ArrayDB.length -1] console.log('2nd Match:' , TitleLastTmp) } else if(byteLengthOfCheck(ArrayDB[ArrayDB.length -1]) < 100) { TitleLastTmp = ArrayDB[ArrayDB.length - 2] + ' ' + ArrayDB[ArrayDB.length - 1] console.log('3th Match:' , TitleLastTmp) } } console.log('TitleLastTmp: ', TitleLastTmp, /\d+/.test(ArrayDB[ArrayDB.length -1]), byteLengthOfCheck(TitleLastTmp)) if(typeof TitleLastTmp == 'undefined' || !TitleLastTmp || TitleLastTmp.length === 0 || TitleLastTmp === "" || !/[^\s]/.test(TitleLastTmp) || /^\s*$/.test(TitleLastTmp) || TitleLastTmp.replace(/\s/g,"") === ""){ byteCheck = '' } else if(TitleLastTmp.match(/\d+/)){ if(SearchChar(TitleLastTmp, '】')){ SearchCharPoint = Text.lastIndexOf("【") TitleLastTmp = Text.substring(SearchCharPoint) console.log('TitleLastTmp: ', TitleLastTmp) } else if(SearchChar(TitleLastTmp, '、') && TitleLastTmp.length <= 10 ){ SearchCharPoint = TitleLastTmp.lastIndexOf("、") TitleLastTmp = TitleLastTmp.substring(SearchCharPoint + 1) console.log('TitleLastTmp: ', TitleLastTmp) } byteCheck = TitleLastTmp console.log('byteCheck: ', byteCheck) let FlagPoint = getFlag(byteCheck) if (byteLengthOfCheck(byteCheck) >= 100){ console.log('CheckFlag: ', byteCheck, byteLengthOfCheck(byteCheck)) let byteCheckTmp = byteCheck.substring(FlagPoint[0]) if(!JapaneseChar.test(byteCheckTmp)){ byteCheckTmp = byteCheck.substring(FlagPoint[1]) } if(byteLengthOfCheck(byteCheckTmp) > 250 - byteLengthOfCheck(ID)){ byteCheckTmp = '' } byteCheck = byteCheckTmp } if(!/\d+|【.*】$/.test(byteCheck)){ byteCheck = '' } console.log('TitleLast: ' , byteCheck) } if(ModelName) { byteCheck = byteCheck + ModelName } return byteCheck } async function CollectionCoverImage(CoverImage){ RootDomainDB = JSON.parse(await GM_getValue(RootDomain, '[]')) if(CoverImage){ await UpdateDB(CoverImage, FilenameConvert(CopyTitle) + Resolution) await GM_setValue(RootDomain, JSON.stringify(RootDomainDB)) } GetState = RootDomainDB document.querySelector('.State').textContent = ' ' + GetState.length return CoverImage } async function CollectionLinks(DownloadArea){ RootDomainDB = JSON.parse(await GM_getValue(RootDomain, '[]')) var CollectionATag = [] DownloadArea.forEach((LinkEntry) => { LinkEntry.querySelectorAll('a').forEach((aEntry) => { if(/\?site.+$/.test(aEntry.href)){ aEntry.setAttribute('href', aEntry.href.replace(/\?site.+$/, '')) } CollectionATag.push(aEntry) }) }) //console.log('CollectionATag: ', CollectionATag ) CollectionATag = CollectionATag.filter(el => SkipClassNames.some(Skip => !el.classList.contains(Skip))) // SkipClass CollectionATag = CollectionATag.filter(el => !SkipFilter.test(el.href)) // SkipFilter CollectionATag = CollectionATag.filter(el => ![...el.children].some(e => e.matches('img'))) // LinkItemsChilren if(/blogjav/.test(RootDomain)){ CollectionATag = CollectionATag.filter(el => !el.textContent.match(/\.(mp4|mkv)$/i)) // Skip mp4 mkv } else if(/javarchive/.test(RootDomain)){ let RemainCount = CollectionATag.filter(el => !el.textContent.match(/k2s\.cc|part\d\.rar/i)) // Skip k2s part //console.log('RemainCount:', RemainCount?.length) if(RemainCount?.length){ CollectionATag = CollectionATag.filter(el => !el.textContent.match(/k2s\.cc|part\d\.rar/i)) // Skip k2s part } else{ CollectionATag = CollectionATag.filter(el => !el.textContent.match(/k2s\.cc/i)) // Skip k2s } } //console.log('CollectionATag: ', CollectionATag ) let SkipLink, SkipClass, LinkItemsChilren for (let i = 0; i < CollectionATag.length; i++) { Target = CollectionATag[i].href if(/naughtyblog.org/.test(RootDomain)){ if(CollectionATag[i].textContent.match(/SD\.mp4/gi)){ continue } else if(!CopyTitle.match(/SITERIP|OnlyFans|Updates|Collection/)){ Resolution = CollectionATag[i].textContent.match(/[0-9]{3,4}p/) ? '.XXX.' + CollectionATag[i].textContent.match(/[0-9]{3,4}p/)[0] : '' } } if(/blogjav.net/.test(RootDomain)){ if(Target.match(/\.mp4(\.html)?$/gi)){ continue } } if(Target){ if(CopyTitle){ CopyTitle = FilenameConvert(CopyTitle) //CopyLinks += Target + "#Title=" + encodeURI(CopyTitle) + Resolution + "\n" UrlTitle = CopyTitle + Resolution //console.log('RootDomainDB: ', RootDomainDB) //await GM_setValue(Target, "#Title=" + encodeURI(CopyTitle) + Resolution) } CopyLinks += Target + "\n" await UpdateDB(Target, UrlTitle) } } await GM_setValue(RootDomain, JSON.stringify(RootDomainDB)) GetState = RootDomainDB document.querySelector('.State').textContent = ' ' + GetState.length console.log(CopyLinks) if(CopyLinks?.length){ return CopyLinks.split("\n").filter((item, i, allItems) => { return i === allItems.indexOf(item)}).join("\n") } else return null } async function UpdateDB(Target, UrlTitle){ if(Target.match(K2SRegExp)){ Target = Target.match(K2SRegExp)[1] + Target.match(K2SRegExp)[2].slice(0, 18) } searchDB = RootDomainDB.find( ({ U }) => U === Target ) //console.log(RootDomainDB, searchDB) if(searchDB){ searchDB.T = UrlTitle } else{ RootDomainDB.push({U : Target , T : UrlTitle}) } //console.log(RootDomainDB) return RootDomainDB } async function RemoveDB(listToDelete){ RootDomainDB = RootDomainDB.filter( item => (!listToDelete.includes(item.U)) ); await GM_setValue(RootDomain, JSON.stringify(RootDomainDB)) GetState = RootDomainDB document.querySelector('.State').textContent = ' ' + GetState.length } async function CheckDB(listTo){ if(GetState.length > 0){ let Check = RootDomainDB.some( item => (listTo.includes(item.U))) //console.log('CheckDB: ', RootDomainDB, listTo, Check) if(Check){ document.querySelector('.Minus').style.visibility = "visible" } else{ document.querySelector('.Minus').style.visibility = "hidden" } } } async function CopyLink(){ var CopyNoticeData = '' //console.log('CopyLinks: ', CopyLinks, TmpLinksDB, !CopyLinks?.length, !TmpLinksDB?.length) if(!CopyLinks?.length && !TmpLinksDB?.length){ CopyNoticeData = FilenameConvert(CopyTitle) + "\n" AllCopyLinks = await CollectionLinks(DownloadArea) //console.log('AllCopyLinks: ', AllCopyLinks) if(AllCopyLinks){ if(CoverImage){ AllCopyLinks += await CollectionCoverImage(CoverImage) } JDownloader(AllCopyLinks, FilenameConvert(CopyTitle) + Resolution) //updateClipboard(AllCopyLinks) CopyNoticeData += AllCopyLinks document.querySelector('.CopyNotice').textContent = CopyNoticeData } else{ document.querySelector('.CopyNotice').textContent = 'Empty Links' } } else if(TmpLinksDB?.length > 0){ //console.log('TmpLinksDB: ', TmpLinksDB) for (let i = 0; i < TmpLinksDB.length; i++) { UpdateDB(TmpLinksDB[i].U, TmpLinksDB[i].T) CopyLinks += TmpLinksDB[i].U + '\n' //await GM_setValue(TmpLinksDB[i].Key, TmpLinksDB[i].Value) } await GM_setValue(RootDomain, JSON.stringify(RootDomainDB)) GetState = RootDomainDB //console.log(GetState) document.querySelector('.State').textContent = ' ' + GetState.length //console.log(TmpLinksDB) JDownloaderDB(TmpLinksDB) //console.log(JdownloaderData) //updateClipboard(CopyLinks) CopyNoticeData = CopyLinks document.querySelector('.CopyNotice').textContent = CopyNoticeData } await CheckDB(listToDo(DownloadArea)) CopyLinks = [] AllCopyLinks = [] } function listToDo(Area) { let List = [], CheckList = [] let Target try { Area.forEach((LinkEntry) => { LinkEntry.querySelectorAll('a').forEach((aEntry) => { if(CheckList.indexOf(aEntry) === -1){ CheckList.push(aEntry) } }) }) for (let i = 0; i < CheckList.length; i++) { let SkipLink = SkipFilter.test(CheckList[i].href) let LinkItemsChilren = [...CheckList[i].children].filter(e => e.matches('img')) if(SkipLink || LinkItemsChilren?.length){ continue } Target = CheckList[i].href.replace(/\?site.+/, '') if(Target.match(K2SRegExp)){ Target = Target.match(K2SRegExp)[1] + Target.match(K2SRegExp)[2].slice(0, 18) } if(List.indexOf(Target) === -1){ List.push(Target) } } if(CoverImage){ List.push(CoverImage) } return List } catch (err){ console.log(err) return List } } async function MutilSubTitle(MatchWeb, MatchWebPoint, InfoAreaCast, DownloadArea) { let AreadyAdd = [], CastName, CastNameDB = [], CastFirstTitle, CastLastTitle for (let i = 0; i < InfoAreaCast.length; i++) { let MatchPoint = InfoAreaCast[i].search(/\s?-\s/) console.log('MatchPoint: ', MatchPoint) console.log(MatchWeb, InfoAreaCast[i].substr(0, MatchPoint).replace(/\s/g, '')) if(MatchPoint !== -1 && MatchWeb !== InfoAreaCast[i].substr(0, MatchPoint).replace(/\s/g, '')){ CastName = MatchPoint !== -1 ? InfoAreaCast[i].substr(0, MatchPoint).replace(/\s?(,|&|aka.*)\s?/gi, '&').replace(/\s{2}/g, ' ').trim().replace(/\s/g, '.') : '' console.log('CastName: ' , CastName) if(CastName.match(/&/)){ CastNameDB = CastName.split('&') CastName = CastNameDB[0] + '(.+)\?' + CastNameDB.pop() } } else{ CastName = '' } console.log('CastName: ' , CastName) console.log(MatchPoint, InfoAreaCast[i].lastIndexOf(' - ')) CastFirstTitle = MatchPoint !== -1 ? InfoAreaCast[i].slice(MatchPoint + 1, InfoAreaCast[i].length).replace(/\s-\s.*/, '').split(' ') : [] CastFirstTitle = CastFirstTitle?.length > 0 ? CastFirstTitle.filter((entry) => isNaN(entry)) : []//숫자 및 단일글자 제거 CastFirstTitle = CastFirstTitle?.length > 0 ? CastFirstTitle.filter((entry) => entry.length > 1) : []//숫자 및 단일글자 제거 CastFirstTitle = CastFirstTitle?.length > 0 ? CastFirstTitle.shift().trim() : '' CastLastTitle = MatchPoint !== -1 ? InfoAreaCast[i].slice(MatchPoint + 1, InfoAreaCast[i].length).replace(/\s-\s.*/, '').split(' ') : [] //CastLastTitle = MatchPoint !== -1 ? InfoAreaCast[i].slice(MatchPoint + 1, InfoAreaCast[i].lastIndexOf(' - ')).replace(/\s-\s.*/, '').split(' ') : [] CastLastTitle = CastLastTitle?.length > 0 ? CastLastTitle.filter((entry) => isNaN(entry)) : []//숫자 및 단일글자 제거 CastLastTitle = CastLastTitle?.length > 0 ? CastLastTitle.filter((entry) => entry.length > 1) : []//숫자 및 단일글자 제거 CastLastTitle = CastLastTitle?.length > 0 ? CastLastTitle.pop().trim() : '' console.log('Cast First & Last Title: ', CastFirstTitle, CastLastTitle) DownloadArea = document.querySelectorAll('div#download') DownloadArea.forEach((LinkEntry) => { let Links if(CastName){ Links = MatchRegex(LinkEntry, new RegExp(CastName + '.*' + CastFirstTitle + '.*' + CastLastTitle, 'i'), 'href') if(!Links?.length){ Links = MatchRegex(LinkEntry, new RegExp(CastName, 'i'), 'href') if(!Links?.length){ console.log('Links Empty...') return } } } else{ Links = MatchRegex(LinkEntry, new RegExp(CastFirstTitle + '.*' + CastLastTitle, 'i'), 'href') if(!Links?.length){ Links = MatchRegex(LinkEntry, new RegExp(CastFirstTitle, 'i'), 'href') if(!Links?.length){ console.log('Links Empty...') return } } } Links = Links.filter( ( el ) => !AreadyAdd.includes( el )) //이미 추가된 링크 제외 // 링크가 6개 이상일때 짝수인덱스 값만 가져오기 if(Links?.length >= 6){ var filtered = Links.filter(function(element, index, array) { return (index % 2 === 0); }); Links = filtered } console.log('Links: ', Links) for (let j = 0; j < Links.length; j++) { let LinkText = Links[j].innerText.search(MatchWebRegExp) ? Links[j].innerText.substr(Links[j].innerText.search(MatchWebRegExp)) : Links[j].innerText console.log('LinkText: ', LinkText) let Released = LinkText.match(/(.+)(\.\d+\.\d+.\d+\.)(.+)/) ? LinkText.match(/(\.\d+\.\d+.\d+\.)/).pop() : MatchWebPoint !== -1 && LinkText.match(new RegExp(MatchWeb + '\\.\\d{4}\\.')) ? LinkText.match(new RegExp(MatchWeb + '\(\\.\\d{4}\\.\)')).pop() : '' console.log('Released: ', Released) let Episode = LinkText.match(/E\d{2,5}/i) ? '.' + LinkText.match(/E\d{2,5}/i) + '.' : '' Resolution = LinkText.match(/[0-9]{3,4}p/) ? '.XXX.' + LinkText.match(/[0-9]{3,4}p/)[0] : '' let CastTitle = InfoAreaCast[i].substr(MatchPoint + 3) && Episode ? '- ' + InfoAreaCast[i].substr(MatchPoint + 3).replace(/-\sE\d{2,5}/i, '').trim() : InfoAreaCast[i].substr(MatchPoint + 3) && !Episode ? '- ' + InfoAreaCast[i].substr(MatchPoint + 3) : '' console.log('CastTitle: ', CastTitle) let CastRegExp = LinkText.match(CastFirstTitle) && LinkText.match(CastLastTitle) ? new RegExp(MatchWeb + Episode + Released + CastName + '.*(' + CastFirstTitle + ')?(.*' + CastLastTitle + ')?', 'i') : '' console.log('CastRegExp: ', CastRegExp) let Cast = LinkText.match(CastRegExp) console.log('Cast: ', Cast) Title = CastRegExp && Cast && Cast.length > 1 && Episode ? MatchWeb + Episode + Released + Cast.pop().replace(/\./g, ' ') + CastTitle : Episode || Released ? MatchWeb + Episode + Released + InfoAreaCast[i] : MatchWeb + ' ' + Released + InfoAreaCast[i] Title = Title.replace(/(S\d+):(E\d+)/i, '$1$2') Title = FilenameConvert(Title) //CopyLinks += Links[j].href + "\n" let U = Links[j].href let T = Title + Resolution console.log(Title, Links[j]) TmpLinksDB.push({U, T}) AreadyAdd.push(Links[j]) } if(CoverImage){ let U = CoverImage let T = FilenameConvert(CopyTitle) + Resolution TmpLinksDB.push({U, T}) } }) } } async function ClearUrls(){ document.querySelector('.ClearButton').style = "color: White !important;"; //document.querySelector('.ClearButton').style.setProperty('font-size', Number(((1/(GetDPI/1.5))*(16/DefaultFontSize)).toFixed(2)) + 'rem', 'important'); await GM_deleteValue(RootDomain) RootDomainDB = JSON.parse(await GM_getValue(RootDomain, '[]')) GetState = RootDomainDB //console.log(GetState) if(document.querySelector('.Minus')){ document.querySelector('.Minus').style.visibility = "hidden" } document.querySelector('.State').textContent = ' ' + 0 } async function ClipPaste(){ document.querySelector('.CopyButton').style = "color: White !important;"; //document.querySelector('.CopyButton').style.setProperty('font-size', Number(((1/(GetDPI/1.5))*(16/DefaultFontSize)).toFixed(2)) + 'rem', 'important'); var ClipPasteData = JSON.parse(await GM_getValue(RootDomain, '[]')) JDownloaderDB(ClipPasteData) //updateClipboard(ClipPasteData) } function MakeIcon(GetDPI) { clearTimeout(MakeIconTimer) if(CopyOffSetArea){ let ModArea = CopyOffSetArea let OffSetArea let IconSet = document.querySelector(".IconSet") //console.log(ModArea, ModArea.nodeType) if(/kbjme\.com/.test(RootDomain)){ OffSetArea = ModArea.closest('.article_container') OffSetArea.style.setProperty('position', 'relative') } else if(/javarchive\.com/.test(RootDomain)){ OffSetArea = ModArea.closest('.category_news_phai_chinh').querySelector('.menudd') OffSetArea.style.setProperty('position', 'relative') } else if(/pornchil\.com/.test(RootDomain)){ OffSetArea = ModArea.closest('.entry-content') OffSetArea.style.setProperty('position', 'relative') } else if(/top-modelz\.org/.test(RootDomain)){ OffSetArea = ModArea OffSetArea.parentElement.style.setProperty('position', 'relative') } else if(/pornrips\.cc/.test(RootDomain)){ OffSetArea = ModArea OffSetArea.parentElement.style.setProperty('position', 'relative') } else{ OffSetArea = ModArea OffSetArea.parentElement.style.setProperty('position', 'relative') } var GetViewProperty = window.document.defaultView.getComputedStyle(ModArea, null) var GetPadding = GetViewProperty.getPropertyValue('padding') || 0 var verticalalign = GetViewProperty.getPropertyValue('vertical-align') || 'middle' var lineheight = GetViewProperty.getPropertyValue('line-height') || '1rem' var Top = GetViewProperty.getPropertyValue('top') || 'auto' var DisPlay = GetViewProperty.getPropertyValue('display') || 'auto' let IconHeight = parseFloat(window.getComputedStyle(IconSet).fontSize) let FontHeight = parseFloat(window.getComputedStyle(OffSetArea).fontSize) let OffSetAreaElementOffset = getRelativeOffset(OffSetArea) let OffSetAreatNodeTextElementOffset = getNodeTextElementOffset(OffSetArea) let IconSetElementOffset = getRelativeOffset(IconSet) //console.log(OffSetArea.offsetParent, GetPadding) if(/javfree|blogjav|javpink|wetholefans/.test(PageURL)){ $('.IconSet').css({ "top": OffSetAreaElementOffset.top - IconSetElementOffset.height , "left": OffSetAreaElementOffset.width - IconSetElementOffset.width/2 }) } else if(/naughtyblog|pornrip\.cc/.test(PageURL)) { $('.IconSet').css({ "top": OffSetAreaElementOffset.top, "left": OffSetAreaElementOffset.width - IconSetElementOffset.width, "padding": GetPadding, }) } else if(/pornrips\.cc/.test(PageURL)) { let MetaView = getRelativeOffset(OffSetArea.parentElement.querySelector('.meta > .meta_views')) $('.IconSet').css({ "top": MetaView.top - IconSetElementOffset.height, "left": MetaView.left + IconSetElementOffset.width, }) console.log(getRelativeOffset(MetaView)) } else if(/javarchive/.test(PageURL)) { $('.IconSet').css({ "top": OffSetAreaElementOffset.top + OffSetAreaElementOffset.height - IconSetElementOffset.height/2, "left": OffSetAreaElementOffset.left + OffSetAreaElementOffset.width - IconSetElementOffset.width }) } else if(/kbjme\.com/.test(PageURL)) { $('.IconSet').css({ "top": getElementOffset(IconSet).height*3/2, "left": OffSetAreaElementOffset.right - OffSetAreaElementOffset.width + IconSetElementOffset.width }) //}) } else if(/maxjav\.com/.test(PageURL)) { $('.IconSet').css({ "top": OffSetAreaElementOffset.top + IconSetElementOffset.height/2, "left": OffSetAreaElementOffset.left + OffSetAreaElementOffset.width - IconSetElementOffset.width }) } else if(/0xxx\.ws\/articles\/\d+/.test(PageURL)) { //console.log((getElementOffset(OffSetArea).top - getNodeTextElementOffset(OffSetArea).top)/2) $('.IconSet').css({ "top": OffSetAreaElementOffset.top, "right": IconHeight, "padding": GetPadding, }) } else if(/top-modelz\.org/.test(PageURL)) { //console.log((getElementOffset(OffSetArea).top - getNodeTextElementOffset(OffSetArea).top)/2) $('.IconSet').css({ "top": OffSetAreaElementOffset.top, "right": IconHeight }) } else if(/hpjav\.tv/.test(PageURL)) { $('.IconSet').css({ "top": OffSetAreaElementOffset.top - Math.abs(FontHeight - IconHeight)/2, "left": OffSetAreaElementOffset.width + IconHeight }) } else if(/8kcosplay\.com|fhdporn/.test(PageURL)){ $('.IconSet').css({ "top": OffSetAreaElementOffset.top - IconHeight, "left": OffSetAreaElementOffset.width - IconSetElementOffset.width }) } else if(/av18plus\.com/.test(PageURL)){ $('.IconSet').css({ "top": OffSetAreaElementOffset.top - IconHeight, "left": OffSetAreaElementOffset.width - IconSetElementOffset.width }) } else if(/pornchil\.com|asianscan/.test(PageURL)){ $('.IconSet').css({ "top": 0, "left": OffSetAreaElementOffset.width - IconSetElementOffset.width }) } else { $('.IconSet').css({ "top": OffSetAreaElementOffset.top, "left": OffSetAreaElementOffset.width - IconSetElementOffset.width, }) } IconSet.style.visibility = "visible" document.querySelector('.CopyIcon').style.visibility = "visible" document.querySelector(".CloseIcon").style.visibility = "visible" if(DownloadArea){ CheckDB(listToDo(DownloadArea)) } //console.log(getElementOffset(OffSetArea), getNodeTextElementOffset(OffSetArea), getElementOffset(IconSet), getRelativeOffset(OffSetArea), getRelativeOffset(IconSet), FontHeight, IconHeight ) } } function JDownloader(JdownloaderData, PackageName){ //console.log(PackageName + '\n' + JdownloaderData) if(JdownloaderData){ let data = new URLSearchParams(); data.append(`urls`, JdownloaderData); data.append(`referer`, PageURL) if(PackageName){ data.append(`package`, PackageName) } fetch('http://127.0.0.1:9666/flash/add', { method: 'POST', //mode: 'cors', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', }, body: data }) } } function JDownloaderDB(LinksDB){ //console.log(LinksDB) let uniqueTitle = [...new Set(LinksDB.map( x => x.T ))] //console.log(uniqueTitle) uniqueTitle.forEach(x => JDownloader(GetMatchLinks(x, LinksDB), x)) } function GetMatchLinks(text, LinksDB){ try { return LinksDB.filter(u => text.includes(u.T)).map(l => l.U).join('\n') } catch(err) { console.log(err, text, LinksDB) } } function scrollToTop() { window.scrollTo({ top: 0, behavior: 'auto' }) window.removeEventListener('scroll', scrollToTop) } function attrPromise(element, attributeName, attributeValue) { return new Promise((resolve,reject) => { const observerConfig = {attributes: true, childList: true, subtree: true,}; const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.attributeName == attributeName && mutation.getAttribute(attributeName) == attributeValue ) { observer.disconnect(); resolve(element); } }); }); observer.observe(element, observerConfig); }); }