diff --git a/.gitignore b/.gitignore index e6413018..29a853c9 100644 --- a/.gitignore +++ b/.gitignore @@ -328,3 +328,4 @@ savedconfig/cider-config.json savedconfig/config.json savedconfig/session.json savedconfig/window-state.json +src/main/base/sample.json diff --git a/src/i18n/de_DE.json b/src/i18n/de_DE.json index 071d18eb..dd3b4970 100644 --- a/src/i18n/de_DE.json +++ b/src/i18n/de_DE.json @@ -386,5 +386,13 @@ "term.track": { "one": "Titel", "other": "Titel" - } + }, + "settings.option.visual.customAccentColor": "Benutzerdefinierte Akzentfarbe", + "settings.option.visual.accentColor": "Akzentfarbe", + "settings.option.visual.purplePodcastPlaybackBar": "Lila Wiedergabeleiste für Podcasts", + "settings.option.visual.windowColor": "Fenstertönung Farbe", + "action.cut": "Ausschneiden", + "action.paste": "Einfügen", + "action.selectAll": "Alles auswählen", + "action.delete": "Löschen" } diff --git a/src/main/base/store.ts b/src/main/base/store.ts index b72e48d3..97a3a26c 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -156,14 +156,14 @@ export class Store { "dBSPL": false, "dBSPLcalibration": 90, "maikiwiAudio": { - "ciderPPE": false, + "ciderPPE": true, "ciderPPE_value": "MAIKIWI", "atmosphereRealizer1": false, "atmosphereRealizer1_value": "NATURAL_STANDARD", "atmosphereRealizer2": false, "atmosphereRealizer2_value": "NATURAL_STANDARD", "spatial": false, - "spatialProfile": "71_420maikiwi", + "spatialProfile": "BPLK", "vibrantBass": { // Hard coded into the app. Don't include any of this config into exporting presets in store.ts 'frequencies': [17.182, 42.169, 53.763, 112.69, 119.65, 264.59, 336.57, 400.65, 505.48, 612.7, 838.7, 1155.3, 1175.6, 3406.8, 5158.6, 5968.1, 6999.9, 7468.6, 8862.9, 9666, 10109], 'Q': [2.5, 0.388, 5, 5, 2.5, 7.071, 14.14, 10, 7.071, 14.14, 8.409, 0.372, 7.071, 10, 16.82, 7.071, 28.28, 20, 8.409, 40, 40], @@ -243,7 +243,8 @@ export class Store { "AudioContext": true, "experiments": [], "playlistTrackMapping": true, - "ffmpegLocation": "" + "ffmpegLocation": "", + "disableLogging": false }, "connectUser": { "auth": null, diff --git a/src/renderer/less/pages.less b/src/renderer/less/pages.less index b29dc0b7..6b79acd7 100644 --- a/src/renderer/less/pages.less +++ b/src/renderer/less/pages.less @@ -670,6 +670,29 @@ width : 100%; height : 100%; + .playlist-hero { + width : 100%; + transform : translateX(+25%); + position : absolute; + z-index : -1; + top : 0; + left : 0; + right : 0; + bottom : 0; + + .mediaitem-artwork { + -webkit-mask-image: -webkit-radial-gradient(center, circle cover, rgba(0, 0, 0, 1) 50%, rgba(0, 0, 0, 0) 75%); + border-radius : 0px; + } + .hero-tint { + position: absolute; + top : 0; + opacity: 0.6; + width: 100%; + height: 100%; + } + } + >.row { width: calc(100% - 32px); } @@ -689,6 +712,10 @@ flex-shrink : unset; } + .search-input::placeholder { + color: var(--heroplaceholdercolor) + } + .nameEdit { font-weight: 700; font-size : 1.6rem; diff --git a/src/renderer/main/app.js b/src/renderer/main/app.js index c94b012a..097c0556 100644 --- a/src/renderer/main/app.js +++ b/src/renderer/main/app.js @@ -17,6 +17,17 @@ window.CiderCache = CiderCache window.CiderFrontAPI = CiderFrontAPI window.wsapi = wsapi +if (app.cfg.advanced.disableLogging === true) { + window.console = { + log: function() {}, + error: function() {}, + warn: function() {}, + assert: function() {}, + debug: function() {} + } +} + + // Mount Vue to #app app.$mount("#app") diff --git a/src/renderer/main/events.js b/src/renderer/main/events.js index 52191c5d..e0a3c45c 100644 --- a/src/renderer/main/events.js +++ b/src/renderer/main/events.js @@ -24,7 +24,7 @@ const Events = { // CTRL + R if (event.keyCode === 82 && event.ctrlKey) { event.preventDefault() - bootbox.confirm(app.getLz('term.reload'), (res)=>{ + app.confirm(app.getLz('term.reload'), (res)=>{ if (res) { window.location.reload() } @@ -69,8 +69,8 @@ const Events = { // Prevent Scrolling on spacebar if (event.keyCode === 32 && event.target === document.body) { event.preventDefault() - app.SpacePause() - + app.SpacePause() + } }); diff --git a/src/renderer/main/vueapp.js b/src/renderer/main/vueapp.js index a0c7fb55..0c6c02b6 100644 --- a/src/renderer/main/vueapp.js +++ b/src/renderer/main/vueapp.js @@ -952,22 +952,22 @@ const app = new Vue({ } } catch (e) { localStorage.setItem("playingBitrate", "256") - } + } if (!app.cfg.audio.normalization) {CiderAudio.hierarchical_loading();} - + } - + if (app.cfg.audio.normalization) { // get unencrypted audio previews to get SoundCheck's normalization tag try { let previewURL = null try { - previewURL = app.mk.nowPlayingItem.previewURL + previewURL = app.mk.nowPlayingItem.previewURL } catch (e) { } if (previewURL == null && ((app.mk.nowPlayingItem?._songId ?? (app.mk.nowPlayingItem["songId"] ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id)) != -1)) { app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/songs/${app.mk.nowPlayingItem?._songId ?? (app.mk.nowPlayingItem["songId"] ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id)}`).then((response) => { - previewURL = response.data.data[0].attributes.previews[0].url + previewURL = response.data.data[0].attributes.previews[0].url if (previewURL) console.debug("[Cider][MaikiwiSoundCheck] previewURL response.data.data[0].attributes.previews[0].url: " + previewURL) ipcRenderer.send('getPreviewURL', previewURL) @@ -1173,7 +1173,7 @@ const app = new Vue({ } }, unauthorize() { - bootbox.confirm(app.getLz('term.confirmLogout'), function (result) { + this.confirm(app.getLz('term.confirmLogout'), function (result) { if (result) { app.mk.unauthorize() document.location.reload() @@ -1554,22 +1554,24 @@ const app = new Vue({ }, deletePlaylist(id) { let self = this - if (confirm(app.getLz('term.deletePlaylist'))) { - app.mk.api.v3.music(`/v1/me/library/playlists/${id}`, {}, { - fetchOptions: { - method: "DELETE" - } - }).then(res => { - // remove this playlist from playlists.listing if it exists - let found = self.playlists.listing.find(item => item.id == id) - if (found) { - self.playlists.listing.splice(self.playlists.listing.indexOf(found), 1) - } - setTimeout(() => { - app.refreshPlaylists(false, false); - }, 8000); - }) - } + this.confirm(app.getLz('term.deletePlaylist'), (ok) => { + if (ok) { + app.mk.api.v3.music(`/v1/me/library/playlists/${id}`, {}, { + fetchOptions: { + method: "DELETE" + } + }).then(res => { + // remove this playlist from playlists.listing if it exists + let found = self.playlists.listing.find(item => item.id == id) + if (found) { + self.playlists.listing.splice(self.playlists.listing.indexOf(found), 1) + } + setTimeout(() => { + app.refreshPlaylists(false, false); + }, 8000); + }) + } + }); }, /** * @param {string} url, href for the initial request @@ -4624,6 +4626,29 @@ const app = new Vue({ app.mk._services.mediaItemPlayback._currentPlayer._playAssetURL(src, false) } } + }, + confirm(message, callback) { + bootbox.confirm(this.getBootboxParams(null, message, callback)); + }, + prompt(title, callback) { + bootbox.prompt(this.getBootboxParams(title, null, callback)); + }, + getBootboxParams(title, message, callback) { + return { + title: title, + message: message, + buttons: { + confirm: { + label: app.getLz('dialog.ok'), + }, + cancel: { + label: app.getLz('dialog.cancel'), + }, + }, + callback: function (result) { + if (callback) callback(result); + }, + } } } }) diff --git a/src/renderer/style.less b/src/renderer/style.less index 5d45481c..286c0cf2 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -2073,7 +2073,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { align-items: center; .fs-row { - flex-grow: 1; + flex-grow: 0.5; } .playback-button--small.active { diff --git a/src/renderer/views/components/equalizer.ejs b/src/renderer/views/components/equalizer.ejs index 64acca69..2e7639ca 100644 --- a/src/renderer/views/components/equalizer.ejs +++ b/src/renderer/views/components/equalizer.ejs @@ -280,7 +280,7 @@ }, deletePreset() { let presets = this.$root.cfg.audio.equalizer.presets - bootbox.confirm(app.getLz('term.deletepreset.warn'), (result) => { + app.confirm(app.getLz('term.deletepreset.warn'), (result) => { if (result) { this.changePreset("default") // find the preset by id (preset) and remove it @@ -351,7 +351,7 @@ }, addPreset() { let self = this - bootbox.prompt(app.getLz('term.newpreset.name'), (res) => { + app.prompt(app.getLz('term.newpreset.name'), (res) => { if (res) { let eqSettings = Clone(app.cfg.audio.equalizer) let newPreset = new self.eqPreset() @@ -386,7 +386,7 @@ }, importPreset() { let self = this - bootbox.prompt("Enter preset share code", (res) => { + app.prompt("Enter preset share code", (res) => { if (res) { let preset = JSON.parse(atob(res)) if (preset.frequencies && preset.gain && preset.Q && preset.mix && preset.vibrantBass) { diff --git a/src/renderer/views/components/mediaitem-square.ejs b/src/renderer/views/components/mediaitem-square.ejs index 3ace5791..ab34f7ae 100644 --- a/src/renderer/views/components/mediaitem-square.ejs +++ b/src/renderer/views/components/mediaitem-square.ejs @@ -542,14 +542,14 @@ let followAction = "follow" let followActions = { follow: { - icon: "./assets/feather/plus-circle.svg", + icon: "./assets/star.svg", name: app.getLz('action.favorite'), action: () => { self.$root.setArtistFavorite(this.item.id, true) } }, unfollow: { - icon: "./assets/feather/x-circle.svg", + icon: "./assets/star.svg", name: app.getLz('action.removeFavorite'), action: () => { self.$root.setArtistFavorite(this.item.id, false) diff --git a/src/renderer/views/pages/artist.ejs b/src/renderer/views/pages/artist.ejs index c926794f..539393dc 100644 --- a/src/renderer/views/pages/artist.ejs +++ b/src/renderer/views/pages/artist.ejs @@ -25,7 +25,8 @@
+ :style="{ 'color': '#' +hasHeroObject()?.textColor1 ?? ''}" + > @@ -178,11 +179,21 @@ return this.data.attributes?.editorialArtwork?.centeredFullscreenBackground.url } else if(this.data.attributes?.editorialArtwork?.bannerUber) { return this.data.attributes?.editorialArtwork?.bannerUber.url - }else if(this.data.attributes?.editorialArtwork?.subscriptionHero){ + } else if(this.data.attributes?.editorialArtwork?.subscriptionHero){ return this.data.attributes?.editorialArtwork?.subscriptionHero.url } return false; }, + hasHeroObject() { + if(this.data.attributes?.editorialArtwork?.centeredFullscreenBackground){ + return this.data.attributes?.editorialArtwork?.centeredFullscreenBackground + } else if(this.data.attributes?.editorialArtwork?.bannerUber) { + return this.data.attributes?.editorialArtwork?.bannerUber + } else if(this.data.attributes?.editorialArtwork?.subscriptionHero){ + return this.data.attributes?.editorialArtwork?.subscriptionHero + } + return []; + }, isHeaderVisible(visible) { this.headerVisible = visible }, diff --git a/src/renderer/views/pages/cider-playlist.ejs b/src/renderer/views/pages/cider-playlist.ejs index ca2e3e6b..bc6d7622 100644 --- a/src/renderer/views/pages/cider-playlist.ejs +++ b/src/renderer/views/pages/cider-playlist.ejs @@ -8,9 +8,13 @@