diff --git a/index.js b/index.js index 14e1839b..2d02b3a0 100644 --- a/index.js +++ b/index.js @@ -1,14 +1,14 @@ require('v8-compile-cache'); -const {app, components} = require('electron'), - {resolve, join} = require("path"), +const { app, components } = require('electron'), { resolve, join } = require("path"), CiderBase = require('./src/main/cider-base'); - +const customProtocols = require('./package.json').fileAssociations[0].protocols +console.log(customProtocols) const comps = components; // Analytics for debugging. const ElectronSentry = require("@sentry/electron"); -ElectronSentry.init({dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214"}); +ElectronSentry.init({ dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214" }); const configDefaults = { "general": { @@ -109,23 +109,23 @@ app.paths = { switch (app.cfg.get("visual.hw_acceleration")) { default: - case "default": + case "default": app.commandLine.appendSwitch('enable-accelerated-mjpeg-decode') - app.commandLine.appendSwitch('enable-accelerated-video') - app.commandLine.appendSwitch('disable-gpu-driver-bug-workarounds') - app.commandLine.appendSwitch('ignore-gpu-blacklist') - app.commandLine.appendSwitch('enable-native-gpu-memory-buffers') - app.commandLine.appendSwitch('enable-accelerated-video-decode'); - app.commandLine.appendSwitch('enable-gpu-rasterization'); - app.commandLine.appendSwitch('enable-native-gpu-memory-buffers'); - app.commandLine.appendSwitch('enable-oop-rasterization'); - break; + app.commandLine.appendSwitch('enable-accelerated-video') + app.commandLine.appendSwitch('disable-gpu-driver-bug-workarounds') + app.commandLine.appendSwitch('ignore-gpu-blacklist') + app.commandLine.appendSwitch('enable-native-gpu-memory-buffers') + app.commandLine.appendSwitch('enable-accelerated-video-decode'); + app.commandLine.appendSwitch('enable-gpu-rasterization'); + app.commandLine.appendSwitch('enable-native-gpu-memory-buffers'); + app.commandLine.appendSwitch('enable-oop-rasterization'); + break; case "webgpu": - console.info("WebGPU is enabled."); + console.info("WebGPU is enabled."); app.commandLine.appendSwitch('enable-unsafe-webgpu') break; case "disabled": - console.info("Hardware acceleration is disabled."); + console.info("Hardware acceleration is disabled."); app.commandLine.appendSwitch('disable-gpu') break; } @@ -141,7 +141,7 @@ function CreateWindow() { const ciderwin = require("./src/main/cider-base") app.win = ciderwin app.win.Start() - /** CIDER **/ + /** CIDER **/ } if (process.platform === "linux") { @@ -152,10 +152,10 @@ app.commandLine.appendSwitch('no-sandbox'); // app.commandLine.appendSwitch('js-flags', '--max-old-space-size=1024') /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -* App Event Handlers -* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ + * App Event Handlers + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ -app.whenReady().then(async () => { +app.whenReady().then(async() => { if (process.platform === "win32") { app.commandLine.appendSwitch('high-dpi-support', 'true') app.commandLine.appendSwitch('force-device-scale-factor', '1') @@ -208,25 +208,28 @@ app.on('widevine-error', (error) => { if (process.defaultApp) { if (process.argv.length >= 2) { - app.setAsDefaultProtocolClient('cider', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('ame', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('itms', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('itmss', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('musics', process.execPath, [resolve(process.argv[1])]) - app.setAsDefaultProtocolClient('music', process.execPath, [resolve(process.argv[1])]) + customProtocols.forEach((customProtocol) => { + app.setAsDefaultProtocolClient(customProtocol, process.execPath, [resolve(process.argv[1])]) + }) } } else { - app.setAsDefaultProtocolClient('cider') // Custom AME Protocol - app.setAsDefaultProtocolClient('ame') // Custom AME Protocol - app.setAsDefaultProtocolClient('itms') // iTunes HTTP Protocol - app.setAsDefaultProtocolClient('itmss') // iTunes HTTPS Protocol - app.setAsDefaultProtocolClient('musics') // macOS Client Protocol - app.setAsDefaultProtocolClient('music') // macOS Client Protocol + /* + * cider - Custom Cider Protocol + * ame - Custom AME Protocol (Backwards Compat.) + * itms - iTunes HTTP Protocol + * itmss - iTunes HTTPS Protocol + * musics - macOS Client Protocol + * music - macOS Client Protocol + */ + customProtocols.forEach((customProtocol) => { + app.setAsDefaultProtocolClient(customProtocol) + }) + } app.on('open-url', (event, url) => { event.preventDefault() - if (url.includes('ame://') || url.includes('itms://') || url.includes('itmss://') || url.includes('musics://') || url.includes('music://')) { + if (customProtocols.some(protocol => url.includes(protocol))) { CiderBase.LinkHandler(url) } }) @@ -236,8 +239,7 @@ app.on('second-instance', (_e, argv) => { // Checks if first instance is authorized and if second instance has protocol args argv.forEach((value) => { - if (value.includes('ame://') || value.includes('itms://') || value.includes('itmss://') || value.includes('musics://') || value.includes('music://')) { - console.warn(`[InstanceHandler][SecondInstanceHandler] Found Protocol!`) + if (customProtocols.some(protocol => value.includes(protocol))) { CiderBase.LinkHandler(value); } }) @@ -257,7 +259,4 @@ if (!app.requestSingleInstanceLock() && true) { console.warn("[InstanceHandler] Existing Instance is Blocking Second Instance."); app.quit(); // app.isQuiting = true -} - - - \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/cider-base.js b/src/main/cider-base.js index e3ef443b..4a9f3f86 100644 --- a/src/main/cider-base.js +++ b/src/main/cider-base.js @@ -101,8 +101,9 @@ const CiderBase = { }) win.webContents.session.webRequest.onHeadersReceived((details, callback) => { - if(details.url.match(/^https:\/\/store-\d{3}\.blobstore\.apple\.com/) || details.url.startsWith("https://store-037.blobstore.apple.com")){ - details.responseHeaders['Access-Control-Allow-Origin'] = '*';} + if (details.url.match(/^https:\/\/store-\d{3}\.blobstore\.apple\.com/) || details.url.startsWith("https://store-037.blobstore.apple.com")) { + details.responseHeaders['Access-Control-Allow-Origin'] = '*'; + } callback({ responseHeaders: details.responseHeaders }) }) @@ -338,10 +339,11 @@ const CiderBase = { }, LinkHandler: (startArgs) => { if (!startArgs) return; - console.log("lfmtoken", String(startArgs)) + if (String(startArgs).includes('auth')) { let authURI = String(startArgs).split('/auth/')[1] if (authURI.startsWith('lastfm')) { // If we wanted more auth options + console.log("lfmtoken", String(startArgs)) const authKey = authURI.split('lastfm?token=')[1]; app.cfg.set('lastfm.enabled', true); app.cfg.set('lastfm.auth_token', authKey); @@ -349,15 +351,26 @@ const CiderBase = { lastfm.authenticate() } } else { - const formattedSongID = startArgs.replace('ame://', '').replace('/', ''); - console.warn(`[LinkHandler] Attempting to load song id: ${formattedSongID}`); + if (String(startArgs).includes('/play/')) { //Steer away from protocal:// specific conditionals + const playParam = String(startArgs).split('/play/')[1] + if (playParam.includes('s/')) { // setQueue can be done with album, song, url, playlist id + console.log(playParam) + let song = playParam.split('s/')[1] + console.warn(`[LinkHandler] Attempting to load song by id: ${song}`); + this.win.webContents.executeJavaScript(` + MusicKit.getInstance().setQueue({ song: '${song}'}).then(function(queue) { + MusicKit.getInstance().play(); + }); + `).catch((err) => console.error(err)); + } + + + + } + + + - // setQueue can be done with album, song, url, playlist id - this.win.webContents.executeJavaScript(` - MusicKit.getInstance().setQueue({ song: '${formattedSongID}'}).then(function(queue) { - MusicKit.getInstance().play(); - }); - `).catch((err) => console.error(err)); } }, @@ -427,4 +440,4 @@ const CiderBase = { } -module.exports = CiderBase; +module.exports = CiderBase; \ No newline at end of file diff --git a/src/main/discordrpc.js b/src/main/discordrpc.js index ea1f4467..dfea5769 100644 --- a/src/main/discordrpc.js +++ b/src/main/discordrpc.js @@ -1,4 +1,4 @@ -const {app} = require('electron'), +const { app } = require('electron'), DiscordRPC = require('discord-rpc') module.exports = { @@ -7,16 +7,16 @@ module.exports = { * Connects to Discord RPC * @param {string} clientId */ - connect: function (clientId) { - app.discord = {isConnected: false}; + connect: function(clientId) { + app.discord = { isConnected: false }; if (app.cfg.get('general.discord_rpc') == 0 || app.discord.isConnected) return; DiscordRPC.register(clientId) // Apparently needed for ask to join, join, spectate etc. - const client = new DiscordRPC.Client({transport: "ipc"}); - app.discord = Object.assign(client, {error: false, activityCache: null, isConnected: false}); + const client = new DiscordRPC.Client({ transport: "ipc" }); + app.discord = Object.assign(client, { error: false, activityCache: null, isConnected: false }); // Login to Discord - app.discord.login({clientId}) + app.discord.login({ clientId }) .then(() => { app.discord.isConnected = true; }) @@ -37,7 +37,7 @@ module.exports = { /** * Disconnects from Discord RPC */ - disconnect: function () { + disconnect: function() { if (app.cfg.get('general.discord_rpc') == 0 || !app.discord.isConnected) return; try { @@ -54,7 +54,7 @@ module.exports = { * Sets the activity of the client * @param {object} attributes */ - updateActivity: function (attributes) { + updateActivity: function(attributes) { if (app.cfg.get('general.discord_rpc') == 0) return; if (!app.discord.isConnected) { @@ -64,20 +64,20 @@ module.exports = { // console.log('[DiscordRPC][updateActivity] Updating Discord Activity.') - const listenURL = `https://applemusicelectron.com/p?id=${attributes.playParams.id}` - //console.log(attributes) + const listenURL = `https://applemusicelectron.com/p?id=${attributes.playParams.id}` // cider://play/s/[id] (for song) + //console.log(attributes) let ActivityObject = { details: attributes.name, state: `by ${attributes.artistName}`, startTimestamp: attributes.startTime, endTimestamp: attributes.endTime, - largeImageKey: (attributes.artwork.url.replace('{w}', '1024').replace('{h}', '1024')) ?? 'cider', + largeImageKey: (attributes.artwork.url.replace('{w}', '1024').replace('{h}', '1024')) ? ? 'cider', largeImageText: attributes.albumName, smallImageKey: (attributes.status ? 'play' : 'pause'), smallImageText: (attributes.status ? 'Playing' : 'Paused'), instance: true, buttons: [ - {label: "Listen on Cider", url: listenURL}, + { label: "Listen on Cider", url: listenURL }, ] }; if (ActivityObject.largeImageKey == "" || ActivityObject.largeImageKey == null) {