VideoHelp Forum



Support our site by donate $5 directly to us Thanks!!!

Try StreamFab Downloader and download streaming video from Netflix, Amazon!



+ Reply to Thread
Page 5 of 5
FirstFirst ... 3 4 5
Results 121 to 138 of 138
  1. Yeah I'm still unable to get the JSON either
    Quote Quote  
  2. Anybody got a tip?
    Quote Quote  
  3. Originally Posted by atalanta View Post
    Anybody got a tip?
    Does using slug with https://github.com/abdlhay/AbyssVideoDownloader not work for you?
    Quote Quote  
  4. Member
    Join Date
    Jun 2025
    Location
    Your Mom's House
    Search PM
    Any updates? Or is this method abandoned?
    Quote Quote  
  5. It takes time to figure out and update whatever obfuscation or encryption they do. And they always update
    Quote Quote  
  6. The abyss.to site owner himself provided a download site in the js.

    https://dl.openx.xyz/?v=<video ID>
    https://dl.openx.xyz/?v=K8R6OOjS7

    Just use ublock origin to block ads and click n number of times to download video

    APIs:
    Code:
    https://dl.openx.xyz/api/get-video-info?v=<video ID>
    https://dl.openx.xyz/api/export?videoId=<videoID>&hash=<hash>&token=<token>
    Figure out the token generation and you can just use the api to download video directly
    Quote Quote  
  7. If that's new then that's great but they had Hellabyte downloads before and video owner had to enable it to be downloaded. They might've switched or they doing both.
    Quote Quote  
  8. Any news? Both https://github.com/abdlhay/AbyssVideoDownloader and https://github.com/DevLARLEY/AbyssGet are broken. And since today https://dl.openx.xyz is not working anymore for most newer videos. It's so annoying that abyss.to keeps breaking things. I'm literally just trying to download some of the videos for archival purposes bc shit gets deleted all the time.
    Quote Quote  
  9. Originally Posted by atalanta View Post
    Any news? Both https://github.com/abdlhay/AbyssVideoDownloader and https://github.com/DevLARLEY/AbyssGet are broken. And since today https://dl.openx.xyz is not working anymore for most newer videos. It's so annoying that abyss.to keeps breaking things. I'm literally just trying to download some of the videos for archival purposes bc shit gets deleted all the time.
    use debugger

    video link:
    Image
    [Attachment 88153 - Click to enlarge]


    key:
    Image
    [Attachment 88154 - Click to enlarge]
    Quote Quote  
  10. Originally Posted by Frieren View Post
    Originally Posted by atalanta View Post
    Any news? Both https://github.com/abdlhay/AbyssVideoDownloader and https://github.com/DevLARLEY/AbyssGet are broken. And since today https://dl.openx.xyz is not working anymore for most newer videos. It's so annoying that abyss.to keeps breaking things. I'm literally just trying to download some of the videos for archival purposes bc shit gets deleted all the time.
    use debugger

    video link:
    Image
    [Attachment 88153 - Click to enlarge]


    key:
    Image
    [Attachment 88154 - Click to enlarge]
    Thank you, but is there a way to tell which specific line I am supposed to look for in the debugger?

    Could you maybe give me an example what a complete API request looks like using the url and tokens when I put it into this format: https://dl.openx.xyz/api/export?videoId=<videoID>&hash=<hash>&token=<token>
    Quote Quote  
  11. Also, I get this message when I try to use the debugger:
    Due to security concerns, your access request has been denied. Kindly close your browser completely and try again. Kindly refrain from opening the developer tools (eg: F12). Vid: hQLYQ9id_
    Quote Quote  
  12. Figured out if you just add "return i.value = 3" or "i.value++" before "const T=window.open(S". It works skipping opening ads.

    code too big ;v
    Last edited by cibkosglowendnl; 17th Aug 2025 at 03:51.
    Quote Quote  
  13. I was able to do some scripting to download with https://dl.openx.xyz/api/export?videoId=<videoID>&hash=<hash>&token=<token> from the ember viewer.

    no 4k which sucks.

    Modify https://dl.openx.xyz/assets/index-ByMBoLyX.js to make the unlocks 1 click without needing to do ads. Then get the turnstile token emitted. With that you can hit the api.

    Then from the embed, inject a script to hit https://dl.openx.xyz/api/get-video-info?v=<slug> and show a buttons to show what you want to download.

    You can then make an iframe with https://dl.openx.xyz/?v=<slug> with the index-ByMBoLyX.js by injecting or forming your own html with the modified script and emulate clicks to then dl and destroy the iframe.

    Or you can just be lazy and add a button to open up the https://dl.openx.xyz/?v=<slug> with a modified index-ByMBoLyX.js to just click on it manually without ads


    NVM. You can just make a script to run a turnstile and get the token anytime and run the getinfo api and just dl.
    Make a button from the embed, take the slug. Open https://dl.openx.xyz/?v=<slug>, Inject the script to run the turnstile, get the token, use get info api and you're golden.
    Last edited by cibkosglowendnl; 17th Aug 2025 at 01:54.
    Quote Quote  
  14. Member
    Join Date
    Feb 2006
    Location
    United States
    Search Comp PM
    Originally Posted by cibkosglowendnl View Post
    I was able to do some scripting to download with https://dl.openx.xyz/api/export?videoId=<videoID>&hash=<hash>&token=<token> from the ember viewer.

    no 4k which sucks.

    Modify https://dl.openx.xyz/assets/index-ByMBoLyX.js to make the unlocks 1 click without needing to do ads. Then get the turnstile token emitted. With that you can hit the api.

    Then from the embed, inject a script to hit https://dl.openx.xyz/api/get-video-info?v=<slug> and show a buttons to show what you want to download.

    You can then make an iframe with https://dl.openx.xyz/?v=<slug> with the index-ByMBoLyX.js by injecting or forming your own html with the modified script and emulate clicks to then dl and destroy the iframe.

    Or you can just be lazy and add a button to open up the https://dl.openx.xyz/?v=<slug> with a modified index-ByMBoLyX.js to just click on it manually without ads
    i see someone has found a way to download from Abyss/Hydrax - https://github.com/abdlhay/AbyssVideoDownloader/issues (see the first comment)
    Quote Quote  
  15. i see someone has found a way to download from Abyss/Hydrax - https://github.com/abdlhay/AbyssVideoDownloader/issues (see the first comment)

    It looks like it just opens the download page.. and copy the slug.
    Quote Quote  
  16. BTW I might get my openx downloader prettied up so I can share. Also my Slug Extractor is working. I can add a button to put you to the download page but I'm working on a one button downloader.
    Quote Quote  
  17. Sorry for code dump. I minified it already

    My Openx downloader is scuffed but at least it's something. The embed UI sucks cause I just shoved the new code in the ancient one.
    It's a Userscript, It's combined with my Slug Extractor You can click download to go to Openx and the script bypass the ads allowing you to download directly. I don't know if they allow multi connections since the tokens only allow one time connection and it expire.

    Full size mirror : https://pastebin.com/LCZDAgBF




    JS minified
    vvvvvvvvv
    Code:
    // ==UserScript==
    // @name         Abyss Slug Extractor and Openx downloader
    // @version      1
    // @description  Extract slug from requests and DOM with Openx downloader
    // @icon         https://abyss.to/favicon.ico
    // @match        *://*/*
    // @grant        none
    // ==/UserScript==
    
    (function(){'use strict';const openxurlRegex=/dl\.openx\.xyz\/\?v=[0-9A-Za-z_-]{9}/;const urlRegex=/\?v=([0-9A-Za-z_-]{9})/;if(openxurlRegex.test(window.location.href)){class BeautifulVideoDownloader{constructor(){this.config={videoId:'',apiBaseUrl:'https://dl.openx.xyz/api',turnstileSiteKey:'0x4AAAAAABjR-PW5STU0FnV1',turnstileScriptUrl:'https://challenges.cloudflare.com/turnstile/v0/api.js?onload=initManualTurnstile&render=explicit'};this.state={token:'',videoData:null,turnstileWidgetId:null,isLoading:!1,currentStatus:'initializing'};this.elements={mainContainer:null,turnstileContainer:null,downloadSection:null,statusIndicator:null,downloadCards:[]};this.styles=this.createStyles()}
    createStyles(){return `
                    .beautiful-downloader * {
                        box-sizing: border-box;
                        font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
                    }
    
                    .beautiful-downloader {
                        position: fixed;
                        top: 20px;
                        right: 20px;
                        width: 420px;
                        background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
                        border-radius: 20px;
                        padding: 0;
                        box-shadow: 0 20px 40px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.05);
                        backdrop-filter: blur(10px);
                        z-index: 10000;
                        transform: translateX(440px);
                        transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
                        overflow: hidden;
                        max-height: calc(100vh - 40px);
                        display: flex;
                        flex-direction: column;
                    }
    
                    .beautiful-downloader.visible {
                        transform: translateX(0);
                    }
    
                    @media (max-width: 480px) {
                        .beautiful-downloader {
                            width: calc(100vw - 40px);
                            right: 20px;
                            left: 20px;
                        }
                    }
    
                    .downloader-header {
                        background: rgba(0, 0, 0, 0.3);
                        padding: 20px 25px;
                        border-bottom: 1px solid rgba(255, 255, 255, 0.1);
                        display: flex;
                        align-items: center;
                        justify-content: space-between;
                    }
    
                    .downloader-title {
                        color: white;
                        font-size: 18px;
                        font-weight: 600;
                        margin: 0;
                        display: flex;
                        align-items: center;
                        gap: 8px;
                    }
    
                    .downloader-close {
                        background: rgba(211, 42, 42, 0.8);
                        border: none;
                        color: white;
                        font-size: 20px;
                        cursor: pointer;
                        padding: 5px;
                        border-radius: 50%;
                        transition: background-color 0.2s;
                        width: 20px;
                        height: 20px;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        line-height: 1;
                    }
    
                    .downloader-close:hover {
                        background: rgba(241, 36, 36, 0.9)
                    }
    
                    .status-indicator {
                        padding: 15px 25px;
                        background: rgba(0, 0, 0, 0.2);
                        border-bottom: 1px solid rgba(255, 255, 255, 0.08);
                        display: flex;
                        align-items: center;
                        gap: 12px;
                        color: #e2e8f0;
                        font-size: 14px;
                    }
    
                    .status-dot {
                        width: 8px;
                        height: 8px;
                        border-radius: 50%;
                        background: #4ade80;
                        animation: pulse 2s infinite;
                    }
    
                    .status-dot.loading {
                        background: #fbbf24;
                    }
    
                    .status-dot.error {
                        background: #ef4444;
                        animation: none;
                    }
    
                    @keyframes pulse {
                        0%, 100% { opacity: 1; }
                        50% { opacity: 0.5; }
                    }
    
                    .turnstile-section {
                        padding: 25px;
                        background: rgba(0, 0, 0, 0.15);
                        border-bottom: 1px solid rgba(255, 255, 255, 0.08);
                    }
    
                    .turnstile-label {
                        color: #cbd5e0;
                        font-size: 14px;
                        margin-bottom: 15px;
                        display: flex;
                        align-items: center;
                        gap: 8px;
                    }
    
                    #manual-turnstile-container {
                        display: flex;
                        justify-content: center;
                        padding: 10px;
                        background: white;
                        border-radius: 12px;
                        box-shadow: 0 4px 12px rgba(0,0,0,0.1);
                    }
    
                    .download-section {
                        padding: 20px 0;
                        min-height: 0;
                        flex: 1;
                        overflow-y: auto;
                    }
    
                    .download-section::-webkit-scrollbar {
                        width: 6px;
                    }
    
                    .download-section::-webkit-scrollbar-track {
                        background: rgba(255, 255, 255, 0.05);
                    }
    
                    .download-section::-webkit-scrollbar-thumb {
                        background: rgba(255, 255, 255, 0.2);
                        border-radius: 3px;
                    }
    
                    .download-section::-webkit-scrollbar-thumb:hover {
                        background: rgba(255, 255, 255, 0.3);
                    }
    
                    .download-card {
                        margin: 0 25px 15px;
                        background: rgba(0, 0, 0, 0.4);
                        border-radius: 16px;
                        padding: 20px;
                        transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
                        border: 1px solid rgba(255, 255, 255, 0.1);
                        opacity: 0;
                        transform: translateY(20px);
                        animation: slideIn 0.4s forwards;
                    }
    
                    .download-card:hover {
                        transform: translateY(-2px);
                        box-shadow: 0 8px 25px rgba(0,0,0,0.6);
                        background: rgba(0, 0, 0, 0.6);
                        border: 1px solid rgba(255, 255, 255, 0.2);
                    }
    
                    @keyframes slideIn {
                        to {
                            opacity: 1;
                            transform: translateY(0);
                        }
                    }
    
                    .download-info {
                        display: flex;
                        justify-content: space-between;
                        align-items: center;
                        margin-bottom: 15px;
                    }
    
                    .quality-badge {
                        background: linear-gradient(135deg, #dc2626, #b91c1c);
                        color: white;
                        padding: 6px 12px;
                        border-radius: 20px;
                        font-size: 12px;
                        font-weight: 600;
                        text-transform: uppercase;
                        letter-spacing: 0.5px;
                        box-shadow: 0 2px 8px rgba(220, 38, 38, 0.3);
                    }
    
                    .quality-badge.hd {
                        background: linear-gradient(135deg, #059669, #047857);
                        box-shadow: 0 2px 8px rgba(5, 150, 105, 0.3);
                    }
    
                    .quality-badge.fhd {
                        background: linear-gradient(135deg, #7c3aed, #5b21b6);
                        box-shadow: 0 2px 8px rgba(124, 58, 237, 0.3);
                    }
    
                    .file-size {
                        color: #a0aec0;
                        font-size: 13px;
                        font-weight: 500;
                    }
    
                    .download-button {
                        width: 100%;
                        background: linear-gradient(135deg, #2d3748, #1a202c);
                        color: #e2e8f0;
                        border: 1px solid rgba(255, 255, 255, 0.1);
                        padding: 14px 20px;
                        border-radius: 12px;
                        font-size: 14px;
                        font-weight: 600;
                        cursor: pointer;
                        transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
                        position: relative;
                        overflow: hidden;
                        display: flex;
                        align-items: center;
                        justify-content: center;
                        gap: 8px;
                    }
    
                    .download-button:hover:not(:disabled) {
                        background: linear-gradient(135deg, #4a5568, #2d3748);
                        transform: scale(1.02);
                        box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4);
                        border: 1px solid rgba(255, 255, 255, 0.2);
                        color: #f7fafc;
                    }
    
                    .download-button:active:not(:disabled) {
                        transform: scale(0.98);
                    }
    
                    .download-button:disabled {
                        background: rgba(45, 55, 72, 0.5);
                        color: rgba(226, 232, 240, 0.5);
                        cursor: not-allowed;
                        transform: none;
                        box-shadow: none;
                    }
    
                    .download-button::before {
                        content: '';
                        position: absolute;
                        top: 0;
                        left: -100%;
                        width: 100%;
                        height: 100%;
                        background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent);
                        transition: left 0.5s;
                    }
    
                    .download-button:hover:not(:disabled)::before {
                        left: 100%;
                    }
    
                    .loading-spinner {
                        display: inline-block;
                        width: 16px;
                        height: 16px;
                        border: 2px solid rgba(255, 255, 255, 0.3);
                        border-radius: 50%;
                        border-top-color: white;
                        animation: spin 1s linear infinite;
                    }
    
                    @keyframes spin {
                        to {
                            transform: rotate(360deg);
                        }
                    }
    
                    .success-checkmark {
                        display: inline-block;
                        width: 16px;
                        height: 16px;
                        border-radius: 50%;
                        background: #10b981;
                        position: relative;
                    }
    
                    .success-checkmark::after {
                        content: '✓';
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        transform: translate(-50%, -50%);
                        color: white;
                        font-size: 10px;
                        font-weight: bold;
                    }
    
                    .empty-state {
                        text-align: center;
                        padding: 40px 25px;
                        color: #718096;
                    }
    
                    .empty-state-icon {
                        font-size: 48px;
                        margin-bottom: 15px;
                        opacity: 0.5;
                    }
    
                    .empty-state-text {
                        font-size: 16px;
                        line-height: 1.5;
                    }
                `}
    async init(){this.injectStyles();this.createMainInterface();this.updateStatus('Loading video information...','loading');try{await this.loadTurnstileScript();await this.fetchVideoInfo();this.renderTurnstile();this.updateStatus('Ready for verification','ready');this.showInterface()}catch(error){console.error('Failed to initialize:',error);this.updateStatus('Failed to load. Please refresh.','error');this.showInterface()}}
    injectStyles(){const style=document.createElement('style');style.textContent=this.styles;document.head.appendChild(style)}
    createMainInterface(){this.elements.mainContainer=document.createElement('div');this.elements.mainContainer.className='beautiful-downloader';this.elements.mainContainer.innerHTML=`
                    <div class="downloader-header">
                        <h3 class="downloader-title">
                            Video Downloader
                        </h3>
                        <button class="downloader-close" title="Close"></button>
                    </div>
    
                    <div class="status-indicator">
                        <div class="status-dot loading"></div>
                        <span class="status-text">Initializing...</span>
                    </div>
    
                    <div class="turnstile-section">
                        <div class="turnstile-label">
                            🔐 Security Verification
                        </div>
                        <div id="manual-turnstile-container"></div>
                    </div>
    
                    <div class="download-section"></div>
                `;const closeBtn=this.elements.mainContainer.querySelector('.downloader-close');closeBtn.addEventListener('click',()=>this.hideInterface());this.elements.statusIndicator=this.elements.mainContainer.querySelector('.status-indicator');this.elements.turnstileContainer=this.elements.mainContainer.querySelector('#manual-turnstile-container');this.elements.downloadSection=this.elements.mainContainer.querySelector('.download-section');document.body.appendChild(this.elements.mainContainer)}
    showInterface(){setTimeout(()=>{this.elements.mainContainer.classList.add('visible')},100)}
    hideInterface(){this.elements.mainContainer.classList.remove('visible')}
    updateStatus(message,type='loading'){const statusDot=this.elements.statusIndicator.querySelector('.status-dot');const statusText=this.elements.statusIndicator.querySelector('.status-text');statusDot.className=`status-dot ${type}`;statusText.textContent=message}
    loadTurnstileScript(){return new Promise((resolve,reject)=>{if(typeof window.turnstile!=='undefined'){resolve();return}
    const script=document.createElement('script');script.src=this.config.turnstileScriptUrl;script.async=!0;script.onload=()=>resolve();script.onerror=()=>reject(new Error('Failed to load Turnstile script'));document.head.appendChild(script);window.initManualTurnstile=()=>resolve()})}
    async fetchVideoInfo(){if(urlRegex.test(window.location.href)){this.config.videoId=urlRegex.exec(window.location.href)[1]}
    const apiUrl=`${this.config.apiBaseUrl}/get-video-info?v=${this.config.videoId}`;try{const response=await fetch(apiUrl);if(!response.ok){throw new Error(`HTTP ${response.status}: ${response.statusText}`)}
    this.state.videoData=await response.json();this.prepareFilenames();console.log('Video info loaded:',this.state.videoData)}catch(error){console.error('Failed to fetch video info:',error);throw error}}
    prepareFilenames(){if(!this.state.videoData?.sources)return;const baseName=this.state.videoData.name?this.state.videoData.name.replace(/\.(mp4|ts)$/i,''):`video_${this.config.videoId}`;this.state.videoData.sources.forEach(source=>{source.fileName=`${baseName}_${source.quality}.mp4`})}
    renderTurnstile(){try{this.state.turnstileWidgetId=window.turnstile.render('#manual-turnstile-container',{sitekey:this.config.turnstileSiteKey,theme:'light',size:'normal',callback:(token)=>this.handleTurnstileSuccess(token),'error-callback':(error)=>this.handleTurnstileError(error)});console.log('Turnstile rendered successfully')}catch(error){console.error('Error rendering Turnstile:',error);this.updateStatus('Verification failed to load','error')}}
    handleTurnstileSuccess(token){this.state.token=token;this.updateStatus('Verification successful!','success');setTimeout(()=>{this.createDownloadLinks()},500)}
    handleTurnstileError(error){console.error('Turnstile failed:',error);this.updateStatus('Verification failed. Please try again.','error');this.clearDownloadLinks()}
    resetTurnstile(){if(this.state.turnstileWidgetId){try{window.turnstile.remove(this.state.turnstileWidgetId)}catch(error){console.error('Error removing Turnstile:',error)}}
    this.elements.turnstileContainer.innerHTML='';this.state.token='';this.clearDownloadLinks();this.updateStatus('Please verify again...','loading');setTimeout(()=>this.renderTurnstile(),1000)}
    createDownloadLinks(){if(!this.state.videoData?.sources||!this.state.token){this.showEmptyState();return}
    this.clearDownloadLinks();this.updateStatus(`${this.state.videoData.sources.length} downloads ready`,'success');this.state.videoData.sources.forEach((source,index)=>{setTimeout(()=>{const card=this.createDownloadCard(source,index);this.elements.downloadCards.push(card);this.elements.downloadSection.appendChild(card)},index*100)})}
    createDownloadCard(source,index){const card=document.createElement('div');card.className='download-card';card.style.animationDelay=`${index * 0.1}s`;const qualityClass=source.quality.toLowerCase().includes('1080')?'fhd':source.quality.toLowerCase().includes('720')?'hd':'';card.innerHTML=`
                    <div class="download-info">
                        <div class="quality-badge ${qualityClass}">${source.quality}</div>
                        <div class="file-size">${this.formatFileSize(source.size)}</div>
                    </div>
    
                    <button class="download-button" data-source='${JSON.stringify(source)}'>
                        <span class="download-text">Download ${source.quality}</span>
                    </button>
                `;const button=card.querySelector('.download-button');button.addEventListener('click',(e)=>this.handleDownloadClick(e,source));return card}
    disableAllDownloadButtons(){const allButtons=this.elements.downloadSection.querySelectorAll('.download-button');allButtons.forEach(button=>{button.disabled=!0})}
    enableAllDownloadButtons(){const allButtons=this.elements.downloadSection.querySelectorAll('.download-button');allButtons.forEach(button=>{button.disabled=!1})}
    async handleDownloadClick(event,source){const button=event.currentTarget;const originalContent=button.innerHTML;button.innerHTML=`
                    <div class="loading-spinner"></div>
                    <span>Preparing...</span>
                `;this.disableAllDownloadButtons();try{const downloadUrl=this.generateDownloadUrl(source);const link=document.createElement('a');link.href=downloadUrl;link.download=source.fileName;link.target='_blank';document.body.appendChild(link);link.click();document.body.removeChild(link);button.innerHTML=`
                        <div class="success-checkmark"></div>
                        <span>Downloaded!</span>
                    `;setTimeout(()=>{this.resetTurnstile()},2000)}catch(error){console.error('Download failed:',error);button.innerHTML=originalContent;this.enableAllDownloadButtons()}}
    generateDownloadUrl(source){const params=new URLSearchParams({videoId:source.videoId,hash:source.hash,token:this.state.token});return `${this.config.apiBaseUrl}/export?${params.toString()}`}
    clearDownloadLinks(){this.elements.downloadCards.forEach(card=>card.remove());this.elements.downloadCards=[];this.elements.downloadSection.innerHTML=''}
    showEmptyState(){this.elements.downloadSection.innerHTML=`
                    <div class="empty-state">
                        <div class="empty-state-text">
                            No downloads available.<br>
                            Please complete verification first.
                        </div>
                    </div>
                `}
    formatFileSize(bytes){if(!bytes||bytes===0)return'Unknown size';const sizes=['B','KB','MB','GB'];const i=Math.floor(Math.log(bytes)/Math.log(1024));const size=(bytes/Math.pow(1024,i)).toFixed(1);return `${size} ${sizes[i]}`}}
    const beautifulDownloader=new BeautifulVideoDownloader();if(document.readyState==='loading'){document.addEventListener('DOMContentLoaded',()=>beautifulDownloader.init())}else{beautifulDownloader.init()}}else if(urlRegex.test(window.location.href)){const slugRegex=/(?:https:\/\/short\.icu\/|https:\/\/abysscdn\.com\/\?v=|freeimagecdn\.net\/image\/|pixel\.morphify\.net\/.{0,20}v=)([0-9A-Za-z_-]{9})/;let lastSlug=null;let observer=null;const topPanel=document.createElement('div');Object.assign(topPanel.style,{position:'fixed',minWidth:'max-content',top:'1vh',left:'50%',transform:'translateX(-50%)',display:'none',alignItems:'center',background:'#333',padding:'8px 16px',borderRadius:'8px',zIndex:'9999',fontFamily:'Consolas, monospace',fontSize:'1.2rem',color:'white',gap:'10px'});const slugDisplay=document.createElement('span');topPanel.appendChild(slugDisplay);const copyBtn=document.createElement('button');copyBtn.textContent='Copy Slug';Object.assign(copyBtn.style,{fontSize:'inherit',background:'rgba(223, 50, 50, 1)',color:'white',border:'none',borderRadius:'5px',padding:'6px 12px',cursor:'pointer',fontFamily:'Consolas, monospace',textShadow:'rgba(0, 0, 0, 0.5) 2px 2px 5px'});copyBtn.addEventListener('click',()=>{if(lastSlug){navigator.clipboard.writeText(lastSlug);copyBtn.textContent='Copied!';copyBtn.disabled=!0;setTimeout(()=>{copyBtn.textContent='Copy Slug';copyBtn.disabled=!1},1000)}});const downloadBtn=document.createElement('button');downloadBtn.textContent='Download';Object.assign(downloadBtn.style,{fontSize:'inherit',background:'rgba(36, 172, 51, 1)',color:'white',border:'none',borderRadius:'5px',padding:'6px 12px',cursor:'pointer',fontFamily:'Consolas, monospace',textShadow:'rgba(0, 0, 0, 0.5) 2px 2px 5px'});downloadBtn.addEventListener('click',()=>{if(lastSlug){window.open(`https://dl.openx.xyz/?v=${lastSlug}`,'_blank')}});const toggleLogBtn=document.createElement('button');toggleLogBtn.textContent='Show All Requests';Object.assign(toggleLogBtn.style,{fontSize:'inherit',background:'rgba(31, 127, 206, 1)',color:'white',border:'none',borderRadius:'5px',padding:'6px 12px',cursor:'pointer',fontFamily:'Consolas, monospace',textShadow:'rgba(0, 0, 0, 0.5) 2px 2px 5px'});const closeBtn=document.createElement('button');closeBtn.textContent='✖';Object.assign(closeBtn.style,{fontSize:'inherit',background:'rgba(210, 45, 45, 1)',color:'white',border:'none',borderRadius:'5px',padding:'6px 12px',cursor:'pointer',fontFamily:'Consolas, monospace',textShadow:'rgba(0, 0, 0, 0.5) 2px 2px 5px'});closeBtn.addEventListener('click',()=>{topPanel.remove();logPanel.remove();if(observer)observer.disconnect();});topPanel.appendChild(copyBtn);topPanel.appendChild(downloadBtn);topPanel.appendChild(toggleLogBtn);topPanel.appendChild(closeBtn);document.body.appendChild(topPanel);const logPanel=document.createElement('div');Object.assign(logPanel.style,{position:'fixed',bottom:'1vh',width:'100%',height:'40vh',background:'rgba(0,0,0,0.85)',color:'white',fontSize:'1rem',overflowY:'auto',zIndex:'9999',padding:'10px 0px',borderRadius:'10px',display:'none',fontFamily:'Consolas, monospace'});document.body.appendChild(logPanel);toggleLogBtn.addEventListener('click',()=>{const isVisible=logPanel.style.display==='block';logPanel.style.display=isVisible?'none':'block';toggleLogBtn.textContent=isVisible?'Show All Requests':'Hide All Requests'});function showSlug(slug){if(slug===lastSlug)return;lastSlug=slug;slugDisplay.textContent=slug;topPanel.style.display='flex';console.log('Slug found:',slug)}
    function logRequest(type,url){const entry=document.createElement('div');entry.textContent=`[${type}] ${url}`;logPanel.appendChild(entry);logPanel.scrollTop=logPanel.scrollHeight}
    function handleRequest(type,url){logRequest(type,url);const match=slugRegex.exec(url);if(match&&match[1])showSlug(match[1]);}
    const originalFetch=window.fetch;window.fetch=function(...args){const[url]=args;if(typeof url==='string'){handleRequest('fetch',url)}else if(url instanceof Request){handleRequest('fetch',url.url)}
    return originalFetch.apply(this,args)};const originalOpen=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(method,url,...rest){this.addEventListener('loadstart',()=>{handleRequest('XHR',url)});return originalOpen.call(this,method,url,...rest)};function checkNodeForSlug(node){if(!node)return;if(node.nodeType===Node.TEXT_NODE){const match=slugRegex.exec(node.textContent);if(match&&match[1])showSlug(match[1]);}else if(node.nodeType===Node.ELEMENT_NODE){for(const attr of node.attributes||[]){const match=slugRegex.exec(attr.value);if(match&&match[1])showSlug(match[1]);}}}
    function scanDocument(){checkNodeForSlug(document.body);document.querySelectorAll('*').forEach(el=>{checkNodeForSlug(el)})}
    scanDocument();observer=new MutationObserver(mutations=>{for(const mutation of mutations){if(mutation.type==='childList'){mutation.addedNodes.forEach(node=>{checkNodeForSlug(node)})}else if(mutation.type==='attributes'){checkNodeForSlug(mutation.target)}}});observer.observe(document.body,{childList:!0,subtree:!0,attributes:!0})}})()
    Last edited by cibkosglowendnl; 17th Aug 2025 at 06:35.
    Quote Quote  



Similar Threads

Visit our sponsor! Try DVDFab and backup Blu-rays!