diff --git a/src/i18n/README.md b/src/i18n/README.md index 6552894c..72e15e8b 100644 --- a/src/i18n/README.md +++ b/src/i18n/README.md @@ -121,4 +121,10 @@ Update 16/02/2022 21:45 UTC * `term.audioControls`: Added for `en_US`. * `settings.option.audio.volumeStep`: Added for `en_US`. -* `settings.option.audio.maxVolume`: Added for `en_US`.` \ No newline at end of file +* `settings.option.audio.maxVolume`: Added for `en_US`.` + +Update 17/02/2022 10:00 UTC ++ `settings.header.debug`: Added for `en_US`. ++ `settings.option.debug.copy_log`: Replaces `settings.option.experimental.copy_log`. ++ `settings.option.debug.openAppData`: Added for `en_US` ++ `action.open`: Added for `en_US` \ No newline at end of file diff --git a/src/i18n/en_US.jsonc b/src/i18n/en_US.jsonc index 037cbe9c..a14377d8 100644 --- a/src/i18n/en_US.jsonc +++ b/src/i18n/en_US.jsonc @@ -231,7 +231,7 @@ "action.copy": "Copy", "action.newpreset": "New Preset...", // Equalizer Preset "action.deletepreset": "Delete Preset", - + "action.open": "Open", // Settings - General "settings.header.general": "General", "settings.header.general.description": "Adjust the general settings for Cider.", @@ -339,13 +339,19 @@ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)", "settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)", // Refer to term.connect for the connect button - + + // Settings - Debug + "settings.header.debug": "Debug", + "settings.option.debug.copy_log": "Copy logs to clipboard", + "settings.option.debug.openAppData": "Open Cider Folder", + + // Settings - Experimental "settings.header.experimental": "Experimental", "settings.header.experimental.description": "Adjust the experimental settings for Cider.", "settings.option.experimental.compactUI": "Compact UI", // Toggle "settings.option.experimental.close_button_hide": "Close Button Should Hide the Application", - "settings.option.experimental.copy_log": "Copy logs to clipboard", + "settings.option.experimental.inline_playlists": "Inline Playlists and Albums", // Refer to term.disabled & term.enabled diff --git a/src/i18n/ja_JP.jsonc b/src/i18n/ja_JP.jsonc index e57fc75a..2264f068 100644 --- a/src/i18n/ja_JP.jsonc +++ b/src/i18n/ja_JP.jsonc @@ -215,6 +215,8 @@ // Settings - Audio "settings.header.audio": "オーディオ", "settings.header.audio.description": "Ciderのオーディオ設定", + "settings.option.audio.volumeStep": "音量調整のステップ", + "settings.option.audio.maxVolume": "最大音量", "settings.option.audio.quality": "音質", // Dropdown "settings.header.audio.quality.hireslossless": "ハイレゾロスレス", "settings.header.audio.quality.hireslossless.description": "(最大解像度 24 ビット/192 kHz)", diff --git a/src/i18n/zh_TW.jsonc b/src/i18n/zh_TW.jsonc index b373c6f7..d66c4f73 100644 --- a/src/i18n/zh_TW.jsonc +++ b/src/i18n/zh_TW.jsonc @@ -229,6 +229,8 @@ // Settings - Audio "settings.header.audio": "音訊", "settings.header.audio.description": "調整 Cider 的音訊設定", + "settings.option.audio.volumeStep": "音量改變量", + "settings.option.audio.maxVolume": "最高音量", "settings.option.audio.quality": "音訊品質", // Dropdown "settings.header.audio.quality.hireslossless": "高品質無損壓縮", "settings.header.audio.quality.hireslossless.description": "(高達 24-bit/192 kHz)", diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index 7e120ec2..22010f45 100644 --- a/src/main/base/browserwindow.ts +++ b/src/main/base/browserwindow.ts @@ -47,6 +47,7 @@ export class BrowserWindow { "pages/library-videos", "pages/remote-pair", "pages/themes-github", + "pages/replay", "components/mediaitem-artwork", "components/artwork-material", "components/menu-panel", @@ -125,6 +126,16 @@ export class BrowserWindow { this.options.width = windowState.width; this.options.height = windowState.height; + switch(process.platform) { + default: + + break; + case "linux": + this.options.autoHideMenuBar = true + this.options.frame = true + break; + } + // Start the webserver for the browser window to load this.startWebServer(); @@ -699,7 +710,9 @@ export class BrowserWindow { ipcMain.on('get-version', (_event) => { _event.returnValue = app.getVersion() }); - + ipcMain.on('open-appdata', (_event) => { + shell.openPath(app.getPath('userData')); + }); /* ********************************************************************************************* * Window Events * **********************************************************************************************/ diff --git a/src/main/base/store.ts b/src/main/base/store.ts index e60b9a82..26629f9d 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -27,7 +27,7 @@ export class Store { }, "audio": { "volume": 1, - "volumeStep": 0.1, + "volumeStep": 0.02, "maxVolume": 1, "lastVolume": 1, "muted": false, diff --git a/src/main/index.ts b/src/main/index.ts index 9e0d53d9..daeb3eeb 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -69,9 +69,9 @@ ipcMain.on('nowPlayingItemDidChange', (_event, attributes) => { CiderPlug.callPlugins('onNowPlayingItemDidChange', attributes); }); -ipcMain.on('lfmItemChange', (_event, attributes) => { - CiderPlug.callPlugins('lfmItemChange', attributes); -}); +ipcMain.on('nowPlayingItemDidChangeLastFM', (_event, attributes) => { + CiderPlug.callPlugin('lastfm', 'nowPlayingItemDidChangeLastFM', attributes); +}) app.on('before-quit', () => { CiderPlug.callPlugins('onBeforeQuit'); diff --git a/src/main/plugins/lastfm.ts b/src/main/plugins/lastfm.ts index fbeb2b40..a7433b8b 100644 --- a/src/main/plugins/lastfm.ts +++ b/src/main/plugins/lastfm.ts @@ -79,46 +79,47 @@ export default class LastFMPlugin { } private scrobbleSong(attributes: any) { - if(this._timer) clearTimeout(this._timer); + if (this._timer) clearTimeout(this._timer); var self = this; this._timer = setTimeout(async () => { - const currentAttributes = attributes; + const currentAttributes = attributes; - if (!self._lastfm || self._lastfm.cachedAttributes === attributes) { - return - } + if (!self._lastfm || self._lastfm.cachedAttributes === attributes) { + return + } - if (self._lastfm.cachedAttributes) { - if (self._lastfm.cachedAttributes.playParams.id === attributes.playParams.id) return; - } + if (self._lastfm.cachedAttributes) { + if (self._lastfm.cachedAttributes.playParams.id === attributes.playParams.id) return; + } - const artist = await this.getPrimaryArtist(attributes) + 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': artist, - 'track': attributes.name, - 'album': attributes.albumName, - 'albumArtist': artist, - 'timestamp': new Date().getTime() / 1000 - }, function (err: any, scrobbled: any) { - if (err) { - return console.error('[LastFM] An error occurred while scrobbling', err); - } + if (currentAttributes.status && currentAttributes === attributes) { + if (fs.existsSync(this.sessionPath)) { + // Scrobble playing song. + if (attributes.status === true) { + self._lastfm.track.scrobble({ + 'artist': artist, + 'track': attributes.name, + 'album': attributes.albumName, + 'albumArtist': artist, + 'timestamp': new Date().getTime() / 1000 + }, function (err: any, scrobbled: any) { + if (err) { + return console.error('[LastFM] An error occurred while scrobbling', err); + } - console.log('[LastFM] Successfully scrobbled: ', scrobbled); - }); - self._lastfm.cachedAttributes = attributes + console.log('[LastFM] Successfully scrobbled: ', scrobbled); + }); + self._lastfm.cachedAttributes = attributes + } + } else { + self.authenticate(); } } else { - self.authenticate(); + return console.log('[LastFM] Did not add ', attributes.name, '—', artist, 'because now playing a other song.'); } - } else { - 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))); + }, Math.round(attributes.durationInMillis * (self._store.lastfm.scrobble_after / 100))); } private async updateNowPlayingSong(attributes: any) { @@ -155,7 +156,7 @@ export default class LastFMPlugin { } } - private async getPrimaryArtist (attributes: any) { + private async getPrimaryArtist(attributes: any) { const songId = attributes.playParams.catalogId || attributes.playParams.id if (!this._store.lastfm.enabledRemoveFeaturingArtists || !songId) return attributes.artistName; @@ -257,22 +258,22 @@ export default class LastFMPlugin { * @param attributes Music Attributes (attributes.status = current state) */ onPlaybackStateDidChange(attributes: object): void { - this.updateNowPlayingSong(attributes) - // this.scrobbleSong(attributes) + this.updateNowPlayingSong(attributes) + // this.scrobbleSong(attributes) } /** * Runs on song change * @param attributes Music Attributes */ - lfmItemChange(attributes: any): void { + nowPlayingItemDidChangeLastFM(attributes: any): void { attributes.status = true - if (!this._store.lastfm.filterLoop){ + if (!this._store.lastfm.filterLoop) { this._lastfm.cachedNowPlayingAttributes = false; this._lastfm.cachedAttributes = false } - this.updateNowPlayingSong(attributes) - this.scrobbleSong(attributes) + this.updateNowPlayingSong(attributes) + this.scrobbleSong(attributes) } } diff --git a/src/preload/cider-preload.js b/src/preload/cider-preload.js index 47441d25..243b7951 100644 --- a/src/preload/cider-preload.js +++ b/src/preload/cider-preload.js @@ -7,9 +7,10 @@ let cache = {playParams: {id: 0}, status: null, remainingTime: 0}, const MusicKitInterop = { init: function () { MusicKit.getInstance().addEventListener(MusicKit.Events.playbackStateDidChange, () => { - if (MusicKitInterop.filterTrack(MusicKitInterop.getAttributes(), true, false)) { - global.ipcRenderer.send('playbackStateDidChange', MusicKitInterop.getAttributes()) - ipcRenderer.send('wsapi-updatePlaybackState', MusicKitInterop.getAttributes()); + const attributes = MusicKitInterop.getAttributes() + if (MusicKitInterop.filterTrack(attributes, true, false)) { + global.ipcRenderer.send('playbackStateDidChange', attributes) + ipcRenderer.send('wsapi-updatePlaybackState', attributes); // if (typeof _plugins != "undefined") { // _plugins.execute("OnPlaybackStateChanged", {Attributes: MusicKitInterop.getAttributes()}) // } @@ -23,12 +24,18 @@ const MusicKitInterop = { /** wsapi */ MusicKit.getInstance().addEventListener(MusicKit.Events.nowPlayingItemDidChange, async () => { - // await MusicKitInterop.modifyNamesOnLocale(); - if (MusicKitInterop.filterTrack(MusicKitInterop.getAttributes(), false, true) || !app.cfg.lastfm.filterLoop) { - global.ipcRenderer.send('lfmItemChange', MusicKitInterop.getAttributes()); + const attributes = MusicKitInterop.getAttributes() + const trackFilter = MusicKitInterop.filterTrack(attributes, false, true) + + if (trackFilter) { + global.ipcRenderer.send('nowPlayingItemDidChange', attributes); } - global.ipcRenderer.send('nowPlayingItemDidChange', MusicKitInterop.getAttributes()); + // LastFM's Custom Call + await MusicKitInterop.modifyNamesOnLocale(); + if (trackFilter || !app.cfg.lastfm.filterLoop) { + global.ipcRenderer.send('nowPlayingItemDidChangeLastFM', attributes); + } }); MusicKit.getInstance().addEventListener(MusicKit.Events.authorizationStatusDidChange, () => { @@ -69,7 +76,7 @@ const MusicKitInterop = { const attributes = (nowPlayingItem != null ? nowPlayingItem.attributes : {}); attributes.status = isPlayingExport ?? false; - attributes.name = attributes?.name ?? 'No Title Found'; + attributes.name = attributes?.name ?? 'no-title-found'; attributes.artwork = attributes?.artwork ?? {url: ''}; attributes.artwork.url = (attributes?.artwork?.url ?? '').replace(`{f}`, "png"); attributes.playParams = attributes?.playParams ?? {id: 'no-id-found'}; @@ -98,7 +105,7 @@ const MusicKitInterop = { }, filterTrack: function (a, playbackCheck, mediaCheck) { - if (a.title === "No Title Found" || a.playParams.id === "no-id-found") { + if (a.name === 'no-title-found' || a.playParams.id === "no-id-found") { return; } else if (mediaCheck && a.playParams.id === cache.playParams.id) { return; diff --git a/src/renderer/assets/feather/external-link.svg b/src/renderer/assets/feather/external-link.svg new file mode 100644 index 00000000..6236df3e --- /dev/null +++ b/src/renderer/assets/feather/external-link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index ac2a6567..80eec3ee 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -152,13 +152,12 @@ var CiderAudio = { } }, llpw_h2_2: function (status, hierarchy){ - if (status === true) { // 23 Band Adjustment + if (status === true) { 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'; diff --git a/src/renderer/index.js b/src/renderer/index.js index bc1d5381..e4700d7d 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -1354,8 +1354,15 @@ const app = new Vue({ } }, async getNowPlayingItemDetailed(target) { - let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind, (app.mk.nowPlayingItem.songId == -1), (app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"], {"include[songs]": "albums,artists", l : app.mklang}); - app.searchAndNavigate(u.data.data[0], target) + try { + let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind, + (app.mk.nowPlayingItem.songId == -1), + (app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"], + { "include[songs]": "albums,artists", l: app.mklang }); + app.searchAndNavigate(u.data.data[0], target) + } catch (e) { + app.searchAndNavigate(app.mk.nowPlayingItem, target) + } }, async searchAndNavigate(item, target) { let self = this @@ -3037,7 +3044,7 @@ const app = new Vue({ type += "s" } type = type.replace("library-", "") - let id = item.attributes.playParams.catalogId ?? item.id + let id = item.attributes.playParams.catalogId ?? item.attributes.playParams.id ?? item.id let index = types.findIndex(function (type) { return type.type == this diff --git a/src/renderer/less/linux.less b/src/renderer/less/linux.less new file mode 100644 index 00000000..6b26d1ee --- /dev/null +++ b/src/renderer/less/linux.less @@ -0,0 +1,6 @@ +// Linux +body[platform="linux"] { + #window-controls-container { + display: none; + } +} \ No newline at end of file diff --git a/src/renderer/less/pages.less b/src/renderer/less/pages.less index f95f07e4..ee7ba294 100644 --- a/src/renderer/less/pages.less +++ b/src/renderer/less/pages.less @@ -819,3 +819,180 @@ margin: 16px; } } + +//Home +.home-page { + top: 0; + padding-top: var(--navbarHeight); + + .md-btn-replay { + background: var(--replayGradient); + border: 0px; + box-shadow: inset 0px 0px 0px 1px rgba(200, 200, 200, 0.2); + text-transform: uppercase; + font-weight: bold; + } + .md-btn-replay--hero { + font-size: 1em; + padding: 16px; + background: var(--replayGradient); + border: 0px; + box-shadow: inset 0px 0px 0px 1px rgb(200 200 200 / 20%); + margin-top: 1em; + font-size: 0.9em; + text-transform: uppercase; + font-weight: bold; + } + + .artist-feed-card { + position: absolute; + bottom: 0; + left: 10%; + z-index: 1; + background: black; + width: 80%; + height: 96%; + overflow: scroll; + border-radius: 10px; + } + + .col.madeforyou-col { + width: 420px; + min-width: 0px; + max-width: 420px; + } + + .well.artistfeed-well { + margin-top: 0px; + height: 392px; + align-content: flex-start; + } + + .hint-text { + font-size: 0.9rem; + color: rgb(200 200 200 / 70%); + } + + .user-icon { + border-radius: 100%; + width: 128px; + height: 128px; + overflow: hidden; + box-shadow: var(--mediaItemShadow-Shadow); + margin: 16px; + } + + .well.profile-well { + flex-direction: column; + justify-content: center; + align-items: center; + + .name { + margin: 4px; + font-weight: 500; + } + + .handle { + margin: 4px; + opacity: 0.7; + font-weight: 500; + } + } +} + +// Replay +.replay-page { + --replayTextShadow: 0px 3px 2px #6f3f52; + + .replay-period { + height: 200px; + width: 200px; + margin: 6px; + border-radius: var(--mediaItemRadius); + overflow: hidden; + cursor: pointer; + transition: transform .2s var(--appleEase); + transition-delay: .1s; + align-self: center; + &:hover { + transform: translateY(-6px); + transition-delay: 0s; + } + .artwork-container { + height:200px; + width:200px; + } + } + + .top-genres-container { + + .genre-name { + font-size: 0.9em; + margin: 6px 0px; + font-weight: 500; + } + .genre-count { + width: 100%; + height: 32px; + background: #ffffff14; + border-radius: 10px; + overflow: hidden; + + .genre-count-bar { + height: 100%; + width: 0%; + background: var(--keyColor); + display: flex; + justify-content: center; + align-items: center; + min-width: 32px; + font-size: 0.9em; + font-weight: 500; + } + } + } + + .cd-mediaitem-square { + .mediaitem-artwork { + animation: replayFadeIn .5s var(--appleEase); + } + transition: transform .2s var(--appleEase); + transition-delay: .1s; + &:hover { + transform: scale(1.1); + transition-delay: 0s; + } + } + + @keyframes replayFadeIn { + 0% { + //border-radius: 100%; + transform: translateY(10px) scale(0.9); + opacity: 0; + } + + 100% { + //border-radius: var(--mediaItemRadius); + transform: scale(1); + opacity: 1; + } + } + + .replay-viewport { + background: var(--replayGradient); + padding: 16px 40px; + border-radius: 10px; + box-shadow: var(--mediaItemShadow), var(--mediaItemShadow-Shadow); + color: rgb(238 238 238 / 86%); + + .replay-header { + text-align: center; + font-size: 3em; + text-shadow: var(--replayTextShadow); + } + } + .replay-card { + background: transparent; + border:0px; + } +} \ No newline at end of file diff --git a/src/renderer/style.less b/src/renderer/style.less index 4b4d957c..08813883 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -38,6 +38,7 @@ --songProgressColor: var(--keyColor); --songProgressBackground: #333; --textColor: #eee; + --replayGradient: linear-gradient(45deg, hsl(248deg 58% 29%), hsl(13deg 41% 42%)); } html, @@ -1085,6 +1086,7 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl max-width: 500px; border-left: 1px solid rgb(200 200 200 / 8%); border-right: 1px solid rgb(200 200 200 / 8%); + -webkit-app-region: drag; } .app-chrome .app-chrome-item > .app-playback-controls { @@ -1092,6 +1094,7 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl justify-content: center; align-content: center; width: 100%; + -webkit-app-region: no-drag; } .app-chrome .app-chrome-item > .app-playback-controls { @@ -1220,6 +1223,7 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl height: 4px; background-color: rgb(200 200 200 / 10%); border-radius: 2px; + margin: 0; &::-webkit-slider-thumb { opacity: 0; @@ -1645,66 +1649,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { height: 100%; } -.home-page { - top: 0; - padding-top: var(--navbarHeight); - - .artist-feed-card { - position: absolute; - bottom: 0; - left: 10%; - z-index: 1; - background: black; - width: 80%; - height: 96%; - overflow: scroll; - border-radius: 10px; - } - - .col.madeforyou-col { - width: 420px; - min-width: 0px; - max-width: 420px; - } - - .well.artistfeed-well { - margin-top: 0px; - height: 392px; - align-content: flex-start; - } - - .hint-text { - font-size: 0.9rem; - color: rgb(200 200 200 / 70%); - } - - .user-icon { - border-radius: 100%; - width: 128px; - height: 128px; - overflow: hidden; - box-shadow: var(--mediaItemShadow-Shadow); - margin: 16px; - } - - .well.profile-well { - flex-direction: column; - justify-content: center; - align-items: center; - - .name { - margin: 4px; - font-weight: 500; - } - - .handle { - margin: 4px; - opacity: 0.7; - font-weight: 500; - } - } -} - /* Cider */ .more-btn-round { @@ -2756,6 +2700,17 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { /* Transitions */ +.replaycard-enter-active, +.replaycard-leave-active { + transition: opacity .5s var(--appleEase), transform .5s var(--appleEase); +} + +.replaycard-enter, +.replaycard-leave-to { + opacity: 0; + transform: translateY(20px); +} + .modal-enter-active, .modal-leave-active { transition: opacity .1s var(--appleEase), transform .1s var(--appleEase); @@ -3155,4 +3110,5 @@ body[platform='darwin'] { } +@import url("less/linux.less"); @import url("less/compact.less"); diff --git a/src/renderer/views/app/app-content.ejs b/src/renderer/views/app/app-content.ejs index 1ebbd22e..b64e3f7d 100644 --- a/src/renderer/views/app/app-content.ejs +++ b/src/renderer/views/app/app-content.ejs @@ -172,4 +172,11 @@ + + + + + \ No newline at end of file diff --git a/src/renderer/views/components/listitem-horizontal.ejs b/src/renderer/views/components/listitem-horizontal.ejs index a8df81f4..ba00fe6f 100644 --- a/src/renderer/views/components/listitem-horizontal.ejs +++ b/src/renderer/views/components/listitem-horizontal.ejs @@ -3,7 +3,7 @@
@@ -19,6 +19,10 @@ items: { type: Array, required: true + }, + showLibraryStatus: { + type: Boolean, + default: true } }, data: function () { diff --git a/src/renderer/views/components/mediaitem-list-item.ejs b/src/renderer/views/components/mediaitem-list-item.ejs index fc671c53..44288389 100644 --- a/src/renderer/views/components/mediaitem-list-item.ejs +++ b/src/renderer/views/components/mediaitem-list-item.ejs @@ -74,6 +74,9 @@
{{ msToMinSec(item.attributes.durationInMillis ?? 0) }}
+
+ {{ item.attributes.playCount }} +
diff --git a/src/renderer/views/pages/home.ejs b/src/renderer/views/pages/home.ejs index 226dc360..45fe4b57 100644 --- a/src/renderer/views/pages/home.ejs +++ b/src/renderer/views/pages/home.ejs @@ -49,9 +49,21 @@ +
+
+ +
+
-

{{app.getLz('home.madeForYou')}}

+
+
+

{{app.getLz('home.madeForYou')}}

+
+
+ +
+
@@ -98,7 +110,9 @@ artistFeed: [], showingArtistFeed: false, page: "main", - sectionsReady: [] + sectionsReady: [], + year: new Date().getFullYear(), + seenReplay: localStorage.getItem('seenReplay') } }, async mounted() { @@ -106,6 +120,10 @@ this.getListenNowData() await this.getArtistFeed() await this.getFavorites() + if (new Date().getMonth() == 11) { + this.seenReplay = false + localStorage.setItem('seenReplay', false) + } }, methods: { async seeAllHistory() { diff --git a/src/renderer/views/pages/library-songs.ejs b/src/renderer/views/pages/library-songs.ejs index 567d2884..b2e27ab5 100644 --- a/src/renderer/views/pages/library-songs.ejs +++ b/src/renderer/views/pages/library-songs.ejs @@ -15,8 +15,16 @@ v-model="library.songs.search" class="search-input">
-
+
+ +
-
+
- {{$root.getLz('settings.option.experimental.copy_log')}} + {{$root.getLz('settings.option.general.updateCider')}}
-
+
+
+ {{$root.getLz('settings.option.general.updateCider.branch')}}
+ ({{$root.getLz('settings.option.general.updateCider.branch.description')}}) +
+
+ +
+
@@ -790,6 +836,9 @@ ipcRenderer.send('fetch-log') notyf.success(app.getLz('term.share.success')); }, + openAppData() { + ipcRenderer.send('open-appdata') + }, getLanguages: function () { let langs = this.$root.lzListing let categories = {