diff --git a/crowdin.yml b/crowdin.yml index 3b23bae3..9ac8d3ef 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -1,3 +1,3 @@ files: - source: /src/i18n/source/ - translation: /src/i18n/%locale_with_underscore%.jsonc + translation: /src/i18n/%locale_with_underscore%.json diff --git a/package.json b/package.json index 9fd41746..0d447ef4 100644 --- a/package.json +++ b/package.json @@ -103,9 +103,9 @@ } ], "build": { - "electronVersion": "16.0.9", + "electronVersion": "16.0.7", "electronDownload": { - "version": "16.0.9+wvcus", + "version": "16.0.7+wvcus", "mirror": "https://github.com/castlabs/electron-releases/releases/download/v" }, "appId": "cider", diff --git a/src/i18n/de_DE.json b/src/i18n/de_DE.json index 764f16f1..587de0c9 100644 --- a/src/i18n/de_DE.json +++ b/src/i18n/de_DE.json @@ -23,6 +23,7 @@ "term.about": "Über", "term.privateSession": "Private Sitzung", "term.queue": "Warteschlange", + "term.history": "Verlauf", "term.search": "Suche", "term.library": "Mediathek", "term.listenNow": "Jetzt Hören", diff --git a/src/i18n/source/en_US.json b/src/i18n/source/en_US.json index 5a7043ff..baf51e29 100644 --- a/src/i18n/source/en_US.json +++ b/src/i18n/source/en_US.json @@ -142,6 +142,7 @@ "term.noVideos": "No videos found.", "term.plugin": "Plug-in", "term.pluginMenu": "Plug-in Menu", + "term.pluginMenu.none": "No interactive plugins.", "term.replay": "Replay", "term.uniqueAlbums": "Unique Albums", "term.uniqueArtists": "Unique Artists", @@ -365,4 +366,4 @@ "remote.web.title": "Cider Remote", "remote.web.description": "Scan the QR code to pair your phone up with this Cider instance", "about.thanks": "Major thanks to the Cider Collective Team and all of our contributors." -} \ No newline at end of file +} diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index f6bb5826..3daba446 100644 --- a/src/main/base/browserwindow.ts +++ b/src/main/base/browserwindow.ts @@ -12,6 +12,7 @@ import fetch from 'electron-fetch' import {wsapi} from "./wsapi"; import {AppImageUpdater, NsisUpdater} from "electron-updater"; import {utils} from './utils'; + const AdmZip = require("adm-zip"); @@ -46,6 +47,7 @@ export class BrowserWindow { "pages/library-videos", "pages/remote-pair", "pages/themes-github", + "pages/plugins-github", "pages/replay", "pages/audiolabs", "components/mediaitem-artwork", @@ -76,6 +78,112 @@ export class BrowserWindow { "components/lyrics-view", "components/fullscreen", "components/miniplayer", + ], + appRoutes: [ + { + page: "podcasts", + component: ``, + condition: `page == 'podcasts'` + }, { + page: "library-videos", + component: ``, + condition: `page == 'library-videos'` + }, { + page: "apple-account-settings", + component: ``, + condition: `page == 'apple-account-settings'` + }, { + page: "about", + component: ``, + condition: `page == 'about'` + }, { + page: "cider-artist", + component: ``, + condition: `page == 'artist-page' && artistPage.data.attributes` + }, { + page: "collection-list", + component: ``, + condition: `page == 'collection-list'` + }, { + page: "home", + component: ``, + condition: `page == 'home'` + }, { + page: "artist-feed", + component: ``, + condition: `page == 'artist-feed'` + }, { + page: "playlist-inline", + component: ``, + condition: `modals.showPlaylist` + }, { + page: "playlist_", + component: ``, + condition: `page.includes('playlist_')` + }, { + page: "album_", + component: ``, + condition: `page.includes('album_')` + }, { + page: "recordLabel_", + component: ``, + condition: `page.includes('recordLabel_')` + }, { + page: "curator_", + component: ``, + condition: `page.includes('curator_')` + }, { + page: "browsepage", + component: ``, + condition: `page == 'browse'`, + onEnter: `getBrowsePage();` + }, { + page: "listen_now", + component: ``, + condition: `page == 'listen_now'`, + onEnter: `getListenNow()` + }, { + page: "settings", + component: ``, + condition: `page == 'settings'` + }, { + page: "search", + component: ``, + condition: `page == 'search'` + }, { + page: "library-songs", + component: ``, + condition: `page == 'library-songs'`, + onEnter: `getLibrarySongsFull()` + }, { + page: "appleCurator", + component: ``, + condition: `page.includes('appleCurator')` + }, { + page: "themes-github", + component: ``, + condition: `page == 'themes-github'` + },{ + page: "plugins-github", + component: ``, + condition: `page == 'plugins-github'` + }, { + page: "podcasts", + component: ``, + condition: `page == 'podcasts'` + }, { + page: "remote-pair", + component: ``, + condition: `page == 'remote-pair'` + }, { + page: "audiolabs", + component: ``, + condition: `page == 'audiolabs'` + }, { + page: "replay", + component: ``, + condition: `page == 'replay'` + } ] }, }; @@ -125,24 +233,24 @@ export class BrowserWindow { this.options.width = windowState.width; this.options.height = windowState.height; - switch(process.platform) { + switch (process.platform) { default: - break; + break; case "win32": this.options.backgroundColor = "#1E1E1E"; this.options.transparent = false; - break; + break; case "linux": this.options.backgroundColor = "#1E1E1E"; this.options.autoHideMenuBar = true this.options.frame = true - break; + break; case "darwin": this.options.transparent = true; this.options.vibrancy = "dark"; this.options.hasShadow = true; - break; + break; } // Start the webserver for the browser window to load @@ -279,7 +387,7 @@ export class BrowserWindow { res.send(`// File not found - ${userThemePath}`); } }); - + app.get("/plugins/:plugin/*", (req, res) => { const plugin = req.params.plugin; // @ts-ignore @@ -425,7 +533,7 @@ export class BrowserWindow { let zipFile = new AdmZip(zip); zipFile.extractAllTo(utils.getPath("themes"), true); - }catch(e) { + } catch (e) { returnVal.success = false; } BrowserWindow.win.webContents.send("theme-installed", returnVal); @@ -684,8 +792,8 @@ export class BrowserWindow { console.log('sc', SoundCheckTag) BrowserWindow.win.webContents.send('SoundCheckTag', SoundCheckTag) }).catch(err => { - console.log(err) - }); + console.log(err) + }); }); ipcMain.on('check-for-update', async (_event) => { @@ -704,9 +812,9 @@ export class BrowserWindow { provider: 'generic', url: `${base_url}` } - + // Have to handle the auto updaters seperatly until we can support macOS. electron-builder limitation -q - + const win_autoUpdater = new NsisUpdater(options) //Windows const linux_autoUpdater = new AppImageUpdater(options) //Linux await win_autoUpdater.checkForUpdatesAndNotify() diff --git a/src/main/base/store.ts b/src/main/base/store.ts index 4436b3fc..f60b2d7d 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -13,7 +13,8 @@ export class Store { "language": "en_US", // electron.app.getLocale().replace('-', '_') this can be used in future "playbackNotifications": true, "update_branch": "main", - "resumeOnStartupBehavior": "local" + "resumeOnStartupBehavior": "local", + "privateEnabled": false, }, "home": { "followedArtists": [], diff --git a/src/main/index.ts b/src/main/index.ts index a046cd8a..34e4ab66 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -74,7 +74,7 @@ ipcMain.on('nowPlayingItemDidChange', (_event, attributes) => { }); ipcMain.on('nowPlayingItemDidChangeLastFM', (_event, attributes) => { - CiderPlug.callPlugin('lastfm', 'nowPlayingItemDidChangeLastFM', attributes); + CiderPlug.callPlugin('lastfm.js', 'nowPlayingItemDidChangeLastFM', attributes); }) app.on('before-quit', () => { diff --git a/src/main/plugins/discordrpc.ts b/src/main/plugins/discordrpc.ts index 3b11557e..cec2d6d3 100644 --- a/src/main/plugins/discordrpc.ts +++ b/src/main/plugins/discordrpc.ts @@ -207,6 +207,7 @@ export default class DiscordRichPresence { this.connect((DiscordRichPresence._store.general.discord_rpc == 1) ? '911790844204437504' : '886578863147192350'); console.debug(`[Plugin][${this.name}] Ready.`); ipcMain.on('updateRPCImage', (_event, imageurl) => { + if (!DiscordRichPresence._store.general.privateEnabled){ fetch('https://api.cider.sh/v1/images' ,{ method: 'POST', @@ -221,7 +222,7 @@ export default class DiscordRichPresence { self._attributes["artwork"]["url"] = json.url self.updateActivity(self._attributes) }) - + } }) } @@ -237,8 +238,9 @@ export default class DiscordRichPresence { * @param attributes Music Attributes (attributes.status = current state) */ onPlaybackStateDidChange(attributes: object): void { + if (!DiscordRichPresence._store.general.privateEnabled){ this._attributes = attributes - this.updateActivity(attributes) + this.updateActivity(attributes)} } /** @@ -246,7 +248,8 @@ export default class DiscordRichPresence { * @param attributes Music Attributes */ onNowPlayingItemDidChange(attributes: object): void { + if (!DiscordRichPresence._store.general.privateEnabled){ this._attributes = attributes - this.updateActivity(attributes) + this.updateActivity(attributes)} } } diff --git a/src/main/plugins/lastfm.ts b/src/main/plugins/lastfm.ts index a7433b8b..2ac0a000 100644 --- a/src/main/plugins/lastfm.ts +++ b/src/main/plugins/lastfm.ts @@ -93,6 +93,7 @@ export default class LastFMPlugin { } const artist = await this.getPrimaryArtist(attributes) + const album = this.getAlbumName(attributes) if (currentAttributes.status && currentAttributes === attributes) { if (fs.existsSync(this.sessionPath)) { @@ -101,7 +102,7 @@ export default class LastFMPlugin { self._lastfm.track.scrobble({ 'artist': artist, 'track': attributes.name, - 'album': attributes.albumName, + 'album': album, 'albumArtist': artist, 'timestamp': new Date().getTime() / 1000 }, function (err: any, scrobbled: any) { @@ -119,7 +120,7 @@ export default class LastFMPlugin { } 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 * Math.min((self._store.lastfm.scrobble_after / 100),0.8))); } private async updateNowPlayingSong(attributes: any) { @@ -133,13 +134,14 @@ export default class LastFMPlugin { if (fs.existsSync(this.sessionPath)) { const artist = await this.getPrimaryArtist(attributes) + const album = this.getAlbumName(attributes) // update Now Playing if (attributes.status === true) { this._lastfm.track.updateNowPlaying({ 'artist': artist, 'track': attributes.name, - 'album': attributes.albumName, + 'album': album, 'albumArtist': artist }, function (err: any, nowPlaying: any) { if (err) { @@ -156,6 +158,10 @@ export default class LastFMPlugin { } } + private getAlbumName(attributes: any): string { + return attributes.albumName.replace(/ - Single| - EP/g, ''); + } + private async getPrimaryArtist(attributes: any) { const songId = attributes.playParams.catalogId || attributes.playParams.id @@ -253,27 +259,19 @@ export default class LastFMPlugin { console.log('Example plugin stopped'); } - /** - * Runs on playback State Change - * @param attributes Music Attributes (attributes.status = current state) - */ - onPlaybackStateDidChange(attributes: object): void { - this.updateNowPlayingSong(attributes) - // this.scrobbleSong(attributes) - } - /** * Runs on song change * @param attributes Music Attributes */ nowPlayingItemDidChangeLastFM(attributes: any): void { + if (!this._store.general.privateEnabled){ attributes.status = true if (!this._store.lastfm.filterLoop) { this._lastfm.cachedNowPlayingAttributes = false; this._lastfm.cachedAttributes = false } this.updateNowPlayingSong(attributes) - this.scrobbleSong(attributes) + this.scrobbleSong(attributes)} } } diff --git a/src/renderer/index.js b/src/renderer/index.js index b7f9ae24..ef140567 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -612,6 +612,7 @@ const app = new Vue({ } else { // Get Hide User from Settings this.chrome.hideUserInfo = !this.cfg.visual.showuserinfo + this.mk.privateEnabled = this.cfg.general.privateEnabled } if (this.cfg.visual.hw_acceleration == "disabled") { document.body.classList.add("no-gpu") @@ -626,7 +627,7 @@ const app = new Vue({ this.chrome.userinfo = (await app.mk.api.v3.music(`/v1/me/social-profile`)).data.data[0] } catch (err) { } - this.mk.privateEnabled = !this.cfg.visual.showuserinfo + this.mk._bag.features['seamless-audio-transitions'] = this.cfg.audio.seamless_audio // API Fallback @@ -2634,6 +2635,10 @@ const app = new Vue({ getToken(1, track, artist, '', lang, time); } } + req.onerror = function () { + console.log('error'); + app.loadAMLyrics(); + }; req.send(); } diff --git a/src/renderer/less/codicon.css b/src/renderer/less/codicon.css new file mode 100644 index 00000000..bd00654c --- /dev/null +++ b/src/renderer/less/codicon.css @@ -0,0 +1,553 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +@font-face { + font-family: "codicon"; + font-display: block; + src: url("codicon.ttf") format("truetype"); +} + +.codicon[class*='codicon-'] { + font: normal normal normal 16px/1 codicon; + display: inline-block; + text-decoration: none; + text-rendering: auto; + text-align: center; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + user-select: none; + -webkit-user-select: none; + -ms-user-select: none; +} + +/*--------------------- + * Modifiers + *-------------------*/ + +@keyframes codicon-spin { + 100% { + transform:rotate(360deg); + } +} + +.codicon-sync.codicon-modifier-spin, +.codicon-loading.codicon-modifier-spin, +.codicon-gear.codicon-modifier-spin { + /* Use steps to throttle FPS to reduce CPU usage */ + animation: codicon-spin 1.5s steps(30) infinite; +} + +.codicon-modifier-disabled { + opacity: 0.5; +} + +/* custom speed & easing for loading icon */ +.codicon-loading { + animation-duration: 1s !important; + animation-timing-function: cubic-bezier(0.53, 0.21, 0.29, 0.67) !important; +} + +/*--------------------- + * Icons + *-------------------*/ + +.codicon-add:before { content: "\ea60" } +.codicon-plus:before { content: "\ea60" } +.codicon-gist-new:before { content: "\ea60" } +.codicon-repo-create:before { content: "\ea60" } +.codicon-lightbulb:before { content: "\ea61" } +.codicon-light-bulb:before { content: "\ea61" } +.codicon-repo:before { content: "\ea62" } +.codicon-repo-delete:before { content: "\ea62" } +.codicon-gist-fork:before { content: "\ea63" } +.codicon-repo-forked:before { content: "\ea63" } +.codicon-git-pull-request:before { content: "\ea64" } +.codicon-git-pull-request-abandoned:before { content: "\ea64" } +.codicon-record-keys:before { content: "\ea65" } +.codicon-keyboard:before { content: "\ea65" } +.codicon-tag:before { content: "\ea66" } +.codicon-tag-add:before { content: "\ea66" } +.codicon-tag-remove:before { content: "\ea66" } +.codicon-person:before { content: "\ea67" } +.codicon-person-follow:before { content: "\ea67" } +.codicon-person-outline:before { content: "\ea67" } +.codicon-person-filled:before { content: "\ea67" } +.codicon-git-branch:before { content: "\ea68" } +.codicon-git-branch-create:before { content: "\ea68" } +.codicon-git-branch-delete:before { content: "\ea68" } +.codicon-source-control:before { content: "\ea68" } +.codicon-mirror:before { content: "\ea69" } +.codicon-mirror-public:before { content: "\ea69" } +.codicon-star:before { content: "\ea6a" } +.codicon-star-add:before { content: "\ea6a" } +.codicon-star-delete:before { content: "\ea6a" } +.codicon-star-empty:before { content: "\ea6a" } +.codicon-comment:before { content: "\ea6b" } +.codicon-comment-add:before { content: "\ea6b" } +.codicon-alert:before { content: "\ea6c" } +.codicon-warning:before { content: "\ea6c" } +.codicon-search:before { content: "\ea6d" } +.codicon-search-save:before { content: "\ea6d" } +.codicon-log-out:before { content: "\ea6e" } +.codicon-sign-out:before { content: "\ea6e" } +.codicon-log-in:before { content: "\ea6f" } +.codicon-sign-in:before { content: "\ea6f" } +.codicon-eye:before { content: "\ea70" } +.codicon-eye-unwatch:before { content: "\ea70" } +.codicon-eye-watch:before { content: "\ea70" } +.codicon-circle-filled:before { content: "\ea71" } +.codicon-primitive-dot:before { content: "\ea71" } +.codicon-close-dirty:before { content: "\ea71" } +.codicon-debug-breakpoint:before { content: "\ea71" } +.codicon-debug-breakpoint-disabled:before { content: "\ea71" } +.codicon-debug-hint:before { content: "\ea71" } +.codicon-primitive-square:before { content: "\ea72" } +.codicon-edit:before { content: "\ea73" } +.codicon-pencil:before { content: "\ea73" } +.codicon-info:before { content: "\ea74" } +.codicon-issue-opened:before { content: "\ea74" } +.codicon-gist-private:before { content: "\ea75" } +.codicon-git-fork-private:before { content: "\ea75" } +.codicon-lock:before { content: "\ea75" } +.codicon-mirror-private:before { content: "\ea75" } +.codicon-close:before { content: "\ea76" } +.codicon-remove-close:before { content: "\ea76" } +.codicon-x:before { content: "\ea76" } +.codicon-repo-sync:before { content: "\ea77" } +.codicon-sync:before { content: "\ea77" } +.codicon-clone:before { content: "\ea78" } +.codicon-desktop-download:before { content: "\ea78" } +.codicon-beaker:before { content: "\ea79" } +.codicon-microscope:before { content: "\ea79" } +.codicon-vm:before { content: "\ea7a" } +.codicon-device-desktop:before { content: "\ea7a" } +.codicon-file:before { content: "\ea7b" } +.codicon-file-text:before { content: "\ea7b" } +.codicon-more:before { content: "\ea7c" } +.codicon-ellipsis:before { content: "\ea7c" } +.codicon-kebab-horizontal:before { content: "\ea7c" } +.codicon-mail-reply:before { content: "\ea7d" } +.codicon-reply:before { content: "\ea7d" } +.codicon-organization:before { content: "\ea7e" } +.codicon-organization-filled:before { content: "\ea7e" } +.codicon-organization-outline:before { content: "\ea7e" } +.codicon-new-file:before { content: "\ea7f" } +.codicon-file-add:before { content: "\ea7f" } +.codicon-new-folder:before { content: "\ea80" } +.codicon-file-directory-create:before { content: "\ea80" } +.codicon-trash:before { content: "\ea81" } +.codicon-trashcan:before { content: "\ea81" } +.codicon-history:before { content: "\ea82" } +.codicon-clock:before { content: "\ea82" } +.codicon-folder:before { content: "\ea83" } +.codicon-file-directory:before { content: "\ea83" } +.codicon-symbol-folder:before { content: "\ea83" } +.codicon-logo-github:before { content: "\ea84" } +.codicon-mark-github:before { content: "\ea84" } +.codicon-github:before { content: "\ea84" } +.codicon-terminal:before { content: "\ea85" } +.codicon-console:before { content: "\ea85" } +.codicon-repl:before { content: "\ea85" } +.codicon-zap:before { content: "\ea86" } +.codicon-symbol-event:before { content: "\ea86" } +.codicon-error:before { content: "\ea87" } +.codicon-stop:before { content: "\ea87" } +.codicon-variable:before { content: "\ea88" } +.codicon-symbol-variable:before { content: "\ea88" } +.codicon-array:before { content: "\ea8a" } +.codicon-symbol-array:before { content: "\ea8a" } +.codicon-symbol-module:before { content: "\ea8b" } +.codicon-symbol-package:before { content: "\ea8b" } +.codicon-symbol-namespace:before { content: "\ea8b" } +.codicon-symbol-object:before { content: "\ea8b" } +.codicon-symbol-method:before { content: "\ea8c" } +.codicon-symbol-function:before { content: "\ea8c" } +.codicon-symbol-constructor:before { content: "\ea8c" } +.codicon-symbol-boolean:before { content: "\ea8f" } +.codicon-symbol-null:before { content: "\ea8f" } +.codicon-symbol-numeric:before { content: "\ea90" } +.codicon-symbol-number:before { content: "\ea90" } +.codicon-symbol-structure:before { content: "\ea91" } +.codicon-symbol-struct:before { content: "\ea91" } +.codicon-symbol-parameter:before { content: "\ea92" } +.codicon-symbol-type-parameter:before { content: "\ea92" } +.codicon-symbol-key:before { content: "\ea93" } +.codicon-symbol-text:before { content: "\ea93" } +.codicon-symbol-reference:before { content: "\ea94" } +.codicon-go-to-file:before { content: "\ea94" } +.codicon-symbol-enum:before { content: "\ea95" } +.codicon-symbol-value:before { content: "\ea95" } +.codicon-symbol-ruler:before { content: "\ea96" } +.codicon-symbol-unit:before { content: "\ea96" } +.codicon-activate-breakpoints:before { content: "\ea97" } +.codicon-archive:before { content: "\ea98" } +.codicon-arrow-both:before { content: "\ea99" } +.codicon-arrow-down:before { content: "\ea9a" } +.codicon-arrow-left:before { content: "\ea9b" } +.codicon-arrow-right:before { content: "\ea9c" } +.codicon-arrow-small-down:before { content: "\ea9d" } +.codicon-arrow-small-left:before { content: "\ea9e" } +.codicon-arrow-small-right:before { content: "\ea9f" } +.codicon-arrow-small-up:before { content: "\eaa0" } +.codicon-arrow-up:before { content: "\eaa1" } +.codicon-bell:before { content: "\eaa2" } +.codicon-bold:before { content: "\eaa3" } +.codicon-book:before { content: "\eaa4" } +.codicon-bookmark:before { content: "\eaa5" } +.codicon-debug-breakpoint-conditional-unverified:before { content: "\eaa6" } +.codicon-debug-breakpoint-conditional:before { content: "\eaa7" } +.codicon-debug-breakpoint-conditional-disabled:before { content: "\eaa7" } +.codicon-debug-breakpoint-data-unverified:before { content: "\eaa8" } +.codicon-debug-breakpoint-data:before { content: "\eaa9" } +.codicon-debug-breakpoint-data-disabled:before { content: "\eaa9" } +.codicon-debug-breakpoint-log-unverified:before { content: "\eaaa" } +.codicon-debug-breakpoint-log:before { content: "\eaab" } +.codicon-debug-breakpoint-log-disabled:before { content: "\eaab" } +.codicon-briefcase:before { content: "\eaac" } +.codicon-broadcast:before { content: "\eaad" } +.codicon-browser:before { content: "\eaae" } +.codicon-bug:before { content: "\eaaf" } +.codicon-calendar:before { content: "\eab0" } +.codicon-case-sensitive:before { content: "\eab1" } +.codicon-check:before { content: "\eab2" } +.codicon-checklist:before { content: "\eab3" } +.codicon-chevron-down:before { content: "\eab4" } +.codicon-chevron-left:before { content: "\eab5" } +.codicon-chevron-right:before { content: "\eab6" } +.codicon-chevron-up:before { content: "\eab7" } +.codicon-chrome-close:before { content: "\eab8" } +.codicon-chrome-maximize:before { content: "\eab9" } +.codicon-chrome-minimize:before { content: "\eaba" } +.codicon-chrome-restore:before { content: "\eabb" } +.codicon-circle-outline:before { content: "\eabc" } +.codicon-debug-breakpoint-unverified:before { content: "\eabc" } +.codicon-circle-slash:before { content: "\eabd" } +.codicon-circuit-board:before { content: "\eabe" } +.codicon-clear-all:before { content: "\eabf" } +.codicon-clippy:before { content: "\eac0" } +.codicon-close-all:before { content: "\eac1" } +.codicon-cloud-download:before { content: "\eac2" } +.codicon-cloud-upload:before { content: "\eac3" } +.codicon-code:before { content: "\eac4" } +.codicon-collapse-all:before { content: "\eac5" } +.codicon-color-mode:before { content: "\eac6" } +.codicon-comment-discussion:before { content: "\eac7" } +.codicon-credit-card:before { content: "\eac9" } +.codicon-dash:before { content: "\eacc" } +.codicon-dashboard:before { content: "\eacd" } +.codicon-database:before { content: "\eace" } +.codicon-debug-continue:before { content: "\eacf" } +.codicon-debug-disconnect:before { content: "\ead0" } +.codicon-debug-pause:before { content: "\ead1" } +.codicon-debug-restart:before { content: "\ead2" } +.codicon-debug-start:before { content: "\ead3" } +.codicon-debug-step-into:before { content: "\ead4" } +.codicon-debug-step-out:before { content: "\ead5" } +.codicon-debug-step-over:before { content: "\ead6" } +.codicon-debug-stop:before { content: "\ead7" } +.codicon-debug:before { content: "\ead8" } +.codicon-device-camera-video:before { content: "\ead9" } +.codicon-device-camera:before { content: "\eada" } +.codicon-device-mobile:before { content: "\eadb" } +.codicon-diff-added:before { content: "\eadc" } +.codicon-diff-ignored:before { content: "\eadd" } +.codicon-diff-modified:before { content: "\eade" } +.codicon-diff-removed:before { content: "\eadf" } +.codicon-diff-renamed:before { content: "\eae0" } +.codicon-diff:before { content: "\eae1" } +.codicon-discard:before { content: "\eae2" } +.codicon-editor-layout:before { content: "\eae3" } +.codicon-empty-window:before { content: "\eae4" } +.codicon-exclude:before { content: "\eae5" } +.codicon-extensions:before { content: "\eae6" } +.codicon-eye-closed:before { content: "\eae7" } +.codicon-file-binary:before { content: "\eae8" } +.codicon-file-code:before { content: "\eae9" } +.codicon-file-media:before { content: "\eaea" } +.codicon-file-pdf:before { content: "\eaeb" } +.codicon-file-submodule:before { content: "\eaec" } +.codicon-file-symlink-directory:before { content: "\eaed" } +.codicon-file-symlink-file:before { content: "\eaee" } +.codicon-file-zip:before { content: "\eaef" } +.codicon-files:before { content: "\eaf0" } +.codicon-filter:before { content: "\eaf1" } +.codicon-flame:before { content: "\eaf2" } +.codicon-fold-down:before { content: "\eaf3" } +.codicon-fold-up:before { content: "\eaf4" } +.codicon-fold:before { content: "\eaf5" } +.codicon-folder-active:before { content: "\eaf6" } +.codicon-folder-opened:before { content: "\eaf7" } +.codicon-gear:before { content: "\eaf8" } +.codicon-gift:before { content: "\eaf9" } +.codicon-gist-secret:before { content: "\eafa" } +.codicon-gist:before { content: "\eafb" } +.codicon-git-commit:before { content: "\eafc" } +.codicon-git-compare:before { content: "\eafd" } +.codicon-compare-changes:before { content: "\eafd" } +.codicon-git-merge:before { content: "\eafe" } +.codicon-github-action:before { content: "\eaff" } +.codicon-github-alt:before { content: "\eb00" } +.codicon-globe:before { content: "\eb01" } +.codicon-grabber:before { content: "\eb02" } +.codicon-graph:before { content: "\eb03" } +.codicon-gripper:before { content: "\eb04" } +.codicon-heart:before { content: "\eb05" } +.codicon-home:before { content: "\eb06" } +.codicon-horizontal-rule:before { content: "\eb07" } +.codicon-hubot:before { content: "\eb08" } +.codicon-inbox:before { content: "\eb09" } +.codicon-issue-reopened:before { content: "\eb0b" } +.codicon-issues:before { content: "\eb0c" } +.codicon-italic:before { content: "\eb0d" } +.codicon-jersey:before { content: "\eb0e" } +.codicon-json:before { content: "\eb0f" } +.codicon-kebab-vertical:before { content: "\eb10" } +.codicon-key:before { content: "\eb11" } +.codicon-law:before { content: "\eb12" } +.codicon-lightbulb-autofix:before { content: "\eb13" } +.codicon-link-external:before { content: "\eb14" } +.codicon-link:before { content: "\eb15" } +.codicon-list-ordered:before { content: "\eb16" } +.codicon-list-unordered:before { content: "\eb17" } +.codicon-live-share:before { content: "\eb18" } +.codicon-loading:before { content: "\eb19" } +.codicon-location:before { content: "\eb1a" } +.codicon-mail-read:before { content: "\eb1b" } +.codicon-mail:before { content: "\eb1c" } +.codicon-markdown:before { content: "\eb1d" } +.codicon-megaphone:before { content: "\eb1e" } +.codicon-mention:before { content: "\eb1f" } +.codicon-milestone:before { content: "\eb20" } +.codicon-mortar-board:before { content: "\eb21" } +.codicon-move:before { content: "\eb22" } +.codicon-multiple-windows:before { content: "\eb23" } +.codicon-mute:before { content: "\eb24" } +.codicon-no-newline:before { content: "\eb25" } +.codicon-note:before { content: "\eb26" } +.codicon-octoface:before { content: "\eb27" } +.codicon-open-preview:before { content: "\eb28" } +.codicon-package:before { content: "\eb29" } +.codicon-paintcan:before { content: "\eb2a" } +.codicon-pin:before { content: "\eb2b" } +.codicon-play:before { content: "\eb2c" } +.codicon-run:before { content: "\eb2c" } +.codicon-plug:before { content: "\eb2d" } +.codicon-preserve-case:before { content: "\eb2e" } +.codicon-preview:before { content: "\eb2f" } +.codicon-project:before { content: "\eb30" } +.codicon-pulse:before { content: "\eb31" } +.codicon-question:before { content: "\eb32" } +.codicon-quote:before { content: "\eb33" } +.codicon-radio-tower:before { content: "\eb34" } +.codicon-reactions:before { content: "\eb35" } +.codicon-references:before { content: "\eb36" } +.codicon-refresh:before { content: "\eb37" } +.codicon-regex:before { content: "\eb38" } +.codicon-remote-explorer:before { content: "\eb39" } +.codicon-remote:before { content: "\eb3a" } +.codicon-remove:before { content: "\eb3b" } +.codicon-replace-all:before { content: "\eb3c" } +.codicon-replace:before { content: "\eb3d" } +.codicon-repo-clone:before { content: "\eb3e" } +.codicon-repo-force-push:before { content: "\eb3f" } +.codicon-repo-pull:before { content: "\eb40" } +.codicon-repo-push:before { content: "\eb41" } +.codicon-report:before { content: "\eb42" } +.codicon-request-changes:before { content: "\eb43" } +.codicon-rocket:before { content: "\eb44" } +.codicon-root-folder-opened:before { content: "\eb45" } +.codicon-root-folder:before { content: "\eb46" } +.codicon-rss:before { content: "\eb47" } +.codicon-ruby:before { content: "\eb48" } +.codicon-save-all:before { content: "\eb49" } +.codicon-save-as:before { content: "\eb4a" } +.codicon-save:before { content: "\eb4b" } +.codicon-screen-full:before { content: "\eb4c" } +.codicon-screen-normal:before { content: "\eb4d" } +.codicon-search-stop:before { content: "\eb4e" } +.codicon-server:before { content: "\eb50" } +.codicon-settings-gear:before { content: "\eb51" } +.codicon-settings:before { content: "\eb52" } +.codicon-shield:before { content: "\eb53" } +.codicon-smiley:before { content: "\eb54" } +.codicon-sort-precedence:before { content: "\eb55" } +.codicon-split-horizontal:before { content: "\eb56" } +.codicon-split-vertical:before { content: "\eb57" } +.codicon-squirrel:before { content: "\eb58" } +.codicon-star-full:before { content: "\eb59" } +.codicon-star-half:before { content: "\eb5a" } +.codicon-symbol-class:before { content: "\eb5b" } +.codicon-symbol-color:before { content: "\eb5c" } +.codicon-symbol-constant:before { content: "\eb5d" } +.codicon-symbol-enum-member:before { content: "\eb5e" } +.codicon-symbol-field:before { content: "\eb5f" } +.codicon-symbol-file:before { content: "\eb60" } +.codicon-symbol-interface:before { content: "\eb61" } +.codicon-symbol-keyword:before { content: "\eb62" } +.codicon-symbol-misc:before { content: "\eb63" } +.codicon-symbol-operator:before { content: "\eb64" } +.codicon-symbol-property:before { content: "\eb65" } +.codicon-wrench:before { content: "\eb65" } +.codicon-wrench-subaction:before { content: "\eb65" } +.codicon-symbol-snippet:before { content: "\eb66" } +.codicon-tasklist:before { content: "\eb67" } +.codicon-telescope:before { content: "\eb68" } +.codicon-text-size:before { content: "\eb69" } +.codicon-three-bars:before { content: "\eb6a" } +.codicon-thumbsdown:before { content: "\eb6b" } +.codicon-thumbsup:before { content: "\eb6c" } +.codicon-tools:before { content: "\eb6d" } +.codicon-triangle-down:before { content: "\eb6e" } +.codicon-triangle-left:before { content: "\eb6f" } +.codicon-triangle-right:before { content: "\eb70" } +.codicon-triangle-up:before { content: "\eb71" } +.codicon-twitter:before { content: "\eb72" } +.codicon-unfold:before { content: "\eb73" } +.codicon-unlock:before { content: "\eb74" } +.codicon-unmute:before { content: "\eb75" } +.codicon-unverified:before { content: "\eb76" } +.codicon-verified:before { content: "\eb77" } +.codicon-versions:before { content: "\eb78" } +.codicon-vm-active:before { content: "\eb79" } +.codicon-vm-outline:before { content: "\eb7a" } +.codicon-vm-running:before { content: "\eb7b" } +.codicon-watch:before { content: "\eb7c" } +.codicon-whitespace:before { content: "\eb7d" } +.codicon-whole-word:before { content: "\eb7e" } +.codicon-window:before { content: "\eb7f" } +.codicon-word-wrap:before { content: "\eb80" } +.codicon-zoom-in:before { content: "\eb81" } +.codicon-zoom-out:before { content: "\eb82" } +.codicon-list-filter:before { content: "\eb83" } +.codicon-list-flat:before { content: "\eb84" } +.codicon-list-selection:before { content: "\eb85" } +.codicon-selection:before { content: "\eb85" } +.codicon-list-tree:before { content: "\eb86" } +.codicon-debug-breakpoint-function-unverified:before { content: "\eb87" } +.codicon-debug-breakpoint-function:before { content: "\eb88" } +.codicon-debug-breakpoint-function-disabled:before { content: "\eb88" } +.codicon-debug-stackframe-active:before { content: "\eb89" } +.codicon-debug-stackframe-dot:before { content: "\eb8a" } +.codicon-debug-stackframe:before { content: "\eb8b" } +.codicon-debug-stackframe-focused:before { content: "\eb8b" } +.codicon-debug-breakpoint-unsupported:before { content: "\eb8c" } +.codicon-symbol-string:before { content: "\eb8d" } +.codicon-debug-reverse-continue:before { content: "\eb8e" } +.codicon-debug-step-back:before { content: "\eb8f" } +.codicon-debug-restart-frame:before { content: "\eb90" } +.codicon-debug-alt:before { content: "\eb91" } +.codicon-call-incoming:before { content: "\eb92" } +.codicon-call-outgoing:before { content: "\eb93" } +.codicon-menu:before { content: "\eb94" } +.codicon-expand-all:before { content: "\eb95" } +.codicon-feedback:before { content: "\eb96" } +.codicon-group-by-ref-type:before { content: "\eb97" } +.codicon-ungroup-by-ref-type:before { content: "\eb98" } +.codicon-account:before { content: "\eb99" } +.codicon-bell-dot:before { content: "\eb9a" } +.codicon-debug-console:before { content: "\eb9b" } +.codicon-library:before { content: "\eb9c" } +.codicon-output:before { content: "\eb9d" } +.codicon-run-all:before { content: "\eb9e" } +.codicon-sync-ignored:before { content: "\eb9f" } +.codicon-pinned:before { content: "\eba0" } +.codicon-github-inverted:before { content: "\eba1" } +.codicon-server-process:before { content: "\eba2" } +.codicon-server-environment:before { content: "\eba3" } +.codicon-pass:before { content: "\eba4" } +.codicon-issue-closed:before { content: "\eba4" } +.codicon-stop-circle:before { content: "\eba5" } +.codicon-play-circle:before { content: "\eba6" } +.codicon-record:before { content: "\eba7" } +.codicon-debug-alt-small:before { content: "\eba8" } +.codicon-vm-connect:before { content: "\eba9" } +.codicon-cloud:before { content: "\ebaa" } +.codicon-merge:before { content: "\ebab" } +.codicon-export:before { content: "\ebac" } +.codicon-graph-left:before { content: "\ebad" } +.codicon-magnet:before { content: "\ebae" } +.codicon-notebook:before { content: "\ebaf" } +.codicon-redo:before { content: "\ebb0" } +.codicon-check-all:before { content: "\ebb1" } +.codicon-pinned-dirty:before { content: "\ebb2" } +.codicon-pass-filled:before { content: "\ebb3" } +.codicon-circle-large-filled:before { content: "\ebb4" } +.codicon-circle-large-outline:before { content: "\ebb5" } +.codicon-combine:before { content: "\ebb6" } +.codicon-gather:before { content: "\ebb6" } +.codicon-table:before { content: "\ebb7" } +.codicon-variable-group:before { content: "\ebb8" } +.codicon-type-hierarchy:before { content: "\ebb9" } +.codicon-type-hierarchy-sub:before { content: "\ebba" } +.codicon-type-hierarchy-super:before { content: "\ebbb" } +.codicon-git-pull-request-create:before { content: "\ebbc" } +.codicon-run-above:before { content: "\ebbd" } +.codicon-run-below:before { content: "\ebbe" } +.codicon-notebook-template:before { content: "\ebbf" } +.codicon-debug-rerun:before { content: "\ebc0" } +.codicon-workspace-trusted:before { content: "\ebc1" } +.codicon-workspace-untrusted:before { content: "\ebc2" } +.codicon-workspace-unknown:before { content: "\ebc3" } +.codicon-terminal-cmd:before { content: "\ebc4" } +.codicon-terminal-debian:before { content: "\ebc5" } +.codicon-terminal-linux:before { content: "\ebc6" } +.codicon-terminal-powershell:before { content: "\ebc7" } +.codicon-terminal-tmux:before { content: "\ebc8" } +.codicon-terminal-ubuntu:before { content: "\ebc9" } +.codicon-terminal-bash:before { content: "\ebca" } +.codicon-arrow-swap:before { content: "\ebcb" } +.codicon-copy:before { content: "\ebcc" } +.codicon-person-add:before { content: "\ebcd" } +.codicon-filter-filled:before { content: "\ebce" } +.codicon-wand:before { content: "\ebcf" } +.codicon-debug-line-by-line:before { content: "\ebd0" } +.codicon-inspect:before { content: "\ebd1" } +.codicon-layers:before { content: "\ebd2" } +.codicon-layers-dot:before { content: "\ebd3" } +.codicon-layers-active:before { content: "\ebd4" } +.codicon-compass:before { content: "\ebd5" } +.codicon-compass-dot:before { content: "\ebd6" } +.codicon-compass-active:before { content: "\ebd7" } +.codicon-azure:before { content: "\ebd8" } +.codicon-issue-draft:before { content: "\ebd9" } +.codicon-git-pull-request-closed:before { content: "\ebda" } +.codicon-git-pull-request-draft:before { content: "\ebdb" } +.codicon-debug-all:before { content: "\ebdc" } +.codicon-debug-coverage:before { content: "\ebdd" } +.codicon-run-errors:before { content: "\ebde" } +.codicon-folder-library:before { content: "\ebdf" } +.codicon-debug-continue-small:before { content: "\ebe0" } +.codicon-beaker-stop:before { content: "\ebe1" } +.codicon-graph-line:before { content: "\ebe2" } +.codicon-graph-scatter:before { content: "\ebe3" } +.codicon-pie-chart:before { content: "\ebe4" } +.codicon-bracket:before { content: "\eb0f" } +.codicon-bracket-dot:before { content: "\ebe5" } +.codicon-bracket-error:before { content: "\ebe6" } +.codicon-lock-small:before { content: "\ebe7" } +.codicon-azure-devops:before { content: "\ebe8" } +.codicon-verified-filled:before { content: "\ebe9" } +.codicon-newline:before { content: "\ebea" } +.codicon-layout:before { content: "\ebeb" } +.codicon-layout-activitybar-left:before { content: "\ebec" } +.codicon-layout-activitybar-right:before { content: "\ebed" } +.codicon-layout-panel-left:before { content: "\ebee" } +.codicon-layout-panel-center:before { content: "\ebef" } +.codicon-layout-panel-justify:before { content: "\ebf0" } +.codicon-layout-panel-right:before { content: "\ebf1" } +.codicon-layout-panel:before { content: "\ebf2" } +.codicon-layout-sidebar-left:before { content: "\ebf3" } +.codicon-layout-sidebar-right:before { content: "\ebf4" } +.codicon-layout-statusbar:before { content: "\ebf5" } +.codicon-layout-menubar:before { content: "\ebf6" } +.codicon-layout-centered:before { content: "\ebf7" } +.codicon-target:before { content: "\ebf8" } +.codicon-indent:before { content: "\ebf9" } +.codicon-record-small:before { content: "\ebfa" } +.codicon-error-small:before { content: "\ebfb" } +.codicon-arrow-circle-down:before { content: "\ebfc" } +.codicon-arrow-circle-left:before { content: "\ebfd" } +.codicon-arrow-circle-right:before { content: "\ebfe" } +.codicon-arrow-circle-up:before { content: "\ebff" } diff --git a/src/renderer/less/codicon.svg b/src/renderer/less/codicon.svg new file mode 100644 index 00000000..c0bb5a8d --- /dev/null +++ b/src/renderer/less/codicon.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/renderer/less/codicon.ttf b/src/renderer/less/codicon.ttf new file mode 100644 index 00000000..47dffef7 Binary files /dev/null and b/src/renderer/less/codicon.ttf differ diff --git a/src/renderer/style.less b/src/renderer/style.less index 36a4d469..6489561a 100644 --- a/src/renderer/style.less +++ b/src/renderer/style.less @@ -5,6 +5,7 @@ @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap"); @import url("less/ameframework.less"); +@import url("less/codicon.css"); @import url("less/bootstrap.less"); @import url("less/notyf.less"); @import url("less/elements.less"); @@ -2739,7 +2740,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb { .wpfade_transform-enter, .wpfade_transform-leave-to { - transform: scale(0.90); + transform: translateX(20px); opacity: 0; } diff --git a/src/renderer/views/app/app-content.ejs b/src/renderer/views/app/app-content.ejs index 10250ca4..8bd2de6b 100644 --- a/src/renderer/views/app/app-content.ejs +++ b/src/renderer/views/app/app-content.ejs @@ -8,103 +8,26 @@ - - - - - - - - + + <% for(var i=0; i < Object.keys(env.appRoutes).length ; i++) {%> + + v-on:enter="<%- env.appRoutes[i].onEnter %>" + <% + } + %> + name="wpfade_transform" + > + + + <% } %> - - - - - - - - - - - - - - <%- include('../pages/zoo') %> - - - <%- include('../pages/webview') %> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - + <%- include('../pages/library-recentlyadded') %>'); - - - - - + <%- include('../pages/library-albums') %>'); %> - + - + - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/renderer/views/components/plugin-menu.ejs b/src/renderer/views/components/plugin-menu.ejs index cb7a26f1..6b3d5341 100644 --- a/src/renderer/views/components/plugin-menu.ejs +++ b/src/renderer/views/components/plugin-menu.ejs @@ -1,37 +1,39 @@ \ No newline at end of file diff --git a/src/renderer/views/components/queue.ejs b/src/renderer/views/components/queue.ejs index eeb70ace..b08bdebf 100644 --- a/src/renderer/views/components/queue.ejs +++ b/src/renderer/views/components/queue.ejs @@ -94,8 +94,8 @@ self.queueItems.splice(position, 1) app.mk.queue._queueItems = self.queueItems; app.mk.queue._reindex() - } - }, + } + }, { "name": app.getLz('action.startRadio'), "action": function () { @@ -106,6 +106,18 @@ }) } }, + { + "name": app.getLz('action.goToArtist'), + "action": function () { + app.searchAndNavigate(item,'artist') + } + }, + { + "name": app.getLz('action.goToAlbum'), + "action": function () { + app.searchAndNavigate(item,'album') + } + }, ] }, multiple: { diff --git a/src/renderer/views/pages/artist-feed.ejs b/src/renderer/views/pages/artist-feed.ejs index 70059d09..e2af0b51 100644 --- a/src/renderer/views/pages/artist-feed.ejs +++ b/src/renderer/views/pages/artist-feed.ejs @@ -78,21 +78,30 @@ let self = this this.artists = [] this.artistFeed = [] - this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists?ids=${artists.toString()}&views=latest-release&include[songs]=albums&fields[albums]=artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount&limit[artists:top-songs]=2&art[url]=f`,{ l : this.$root.mklang}).then(artistData => { - artistData.data.data.forEach(item => { - self.artists.push(item) - if (item.views["latest-release"].data.length != 0) { - self.artistFeed.push(item.views["latest-release"].data[0]) - } - }) + + // Apple limits the number of IDs we can provide in a single API call to 50. + // Divide it into groups of 50 and send parallel requests + let chunks = [] + for (let artistIdx = 0; artistIdx < artists.length; artistIdx += 50) { + chunks.push(artists.slice(artistIdx, artistIdx + 50)) + } + try { + const chunkArtistData = await Promise.all(chunks.map(chunk => + this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists?ids=${chunk.toString()}&views=latest-release&include[songs]=albums&fields[albums]=artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount&limit[artists:top-songs]=2&art[url]=f`))) + chunkArtistData.forEach(chunkResult => + chunkResult.data.data.forEach(item => { + self.artists.push(item) + if (item.views["latest-release"].data.length != 0) { + self.artistFeed.push(item.views["latest-release"].data[0]) + } + })) // sort artistFeed by attributes.releaseDate descending, date is formatted as "YYYY-MM-DD" this.artistFeed.sort((a, b) => { let dateA = new Date(a.attributes.releaseDate) let dateB = new Date(b.attributes.releaseDate) return dateB - dateA }) - }) - + } catch (err) { } } } }); diff --git a/src/renderer/views/pages/home.ejs b/src/renderer/views/pages/home.ejs index 6a0bb7ac..d4a4169d 100644 --- a/src/renderer/views/pages/home.ejs +++ b/src/renderer/views/pages/home.ejs @@ -177,21 +177,27 @@ async getArtistFeed() { let artists = this.followedArtists let self = this - this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists?ids=${artists.toString()}&views=latest-release&include[songs]=albums&fields[albums]=artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount&limit[artists:top-songs]=2&art[url]=f&l=${this.$root.mklang}`).then(artistData => { - artistData.data.data.forEach(item => { + + let chunks = [] + for (let artistIdx = 0; artistIdx < artists.length; artistIdx += 50) { + chunks.push(artists.slice(artistIdx, artistIdx + 50)); + } + try { + const chunkArtistData = await Promise.all(chunks.map(chunk => + this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists?ids=${chunk.toString()}&views=latest-release&include[songs]=albums&fields[albums]=artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount&limit[artists:top-songs]=2&art[url]=f`))) + chunkArtistData.forEach(chunkResult => + chunkResult.data.data.forEach(item => { if (item.views["latest-release"].data.length != 0) { self.artistFeed.push(item.views["latest-release"].data[0]) } - }) - // sort artistFeed by attributes.releaseDate descending, date is formatted as "YYYY-MM-DD" + })) + // sort artistFeed by attributes.releaseDate descending, date is formatted as "YYYY-MM-DD" this.artistFeed.sort((a, b) => { let dateA = new Date(a.attributes.releaseDate) let dateB = new Date(b.attributes.releaseDate) return dateB - dateA }) - }) - - + } catch (error) { } }, getRecentlyPlayed() { diff --git a/src/renderer/views/pages/plugins-github.ejs b/src/renderer/views/pages/plugins-github.ejs new file mode 100644 index 00000000..a6da8981 --- /dev/null +++ b/src/renderer/views/pages/plugins-github.ejs @@ -0,0 +1,176 @@ + + \ No newline at end of file diff --git a/src/renderer/views/pages/settings.ejs b/src/renderer/views/pages/settings.ejs index 2b85851c..5b058845 100644 --- a/src/renderer/views/pages/settings.ejs +++ b/src/renderer/views/pages/settings.ejs @@ -20,7 +20,7 @@ {{$root.getLz('term.privateSession')}}
- +
@@ -889,4 +889,4 @@ } } }) - \ No newline at end of file + diff --git a/src/renderer/views/pages/themes-github.ejs b/src/renderer/views/pages/themes-github.ejs index fe962234..c8049f0b 100644 --- a/src/renderer/views/pages/themes-github.ejs +++ b/src/renderer/views/pages/themes-github.ejs @@ -5,6 +5,13 @@

{{$root.getLz('settings.header.visual.theme.github.page')}}

+
+ +