{"size": 10601, "ext": "js", "max_stars_repo_path": "resources/functions/load.js", "max_stars_repo_name": "fossabot/Apple-Music-Electron", "max_stars_repo_stars_event_min_datetime": null, "max_stars_repo_stars_event_max_datetime": null, "max_issues_repo_path": "resources/functions/load.js", "max_issues_repo_name": "fossabot/Apple-Music-Electron", "max_issues_repo_issues_event_min_datetime": null, "max_issues_repo_issues_event_max_datetime": null, "max_forks_repo_path": "resources/functions/load.js", "max_forks_repo_name": "fossabot/Apple-Music-Electron", "max_forks_repo_forks_event_min_datetime": null, "max_forks_repo_forks_event_max_datetime": null}
{"max_stars_count": null, "max_issues_count": null, "max_forks_count": null, "avg_line_length": 45.1106382979, "max_line_length": 564, "alphanum_fraction": 0.5498537874}
const {join, resolve} = require("path"),
    {app, ipcMain, systemPreferences} = require("electron"),
    {readFile, constants, chmodSync, existsSync, watch} = require("fs"),
    {initAnalytics} = require('./utils');
initAnalytics();

module.exports = {

    LoadCSS: function (path, theme, important) {
        const fileName = path
        if (theme) {
            path = join(app.userThemesPath, path.toLowerCase());
        } else {
            path = join(join(__dirname, '../css/'), path)
        }

        // Check that the file exists
        if (!existsSync(path)) {
            console.warn(`[LoadCSS] ${path} not found.`)
            return
        }

        // Remove previous inject (If there is one)
        if (app.injectedCSS[path]) {
            app.win.webContents.removeInsertedCSS(app.injectedCSS[fileName]).then(r => { if (r) console.error(r); });
        }

        // Get the CSS to inject
        readFile(path, "utf-8", function (error, data) {
            if (error) {
                console.error(`[LoadCSS] Error while injecting: '${path}' - ${error}`)
                try {
                    chmodSync(path, constants.S_IRUSR | constants.S_IWUSR);
                } catch (err) {
                    console.error(`[LoadCSS] ${err}`)
                }
            } else {
                let formattedData = data.replace(/\s{2,10}/g, ' ').trim();
                app.win.webContents.insertCSS(formattedData, {cssOrigin: (important ? 'user' : 'author')}).then((key) => {
                    console.verbose(`[${theme ? 'LoadTheme' : 'LoadCSS'}] '${fileName}' successfully injected.`)
                    app.injectedCSS[fileName] = key
                });
            }
        });
    },

    LoadJS: function (path, formatting = true) {
        const fileName = path;
        path = join(join(__dirname, '../js/'), path)

        readFile(path, "utf-8", function (error, data) {
            if (!error) {
                try {
                    let formattedData = data
                    if (formatting) {
                        formattedData = data.replace(/\s{2,10}/g, ' ').trim();
                    }
                    app.win.webContents.executeJavaScript(formattedData).then(() => {
                        console.verbose(`[LoadJSFile] '${fileName}' successfully injected.`)
                    });
                } catch (err) {
                    console.error(`[LoadJSFile] Error while injecting: '${fileName}' - Error: ${err}`)
                }
            } else {
                console.error(`[LoadJSFile] Error while reading: '${fileName}' - Error: ${error}`)
            }
        });
    },

    LoadWebsite: function (win) {
        if (!win) return;

        app.storefront = app.cfg.get('general.storefront');
        const urlBase = app.cfg.get('advanced.useBetaSite') ? 'https://beta.music.apple.com' : 'https://music.apple.com/' + app.cfg.get('general.storefront'),
            urlFallback = `https://music.apple.com/`;

        ipcMain.once('userAuthorized', (e, args) => {
            app.isAuthorized = true
            console.log(`[LoadWebsite] User Authenticated. Setting page to: ${args}`)
            win.webContents.clearHistory()
        })

        win.loadURL(urlBase).then(() => {
            app.ame.load.LoadJS('checkAuth.js')
        }).catch((err) => {
            win.loadURL(urlFallback).then(() => console.error(`[LoadWebsite] '${urlBase}' was unavailable, falling back to '${urlFallback}' | ${err}`))
        })
    },

    LoadFiles: function () {
        app.ame.load.LoadJS('settingsPage.js');
        if (app.cfg.get('visual.removeAppleLogo')) {
            app.win.webContents.insertCSS(`
            @media only screen and (max-width: 483px) {
                .web-navigation__nav-list {
                        margin-top: 50px;
                    }
                }
            }
            `).catch((e) => console.error(e));
        }

        if (app.cfg.get('visual.useOperatingSystemAccent') && (process.platform === "win32" || process.platform === "darwin")) {
            if (systemPreferences.getAccentColor()) {
                const accent = '#' + systemPreferences.getAccentColor().slice(0, -2)
                app.win.webContents.insertCSS(`
                :root {
                    --keyColor: ${accent} !important;
                    --systemAccentBG: ${accent} !important;
                    --systemAccentBG-pressed: rgba(${app.ame.utils.hexToRgb(accent).r}, ${app.ame.utils.hexToRgb(accent).g}, ${app.ame.utils.hexToRgb(accent).b}, 0.75) !important;
                    --keyColor-rgb: ${app.ame.utils.hexToRgb(accent).r} ${app.ame.utils.hexToRgb(accent).g} ${app.ame.utils.hexToRgb(accent).b} !important;
                }`).then((key) => {
                    app.injectedCSS['useOperatingSystemAccent'] = key
                })
            }
        } else {
            app.ame.win.removeInsertedCSS('useOperatingSystemAccent')
        }

        /* Load Window Frame */
        if (app.cfg.get('visual.frameType') === 'mac') {
            app.ame.load.LoadJS('frame_macOS.js')
        } else if ((app.cfg.get('visual.frameType') === 'mac-right')) {
            app.ame.load.LoadJS('frame_Windows.js')
        } else if (process.platform === 'darwin' && !app.cfg.get('visual.frameType')) {
            app.ame.load.LoadJS('frame_macOS.js')
        } else if (process.platform === 'win32' && !app.cfg.get('visual.frameType')) {
            app.ame.load.LoadJS('frame_Windows.js')
            if (app.win.isMaximized()) {
                app.win.webContents.executeJavaScript(`if (document.querySelector("#maximize")) { document.querySelector("#maximize").classList.add("maxed"); }`).catch((e) => console.error(e));
            }
        }

        const BackButtonChecks = (url) => {
            if (!app.win.webContents.canGoBack()) return false
            const backButtonBlacklist = [`*music.apple.com/*/listen-now*`, `*music.apple.com/*/browse*`, `*music.apple.com/*/radio*`, `*music.apple.com/*/search*`, `*music.apple.com/library/recently-added?l=*`, `*music.apple.com/library/albums?l=*`, `*music.apple.com/library/songs?l=*`, `*music.apple.com/library/made-for-you?l=*`, `*music.apple.com/library/recently-added`, `*music.apple.com/library/albums`, `*music.apple.com/library/made-for-you`, `*music.apple.com/library/songs*`, `*music.apple.com/library/artists/*`, `*music.apple.com/library/playlist/*`];
            let blacklistPassed = true
            backButtonBlacklist.forEach((item) => {
                if (!blacklistPassed) return;
                if (app.ame.utils.matchRuleShort(url, item) || url === item) {
                    blacklistPassed = false
                }
            });
            return blacklistPassed
        }

        /* Load Back Button */
        if (BackButtonChecks(app.win.webContents.getURL())) {
            app.ame.load.LoadJS('backButton.js')
            app.win.webContents.executeJavaScript(`document.body.setAttribute('back-button', 1)`)
        } else { /* Removes the button if the check failed. */
            app.win.webContents.executeJavaScript(`if (document.querySelector('#backButtonBar')) { document.getElementById('backButtonBar').remove() };`).catch((e) => console.error(e));
            app.win.webContents.executeJavaScript(`document.body.removeAttribute('back-button')`)
        }

        /* Load the Startup JavaScript Function */
        app.win.webContents.executeJavaScript('if (AMJavaScript) { AMJavaScript.LoadCustom(); }').catch((e) => console.error(e));
    },

    LoadOneTimeFiles: function () {
        // Inject the custom stylesheet
        app.ame.load.LoadCSS('custom-stylesheet.css')       
        app.ame.load.LoadCSS('ameframework.css')

        // Inject Plugin Interaction
        if (app.pluginsEnabled) {
            app.ame.load.LoadJS('pluginSystem.js', false)
        }
        // Load this first so it doesn't stuck
        app.ame.load.LoadJS('OpusMediaRecorder.umd.js')
        app.ame.load.LoadJS('encoderWorker.umd.js')
        

        // Lyrics
        app.ame.load.LoadJS('lyrics.js')

        // Vue Test
        app.ame.load.LoadJS('vue.js')
        app.ame.load.LoadJS('utils.js', false)
        app.ame.load.LoadJS('tests.js', false)

        // Bulk JavaScript Functions
        app.ame.load.LoadJS('custom.js')

        // Audio Manuipulation Stuff

        app.ame.load.LoadJS('eq.js')


        // Window Frames
        if (app.cfg.get('visual.frameType') === 'mac') {
            app.ame.load.LoadCSS('frame_macOS_emulation.css')
        } else if (app.cfg.get('visual.frameType') === 'mac-right') {
            app.ame.load.LoadCSS('frame_macOS_emulation_right.css')
        } else if (process.platform === 'win32' && !app.cfg.get('visual.frameType')) {
            app.ame.load.LoadCSS('frame_Windows.css')
        }

        // Set the settings variables if needed
        if (app.cfg.get('visual.frameType') === 'mac' || app.cfg.get('visual.frameType') === 'mac-right') {
            app.cfg.set('visual.removeUpsell', true);
            app.cfg.set('visual.removeAppleLogo', true);
        }

        // Streamer Mode
        if (app.cfg.get('visual.streamerMode')) {
            app.ame.load.LoadCSS('streamerMode.css')
        }

        /* Remove the Scrollbar */
        if (app.cfg.get('visual.removeScrollbars')) {
            app.win.webContents.insertCSS('::-webkit-scrollbar { display: none; }').then()
        } else {
            app.ame.load.LoadCSS('macosScrollbar.css')
        }

        /* Inject the MusicKitInterop file */
        app.win.webContents.executeJavaScript('MusicKitInterop.init()').catch((e) => console.error(e));

        /* Watches for changes to a theme */
        if (app.watcher) {
            app.watcher.close();
            console.verbose('[Watcher] Removed old watcher.')
        }

        if (existsSync(resolve(app.getPath('userData'), 'themes', `${app.cfg.get('visual.theme')}.css`)) && app.cfg.get('visual.theme') !== "default" && app.cfg.get('visual.theme')) {
            app.watcher = watch(resolve(app.getPath('userData'), 'themes', `${app.cfg.get('visual.theme')}.css`), (event, fileName) => {
                if (event === "change" && fileName === `${app.cfg.get('visual.theme')}.css`) {
                    app.win.webContents.executeJavaScript(`AMStyling.loadTheme("${app.cfg.get('visual.theme')}", true);`).catch((err) => console.error(err));
                }
            });
            console.verbose(`[Watcher] Watching for changes: 'themes/${app.cfg.get('visual.theme')}.css'`)
        }
    }
}