From a8042346460d193ac7525e8f235ae47fe7ce042e Mon Sep 17 00:00:00 2001 From: Chase Ingebritson Date: Sun, 13 Feb 2022 18:01:43 -0600 Subject: [PATCH 01/26] Added a network request to pull artist names on scrobbling --- src/main/plugins/lastfm.ts | 70 ++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/src/main/plugins/lastfm.ts b/src/main/plugins/lastfm.ts index 10440584..6978c8fb 100644 --- a/src/main/plugins/lastfm.ts +++ b/src/main/plugins/lastfm.ts @@ -81,7 +81,7 @@ export default class LastFMPlugin { private scrobbleSong(attributes: any) { if(this._timer) clearTimeout(this._timer); var self = this; - this._timer = setTimeout(() => { + this._timer = setTimeout(async () => { const currentAttributes = attributes; if (!self._lastfm || self._lastfm.cachedAttributes === attributes) { @@ -92,15 +92,17 @@ export default class LastFMPlugin { if (self._lastfm.cachedAttributes.playParams.id === attributes.playParams.id) return; } + const artist = await this.getPrimaryArtist(attributes) + if (currentAttributes.status && currentAttributes === attributes) { if (fs.existsSync(this.sessionPath)) { // Scrobble playing song. if (attributes.status === true) { self._lastfm.track.scrobble({ - 'artist': this.filterArtistName(attributes.artistName), + 'artist': artist, 'track': attributes.name, 'album': attributes.albumName, - 'albumArtist': self.filterArtistName(attributes.artistName), + 'albumArtist': artist, 'timestamp': new Date().getTime() / 1000 }, function (err: any, scrobbled: any) { if (err) { @@ -115,29 +117,11 @@ export default class LastFMPlugin { self.authenticate(); } } else { - return console.log('[LastFM] Did not add ', attributes.name, '—', self.filterArtistName(attributes.artistName), 'because now playing a other song.'); + return console.log('[LastFM] Did not add ', attributes.name, '—', artist, 'because now playing a other song.'); }},Math.round(attributes.durationInMillis * (self._store.lastfm.scrobble_after / 100))); } - private filterArtistName(artist: any) { - if (!this._store.lastfm.enabledRemoveFeaturingArtists) return artist; - - artist = artist.split(' '); - if (artist.includes('&')) { - artist.length = artist.indexOf('&'); - } - if (artist.includes('and')) { - artist.length = artist.indexOf('and'); - } - artist = artist.join(' '); - if (artist.includes(',')) { - artist = artist.split(',') - artist = artist[0] - } - return artist.charAt(0).toUpperCase() + artist.slice(1); - } - - private updateNowPlayingSong(attributes: any) { + private async updateNowPlayingSong(attributes: any) { if (!this._lastfm || this._lastfm.cachedNowPlayingAttributes === attributes || !this._store.lastfm.NowPlaying) { return } @@ -147,13 +131,15 @@ export default class LastFMPlugin { } if (fs.existsSync(this.sessionPath)) { + const artist = await this.getPrimaryArtist(attributes) + // update Now Playing if (attributes.status === true) { this._lastfm.track.updateNowPlaying({ - 'artist': this.filterArtistName(attributes.artistName), + 'artist': artist, 'track': attributes.name, 'album': attributes.albumName, - 'albumArtist': this.filterArtistName(attributes.artistName) + 'albumArtist': artist }, function (err: any, nowPlaying: any) { if (err) { return console.error('[LastFM] An error occurred while updating nowPlayingSong', err); @@ -169,6 +155,40 @@ export default class LastFMPlugin { } } + private async getPrimaryArtist (attributes: any) { + const songId = attributes.playParams.catalogId || attributes.playParams.id + + if (!this._store.lastfm.enabledRemoveFeaturingArtists || !songId) return attributes.artistName; + + const res = await this._win.webContents.executeJavaScript(` + (async () => { + const subMk = await MusicKit.getInstance().api.v3.music('/v1/catalog/us/songs/${songId}', { + include: { + songs: ["artists"] + } + }) + if (!subMk) console.error('[LastFM] Request failed: /v1/catalog/us/songs/${songId}') + return subMk.data + })() + `).catch(console.error) + if (!res) return attributes.artistName + + const data = res.data + if (!data.length) { + console.error(`[LastFM] Unable to locate song with id of ${songId}`) + return attributes.artistName; + } + + const artists = res.data[0].relationships.artists.data + if (!artists.length) { + console.error(`[LastFM] Unable to find artists related to the song with id of ${songId}`) + return attributes.artistName; + } + + const primaryArtist = artists[0] + return primaryArtist.attributes.name + } + /** * Base Plugin Details (Eventually implemented into a GUI in settings) */ From ade11cd717ea267927a36167bb2947fc40e85027 Mon Sep 17 00:00:00 2001 From: vapormusic Date: Mon, 14 Feb 2022 08:14:27 +0700 Subject: [PATCH 02/26] Update lastfm.ts --- src/main/plugins/lastfm.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/plugins/lastfm.ts b/src/main/plugins/lastfm.ts index 6978c8fb..ac56ad1b 100644 --- a/src/main/plugins/lastfm.ts +++ b/src/main/plugins/lastfm.ts @@ -162,7 +162,7 @@ export default class LastFMPlugin { const res = await this._win.webContents.executeJavaScript(` (async () => { - const subMk = await MusicKit.getInstance().api.v3.music('/v1/catalog/us/songs/${songId}', { + const subMk = await MusicKit.getInstance().api.v3.music(`/v1/catalog/${MusicKit.getInstance().storefrontId}/songs/${songId}`, { include: { songs: ["artists"] } @@ -273,4 +273,4 @@ export default class LastFMPlugin { this.scrobbleSong(attributes) } -} \ No newline at end of file +} From 49e5a92c2e5dae78875145a7fd8310f80bd8e924 Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 13 Feb 2022 21:23:12 -0800 Subject: [PATCH 03/26] I cant fucking spell --- src/renderer/audio/audio.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index b9e09bdf..1bdedb00 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -168,7 +168,7 @@ var CiderAudio = { } }, - hiererchical_unloading: function (){ + hierarchical_unloading: function (){ try {CiderAudio.audioNodes.spatialNode.output.disconnect();} catch(e){} try {CiderAudio.audioNodes.gainNode.disconnect();} catch(e){} try {for (var i of CiderAudio.audioNodes.llpw){i.disconnect();} CiderAudio.audioNodes.llpw = []} catch(e){} From 28435799169b36a29a248a6c8d516f73c752b0fa Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 13 Feb 2022 21:55:20 -0800 Subject: [PATCH 04/26] bamboozled --- src/i18n/ja_JP.jsonc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i18n/ja_JP.jsonc b/src/i18n/ja_JP.jsonc index 5489fd82..e57fc75a 100644 --- a/src/i18n/ja_JP.jsonc +++ b/src/i18n/ja_JP.jsonc @@ -119,6 +119,7 @@ "one" : "曲", "other" : "曲" }, + "term.tracks": "曲", "term.videos": "ビデオ", "term.menu": "メニュー", "term.check": "確認", From 46bd4d255822b166a581e4d5b0f5923b7065575f Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 13 Feb 2022 22:16:56 -0800 Subject: [PATCH 05/26] fix CAP compat warning + CAP hot reload + unbonk loading --- src/renderer/audio/audio.js | 29 ++++++++++++++++----------- src/renderer/views/pages/settings.ejs | 13 ++---------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index 1bdedb00..4160c08e 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -125,6 +125,8 @@ var CiderAudio = { let LLPW_Q = [5, 1, 3.536, 1.25, 8.409, 1.25, 14.14, 7.071, 5, 0.625, 16.82, 20, 20, 20, 28.28, 28.28, 28.28, 20, 33.64, 33.64, 10, 28.28, 7.071, 3.856]; let LLPW_GAIN = [0.38, -1.81, -0.23, -0.51, 0.4, 0.84, 0.36, -0.34, 0.27, -1.2, -0.42, -0.67, 0.81, 1.31, -0.71, 0.68, -1.04, 0.79, -0.73, -1.33, 1.17, 0.57, 0.35, 6.33]; let LLPW_FREQUENCIES = [16.452, 24.636, 37.134, 74.483, 159.54, 308.18, 670.21, 915.81, 1200.7, 2766.4, 2930.6, 4050.6, 4409.1, 5395.2, 5901.6, 6455.5, 7164.1, 7724.1, 8449, 10573, 12368, 14198, 17910, 18916]; + CiderAudio.audioNodes.llpw = [] + for (i = 0; i < LLPW_FREQUENCIES.length; i++) { CiderAudio.audioNodes.llpw[i] = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.llpw[i].type = 'peaking'; // 'peaking'; @@ -151,7 +153,8 @@ var CiderAudio = { let VIBRANTBASSBANDS = app.cfg.audio.vibrantBass.frequencies; let VIBRANTBASSGAIN = app.cfg.audio.vibrantBass.gain; let VIBRANTBASSQ = app.cfg.audio.vibrantBass.Q; - + CiderAudio.audioNodes.vibrantbassNode = [] + for (i = 0; i < VIBRANTBASSBANDS.length; i++) { CiderAudio.audioNodes.vibrantbassNode[i] = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.vibrantbassNode[i].type = 'peaking'; // 'peaking'; @@ -178,37 +181,39 @@ var CiderAudio = { }, hierarchical_loading: function (){ - CiderAudio.hiererchical_unloading(); + CiderAudio.hierarchical_unloading(); if (app.cfg.audio.vibrantBass.multiplier !== 0) { // If vibrant bass is enabled if (app.cfg.audio.ciderPPE) { // If CAP & vibrant bass is enabled CiderAudio.vibrantbass_h2_1(true) - CiderAudio.llpw_h2_2(true, 2) - if (app.cfg.audio.spatial) {CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.llpw[0]);} - else {CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);} - console.log("[Cider][Audio] CAP & vibrant bass is enabled") + if (app.cfg.audio.spatial) { + app.cfg.advanced.ciderPPE = false; + notyf.error(app.getLz('settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility')); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]); + } + else {CiderAudio.llpw_h2_2(true, 2); CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);} } else { // If only vibrant bass is enabled CiderAudio.vibrantbass_h2_1(true) //CiderAudio.llpw_h2_2(false, 0) if (app.cfg.audio.spatial) {CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]);} else {CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]);} - console.log("[Cider][Audio] Only vibrant bass is enabled") } } else { // If vibrant bass is disabled if (app.cfg.audio.ciderPPE) { // If CAP is enabled & vibrant bass is disabled //CiderAudio.vibrantbass_h2_1(false) - CiderAudio.llpw_h2_2(true, 1) - if (app.cfg.audio.spatial) {CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.llpw[0]);} - else {CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);} - console.log("[Cider][Audio] CAP is enabled & vibrant bass is disabled") + if (app.cfg.audio.spatial) { + app.cfg.advanced.ciderPPE = false; + notyf.error(app.getLz('settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility')); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]); + } + else {CiderAudio.llpw_h2_2(true, 1); CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);} } else { // If CAP & vibrant bass is disabled //CiderAudio.vibrantbass_h2_1(false) //CiderAudio.llpw_h2_2(false, 0) if (app.cfg.audio.spatial) {CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]);} else {CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.audioBands[0]);} - console.log("[Cider][Audio] CAP & vibrant bass is disabled") } } diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 25f22637..88b5e51e 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -78,10 +78,10 @@ {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description')}}
- -
@@ -839,15 +839,6 @@ CiderAudio.normalizerOff() } }, - ciderPPE: function () { - if (app.cfg.advanced.ciderPPE) { - if (app.cfg.audio.spatial) { - app.cfg.advanced.ciderPPE = false; - notyf.error(app.getLz('settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility')) - } - } - CiderAudio.hierarchical_loading(); - }, toggleSpatial: function () { if (app.cfg.audio.spatial) { if (!app.cfg.advanced.ciderPPE) { From 8a7e5702b6c8cb63f47a7a030541d384170ff3ce Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 13 Feb 2022 22:18:00 -0800 Subject: [PATCH 06/26] forgot to commit --- src/renderer/views/pages/settings.ejs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 88b5e51e..fc9d0c28 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -68,7 +68,7 @@ {{$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPE.description')}}
- +
From b7faf4f8b6c31488020758c9739af7f9a1bb707a Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 13 Feb 2022 22:22:22 -0800 Subject: [PATCH 07/26] you know I should probably test my client before pushing next time --- src/renderer/audio/audio.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index 4160c08e..4d0785f1 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -183,7 +183,7 @@ var CiderAudio = { hierarchical_loading: function (){ CiderAudio.hierarchical_unloading(); if (app.cfg.audio.vibrantBass.multiplier !== 0) { // If vibrant bass is enabled - if (app.cfg.audio.ciderPPE) { // If CAP & vibrant bass is enabled + if (app.cfg.advanced.ciderPPE) { // If CAP & vibrant bass is enabled CiderAudio.vibrantbass_h2_1(true) if (app.cfg.audio.spatial) { app.cfg.advanced.ciderPPE = false; @@ -200,7 +200,7 @@ var CiderAudio = { } } else { // If vibrant bass is disabled - if (app.cfg.audio.ciderPPE) { // If CAP is enabled & vibrant bass is disabled + if (app.cfg.advanced.ciderPPE) { // If CAP is enabled & vibrant bass is disabled //CiderAudio.vibrantbass_h2_1(false) if (app.cfg.audio.spatial) { app.cfg.advanced.ciderPPE = false; From db7e06c40c5cbc27eabec6f403319604688d31af Mon Sep 17 00:00:00 2001 From: Maikiwi Date: Sun, 13 Feb 2022 22:34:56 -0800 Subject: [PATCH 08/26] shove spatialization into processing workflow before hearing it --- src/renderer/audio/audio.js | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index 4d0785f1..8dbaccac 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -75,11 +75,8 @@ var CiderAudio = { CiderAudio.audioNodes.gainNode.gain.setTargetAtTime(1, CiderAudio.context.currentTime+ 1, 0.5); }, spatialOn: function (){ - try{ - CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){} - CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context); - CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination); + //CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination); let roomDimensions = { width: 32, height: 12, @@ -96,13 +93,9 @@ var CiderAudio = { }; CiderAudio.audioNodes.spatialNode.setRoomProperties(roomDimensions, roomMaterials); CiderAudio.audioNodes.spatialInput = CiderAudio.audioNodes.spatialNode.createSource(); - CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); CiderAudio.hierarchical_loading(); }, spatialOff: function (){ - try{ - CiderAudio.audioNodes.spatialNode.output.disconnect(CiderAudio.context.destination); - CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.audioNodes.spatialInput.input);} catch(e){} CiderAudio.hierarchical_loading(); }, sendAudio: function (){ @@ -188,14 +181,17 @@ var CiderAudio = { if (app.cfg.audio.spatial) { app.cfg.advanced.ciderPPE = false; notyf.error(app.getLz('settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility')); - CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]); } else {CiderAudio.llpw_h2_2(true, 2); CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);} } else { // If only vibrant bass is enabled CiderAudio.vibrantbass_h2_1(true) //CiderAudio.llpw_h2_2(false, 0) - if (app.cfg.audio.spatial) {CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]);} + if (app.cfg.audio.spatial) { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]);} else {CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]);} } } @@ -205,14 +201,17 @@ var CiderAudio = { if (app.cfg.audio.spatial) { app.cfg.advanced.ciderPPE = false; notyf.error(app.getLz('settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility')); - CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]); } else {CiderAudio.llpw_h2_2(true, 1); CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);} } else { // If CAP & vibrant bass is disabled //CiderAudio.vibrantbass_h2_1(false) //CiderAudio.llpw_h2_2(false, 0) - if (app.cfg.audio.spatial) {CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]);} + if (app.cfg.audio.spatial) { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]);} else {CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.audioBands[0]);} } } From a6710486d627b87459762b18c19de94b712e412d Mon Sep 17 00:00:00 2001 From: booploops <49113086+booploops@users.noreply.github.com> Date: Sun, 13 Feb 2022 23:04:29 -0800 Subject: [PATCH 09/26] github themes --- src/i18n/en_US.jsonc | 2 + src/main/base/browserwindow.ts | 1 + src/renderer/less/bootstrap.less | 495 +++++++++++++++++++++ src/renderer/less/pages.less | 14 + src/renderer/style.less | 2 +- src/renderer/views/app/app-content.ejs | 6 + src/renderer/views/pages/settings.ejs | 21 +- src/renderer/views/pages/themes-github.ejs | 96 ++++ 8 files changed, 619 insertions(+), 18 deletions(-) create mode 100644 src/renderer/views/pages/themes-github.ejs diff --git a/src/i18n/en_US.jsonc b/src/i18n/en_US.jsonc index 7f65bf75..9b4e1652 100644 --- a/src/i18n/en_US.jsonc +++ b/src/i18n/en_US.jsonc @@ -299,6 +299,8 @@ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "Theme", "settings.option.visual.theme.github.download": "Install from GitHub URL", + "settings.option.visual.theme.github.explore": "Explore GitHub Themes", + "settings.option.visual.theme.github.install.confirm": "Are you sure you want to install {{ repo }}?", "settings.prompt.visual.theme.github.URL": "Enter the URL of the theme you want to install", "settings.notyf.visual.theme.install.success": "Theme installed successfully", "settings.notyf.visual.theme.install.error": "Theme installation failed", diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index c62488e0..98125067 100644 --- a/src/main/base/browserwindow.ts +++ b/src/main/base/browserwindow.ts @@ -46,6 +46,7 @@ export class BrowserWindow { "pages/about", "pages/library-videos", "pages/remote-pair", + "pages/themes-github", "components/mediaitem-artwork", "components/artwork-material", "components/menu-panel", diff --git a/src/renderer/less/bootstrap.less b/src/renderer/less/bootstrap.less index 0a9be971..fccdd2c6 100644 --- a/src/renderer/less/bootstrap.less +++ b/src/renderer/less/bootstrap.less @@ -1,3 +1,498 @@ +// List Group +.list-group { + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: 0.25rem; +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > li::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item-action { + width: 100%; + color: #495057; + text-align: inherit; +} +.list-group-item-action:hover, .list-group-item-action:focus { + z-index: 1; + color: #495057; + text-decoration: none; + background-color: #f8f9fa; +} +.list-group-item-action:active { + color: #212529; + background-color: #e9ecef; +} + +.list-group-item { + position: relative; + display: block; + padding: 0.5rem 1rem; + color: #212529; + text-decoration: none; + background-color: #fff; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, .list-group-item:disabled { + color: #6c757d; + pointer-events: none; + background-color: #fff; +} +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #0d6efd; + border-color: #0d6efd; +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; +} + +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 1px; +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + color: #084298; + background-color: #cfe2ff; +} +.list-group-item-primary.list-group-item-action:hover, .list-group-item-primary.list-group-item-action:focus { + color: #084298; + background-color: #bacbe6; +} +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #084298; + border-color: #084298; +} + +.list-group-item-secondary { + color: #41464b; + background-color: #e2e3e5; +} +.list-group-item-secondary.list-group-item-action:hover, .list-group-item-secondary.list-group-item-action:focus { + color: #41464b; + background-color: #cbccce; +} +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #41464b; + border-color: #41464b; +} + +.list-group-item-success { + color: #0f5132; + background-color: #d1e7dd; +} +.list-group-item-success.list-group-item-action:hover, .list-group-item-success.list-group-item-action:focus { + color: #0f5132; + background-color: #bcd0c7; +} +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #0f5132; + border-color: #0f5132; +} + +.list-group-item-info { + color: #055160; + background-color: #cff4fc; +} +.list-group-item-info.list-group-item-action:hover, .list-group-item-info.list-group-item-action:focus { + color: #055160; + background-color: #badce3; +} +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #055160; + border-color: #055160; +} + +.list-group-item-warning { + color: #664d03; + background-color: #fff3cd; +} +.list-group-item-warning.list-group-item-action:hover, .list-group-item-warning.list-group-item-action:focus { + color: #664d03; + background-color: #e6dbb9; +} +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #664d03; + border-color: #664d03; +} + +.list-group-item-danger { + color: #842029; + background-color: #f8d7da; +} +.list-group-item-danger.list-group-item-action:hover, .list-group-item-danger.list-group-item-action:focus { + color: #842029; + background-color: #dfc2c4; +} +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #842029; + border-color: #842029; +} + +.list-group-item-light { + color: #636464; + background-color: #fefefe; +} +.list-group-item-light.list-group-item-action:hover, .list-group-item-light.list-group-item-action:focus { + color: #636464; + background-color: #e5e5e5; +} +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #636464; + border-color: #636464; +} + +.list-group-item-dark { + color: var(--textColor); + background-color: #333; +} +.list-group-item-dark.list-group-item-action:hover, .list-group-item-dark.list-group-item-action:focus { + color: #141619; + background-color: #bebebf; +} +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #141619; + border-color: #141619; +} + + +// Card +.card { + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #333; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: 1rem 1rem; +} + +.card-title { + margin-bottom: 0.5rem; +} + +.card-subtitle { + margin-top: -0.25rem; + margin-bottom: 0; +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link + .card-link { + margin-left: 1rem; +} + +.card-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + background-color: rgba(0, 0, 0, 0.03); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} + +.card-footer { + padding: 0.5rem 1rem; + background-color: rgba(0, 0, 0, 0.03); + border-top: 1px solid rgba(0, 0, 0, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} + +.card-header-tabs { + margin-right: -0.5rem; + margin-bottom: -0.5rem; + margin-left: -0.5rem; + border-bottom: 0; +} + +.card-header-pills { + margin-right: -0.5rem; + margin-left: -0.5rem; +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1rem; + border-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} + +.card-group > .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-top, + .card-group > .card:not(:last-child) .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-img-bottom, + .card-group > .card:not(:last-child) .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-top, + .card-group > .card:not(:first-child) .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-img-bottom, + .card-group > .card:not(:first-child) .card-footer { + border-bottom-left-radius: 0; + } +} + + .modal { position: fixed; top: 0; diff --git a/src/renderer/less/pages.less b/src/renderer/less/pages.less index 2d30a480..a62478b3 100644 --- a/src/renderer/less/pages.less +++ b/src/renderer/less/pages.less @@ -18,6 +18,20 @@ } // End Helpers +// GitHub Themes +.github-themes-page { + .github-avatar { + height: 42px; + width: 42px; + margin: 6px; + border-radius: 32px; + } + + .repo-name { + margin:0px; + font-weight: 500; + } +} // Library - Songs page .library-page { diff --git a/src/renderer/style.less b/src/renderer/style.less index 6a238d94..85949811 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -140,7 +140,7 @@ body.notransparency::before { width: 100%; height: 100%; background: var(--color1); - color: white; + color: var(--textColor); user-select: none; margin: 0 auto; position: relative; diff --git a/src/renderer/views/app/app-content.ejs b/src/renderer/views/app/app-content.ejs index 5087544a..1ebbd22e 100644 --- a/src/renderer/views/app/app-content.ejs +++ b/src/renderer/views/app/app-content.ejs @@ -159,6 +159,12 @@ + + + +