Greasy Fork is available in English.

Downloadable Flash Games | NewGrounds.com | ArmorGames.com | Kongregate.com and more!

creates download button for flash games websites. (If game isn't flash game or game file doesn't found, then downloading will not work)

// ==UserScript==
// @name Downloadable Flash Games | NewGrounds.com | ArmorGames.com | Kongregate.com and more!
// @namespace -
// @version 1.3.0
// @description creates download button for flash games websites. (If game isn't flash game or game file doesn't found, then downloading will not work)
// @author NotYou
// @match *://www.newgrounds.com/portal/view/*
// @match *://armorgames.com/play/*
// @match *://*.y8.com/games/*
// @match *://www.kongregate.com/games/*/*
// @match *://www.silvergames.com/*/*
// @match *://www.nitrome.com/games/*
// @match *://www.miniplay.com/game/*
// @match *://frivez.com/*
// @match *://www.twoplayergames.org/game/*
// @run-at document-end
// @license GPL-3.0-or-later
// @icon data:image/jpg;base64,/9j/4AAQSkZJRgABAQEAAAAAAAD/4QBCRXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAkAAAAMAAAABAAAAAEABAAEAAAABAAAAAAAAAAAAAP/bAEMACwkJBwkJBwkJCQkLCQkJCQkJCwkLCwwLCwsMDRAMEQ4NDgwSGRIlGh0lHRkfHCkpFiU3NTYaKjI+LSkwGTshE//bAEMBBwgICwkLFQsLFSwdGR0sLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLP/AABEIAdoB2gMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AMu6ZvtEvP8Ac7D+4Kh3P6/oKlu/+PiX/gH/AKAKgrwnuftUPhQ7c/r+go3P6/oKbRSLHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FG5/X9BTaKAHbn9f0FP3P6/oKip9A0SXf/HxL/wD/wBAFQVPd/8AHxL/AMA/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACn0yn0DRJd/8fEv/AP/AEAVBU93/wAfEv8AwD/0AVBTe5nD4UFFFFIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKfTKfQNEl3/x8S/8A/8AQBUFT3f/AB8S/wDAP/QBUFN7mcPhQUUUUiwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAp9Mp9A0SXf/HxL/wD/wBAFQVPd/8AHxL/AMA/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo+v600yRL96RB9WFMmUlH4nYdRURubUdZk/A5pv2u0/56r+tPll2MHiqC3mvvRPRRRUnQFFFFAwooooAKKKKACiiigAooooAKfTKfQNEl3/x8S/8A/8AQBUFT3f/AB8S/wDAP/QBUFN7mcPhQUUUUiwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKgmuoIeCdz/wB1eT+JppN6Iyq1oUY89R2RPUck8EX35FB9Op/IVly3txLkA7F9F6/iarV0RofzHzeJ4gjHShG/m/8AL/hjSfUlGRHGT7ucD8hVZ727fo4UeiDH61WordU4roeDWzTFVt5temn5Dmklb7zufqxptFFWefKTk7ydwoHUfUfzooHUfUfzpiW50I6L9B/KigdF+g/lRXln6utgooooGFFFFABRRRQAUUUUAFFFFABT6ZT6Boku/wDj4l/4B/6AKgqe7/4+Jf8AgH/oAqCm9zOHwoKKKKRYUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUjukalnYKo7mo5544F3Ock/dUdWNZE08s7bnPH8KjotbU6bnr0PHzDNKeDXKtZ9u3qWLi+kkysWUTuf4jVKiiuyMVFWR8PiMTVxMueq7hRRRVHOFFFFABRRRQAUDqPqP50UDqPqP50AtzoR0X6D+VFA6L9B/KivLP1dbBRRRQMKKKKACiiigAooooAKKKKACn0yn0DRJd/8AHxL/AMA/9AFQVPd/8fEv/AP/AEAVBTe5nD4UFFFFIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqG4uEt0yeXP3F9fc06eZIELt16KO7GsWSR5XZ3OSfyA9BW1OnzavY8PNczWEj7On8b/AA8/8hJJHlYu5yx/IewptFFdux8JKTk3KTu2FFFFMQUUUUAFFFFABRRRQAUDqPqP50UDqPqP50AtzoR0X6D+VFA6L9B/KivLP1dbBRRRQMKKKKACiiigAooooAKKKKACn0yn0DRJd/8AHxL/AMA/9AFQVPd/8fEv/AP/AEAVBTe5nD4UFFFFIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACkZlRWdjhVGSaWsu+uPMbykPyIfmx/E3/ANatIQ53Y4MfjI4Ok6j36LzK887zyFzwo4RfQVFRRXelZWR+c1Kkqs3Obu2FFFFMgKKKKACiiigAooooAKKfHFLKcRoWPt0H1NXI9OkP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QAUUUUAFFFFABRRRQAUUUUAFWLL/AI+Yf+BfyNV6sWX/AB8w/wDAv5Gon8LOvA/7zT/xL8zZooorzj9NCiiigAooooAKKKKACiiigAooooAKKKKACiiigAp9Mp9A0SXf/HxL/wAA/wDQBUFT3f8Ax8S/8A/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiioLubyYWIPzv8AKn1Pemld2RlWqxo03UnsjOvZvNmIB+SP5F+vc1Woor0YrlVkfmVetKvUlVluwoooqjEKKKKACiiigAoq/BYpJEkjsylskAY6dql/s2D/AJ6SfpWTqxTsevTyfF1Iqajo/My6K1P7Ng/56SfpR/ZsH/PST9KXtoF/2HjOy+9GXRWp/ZsH/PST9KP7Ng/56SfpR7aAf2HjOy+9GXRWp/ZsH/PST9KP7Ng/56SfpR7aAf2HjOy+9GXViy/4+Yf+BfyNXP7Ng/56SfpT4rKKGRZFdyVzgHGOeKmVWLTR0YXJ8VTrQnJKyae/mWqKKK4z7YKKKKACiiigAooooAKKKKACiiigAooooAKKKKACn0yn0DRJd/8AHxL/AMA/9AFQVPd/8fEv/AP/AEAVBTe5nD4UFFFFIsKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKxbufzpSR9xPlT/Grt/cbE8lT87j5sdl/+vWXXXRh9pnx+e47mf1aD0W/r2Ciiiuk+XCiiigAooooAKkhjMsscY/iPP0HWo60tOiwrzEct8qfQdTWdSXLG53ZfhvrWIjT6bv0L4AAAHQAAfQUUUV55+khRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAp9Mp9A0SXf/HxL/wD/wBAFQVPd/8AHxL/AMA/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKjnmWCMu3Xoo9TT3dI1Z3OFUZJrFuJ2ncseFHCL6CtadPnfkeRmeYLB07R+N7f5kbu0jM7HLMcmm0UV3H5+25O73CiiimIKKKKACiiigByI0joi9WIAreRFjREXooAH4VQ06H707D/ZT+prQrjrSu7H2+RYT2VH20t5fl/wf8gooornPoQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAp9Mp9A0SXf/HxL/wAA/wDQBUFT3f8Ax8S/8A/9AFQU3uZw+FBRRRSLCiiigAooooAKKKKACiiigAooooAKKKKACiiigApHdEUu5AUckmmyzRQruc49B3J9hWRcXMlw3PCD7qjoPc+9a06bn6HlZhmVPBxtvLov8xbm5a4bjIjU/Kvr7mq9FFdySSsj4GtWnXm6lR3bCiiimZBRRRQAUUUUAFOjjaV0jXqxx9B3NNrTsINqmZh8zjCey+v41E5cqud2AwjxddU+nX0LqIsaIi/dUACloorzz9IjFRVlsFFFFIoKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKfTKfQNEl3/x8S/8AAP8A0AVBU93/AMfEv/AP/QBUFN7mcPhQUUUUiwooooAKKKKACiiigAooooAKKKKACimPLDH9+RV+p5/KqsmoxLkRqXPqeF/xq4wlLZHJXxlDDr95NL8/uLtU576OPKxYd/X+EVQluZ5vvthf7q8LUNdEKFtZHzOMz6Uvdw6t5vf5IdJJJKxd2LMfXt9KbRRXRsfMyk5Pmk7sKKKKYgooooAKKKKACiilVWZlVRlmOAPegEm3ZE1rAZ5Qv8C8ufb0raAAAAGABgD2qK3hWCMIPvHlz6mpa4Kk+Zn6FleB+qUfe+J7/wCXyCiiisj1gooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKfTKfQNEl3/wAfEv8AwD/0AVBU93/x8S/8A/8AQBUFN7mcPhQUUUUiwooooAKKKKACiiigAooooAbISI5COCFYj8qwzNOw+aSQ/VjW5L/q5f8Acb+VYFdVBaM+R4hnKMoJPowooorqPlQooooAKKKKACiiigAooooAKKKKACtSytvLAlkHzsPlB/hU1DZWu4iaQfKOUU/xH1Nadctap9lH1uS5ba2Jqr0X6/5feFFFFcp9WFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAU+mU+gaJLv8A4+Jf+Af+gCoKnu/+PiX/AIB/6AKgpvczh8KCiiikWFFFFABRRRQAUUUU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
// @grant GM.xmlHttpRequest
// ==/UserScript==

