From 15eb3e19c274ef995a186b193cd4fcb7c69b096c Mon Sep 17 00:00:00 2001 From: vapormusic Date: Tue, 11 Jan 2022 10:37:46 +0700 Subject: [PATCH 01/64] fix the vids --- index.js | 3 ++- src/renderer/apple-hls.js | 31 +++++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index afe9bb0f..ec5df2e4 100644 --- a/index.js +++ b/index.js @@ -55,7 +55,8 @@ const configDefaults = { "animated_artwork_qualityLevel": 1, "bg_artwork_rotation": false, "hw_acceleration": "default", // default, webgpu, disabled - "window_transparency": "disabled" + "window_transparency": "disabled", + "videoRes": 720 }, "lyrics": { "enable_mxm": false, diff --git a/src/renderer/apple-hls.js b/src/renderer/apple-hls.js index e4936dda..04c84e2c 100644 --- a/src/renderer/apple-hls.js +++ b/src/renderer/apple-hls.js @@ -23260,9 +23260,36 @@ } if (null != (l = "string" != typeof (h = g.pathwayID) ? im("invalid steering manifest PATHWAY-PRIORITY list item data type") : /^[\w\-\.]+$/.test(h) ? void 0 : im("steering manifest contains invalid pathway ID: " + h))) break; - if (g.hdcpLevel === "NONE"){ - n.push(g)} + let cpc = g.allowedCPCMap ? JSON.stringify(g.allowedCPCMap) : "null"; + if (!cpc.includes("WIDEVINE_HARDWARE") && !g.url.includes('trickPlay')) + n.push(g) } + + + + try{ + // console.log(n, window.screen.width) + let ok = (n.map( function(item){return{height : item.height, content: item}})); + let screenHeight = (app.cfg.visual.videoRes ?? window.screen.height) ; + ok.sort(function (a, b) { + return a.height - b.height; + }); + for (var i = 0; i < ok.length; i++){ + if (ok[i].height > screenHeight){ + if (i == 0){n.splice(0,n.length);n.push(ok[i].content)} + else{n.splice(0,n.length);n.push(ok[i-1].content)} + console.log('selected' , n[0].height) + break; + + } + + } + if (n.length > 1){ + n.splice(0,n.length - 1); + } + // console.log(n) + // console.log(ok) + } catch (e){ console.log(e)} return { variantMediaOptions: n, contentSteeringOption: u, From 80a9d79098ce5972c8a11cb7b4dc3f3d87486b81 Mon Sep 17 00:00:00 2001 From: child_duckling <19170969+child-duckling@users.noreply.github.com> Date: Mon, 10 Jan 2022 20:48:02 -0800 Subject: [PATCH 02/64] mdns/.local address prep + qrcode for remote url? --- package.json | 2 ++ src/main/cider-base.js | 59 ++++++++++++++++++++++++++++-------------- 2 files changed, 42 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index ba6be5af..b7a01f64 100644 --- a/package.json +++ b/package.json @@ -33,8 +33,10 @@ "express": "^4.17.2", "get-port": "^5.1.1", "lastfmapi": "^0.1.1", + "mdns": "^2.7.2", "mpris-service": "^2.1.2", "music-metadata": "^7.11.4", + "qrcode-terminal": "^0.12.0", "react": "^17.0.2", "react-dom": "^17.0.2", "source-map-support": "^0.5.21", diff --git a/src/main/cider-base.js b/src/main/cider-base.js index eedbad50..78e38251 100644 --- a/src/main/cider-base.js +++ b/src/main/cider-base.js @@ -12,6 +12,8 @@ const { writeFile, writeFileSync, existsSync, mkdirSync } = require('fs'); const fs = require('fs'); const mpris = require('./mpris'); const mm = require('music-metadata'); +const mdns = require('mdns') +const qrcode = require('qrcode-terminal') const fetch = require('electron-fetch').default; const { Stream } = require('stream'); @@ -30,7 +32,7 @@ const CiderBase = { clientPort: 0, CreateBrowserWindow() { this.VerifyFiles() - // Set default window sizes + // Set default window sizes const mainWindowState = windowStateKeeper({ defaultWidth: 1024, defaultHeight: 600 @@ -84,8 +86,7 @@ const CiderBase = { } // intercept "https://js-cdn.music.apple.com/hls.js/2.141.0/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead - win.webContents.session.webRequest.onBeforeRequest( - { + win.webContents.session.webRequest.onBeforeRequest({ urls: ["https://*/*.js"] }, (details, callback) => { @@ -101,7 +102,7 @@ const CiderBase = { } ) - win.webContents.session.webRequest.onBeforeSendHeaders(async (details, callback) => { + win.webContents.session.webRequest.onBeforeSendHeaders(async(details, callback) => { if (details.url === "https://buy.itunes.apple.com/account/web/info") { details.requestHeaders['sec-fetch-site'] = 'same-site'; details.requestHeaders['DNT'] = '1'; @@ -184,7 +185,7 @@ const CiderBase = { event.returnValue = JSON.parse(libraryRecentlyAdded) }) - ipcMain.handle('getYTLyrics', async (event, track, artist) => { + ipcMain.handle('getYTLyrics', async(event, track, artist) => { var u = track + " " + artist + " official video"; const videos = await yt.search(u); return videos @@ -222,7 +223,7 @@ const CiderBase = { win.minimize(); }) - ipcMain.on('setFullScreen',(event, flag) => { + ipcMain.on('setFullScreen', (event, flag) => { win.setFullScreen(flag) }) @@ -259,8 +260,7 @@ const CiderBase = { if (url.includes("apple") || url.includes("localhost")) { return { action: "allow" } } - shell.openExternal(url).catch(() => { - }) + shell.openExternal(url).catch(() => {}) return { action: 'deny' } @@ -276,7 +276,7 @@ const CiderBase = { mpris.connect(win) lastfm.authenticate() - // Discord + // Discord discord.connect((app.cfg.get("general.discord_rpc") == 1) ? '911790844204437504' : '886578863147192350'); ipcMain.on('playbackStateDidChange', (_event, a) => { app.media = a; @@ -297,7 +297,7 @@ const CiderBase = { ipcMain.on("getPreviewURL", (_event, url) => { fetch(url) .then(res => res.buffer()) - .then(async (buffer) => { + .then(async(buffer) => { try { const metadata = await mm.parseBuffer(buffer, 'audio/x-m4a'); SoundCheckTag = metadata.native.iTunes[1].value @@ -308,7 +308,7 @@ const CiderBase = { }) }); - ipcMain.on('writeAudio', function (event, buffer) { + ipcMain.on('writeAudio', function(event, buffer) { CiderBase.audiostream.write(Buffer.from(buffer)); }) @@ -374,20 +374,41 @@ const CiderBase = { const webRemotePath = path.join(__dirname, '../renderer/'); webapp.set("views", path.join(webRemotePath, "views")); webapp.set("view engine", "ejs"); - - webapp.use(function (req, res, next) { + let firstRequest = true + //const webRemoteMDNS = mdns.createAdvertisement(mdns.tcp('https'), 9000, { name: "cider", domain: 'local' }) + //webRemoteMDNS.start() + //* Prep for remote -quack + webapp.use(function(req, res, next) { // if not localhost if (req.url.includes("audio.webm") || (req.headers.host.includes("localhost") && req.headers["user-agent"].includes("Cider"))) { next(); + + } else { + console.log(req.get('host')) + res.redirect("https://discord.gg/applemusic") } }); - webapp.use(express.static(webRemotePath)); - webapp.get('/', function (req, res) { + webapp.get('/', function(req, res) { + //if (!req.headers["user-agent"].includes("Cider")) //res.sendFile(path.join(webRemotePath, 'index_old.html')); + if (firstRequest) { + console.log("---- Ignore Me ;) ---") + qrcode.generate(`http://${os.hostname}:9000`) //Prep for remote + console.log("---- Ignore Me ;) ---") + /* + * + * USING https://www.npmjs.com/package/qrcode-terminal for terminal + * WE SHOULD USE https://www.npmjs.com/package/qrcode for the remote (or others) + * -quack + */ + } + firstRequest = false + res.render("main", CiderBase.EnvironmentVariables) }); - webapp.get('/audio.webm', function (req, res) { + webapp.get('/audio.webm', function(req, res) { + console.log('hi') try { req.connection.setTimeout(Number.MAX_SAFE_INTEGER); // CiderBase.requests.push({req: req, res: res}); @@ -406,11 +427,11 @@ const CiderBase = { }) } catch (ex) { console.log(ex) } }); - webapp.listen(CiderBase.clientPort, function () { - console.log(`Cider client port: ${CiderBase.clientPort}`); + webapp.listen(CiderBase.clientPort, function() { + console.log(`Cider hosted on: ${CiderBase.clientPort}`); }); }, } -module.exports = CiderBase; +module.exports = CiderBase; \ No newline at end of file From 6861246a825080658e7056e54a238e72421ce3d3 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Tue, 11 Jan 2022 11:57:31 +0700 Subject: [PATCH 04/64] no hevc please --- src/renderer/apple-hls.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/apple-hls.js b/src/renderer/apple-hls.js index 04c84e2c..1f920850 100644 --- a/src/renderer/apple-hls.js +++ b/src/renderer/apple-hls.js @@ -23261,7 +23261,7 @@ if (null != (l = "string" != typeof (h = g.pathwayID) ? im("invalid steering manifest PATHWAY-PRIORITY list item data type") : /^[\w\-\.]+$/.test(h) ? void 0 : im("steering manifest contains invalid pathway ID: " + h))) break; let cpc = g.allowedCPCMap ? JSON.stringify(g.allowedCPCMap) : "null"; - if (!cpc.includes("WIDEVINE_HARDWARE") && !g.url.includes('trickPlay')) + if (!cpc.includes("WIDEVINE_HARDWARE") && !g.url.includes('trickPlay') && !g.videoCodec.includes("hvc1")) n.push(g) } From cc38b924f76eebc92cc065e74addfc549b288a54 Mon Sep 17 00:00:00 2001 From: child_duckling <19170969+child-duckling@users.noreply.github.com> Date: Mon, 10 Jan 2022 21:01:18 -0800 Subject: [PATCH 05/64] linux build worki pls --- package.json | 1 - src/main/cider-base.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index b7a01f64..d930a0ca 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "express": "^4.17.2", "get-port": "^5.1.1", "lastfmapi": "^0.1.1", - "mdns": "^2.7.2", "mpris-service": "^2.1.2", "music-metadata": "^7.11.4", "qrcode-terminal": "^0.12.0", diff --git a/src/main/cider-base.js b/src/main/cider-base.js index 78e38251..cf900b06 100644 --- a/src/main/cider-base.js +++ b/src/main/cider-base.js @@ -12,7 +12,7 @@ const { writeFile, writeFileSync, existsSync, mkdirSync } = require('fs'); const fs = require('fs'); const mpris = require('./mpris'); const mm = require('music-metadata'); -const mdns = require('mdns') +//const mdns = require('mdns') const qrcode = require('qrcode-terminal') const fetch = require('electron-fetch').default; const { Stream } = require('stream'); From 6135c145457fe327e6213e2d1e6bb887ce4dfdf9 Mon Sep 17 00:00:00 2001 From: yazninja <71800112+yazninja@users.noreply.github.com> Date: Tue, 11 Jan 2022 14:11:30 +0800 Subject: [PATCH 07/64] Fix Acrylic v2 Don't nuke pls --- src/main/cider-base.js | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/cider-base.js b/src/main/cider-base.js index cf900b06..445b2d9e 100644 --- a/src/main/cider-base.js +++ b/src/main/cider-base.js @@ -73,14 +73,13 @@ const CiderBase = { if (process.platform === "darwin" || process.platform === "linux") { win = new BrowserWindow(options) } else { - // i don't know why but we have to do this for acrylic to work properly - if (app.cfg.get("visual.window_transparency") !== "disabled") { + if (app.cfg.get("visual.window_transparency") !== "disabled") { const { BrowserWindow } = require("electron-acrylic-window"); win = new BrowserWindow(options) - win.setVibrancy("dark") - } else { + win.setVibrancy("#59202700") // when out of focus, fills with #592027, 00 is aplha values + } + else{ win = new BrowserWindow(options) - win.setVibrancy("dark") } } @@ -434,4 +433,4 @@ const CiderBase = { } -module.exports = CiderBase; \ No newline at end of file +module.exports = CiderBase; From 6ba500596da875d3836135ee290426b91814596a Mon Sep 17 00:00:00 2001 From: vapormusic Date: Tue, 11 Jan 2022 13:32:36 +0700 Subject: [PATCH 08/64] fix #108 --- src/main/cider-base.js | 6 ++++++ src/renderer/index.js | 18 ++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/main/cider-base.js b/src/main/cider-base.js index cf900b06..0951da33 100644 --- a/src/main/cider-base.js +++ b/src/main/cider-base.js @@ -113,6 +113,12 @@ const CiderBase = { callback({ requestHeaders: details.requestHeaders }) }) + 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'] = '*';} + callback({ responseHeaders: details.responseHeaders }) + }) + let location = `http://localhost:${CiderBase.clientPort}/` win.loadURL(location) win.on("closed", () => { diff --git a/src/renderer/index.js b/src/renderer/index.js index 215705f3..c59afa07 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -2367,10 +2367,9 @@ const app = new Vue({ } let query = app.library.songs.listing.map(item => new MusicKit.MediaItem(item)); - try { - app.mk.stop() - } catch (e) { - } + + + app.mk.stop().then(() => { this.mk.clearQueue().then(function (_) { if (app.mk.shuffleMode == 1){ shuffleArray(query)} app.mk.queue.append(query) @@ -2385,6 +2384,7 @@ const app = new Vue({ app.mk.play() } }) + }) } else { app.mk.stop().then(() => { if (truekind == "playlists" && (id.startsWith("p.") || id.startsWith("pl.u"))){ @@ -2392,15 +2392,13 @@ const app = new Vue({ app.mk.changeToMediaAtIndex(app.mk.queue._itemIDs.indexOf(item.id) ?? 1).then(function(){ if ((app.showingPlaylist && app.showingPlaylist.id == id)) { let query = app.showingPlaylist.relationships.tracks.data.map(item => new MusicKit.MediaItem(item)); - if (query.length > 100) { - let u = query.slice(100); if (app.mk.shuffleMode == 1) { shuffleArray(u) } - app.mk.queue.append(u)} + let u = query; if (app.mk.shuffleMode == 1) { shuffleArray(u) } + app.mk.queue.append(u) } else { app.getPlaylistFromID(id, true).then(function () { let query = app.showingPlaylist.relationships.tracks.data.map(item => new MusicKit.MediaItem(item)); - if (query.length > 100) { - let u = query.slice(100); if (app.mk.shuffleMode == 1) { shuffleArray(u) } - app.mk.queue.append(u)} + let u = query; if (app.mk.shuffleMode == 1) { shuffleArray(u) } + app.mk.queue.append(u) }) } }) From 710db9c819337a02d88377cf4f66b9ed8e9b4e5a Mon Sep 17 00:00:00 2001 From: vapormusic Date: Tue, 11 Jan 2022 22:32:42 +0700 Subject: [PATCH 09/64] core why? --- src/main/lastfm.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/lastfm.js b/src/main/lastfm.js index 2178645e..0c453797 100644 --- a/src/main/lastfm.js +++ b/src/main/lastfm.js @@ -61,7 +61,8 @@ const lfm = { }, scrobbleSong: async function (attributes) { - await new Promise(resolve => setTimeout(resolve, (attributes.durationInMillis / (app.cfg.get('lastfm.scrobble_after') / 100)))); + console.log((app.cfg.get('lastfm.scrobble_after') / 100)) + await new Promise(resolve => setTimeout(resolve, Math.round(attributes.durationInMillis * (app.cfg.get('lastfm.scrobble_after') / 100)))); const currentAttributes = app.media; if (!app.lastfm || app.lastfm.cachedAttributes === attributes ) { From 0e55ca0f3c3b841414073c00f226e2f87c66de92 Mon Sep 17 00:00:00 2001 From: Core Date: Tue, 11 Jan 2022 16:01:07 +0000 Subject: [PATCH 10/64] Removed redundant values --- src/renderer/views/components/add-to-playlist.ejs | 2 +- src/renderer/views/pages/artist-feed.ejs | 2 +- src/renderer/views/pages/artist.ejs | 4 ++-- src/renderer/views/pages/home.ejs | 2 +- src/renderer/views/pages/library-albums.ejs | 6 +++--- src/renderer/views/pages/library-artists.ejs | 6 +++--- src/renderer/views/pages/library-recentlyadded.ejs | 6 +++--- src/renderer/views/pages/library-songs.ejs | 6 +++--- src/renderer/views/pages/madeforyou.ejs | 2 +- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/renderer/views/components/add-to-playlist.ejs b/src/renderer/views/components/add-to-playlist.ejs index ae5d0a30..a061cb51 100644 --- a/src/renderer/views/components/add-to-playlist.ejs +++ b/src/renderer/views/components/add-to-playlist.ejs @@ -15,7 +15,7 @@