(function() {
    class NewGrounds {
        static init() {
            const RE_SWF = /:(\\.*?.swf)/
            const SCRIPT = document.querySelector('#outer-skin script[src] + script')
            const SWF = SCRIPT.textContent.match(RE_SWF)[1]
            const GAME_HEADER = document.querySelector('#embed_header > div span ~ span')

            if(GAME_HEADER) {
                GAME_HEADER.insertAdjacentHTML(
                    'afterend',
                    '<span><a class="icon-download" href="'+ SWF +'" title="Download" rel="nofollow noreferrer">Download</a></span>'
                )
            }
        }
    }

    class ArmorGames {
        static init() {
            const SWF = document.querySelector('[value*=".swf"]').value
            const HEADER = document.querySelector('.game-header h1')
            const LINK = document.createElement('a')

            LINK.href = SWF
            LINK.style.cssText = 'position: relative; top: 13px; left: 4px; height: 18px;'
            LINK.innerHTML = '<i style="background-image: url(../../images/sprites/sprites.png);background-position: -256px -120px;width: 19px;height: 18px;display: block;"></i>'

            HEADER.style.display = 'flex'
            HEADER.appendChild(LINK)
        }
    }

    class Y8 {
        static init() {
            let swf

            const ITEM_CONTAINER = document.querySelector('#item-container')

            if(ITEM_CONTAINER) {
                const ASYNC_CONTENT = ITEM_CONTAINER.dataset.asyncContent

                try {
                    swf = ASYNC_CONTENT.match(/src=['"](.*?\.swf)\?.*['"]/)[1]
                } catch(_) {
                    swf = document.querySelector('[value*=".swf"]').value
                }
            }


            const BTN = document.createElement('a')
            BTN.rel = 'nofollow noreferrer'
            BTN.href = swf
            BTN.className = 'button button--light-grey'
            BTN.style.marginLeft = '7px'

            const ICON = document.createElement('img')
            ICON.src = 'https://www.svgrepo.com/download/507480/arrow-down-alt.svg' // Icon licensed under "MIT License", author "scarlab"
            ICON.style.width = '16px'

            const TEXT = document.createElement('span')
            TEXT.style.marginLeft = '7px'
            TEXT.textContent = 'Download'

            BTN.appendChild(ICON)
            BTN.appendChild(TEXT)

            const BTNS_LIST = document.querySelector('#details .fav-part')
            BTNS_LIST.appendChild(BTN)
        }
    }

    class Kongregate {
        static init() {
            const DL = document.createElement('li')
            DL.id = 'quicklinks_download_block'
            DL.className = 'save lbOn'
            DL.innerHTML = '<a href="#!" style="padding: 0;"><i class="kong_ico prs">d</i><span>Download</span></a>'

            const RE_IFRAME = /iframe_url['"]:['"](.*?)['"]/
            const GAME_SCRIPT = document.querySelector('#gameiframe + script')
            const FETCH_URL = GAME_SCRIPT.textContent.match(RE_IFRAME)[1]

            const BTN_TEXT = DL.querySelector('span')
            let prevText = ''

            console.log(FETCH_URL)

            DL.addEventListener('click', () => {
                prevText = BTN_TEXT.textContent
                BTN_TEXT.textContent = 'Downloading'
                DL.style.pointerEvents = 'none'

                GM.xmlHttpRequest({
                    method: 'GET',
                    url: FETCH_URL,
                    onload: function(res) {
                        const CONTENT = res.responseText
                        const DOC = new DOMParser().parseFromString(CONTENT, 'text/html')
                        const RE_SWF = /swf_location = ['"](.*?)['"];/
                        const GAME_FRAME_SCRIPT= DOC.querySelector('#game_wrapper + script + script')
                        const SWF = GAME_FRAME_SCRIPT.textContent.match(RE_SWF)[1]

                        console.log(SWF)

                        openUrl(SWF)

                        DL.style.pointerEvents = ''
                        BTN_TEXT.textContent = prevText
                    }
                })
            })

            if(FETCH_URL.includes('konggames.com/games/')) {
                const QUICK_LINKS = document.querySelector('#quicklinks')

                QUICK_LINKS.appendChild(DL)
            }
        }
    }

    class SilverGames {
        static init() {
            const GSTAT = document.querySelector('#gstat')
            const GAME_ID = GSTAT.dataset.id
            const FETCH_URL = 'https://f.silvergames.com/emu/waffle/?id=' + GAME_ID
            const DL = document.createElement('a')

            DL.href = '#!'
            DL.style.cssText = 'margin-left: 8px;font-size: large;'
            DL.textContent = '(Download)'

            let prevText = ''

            DL.addEventListener('click', () => {
                DL.style.pointerEvents = 'none'
                prevText = DL.textContent
                DL.textContent = '(Downloading)'

                GM.xmlHttpRequest({
                    method: 'GET',
                    url: FETCH_URL,
                    onload: function(res) {
                        const CONTENT = res.responseText
                        const DOC = new DOMParser().parseFromString(CONTENT, 'text/html')
                        const RE_SWF = /swf[u|U]rl: ['"](.*?)['"]/
                        const SCRIPT = DOC.querySelector('head script')
                        const SWF = SCRIPT.textContent.match(RE_SWF)[1]

                        openUrl(SWF)

                        DL.style.pointerEvents = ''
                        DL.textContent = prevText
                    }
                })
            })

            const HEADER = document.querySelector('h2')
            HEADER.appendChild(DL)
        }
    }

    class Nitrome {
        static init() {
            const GAME = document.title.split(' - ')[0]
            const GAME_FILENAME = GAME.replace(/[\s-]/g, '_')
            const GAME_NAME = GAME.replace(/\-/g, ' ')
            const DL = document.createElement('a')
            DL.style.height = '16px'
            DL.style.display = 'inline-block'

            DL.title = `Download ${GAME}\n\nIcon licensed under Attribution 4.0 International (CC BY 4.0); https://creativecommons.org/licenses/by/4.0/`
            DL.target = '_blank'
            DL.href = `https://archive.org/download/all_nitrome_games/${encodeURIComponent(GAME_NAME)}/${encodeURIComponent(GAME_FILENAME)}.swf`
            DL.innerHTML = '<img src="https://icons.iconarchive.com/icons/famfamfam/mini/16/arrow-down-icon.png" style="position: relative;top: 2px;">'

            const TOP_BAR_BOX = document.querySelector('#top_bar_box')

            TOP_BAR_BOX.appendChild(DL)
        }
    }

    class MiniPlay {
        static init() {
            const DL = document.createElement('div')
            const GAME_HEADER = document.querySelector('h1[itemprop="name"]')
            const GAME_NAME = GAME_HEADER.textContent.toLowerCase().replace(/[^\w\d]/g, '')
            DL.innerHTML = '<a target="_blank" href="https://www.minijuegosgratis.com/flash1234/no_hotlink/' + GAME_NAME + '.swf"><span class="ic ic-mb-download"></span></a>'

            const GAME_ACTIONS_WRAPPER = document.querySelector('.game-actions-wrapper')

            GAME_ACTIONS_WRAPPER.appendChild(DL)
        }
    }

    class FrivEZ {
        static init() {
            const DL = document.createElement('button')
            DL.className = 'btn btn-link ml-3 p-0'

            const SWF = `https://frivez.com/games${location.pathname}.swf`

            DL.innerHTML = `<a target="_blank" href="${SWF}"><i class="far fa-save h5"></i></a>`

            const FLASH_IFRAME = document.querySelector('iframe[src*="flash"]')

            if(FLASH_IFRAME) {
                const LEFT_TEXT = document.querySelector('.container .text-left')

                LEFT_TEXT.appendChild(DL)
            }
        }
    }

    class TwoPlayerGames {
        static init() {
            const RE_SWF = /d['"]:['"](h.*?.swf)['"]/
            const SCRIPT = document.querySelector('script[defer] + script[src] + script')
            const SWF = SCRIPT.textContent.match(RE_SWF)[1]
            const DL = document.createElement('div')

            DL.innerHTML = `<a rel="nofollow noreferrer" target="_blank" href="${SWF}" style="display: flex;background: rgb(192, 183, 152);padding: 2px 8px 2px 5px;border-radius: 10px;"><img src="https://api.iconify.design/material-symbols:arrow-downward-rounded.svg"> Download</a>`

            const GAME_PAGE_LIKE = document.querySelector('.game-page-social')
            GAME_PAGE_LIKE.appendChild(DL)
        }
    }

    const DOMAIN_DATA = {
        NewGrounds: 'www.newgrounds.com',
        ArmorGames: 'armorgames.com',
        Y8: 'y8.com',
        Kongregate: 'www.kongregate.com',
        SilverGames: 'www.silvergames.com',
        Nitrome: 'www.nitrome.com',
        MiniPlay: 'www.miniplay.com',
        FrivEZ: 'frivez.com',
        TwoPlayerGames: 'www.twoplayergames.org'
    }

    class Main {
        static init() {
            const CLASSES = [
                NewGrounds,
                ArmorGames,
                Y8,
                Kongregate,
                SilverGames,
                Nitrome,
                MiniPlay,
                FrivEZ,
                TwoPlayerGames
            ]

            for (let i = 0; i < CLASSES.length; i++) {
                const CLASS = CLASSES[i]
                const CLASS_NAME = CLASS.name
                const DOMAIN = DOMAIN_DATA[CLASS_NAME]

                if(!DOMAIN) {
                    console.error(CLASS_NAME, 'does not have domain info!')
                    continue
                }

                if(location.host.indexOf(DOMAIN) !== -1) {
                    if(CLASS.init) {
                        try {
                            console.log(CLASS_NAME + '.init is initialized')
                            CLASS.init()
                        } catch(e) {
                            console.error(CLASS_NAME, 'has error', e)
                            continue
                        }
                    } else {
                        console.error(CLASS_NAME, 'does not have `init` method!')
                        continue
                    }
                }
            }
        }
    }

    Main.init()

    function openUrl(url) {
        const LINK = document.createElement('a')
        LINK.href = url
        LINK.rel = 'nofollow noreferrer'
        LINK.target = '_blank'

        document.body.appendChild(LINK)

        LINK.click()

        document.body.removeChild(LINK)
    }
})()