Merge branch 'main' into enhancement/radio
This commit is contained in:
commit
d80cf6efb1
40 changed files with 884 additions and 24624 deletions
|
@ -161,7 +161,7 @@ jobs:
|
||||||
command: yarn circle:script
|
command: yarn circle:script
|
||||||
- run:
|
- run:
|
||||||
name: Set App Version
|
name: Set App Version
|
||||||
command: echo "export APP_VERSION=$(grep '"version":.*' package.json | cut -d '"' -f 4 | head -1)" >> $BASH_ENV
|
command: echo "export APP_VERSION=$(grep '"version":.*' package.json | cut -d '"' -f 16 | head -1)" >> $BASH_ENV
|
||||||
- run:
|
- run:
|
||||||
name: Publish Release
|
name: Publish Release
|
||||||
command: |
|
command: |
|
||||||
|
|
|
@ -110,9 +110,9 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"build": {
|
"build": {
|
||||||
"electronVersion": "18.2.3",
|
"electronVersion": "18.2.4",
|
||||||
"electronDownload": {
|
"electronDownload": {
|
||||||
"version": "18.2.3+wvcus",
|
"version": "18.2.4+wvcus",
|
||||||
"mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
|
"mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
|
||||||
},
|
},
|
||||||
"appId": "cider",
|
"appId": "cider",
|
||||||
|
|
|
@ -3,24 +3,22 @@ if (!process.env['CIRCLECI']) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const {readFileSync, writeFile} = require('fs')
|
const { readFileSync, writeFile } = require('fs')
|
||||||
const pkg = JSON.parse(readFileSync('package.json').toString());
|
const pkg = JSON.parse(readFileSync('package.json').toString());
|
||||||
let channel = process.env['CIRCLE_BRANCH'];
|
let channel = process.env['CIRCLE_BRANCH'];
|
||||||
|
|
||||||
if (process.env['CIRCLE_BRANCH'] === 'lts') {
|
|
||||||
channel = 'latest'
|
|
||||||
} else if (process.env['CIRCLE_BRANCH'] === 'main') {
|
|
||||||
channel = 'beta'
|
|
||||||
} else if (process.env['CIRCLE_BRANCH'] === 'develop') {
|
|
||||||
channel = 'alpha'
|
|
||||||
}
|
|
||||||
|
|
||||||
channel = channel.split('/').join('-')
|
channel = channel.split('/').join('-')
|
||||||
|
|
||||||
// https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables
|
// https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables
|
||||||
const version = pkg.version.split('.');
|
const version = pkg.version.split('.');
|
||||||
const patch = version[2].split('-');
|
const patch = version[2].split('-');
|
||||||
pkg.version = `${version[0]}.${version[1]}.${patch[0]}-${channel}.${patch[1]}`
|
if (process.env['CIRCLE_BRANCH'] === 'release') {
|
||||||
|
pkg.version = `${version[0]}.${version[1]}.${patch[0]}`
|
||||||
|
} else if (process.env['CIRCLE_BRANCH'] === 'main') {
|
||||||
|
pkg.version = `${version[0]}.${version[1]}.${patch[0]}-beta.${patch[1]}`
|
||||||
|
} else {
|
||||||
|
pkg.version = `${version[0]}.${version[1]}.${patch[0]}-${channel}.${process.env['CIRCLE_BUILD_NUM']}`
|
||||||
|
}
|
||||||
// package.build.channel = channel
|
// package.build.channel = channel
|
||||||
pkg.publish = {
|
pkg.publish = {
|
||||||
"provider": "github",
|
"provider": "github",
|
||||||
|
@ -32,9 +30,9 @@ pkg.publish = {
|
||||||
"releaseType": "release"
|
"releaseType": "release"
|
||||||
}
|
}
|
||||||
|
|
||||||
const {exec} = require('child_process')
|
const { exec } = require('child_process')
|
||||||
|
|
||||||
exec(`echo $APP_VERSION`, {env: {'APP_VERSION': pkg.version}}, function (error, stdout, stderr) {
|
exec(`echo $APP_VERSION`, { env: { 'APP_VERSION': pkg.version } }, function (error, stdout, stderr) {
|
||||||
console.log(stdout, stderr, error);
|
console.log(stdout, stderr, error);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -397,3 +397,6 @@ Update 18/05/2022 14:20 UTC
|
||||||
* `action.tray.playpause`: Added for `en_US`,
|
* `action.tray.playpause`: Added for `en_US`,
|
||||||
* `action.tray.next`: Added for `en_US`,
|
* `action.tray.next`: Added for `en_US`,
|
||||||
* `action.tray.previous`: Added for `en_US`,
|
* `action.tray.previous`: Added for `en_US`,
|
||||||
|
|
||||||
|
Update 22/05/2022 03:53 UTC
|
||||||
|
* `settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused`: Added for `en_US`
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
"term.navigateForward": "Navigate forward",
|
"term.navigateForward": "Navigate forward",
|
||||||
"term.play": "Play",
|
"term.play": "Play",
|
||||||
"term.pause": "Pause",
|
"term.pause": "Pause",
|
||||||
|
"term.stop": "Stop",
|
||||||
"term.previous": "Previous",
|
"term.previous": "Previous",
|
||||||
"term.next": "Next",
|
"term.next": "Next",
|
||||||
"term.shuffle": "Shuffle",
|
"term.shuffle": "Shuffle",
|
||||||
|
@ -430,6 +431,7 @@
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separation",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separation",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minimal",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minimal",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Diffused",
|
||||||
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatialization is not compatible with CAP. Please disable CAP to continue.",
|
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatialization is not compatible with CAP. Please disable CAP to continue.",
|
||||||
"settings.option.audio.dbspl.display": "dB SPL Display",
|
"settings.option.audio.dbspl.display": "dB SPL Display",
|
||||||
"settings.option.audio.dbspl.description": "(Advanced users only) Display dB SPL instead of dBFS on the volume slider.",
|
"settings.option.audio.dbspl.description": "(Advanced users only) Display dB SPL instead of dBFS on the volume slider.",
|
||||||
|
|
|
@ -52,6 +52,7 @@
|
||||||
"term.navigateForward": "Navigate forward",
|
"term.navigateForward": "Navigate forward",
|
||||||
"term.play": "Play",
|
"term.play": "Play",
|
||||||
"term.pause": "Pause",
|
"term.pause": "Pause",
|
||||||
|
"term.stop": "Stop",
|
||||||
"term.previous": "Previous",
|
"term.previous": "Previous",
|
||||||
"term.next": "Next",
|
"term.next": "Next",
|
||||||
"term.shuffle": "Shuffle",
|
"term.shuffle": "Shuffle",
|
||||||
|
|
|
@ -4,12 +4,13 @@
|
||||||
"i18n.category": "main",
|
"i18n.category": "main",
|
||||||
"i18n.authors": "@kyw504100 @maikirakiwi @BillKerman @jay900604",
|
"i18n.authors": "@kyw504100 @maikirakiwi @BillKerman @jay900604",
|
||||||
"app.name": "Cider",
|
"app.name": "Cider",
|
||||||
"date.format": "${y}年${m}月${d}日",
|
"date.format": "${y} 年 ${m} 月 ${d} 日",
|
||||||
"dialog.cancel": "取消",
|
"dialog.cancel": "取消",
|
||||||
"dialog.ok": "好",
|
"dialog.ok": "好",
|
||||||
"notification.updatingLibrarySongs": "正在更新歌曲資料庫...",
|
"notification.updatingLibrarySongs": "正在更新歌曲資料庫……",
|
||||||
"notification.updatingLibraryAlbums": "正在更新專輯資料庫...",
|
"notification.updatingLibraryAlbums": "正在更新專輯資料庫……",
|
||||||
"notification.updatingLibraryArtists": "正在更新藝人資料庫...",
|
"notification.updatingLibraryArtists": "正在更新藝人資料庫……",
|
||||||
|
"term.variables": "Variables",
|
||||||
"term.appleInc": "Apple Inc.",
|
"term.appleInc": "Apple Inc.",
|
||||||
"term.appleMusic": "Apple Music",
|
"term.appleMusic": "Apple Music",
|
||||||
"term.applePodcasts": "Apple Podcasts",
|
"term.applePodcasts": "Apple Podcasts",
|
||||||
|
@ -20,9 +21,17 @@
|
||||||
"term.accountSettings": "帳號設定",
|
"term.accountSettings": "帳號設定",
|
||||||
"term.logout": "登出",
|
"term.logout": "登出",
|
||||||
"term.login": "登入",
|
"term.login": "登入",
|
||||||
|
"term.quickNav": "快速導航",
|
||||||
|
"term.cast": "投射",
|
||||||
"term.about": "關於",
|
"term.about": "關於",
|
||||||
"term.privateSession": "私人模式",
|
"term.privateSession": "私人模式",
|
||||||
|
"term.disablePrivateSession": "停止私人模式",
|
||||||
|
"term.disableRepeat": "停止重複",
|
||||||
|
"term.disableRepeatOne": "停止重複一次",
|
||||||
|
"term.disableShuffle": "停止隨機播放",
|
||||||
"term.queue": "待播清單",
|
"term.queue": "待播清單",
|
||||||
|
"term.autoplay": "自動播放",
|
||||||
|
"term.lyrics": "歌詞",
|
||||||
"term.search": "搜尋",
|
"term.search": "搜尋",
|
||||||
"term.history": "記錄",
|
"term.history": "記錄",
|
||||||
"term.miniplayer": "迷你播放器",
|
"term.miniplayer": "迷你播放器",
|
||||||
|
@ -42,12 +51,16 @@
|
||||||
"term.createNewPlaylist": "新增播放列表",
|
"term.createNewPlaylist": "新增播放列表",
|
||||||
"term.createNewPlaylistFolder": "新增播放列表資料夾",
|
"term.createNewPlaylistFolder": "新增播放列表資料夾",
|
||||||
"term.deletePlaylist": "你確認要刪除這個播放列表?",
|
"term.deletePlaylist": "你確認要刪除這個播放列表?",
|
||||||
|
"term.navigateBack": "上一頁",
|
||||||
|
"term.navigateForward": "下一頁",
|
||||||
"term.play": "播放",
|
"term.play": "播放",
|
||||||
"term.pause": "暫停",
|
"term.pause": "暫停",
|
||||||
"term.previous": "上一首",
|
"term.previous": "上一首",
|
||||||
"term.next": "下一首",
|
"term.next": "下一首",
|
||||||
"term.shuffle": "隨機播放",
|
"term.shuffle": "隨機播放",
|
||||||
"term.repeat": "重複播放",
|
"term.repeat": "重複播放",
|
||||||
|
"term.enableRepeatOne": "開啟重複一次",
|
||||||
|
"term.enableShuffle": "開啟隨機播放",
|
||||||
"term.volume": "音量",
|
"term.volume": "音量",
|
||||||
"term.mute": "靜音",
|
"term.mute": "靜音",
|
||||||
"term.unmute": "取消靜音",
|
"term.unmute": "取消靜音",
|
||||||
|
@ -64,14 +77,15 @@
|
||||||
"term.sortBy.duration": "時長",
|
"term.sortBy.duration": "時長",
|
||||||
"term.sortBy.dateAdded": "加入日期",
|
"term.sortBy.dateAdded": "加入日期",
|
||||||
"term.sortOrder": "字母排序",
|
"term.sortOrder": "字母排序",
|
||||||
"term.sortOrder.ascending": "由大到小",
|
"term.sortOrder.ascending": "由小至大",
|
||||||
"term.sortOrder.descending": "由小到大",
|
"term.sortOrder.descending": "由大至小",
|
||||||
"term.viewAs": "顯示模式",
|
"term.viewAs": "顯示模式",
|
||||||
"term.viewAs.coverArt": "專輯插圖",
|
"term.viewAs.coverArt": "專輯插圖",
|
||||||
"term.viewAs.list": "播放列表",
|
"term.viewAs.list": "播放列表",
|
||||||
|
"term.dynamic": "動態",
|
||||||
"term.size": "大小",
|
"term.size": "大小",
|
||||||
"term.size.normal": "正常",
|
"term.size.normal": "正常",
|
||||||
"term.size.compact": "緊凑",
|
"term.size.compact": "袖珍",
|
||||||
"term.enable": "開啟",
|
"term.enable": "開啟",
|
||||||
"term.disable": "關閉",
|
"term.disable": "關閉",
|
||||||
"term.enabled": "已開啟",
|
"term.enabled": "已開啟",
|
||||||
|
@ -80,7 +94,7 @@
|
||||||
"term.connecting": "連結中",
|
"term.connecting": "連結中",
|
||||||
"term.disconnect": "取消連結",
|
"term.disconnect": "取消連結",
|
||||||
"term.authed": "已授權",
|
"term.authed": "已授權",
|
||||||
"term.confirm": "確認?",
|
"term.confirm": "確認?",
|
||||||
"term.more": "更多",
|
"term.more": "更多",
|
||||||
"term.less": "較少",
|
"term.less": "較少",
|
||||||
"term.showMore": "顯示更多",
|
"term.showMore": "顯示更多",
|
||||||
|
@ -104,7 +118,7 @@
|
||||||
"term.recentStations": "最近播放的頻道",
|
"term.recentStations": "最近播放的頻道",
|
||||||
"term.language": "語言",
|
"term.language": "語言",
|
||||||
"term.funLanguages": "惡搞",
|
"term.funLanguages": "惡搞",
|
||||||
"term.noLyrics": "加載中... / 找不到歌詞。/ 純音樂。",
|
"term.noLyrics": "載入中…… / 找不到歌詞。/ 純音樂。",
|
||||||
"term.copyright": "Copyright",
|
"term.copyright": "Copyright",
|
||||||
"term.rightsReserved": "保留一切權利。",
|
"term.rightsReserved": "保留一切權利。",
|
||||||
"term.sponsor": "贊助這個項目",
|
"term.sponsor": "贊助這個項目",
|
||||||
|
@ -130,25 +144,41 @@
|
||||||
"term.defaultPresets": "預設範本",
|
"term.defaultPresets": "預設範本",
|
||||||
"term.userPresets": "自訂範本",
|
"term.userPresets": "自訂範本",
|
||||||
"term.requestError": "處理請求時發生錯誤",
|
"term.requestError": "處理請求時發生錯誤",
|
||||||
"term.song.link.generate": "正在產生 song.link 分享連結...",
|
"term.song.link.generate": "正在產生 song.link 分享連結……",
|
||||||
"term.musicVideos": "MV",
|
"term.musicVideos": "MV",
|
||||||
"term.stations": "電台",
|
"term.stations": "電台",
|
||||||
|
"term.curators": "Curators",
|
||||||
|
"term.appleCurators": "Apple Curators",
|
||||||
"term.radioShows": "廣播單集",
|
"term.radioShows": "廣播單集",
|
||||||
"term.recordLabels": "唱片公司",
|
"term.recordLabels": "唱片公司",
|
||||||
"term.videoExtras": "影片特輯",
|
"term.videoExtras": "影片特輯",
|
||||||
"term.version": "版本",
|
"term.version": "版本",
|
||||||
"term.noVideos": "沒有影片",
|
"term.noVideos": "沒有影片",
|
||||||
"term.plugin": "模組",
|
"term.plugin": "外掛程式",
|
||||||
"term.pluginMenu": "模組選單",
|
"term.pluginMenu": "外掛程式選單",
|
||||||
|
"term.pluginMenu.none": "沒有互動的外掛程式",
|
||||||
|
"term.replay": "重新播放",
|
||||||
|
"term.uniqueAlbums": "Unique Albums",
|
||||||
|
"term.uniqueArtists": "Unique Artists",
|
||||||
|
"term.uniqueSongs": "Unique Songs",
|
||||||
|
"term.topArtists": "熱門藝人",
|
||||||
|
"term.listenedTo": "Listened to:",
|
||||||
|
"term.times": "次",
|
||||||
|
"term.topAlbums": "熱門專輯",
|
||||||
|
"term.plays": "Plays",
|
||||||
|
"term.topGenres": "熱門類型",
|
||||||
|
"term.confirmLogout": "你確定你要登出?",
|
||||||
|
"term.creditDesignedBy": "Designed by ${authorUsername}",
|
||||||
|
"term.discNumber": "光碟 ${discNumber}",
|
||||||
"home.title": "首頁",
|
"home.title": "首頁",
|
||||||
"home.recentlyPlayed": "最近播放",
|
"home.recentlyPlayed": "最近播放",
|
||||||
"home.recentlyAdded": "最近加入",
|
"home.recentlyAdded": "最近加入",
|
||||||
"home.artistsFeed": "藝人動態",
|
"home.artistsFeed": "藝人動態",
|
||||||
"home.artistsFeed.noArtist": "追蹤一些藝人來獲得他們的最新歌曲資訊。",
|
"home.artistsFeed.noArtist": "追蹤一些藝人來獲得他們的最新歌曲資訊。",
|
||||||
"home.madeForYou": "為您推薦",
|
"home.madeForYou": "為你推薦",
|
||||||
"home.friendsListeningTo": "朋友正在聆聽",
|
"home.friendsListeningTo": "朋友正在聆聽",
|
||||||
"home.followedArtists": "追蹤的藝人",
|
"home.followedArtists": "追蹤的藝人",
|
||||||
"error.appleMusicSubRequired": "需要訂閱 Apple Music 以使用 Cider",
|
"error.appleMusicSubRequired": "需要訂閱 Apple Music 以使用 Cider。",
|
||||||
"error.connectionError": "無法連線到 Apple Music。",
|
"error.connectionError": "無法連線到 Apple Music。",
|
||||||
"error.noResults": "沒有結果",
|
"error.noResults": "沒有結果",
|
||||||
"error.noResults.description": "請嘗試新的搜尋內容。",
|
"error.noResults.description": "請嘗試新的搜尋內容。",
|
||||||
|
@ -160,6 +190,9 @@
|
||||||
"podcast.episodes": "單集",
|
"podcast.episodes": "單集",
|
||||||
"podcast.playEpisode": "播放單集",
|
"podcast.playEpisode": "播放單集",
|
||||||
"podcast.website": "Podcast 網頁",
|
"podcast.website": "Podcast 網頁",
|
||||||
|
"action.done": "完成",
|
||||||
|
"action.edit": "修改",
|
||||||
|
"action.editTracklist": "修改歌曲列表",
|
||||||
"action.addToLibrary": "加入資料庫",
|
"action.addToLibrary": "加入資料庫",
|
||||||
"action.addToLibrary.success": "成功加入資料庫",
|
"action.addToLibrary.success": "成功加入資料庫",
|
||||||
"action.addToLibrary.error": "加入資料庫的過程發生錯誤",
|
"action.addToLibrary.error": "加入資料庫的過程發生錯誤",
|
||||||
|
@ -186,6 +219,7 @@
|
||||||
"action.startRadio": "建立電台",
|
"action.startRadio": "建立電台",
|
||||||
"action.goToArtist": "前往藝人",
|
"action.goToArtist": "前往藝人",
|
||||||
"action.goToAlbum": "前往專輯",
|
"action.goToAlbum": "前往專輯",
|
||||||
|
"action.showInPlaylist": "顯示於播放清單",
|
||||||
"action.showInAppleMusic": "顯示於 Apple Music",
|
"action.showInAppleMusic": "顯示於 Apple Music",
|
||||||
"action.moveToTop": "移動到頂部",
|
"action.moveToTop": "移動到頂部",
|
||||||
"action.share": "分享歌曲",
|
"action.share": "分享歌曲",
|
||||||
|
@ -203,20 +237,68 @@
|
||||||
"action.showAlbum": "顯示完整的專輯",
|
"action.showAlbum": "顯示完整的專輯",
|
||||||
"action.tray.minimize": "縮小至系統列",
|
"action.tray.minimize": "縮小至系統列",
|
||||||
"action.tray.quit": "結束",
|
"action.tray.quit": "結束",
|
||||||
|
"action.tray.show": "顯示 Cider",
|
||||||
|
"action.tray.playpause": "播放/暫停",
|
||||||
|
"action.tray.next": "下一首",
|
||||||
|
"action.tray.previous": "上一首",
|
||||||
|
"action.tray.listento": "Listen To:",
|
||||||
"action.update": "更新",
|
"action.update": "更新",
|
||||||
|
"action.install": "安裝",
|
||||||
"action.copy": "複製",
|
"action.copy": "複製",
|
||||||
"action.newpreset": "新增範本",
|
"action.newpreset": "新增範本",
|
||||||
"action.deletepreset": "刪除範本",
|
"action.deletepreset": "刪除範本",
|
||||||
"action.open": "開啟",
|
"action.open": "開啟",
|
||||||
"action.relaunch.confirm" : "你想重新啟動 Cider 嗎?" ,
|
"action.close": "關閉",
|
||||||
|
"action.relaunch.confirm": "你想重新啟動 Cider 嗎?",
|
||||||
"action.cast.chromecast": "Chromecast",
|
"action.cast.chromecast": "Chromecast",
|
||||||
"action.cast.todevices": "投射到裝置",
|
"action.cast.todevices": "投射到裝置",
|
||||||
"action.cast.stop": "停止投射到所有裝置",
|
"action.cast.stop": "停止投射到所有裝置",
|
||||||
"action.cast.airplay": "AirPlay",
|
"action.cast.airplay": "AirPlay",
|
||||||
"action.cast.airplay.underdevelopment": "AirPlay 仍處於開發階段中,敬請期待。",
|
"action.cast.airplay.underdevelopment": "AirPlay 仍處於開發階段中,敬請期待。",
|
||||||
"action.cast.scan": "尋找",
|
"action.cast.scan": "尋找",
|
||||||
"action.cast.scanning": "尋找中...",
|
"action.cast.scanning": "尋找中……",
|
||||||
|
"action.createNew": "新增……",
|
||||||
|
"action.openArtworkInBrowser": "在瀏覽器中開啟專輯封面",
|
||||||
|
"action.scrollToTop": "回到最上面",
|
||||||
|
"menubar.options.about": "關於",
|
||||||
|
"menubar.options.account": "帳戶",
|
||||||
|
"menubar.options.accountsettings": "帳戶設定",
|
||||||
|
"menubar.options.albums": "專輯",
|
||||||
|
"menubar.options.artists": "藝人",
|
||||||
|
"menubar.options.audio": "音訊設定",
|
||||||
|
"menubar.options.browse": "瀏覽",
|
||||||
|
"menubar.options.bug": "Bug",
|
||||||
|
"menubar.options.cast": "投射到裝置",
|
||||||
|
"menubar.options.conf": "在編輯器開啟配置文件",
|
||||||
|
"menubar.options.controls": "控制",
|
||||||
|
"menubar.options.discord": "Discord",
|
||||||
|
"menubar.options.feature": "功能請求",
|
||||||
|
"menubar.options.forcereload": "強制重新載入",
|
||||||
|
"menubar.options.github": "GitHub Wiki",
|
||||||
|
"menubar.options.license": "查看授權",
|
||||||
|
"menubar.options.listennow": "立即聆聽",
|
||||||
|
"menubar.options.minimize": "最小化",
|
||||||
|
"menubar.options.next": "下一首",
|
||||||
|
"menubar.options.playpause": "播放/暫停",
|
||||||
|
"menubar.options.plugins": "外掛程式選單",
|
||||||
|
"menubar.options.previous": "上一首",
|
||||||
|
"menubar.options.quit": "離開 Cider",
|
||||||
|
"menubar.options.recentlyAdded": "最近新增",
|
||||||
|
"menubar.options.reload": "重新載入",
|
||||||
|
"menubar.options.report": "回報……",
|
||||||
|
"menubar.options.search": "搜尋",
|
||||||
|
"menubar.options.settings": "設定",
|
||||||
|
"menubar.options.signout": "登出",
|
||||||
|
"menubar.options.songs": "歌曲",
|
||||||
|
"menubar.options.support": "支援",
|
||||||
|
"menubar.options.toggledevtools": "切換開發人員工具",
|
||||||
|
"menubar.options.toggleprivate": "切換私人模式",
|
||||||
|
"menubar.options.trans": "翻譯回報/請求",
|
||||||
|
"menubar.options.view": "查看 ",
|
||||||
|
"menubar.options.volumedown": "降低音量",
|
||||||
|
"menubar.options.volumeup": "提升音量",
|
||||||
|
"menubar.options.webremote": "遠端控制",
|
||||||
|
"menubar.options.window": "視窗",
|
||||||
"settings.header.general": "一般",
|
"settings.header.general": "一般",
|
||||||
"settings.header.general.description": "調整 Cider 的一般設定",
|
"settings.header.general.description": "調整 Cider 的一般設定",
|
||||||
"settings.option.general.resumebehavior": "還原行為",
|
"settings.option.general.resumebehavior": "還原行為",
|
||||||
|
@ -224,11 +306,11 @@
|
||||||
"settings.option.general.resumebehavior.locally": "本機",
|
"settings.option.general.resumebehavior.locally": "本機",
|
||||||
"settings.option.general.resumebehavior.locally.description": "Cider 將還原你在這台電腦上的最後一次操作。",
|
"settings.option.general.resumebehavior.locally.description": "Cider 將還原你在這台電腦上的最後一次操作。",
|
||||||
"settings.option.general.resumebehavior.history": "歷史",
|
"settings.option.general.resumebehavior.history": "歷史",
|
||||||
"settings.option.general.resumebehavior.history.description": "Cider 將跨裝置將你的整個 Apple Music 歷史記錄中的最後一首歌曲排隊入列。",
|
"settings.option.general.resumebehavior.history.description": "Cider 會跨裝置將你的整個 Apple Music 歷史記錄中的最後一首歌曲排隊入列。",
|
||||||
"settings.option.general.resumetabs" : "啟動時打開的選項",
|
"settings.option.general.resumetabs": "啟動時開啟的頁面",
|
||||||
"settings.option.general.resumetabs.description" : "你可以選擇啟動 Cider 時要打開的選項。",
|
"settings.option.general.resumetabs.description": "你可以選擇啟動 Cider 時要開啟的頁面。",
|
||||||
"settings.option.general.resumetabs.dynamic" : "動態",
|
"settings.option.general.resumetabs.dynamic": "動態",
|
||||||
"settings.option.general.resumetabs.dynamic.description" : "Cider 將打開你上次停留的選項。",
|
"settings.option.general.resumetabs.dynamic.description": "Cider 將打開你上次停留的頁面。",
|
||||||
"settings.option.general.language": "語言",
|
"settings.option.general.language": "語言",
|
||||||
"settings.option.general.language.main": "語言",
|
"settings.option.general.language.main": "語言",
|
||||||
"settings.option.general.language.fun": "惡搞語言",
|
"settings.option.general.language.fun": "惡搞語言",
|
||||||
|
@ -241,7 +323,27 @@
|
||||||
"settings.option.general.customizeSidebar": "自訂側邊欄的功能",
|
"settings.option.general.customizeSidebar": "自訂側邊欄的功能",
|
||||||
"settings.option.general.customizeSidebar.customize": "自訂",
|
"settings.option.general.customizeSidebar.customize": "自訂",
|
||||||
"settings.option.general.keybindings": "快捷操作鍵",
|
"settings.option.general.keybindings": "快捷操作鍵",
|
||||||
|
"settings.option.general.keybindings.pressCombination": "按下兩個鍵的組合來更新操作設定。",
|
||||||
|
"settings.option.general.keybindings.pressEscape": "按下 Escape 鍵返回。",
|
||||||
"settings.option.general.keybindings.open": "開啟",
|
"settings.option.general.keybindings.open": "開啟",
|
||||||
|
"settings.notyf.general.keybindings.update.success": "快捷操作鍵更新成功",
|
||||||
|
"settings.prompt.general.keybindings.update.success": "快捷操作鍵更新成功,按下 OK 重新啟動 Cider。",
|
||||||
|
"settings.option.general.themeUpdateNotification": "自動檢查主題更新",
|
||||||
|
"settings.option.general.showLovedTracksInline": "Show loved tracks inline",
|
||||||
|
"settings.description.albums": "資料庫專輯",
|
||||||
|
"settings.description.artists": "資料庫藝人",
|
||||||
|
"settings.description.audio": "音訊設定",
|
||||||
|
"settings.description.browse": "瀏覽",
|
||||||
|
"settings.description.cast": "投射到裝置",
|
||||||
|
"settings.description.developer": "開發人員工具",
|
||||||
|
"settings.description.listnow": "立即聆聽",
|
||||||
|
"settings.description.plugins": "外掛程式選單",
|
||||||
|
"settings.description.private": "切換私人模式",
|
||||||
|
"settings.description.recentAdd": "最近新增",
|
||||||
|
"settings.description.remote": "Web Remote",
|
||||||
|
"settings.description.search": "搜尋",
|
||||||
|
"settings.description.settings": "設定",
|
||||||
|
"settings.description.songs": "歌曲",
|
||||||
"settings.notyf.updateCider.update-not-available": "沒有可用的更新",
|
"settings.notyf.updateCider.update-not-available": "沒有可用的更新",
|
||||||
"settings.notyf.updateCider.update-downloaded": "更新已成功下載,重啟後進行更新",
|
"settings.notyf.updateCider.update-downloaded": "更新已成功下載,重啟後進行更新",
|
||||||
"settings.notyf.updateCider.update-error": "更新時,發生錯誤",
|
"settings.notyf.updateCider.update-error": "更新時,發生錯誤",
|
||||||
|
@ -252,23 +354,46 @@
|
||||||
"settings.option.audio.maxVolume": "最高音量",
|
"settings.option.audio.maxVolume": "最高音量",
|
||||||
"settings.option.audio.quality": "音訊音質",
|
"settings.option.audio.quality": "音訊音質",
|
||||||
"settings.header.audio.quality.hireslossless": "高清無損壓縮",
|
"settings.header.audio.quality.hireslossless": "高清無損壓縮",
|
||||||
"settings.header.audio.quality.hireslossless.description": "(高達 24-bit/192 kHz)",
|
"settings.header.audio.quality.hireslossless.description": "高達 24-bit/192 kHz",
|
||||||
"settings.header.audio.quality.lossless": "無損壓縮",
|
"settings.header.audio.quality.lossless": "無損壓縮",
|
||||||
"settings.header.audio.quality.lossless.description": "(高達 24-bit/48 kHz)",
|
"settings.header.audio.quality.lossless.description": "高達 24-bit/48 kHz",
|
||||||
"settings.header.audio.quality.high": "高素質",
|
"settings.header.audio.quality.high": "高質素",
|
||||||
"settings.header.audio.quality.standard": "高效率",
|
"settings.header.audio.quality.high.description": "256 kbps",
|
||||||
|
"settings.header.audio.quality.standard": "標準",
|
||||||
|
"settings.header.audio.quality.standard.description": "64 kbps",
|
||||||
"settings.option.audio.seamlessTransition": "無縫播放",
|
"settings.option.audio.seamlessTransition": "無縫播放",
|
||||||
"settings.option.audio.enableAdvancedFunctionality": "進階功能",
|
"settings.option.audio.enableAdvancedFunctionality": "進階功能",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.description": "開啟 AudioContext 將解鎖類似音量平衡和均衡器的進階功能。但在一些PC可能會造成音樂卡頓。",
|
"settings.option.audio.enableAdvancedFunctionality.description": "開啟 AudioContext 將解鎖類似音量平衡和均衡器的進階功能。但在一些PC可能會造成音樂卡頓。",
|
||||||
|
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider 認為你的 PC 未能處理這些功能。你確定要繼續?",
|
||||||
"settings.option.audio.audioLab": "Cider 音訊實驗室",
|
"settings.option.audio.audioLab": "Cider 音訊實驗室",
|
||||||
"settings.option.audio.audioLab.description": "包含由 Cider 開發團隊進行的各種音訊改善功能。",
|
"settings.option.audio.audioLab.description": "包含由 Cider 開發團隊進行的各種音訊改善功能。",
|
||||||
"settings.warn.audioLab.withoutAF": "使用 Cider 音訊實驗室需要開啟進階音訊功能才能使用。" ,
|
"settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California",
|
||||||
|
"settings.option.audio.changePlaybackRate": "Change Playback Rate",
|
||||||
|
"settings.option.audio.playbackRate": "Playback Rate",
|
||||||
|
"settings.option.audio.playbackRate.change": "Change",
|
||||||
|
"settings.option.audio.dbfs.calibration": "0 dBFS Calibration",
|
||||||
|
"settings.option.audio.dbfs.description": "Enter the peak Z-weighted dB SPL when Cider is at 0 dBFS.",
|
||||||
|
"settings.option.audio.dbspl.description": "(Advanced users only) Display dB SPL instead of dBFS on the volume slider.",
|
||||||
|
"settings.option.audio.dbspl.display": "dB SPL Display",
|
||||||
|
"settings.warn.audioLab.withoutAF": "使用 Cider 音訊實驗室需要開啟進階音訊功能才能使用。",
|
||||||
|
"settings.warn.enableAdvancedFunctionality": "此功能需要開啟 AudioContext(進階功能)才可使用。",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "模擬溫暖",
|
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "模擬溫暖",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "以 Korg Nutube 6P1 為設計的模擬溫暖。",
|
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "以 Korg Nutube 6P1 為設計的模擬溫暖。",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "模擬溫暖強度",
|
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "模擬溫暖強度",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "改變模擬溫暖模組處理的強度。",
|
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "改變模擬溫暖模組處理的強度。",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "溫和",
|
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "溫和",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "溫暖",
|
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "溫暖",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™️",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Realizes a different musical atmosphere modelled after the state of the art audio setups.",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™️ 模式",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "修改 Atmosphere Realizer 模組的運作模式。",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jasmine Macchiato",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Rock Salt Cheese Foam Tea",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Uji Matcha Milk Tea",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Genmaicha Tapioca Milk Tea",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Hōjicha Cheese Foam Tea",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Milk Tea",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500": "Moonlight Softcake",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數碼音訊增強處理™️",
|
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數碼音訊增強處理™️",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "透過人類的聽力心理學模型和 AAC 編碼特色的即時算法,強化 AAC 音訊的感知音訊質素。",
|
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "透過人類的聽力心理學模型和 AAC 編碼特色的即時算法,強化 AAC 音訊的感知音訊質素。",
|
||||||
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "音訊增強處理不相容於空間音訊,請先停用空間音訊。",
|
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "音訊增強處理不相容於空間音訊,請先停用空間音訊。",
|
||||||
|
@ -278,16 +403,21 @@
|
||||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "激進型",
|
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "激進型",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音量平衡",
|
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音量平衡",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "自動將歌曲播放音量調整至相同水平,建立更統一的聆聽體驗。",
|
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "自動將歌曲播放音量調整至相同水平,建立更統一的聆聽體驗。",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "由音訊實驗室管理",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider 空間音訊效果",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider 空間音訊效果",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "預先調整空間音訊效果,關閉空間音訊可自訂設定。但必須先開啟空間音訊才可以做設定。",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "預先調整空間音訊效果,關閉空間音訊可自訂設定。但必須先開啟空間音訊才可以做設定。",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider 空間音訊配置檔案",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider 空間音訊配置檔案",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "變更空間音訊的配置檔案,需要重新啟動應用程式。",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "變更空間音訊的配置檔案,需要重新啟動應用程式。",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minimal",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separation",
|
||||||
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Soundstage",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "標準",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "標準",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "發燒友",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "發燒友",
|
||||||
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "空間音訊無法與 CAP 相容,請關閉 CAP 再進行操作。",
|
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "空間音訊無法與 CAP 相容,請關閉 CAP 再進行操作。",
|
||||||
"settings.option.visual.uiscale": "介面顯示大小",
|
"settings.option.visual.uiscale": "介面顯示大小",
|
||||||
"settings.header.visual": "外觀",
|
"settings.header.visual": "外觀",
|
||||||
"settings.header.visual.description": "調整 Cider 的外觀",
|
"settings.header.visual.description": "調整 Cider 的外觀",
|
||||||
|
"settings.option.visual.windowStyle": "外觀風格",
|
||||||
"settings.option.visual.windowBackgroundStyle": "視窗背景樣式",
|
"settings.option.visual.windowBackgroundStyle": "視窗背景樣式",
|
||||||
"settings.header.visual.windowBackgroundStyle.none": "空白",
|
"settings.header.visual.windowBackgroundStyle.none": "空白",
|
||||||
"settings.header.visual.windowBackgroundStyle.artwork": "專輯插圖",
|
"settings.header.visual.windowBackgroundStyle.artwork": "專輯插圖",
|
||||||
|
@ -303,33 +433,42 @@
|
||||||
"settings.header.visual.animatedArtworkQuality.veryHigh": "非常高",
|
"settings.header.visual.animatedArtworkQuality.veryHigh": "非常高",
|
||||||
"settings.header.visual.animatedArtworkQuality.extreme": "極高",
|
"settings.header.visual.animatedArtworkQuality.extreme": "極高",
|
||||||
"settings.option.visual.animatedWindowBackground": "動態視窗背景",
|
"settings.option.visual.animatedWindowBackground": "動態視窗背景",
|
||||||
"settings.option.visual.hardwareAcceleration": "硬體加速",
|
"settings.option.visual.hardwareAcceleration": "硬件加速",
|
||||||
"settings.option.visual.hardwareAcceleration.description": "需要重啟 Cider 才能套用",
|
"settings.option.visual.hardwareAcceleration.description": "需要重啟 Cider 才能套用",
|
||||||
"settings.header.visual.hardwareAcceleration.default": "預設",
|
"settings.header.visual.hardwareAcceleration.default": "預設",
|
||||||
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
||||||
"settings.header.visual.theme": "主題",
|
"settings.header.visual.theme": "主題",
|
||||||
"settings.option.visual.theme.github.download": "使用 Github 網址安裝",
|
"settings.option.visual.theme.github.download": "使用 Github 網址安裝",
|
||||||
|
"settings.option.visual.theme.github.openfolder": "開啟主題文件夾",
|
||||||
"settings.option.visual.theme.github.explore": "探索更多主題",
|
"settings.option.visual.theme.github.explore": "探索更多主題",
|
||||||
"settings.option.visual.theme.github.install.confirm": "你確認要安裝 {{ repo }}?",
|
"settings.header.visual.theme.github.page": "GitHub 上的主題",
|
||||||
|
"settings.option.visual.theme.github.install.confirm": "你確認要安裝 {{ repo }}?",
|
||||||
"settings.prompt.visual.theme.github.URL": "請輸入你想要安裝的主題的網址",
|
"settings.prompt.visual.theme.github.URL": "請輸入你想要安裝的主題的網址",
|
||||||
|
"settings.prompt.visual.theme.uninstallTheme": "你確定要移除 {{ theme }}?",
|
||||||
|
"settings.option.visual.theme.checkForUpdates": "檢查更新",
|
||||||
|
"settings.option.visual.theme.manageStyles": "管理風格",
|
||||||
|
"settings.option.visual.theme.uninstall": "移除",
|
||||||
|
"settings.option.visual.theme.viewInfo": "查看資訊",
|
||||||
|
"settings.option.visual.theme.github.available": "可使用的主題",
|
||||||
|
"settings.option.visual.theme.github.applied": "已套用",
|
||||||
"settings.notyf.visual.theme.install.success": "成功安裝主題",
|
"settings.notyf.visual.theme.install.success": "成功安裝主題",
|
||||||
"settings.notyf.visual.theme.install.error": "主題安裝失敗",
|
"settings.notyf.visual.theme.install.error": "主題安裝失敗",
|
||||||
"settings.header.visual.plugin": "模組",
|
"settings.header.visual.plugin": "外掛程式",
|
||||||
"settings.option.visual.plugin.github.download": "從 GitHub 網址安裝",
|
"settings.option.visual.plugin.github.download": "從 GitHub 網址安裝",
|
||||||
"settings.option.visual.plugin.github.explore": "探索 GitHub 模組",
|
"settings.option.visual.plugin.github.explore": "探索 GitHub 外掛程式",
|
||||||
"settings.header.visual.plugin.github.page": "來自 GitHub 的模組",
|
"settings.header.visual.plugin.github.page": "來自 GitHub 的外掛程式",
|
||||||
"settings.option.visual.plugin.github.install.confirm": "你確定要安裝 {{ repo }}?",
|
"settings.option.visual.plugin.github.install.confirm": "你確定要安裝 {{ repo }}?",
|
||||||
"settings.prompt.visual.plugin.github.URL": "輸入你要安裝的模組網址",
|
"settings.prompt.visual.plugin.github.URL": "輸入你要安裝的外掛程式網址",
|
||||||
"settings.prompt.visual.plugin.github.success": "模組已成功安裝,請重新啟動 Cider 以套用。",
|
"settings.prompt.visual.plugin.github.success": "外掛程式已成功安裝,請重新啟動 Cider 以套用。",
|
||||||
"settings.notyf.visual.plugin.install.success": "模組成功安裝",
|
"settings.notyf.visual.plugin.install.success": "外掛程式成功安裝",
|
||||||
"settings.notyf.visual.plugin.install.error": "模組安裝失敗",
|
"settings.notyf.visual.plugin.install.error": "外掛程式安裝失敗",
|
||||||
"settings.option.visual.theme.default": "預設",
|
"settings.option.visual.theme.default": "預設",
|
||||||
"settings.option.visual.theme.dark": "午夜暗",
|
"settings.option.visual.theme.dark": "午夜暗",
|
||||||
"settings.option.visual.showPersonalInfo": "顯示個人檔案",
|
"settings.option.visual.showPersonalInfo": "顯示個人檔案",
|
||||||
"settings.header.window": "視窗",
|
"settings.header.window": "視窗",
|
||||||
"settings.header.window.description": "調整 Cider 的視窗設定",
|
"settings.header.window.description": "調整 Cider 的視窗設定",
|
||||||
"settings.option.window.openOnStartup": "開機時,啟動 Cider ",
|
"settings.option.window.openOnStartup": "開機時啟動 Cider ",
|
||||||
"settings.option.window.openOnStartup.hidden": "啟動時,自動隱藏至系統列",
|
"settings.option.window.openOnStartup.hidden": "啟動時自動隱藏至系統列",
|
||||||
"settings.option.window.useNativeTitleBar": "使用原生視窗標題列",
|
"settings.option.window.useNativeTitleBar": "使用原生視窗標題列",
|
||||||
"settings.option.window.windowControlStyle": "視窗操控樣式",
|
"settings.option.window.windowControlStyle": "視窗操控樣式",
|
||||||
"settings.option.window.windowControlStyle.right": "靠右",
|
"settings.option.window.windowControlStyle.right": "靠右",
|
||||||
|
@ -337,7 +476,7 @@
|
||||||
"settings.header.lyrics": "歌詞",
|
"settings.header.lyrics": "歌詞",
|
||||||
"settings.header.lyrics.description": "調整 Cider 的歌詞設定",
|
"settings.header.lyrics.description": "調整 Cider 的歌詞設定",
|
||||||
"settings.option.lyrics.enableMusixmatch": "開啟 Musixmatch 歌詞",
|
"settings.option.lyrics.enableMusixmatch": "開啟 Musixmatch 歌詞",
|
||||||
"settings.option.lyrics.enableMusixmatchKaraoke": "開啟卡拉OK模式(僅限Musixmatch)",
|
"settings.option.lyrics.enableMusixmatchKaraoke": "開啟卡拉OK模式(僅限 Musixmatch)",
|
||||||
"settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌詞語言偏好",
|
"settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌詞語言偏好",
|
||||||
"settings.option.lyrics.enableYoutubeLyrics": "播放 MV 時,使用 YouTube 歌詞",
|
"settings.option.lyrics.enableYoutubeLyrics": "播放 MV 時,使用 YouTube 歌詞",
|
||||||
"settings.option.lyrics.enableQQLyrics": "開啟 QQ 音樂的歌詞",
|
"settings.option.lyrics.enableQQLyrics": "開啟 QQ 音樂的歌詞",
|
||||||
|
@ -346,10 +485,11 @@
|
||||||
"settings.option.connectivity.discordRPC": "Discord 狀態",
|
"settings.option.connectivity.discordRPC": "Discord 狀態",
|
||||||
"settings.option.connectivity.playbackNotifications": "播放通知",
|
"settings.option.connectivity.playbackNotifications": "播放通知",
|
||||||
"settings.option.connectivity.discordRPC.clientName": "應用程式名稱",
|
"settings.option.connectivity.discordRPC.clientName": "應用程式名稱",
|
||||||
"settings.header.connectivity.discordRPC.cider": "顯示為'Cider'",
|
"settings.header.connectivity.discordRPC.cider": "顯示為「Cider」",
|
||||||
"settings.header.connectivity.discordRPC.appleMusic": "顯示為'Apple Music'",
|
"settings.header.connectivity.discordRPC.appleMusic": "顯示為「Apple Music」",
|
||||||
"settings.option.connectivity.discordRPC.clearOnPause": "暫停時清除 Discord 狀態",
|
"settings.option.connectivity.discordRPC.clearOnPause": "暫停時清除 Discord 狀態",
|
||||||
"settings.option.connectivity.discordRPC.hideButtons": "隱藏 Discord 狀態上的按鈕",
|
"settings.option.connectivity.discordRPC.hideButtons": "隱藏 Discord 狀態上的按鈕",
|
||||||
|
"settings.option.connectivity.discordRPC.hideTimestamp": "隱藏 Discord 狀態上的時間標記",
|
||||||
"settings.option.connectivity.discordRPC.detailsFormat": "詳細資訊格式",
|
"settings.option.connectivity.discordRPC.detailsFormat": "詳細資訊格式",
|
||||||
"settings.option.connectivity.discordRPC.stateFormat": "狀態格式",
|
"settings.option.connectivity.discordRPC.stateFormat": "狀態格式",
|
||||||
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling 記錄",
|
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling 記錄",
|
||||||
|
@ -366,14 +506,14 @@
|
||||||
"settings.option.experimental.reinstallwidevine.confirm": "你確定要重新安裝 WidevineCDM 嗎?",
|
"settings.option.experimental.reinstallwidevine.confirm": "你確定要重新安裝 WidevineCDM 嗎?",
|
||||||
"settings.option.experimental.unknownPlugin": "未知來源",
|
"settings.option.experimental.unknownPlugin": "未知來源",
|
||||||
"settings.option.experimental.unknownPlugin.description": "允許從 Cider 來源以外的 repo 安裝套件",
|
"settings.option.experimental.unknownPlugin.description": "允許從 Cider 來源以外的 repo 安裝套件",
|
||||||
"settings.option.experimental.compactUI": "使用緊密的UI",
|
"settings.option.experimental.compactUI": "使用袖珍的介面",
|
||||||
"settings.option.experimental.closeButtonBehaviour": "關閉按鈕操作",
|
"settings.option.experimental.closeButtonBehaviour": "關閉按鈕行為",
|
||||||
"settings.option.window.close_button_hide": "關閉按鈕將 Cider 隱藏至系統列",
|
"settings.option.window.close_button_hide": "關閉按鈕將 Cider 隱藏至系統列",
|
||||||
"settings.option.experimental.inline_playlists": "將播放列表做為行内元素顯示",
|
"settings.option.experimental.inline_playlists": "將播放列表做為行內元素顯示",
|
||||||
"settings.option.advanced.playlistTrackMapping": "播放列表追蹤映射",
|
"settings.option.advanced.playlistTrackMapping": "播放列表追蹤映射",
|
||||||
"settings.option.advanced.playlistTrackMapping.description": "開啟對播放列表的深度掃描,以確認歌曲在哪些播放列表中。但播放列表快取時間會顯著增加。",
|
"settings.option.advanced.playlistTrackMapping.description": "開啟對播放列表的深度掃描,以確認歌曲在哪些播放列表中。但播放列表緩衝記憶體的建立時間會顯著增加。",
|
||||||
"settings.option.visual.transparent": "透明視窗框架",
|
"settings.option.visual.transparent": "透明視窗邊框",
|
||||||
"settings.option.visual.transparent.description": "需主題有支援透明框架,且須重新啟動才會套用。",
|
"settings.option.visual.transparent.description": "需要主題有支援透明邊框,並需要重新啟動才會套用。",
|
||||||
"settings.header.advanced": "進階",
|
"settings.header.advanced": "進階",
|
||||||
"settings.header.connect": "同步",
|
"settings.header.connect": "同步",
|
||||||
"settings.option.connect.link_account": "開啟與 Cider Connect 同步",
|
"settings.option.connect.link_account": "開啟與 Cider Connect 同步",
|
||||||
|
@ -400,5 +540,15 @@
|
||||||
"settings.header.unfinished": "未完成",
|
"settings.header.unfinished": "未完成",
|
||||||
"remote.web.title": "遙距控制 Cider",
|
"remote.web.title": "遙距控制 Cider",
|
||||||
"remote.web.description": "掃描以下的 QR Code 以控制 Cider",
|
"remote.web.description": "掃描以下的 QR Code 以控制 Cider",
|
||||||
|
"share.platform.clipboard": "複製連結",
|
||||||
|
"share.platform.email": "電郵",
|
||||||
|
"share.platform.facebook": "Facebook",
|
||||||
|
"share.platform.messenger": "Messenger",
|
||||||
|
"share.platform.reddit": "Reddit",
|
||||||
|
"share.platform.songLink": "複製 song.link 連結",
|
||||||
|
"share.platform.telegram": "Telegram",
|
||||||
|
"share.platform.twitter": "Twitter",
|
||||||
|
"share.platform.twitter.tweet": "在 Apple Music 上收聽 {{song}}。\n\n{{url}}\n\n#AppleMusic #Cider",
|
||||||
|
"share.platform.whatsapp": "WhatsApp",
|
||||||
"about.thanks": "感謝 Cider Collective 以及所有貢獻者所作出的貢獻。"
|
"about.thanks": "感謝 Cider Collective 以及所有貢獻者所作出的貢獻。"
|
||||||
}
|
}
|
||||||
|
|
|
@ -195,9 +195,13 @@
|
||||||
"action.export": "輸出",
|
"action.export": "輸出",
|
||||||
"action.showAlbum": "顯示專輯",
|
"action.showAlbum": "顯示專輯",
|
||||||
"action.tray.show": "顯示 Cider",
|
"action.tray.show": "顯示 Cider",
|
||||||
|
"action.tray.playpause": "播放/暫停",
|
||||||
|
"action.tray.next": "下一首",
|
||||||
|
"action.tray.previous": "上一首",
|
||||||
"action.tray.minimize": "最小化",
|
"action.tray.minimize": "最小化",
|
||||||
"action.tray.quit": "結束",
|
"action.tray.quit": "結束",
|
||||||
"action.update": "更新",
|
"action.update": "更新",
|
||||||
|
"action.install": "安裝",
|
||||||
"action.copy": "複製",
|
"action.copy": "複製",
|
||||||
"action.newpreset": "新增預設",
|
"action.newpreset": "新增預設",
|
||||||
"action.deletepreset": "刪除預設",
|
"action.deletepreset": "刪除預設",
|
||||||
|
@ -292,6 +296,10 @@
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "標準",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "標準",
|
||||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "發燒友",
|
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "發燒友",
|
||||||
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "空間音訊無法與 CAP 相容,請關閉 CAP 在進行操作。",
|
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "空間音訊無法與 CAP 相容,請關閉 CAP 在進行操作。",
|
||||||
|
"settings.option.audio.dbspl.display": "顯示分貝聲壓級",
|
||||||
|
"settings.option.audio.dbspl.description": "(僅限進階使用者)在音量調節滑塊上顯示為「dB SPL」,而不是「dBFS」。",
|
||||||
|
"settings.option.audio.dbfs.calibration": "0 dBFS 校準",
|
||||||
|
"settings.option.audio.dbfs.description": "當 Cider 為 0 dBFS 時,輸入峰值 Z 加權 dB SPL。",
|
||||||
"settings.option.visual.uiscale": "介面顯示大小",
|
"settings.option.visual.uiscale": "介面顯示大小",
|
||||||
"settings.header.visual": "外觀",
|
"settings.header.visual": "外觀",
|
||||||
"settings.header.visual.description": "調整 Cider 的外觀",
|
"settings.header.visual.description": "調整 Cider 的外觀",
|
||||||
|
|
|
@ -133,7 +133,7 @@ export class Store {
|
||||||
"maxVolume": 1,
|
"maxVolume": 1,
|
||||||
"lastVolume": 1,
|
"lastVolume": 1,
|
||||||
"muted": false,
|
"muted": false,
|
||||||
"playbackRate": '1',
|
"playbackRate": 1,
|
||||||
"quality": "HIGH",
|
"quality": "HIGH",
|
||||||
"seamless_audio": true,
|
"seamless_audio": true,
|
||||||
"normalization": false,
|
"normalization": false,
|
||||||
|
|
|
@ -39,8 +39,7 @@ const MusicKitInterop = {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (MusicKit.getInstance().nowPlayingItem) {
|
if (MusicKit.getInstance().nowPlayingItem) {
|
||||||
await this.sleep(1000);
|
await this.sleep(750);
|
||||||
console.log("Auto-updating Playback Rate from " + MusicKit.getInstance().playbackRate + " x to " + app.cfg.audio.playbackRate + " x");
|
|
||||||
MusicKit.getInstance().playbackRate = app.cfg.audio.playbackRate;
|
MusicKit.getInstance().playbackRate = app.cfg.audio.playbackRate;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 139 KiB |
Binary file not shown.
Before Width: | Height: | Size: 186 KiB |
Binary file not shown.
Before Width: | Height: | Size: 138 KiB |
Binary file not shown.
Before Width: | Height: | Size: 184 KiB |
45
src/renderer/assets/cider-icons/stop.svg
Normal file
45
src/renderer/assets/cider-icons/stop.svg
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
width="100%"
|
||||||
|
height="100%"
|
||||||
|
viewBox="0 0 34 34"
|
||||||
|
version="1.1"
|
||||||
|
xml:space="preserve"
|
||||||
|
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;"
|
||||||
|
id="svg10"
|
||||||
|
sodipodi:docname="stop.svg"
|
||||||
|
inkscape:version="1.1.2 (b8e25be833, 2022-02-05)"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||||
|
id="defs14" /><sodipodi:namedview
|
||||||
|
id="namedview12"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-object-midpoints="false"
|
||||||
|
inkscape:zoom="24.205882"
|
||||||
|
inkscape:cx="17"
|
||||||
|
inkscape:cy="17.020656"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1009"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg10"><inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid1236" /></sodipodi:namedview>
|
||||||
|
|
||||||
|
<rect
|
||||||
|
style="fill:#ffffff;fill-opacity:1"
|
||||||
|
id="rect871"
|
||||||
|
width="18.01215"
|
||||||
|
height="19.375456"
|
||||||
|
x="7.9939251"
|
||||||
|
y="7.3122721"
|
||||||
|
ry="2.3134873" /></svg>
|
After Width: | Height: | Size: 1.3 KiB |
16
src/renderer/assets/fonts/Pretendard/pretendardvariable.css
Normal file
16
src/renderer/assets/fonts/Pretendard/pretendardvariable.css
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
Copyright (c) 2021 Kil Hyung-jin, with Reserved Font Name Pretendard.
|
||||||
|
https://github.com/orioncactus/pretendard
|
||||||
|
|
||||||
|
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
||||||
|
This license is copied below, and is also available with a FAQ at:
|
||||||
|
http://scripts.sil.org/OFL
|
||||||
|
*/
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Pretendard Variable';
|
||||||
|
font-weight: 45 920;
|
||||||
|
font-style: normal;
|
||||||
|
font-display: swap;
|
||||||
|
src: local('Pretendard Variable'), url('./woff2/PretendardVariable.woff2') format('woff2-variations');
|
||||||
|
}
|
Binary file not shown.
|
@ -98,7 +98,6 @@ const CiderAudio = {
|
||||||
"name": "Maikiwi",
|
"name": "Maikiwi",
|
||||||
"description": "",
|
"description": "",
|
||||||
"gainComp": "1.3381352151540196",
|
"gainComp": "1.3381352151540196",
|
||||||
"img": "./assets/audiolabs/focused.png",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "71_420maikiwi",
|
"id": "71_420maikiwi",
|
||||||
|
@ -106,7 +105,6 @@ const CiderAudio = {
|
||||||
"name": "Soundstage",
|
"name": "Soundstage",
|
||||||
"description": "",
|
"description": "",
|
||||||
"gainComp": "1.3963683610559376",
|
"gainComp": "1.3963683610559376",
|
||||||
"img": "./assets/audiolabs/expansive.png",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "70_422maikiwi",
|
"id": "70_422maikiwi",
|
||||||
|
@ -114,7 +112,6 @@ const CiderAudio = {
|
||||||
"name": "Separation",
|
"name": "Separation",
|
||||||
"description": "",
|
"description": "",
|
||||||
"gainComp": "1.30767553892022",
|
"gainComp": "1.30767553892022",
|
||||||
"img": "./assets/audiolabs/classic.png",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "standard",
|
"id": "standard",
|
||||||
|
@ -122,7 +119,6 @@ const CiderAudio = {
|
||||||
"name": "Minimal",
|
"name": "Minimal",
|
||||||
"description": "",
|
"description": "",
|
||||||
"gainComp": "1.2647363474711515",
|
"gainComp": "1.2647363474711515",
|
||||||
"img": "./assets/audiolabs/minimal.png",
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
atmosphereRealizerProfiles: [
|
atmosphereRealizerProfiles: [
|
||||||
|
@ -407,7 +403,7 @@ const CiderAudio = {
|
||||||
CiderAudio.audioNodes.atmosphereRealizer2 = CiderAudio.context.createConvolver();
|
CiderAudio.audioNodes.atmosphereRealizer2 = CiderAudio.context.createConvolver();
|
||||||
CiderAudio.audioNodes.atmosphereRealizer2.normalize = false;
|
CiderAudio.audioNodes.atmosphereRealizer2.normalize = false;
|
||||||
let atmosphereRealizerProfile = CiderAudio.atmosphereRealizerProfiles.find(function (profile) {
|
let atmosphereRealizerProfile = CiderAudio.atmosphereRealizerProfiles.find(function (profile) {
|
||||||
return profile.id === app.cfg.audio.maikiwiAudio.spatialProfile;
|
return profile.id === app.cfg.audio.maikiwiAudio.atmosphereRealizer2_value;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (atmosphereRealizerProfile === undefined) {
|
if (atmosphereRealizerProfile === undefined) {
|
||||||
|
@ -452,7 +448,7 @@ const CiderAudio = {
|
||||||
CiderAudio.audioNodes.atmosphereRealizer1 = CiderAudio.context.createConvolver();
|
CiderAudio.audioNodes.atmosphereRealizer1 = CiderAudio.context.createConvolver();
|
||||||
CiderAudio.audioNodes.atmosphereRealizer1.normalize = false;
|
CiderAudio.audioNodes.atmosphereRealizer1.normalize = false;
|
||||||
let atmosphereRealizerProfile = CiderAudio.atmosphereRealizerProfiles.find(function (profile) {
|
let atmosphereRealizerProfile = CiderAudio.atmosphereRealizerProfiles.find(function (profile) {
|
||||||
return profile.id === app.cfg.audio.maikiwiAudio.spatialProfile;
|
return profile.id === app.cfg.audio.maikiwiAudio.atmosphereRealizer1_value;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (atmosphereRealizerProfile === undefined) {
|
if (atmosphereRealizerProfile === undefined) {
|
||||||
|
|
2780
src/renderer/less/bootstrap-vue.min.css
vendored
2780
src/renderer/less/bootstrap-vue.min.css
vendored
File diff suppressed because it is too large
Load diff
6246
src/renderer/less/bootstrap.css
vendored
6246
src/renderer/less/bootstrap.css
vendored
File diff suppressed because it is too large
Load diff
186
src/renderer/less/bootstrap.less
vendored
186
src/renderer/less/bootstrap.less
vendored
|
@ -7670,160 +7670,132 @@ fieldset:disabled .btn {
|
||||||
|
|
||||||
.popover {
|
.popover {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top : 0;
|
top: 0;
|
||||||
left : 0
|
left: 0 /* rtl:ignore */;
|
||||||
/* rtl:ignore */
|
z-index: 1070;
|
||||||
;
|
display: block;
|
||||||
z-index : 1070;
|
max-width: 276px;
|
||||||
display : block;
|
font-family: var(--bs-font-sans-serif);
|
||||||
max-width : 276px;
|
font-style: normal;
|
||||||
font-family : var(--bs-font-sans-serif);
|
font-weight: 400;
|
||||||
font-style : normal;
|
line-height: 1.5;
|
||||||
font-weight : 400;
|
text-align: left;
|
||||||
line-height : 1.5;
|
text-align: start;
|
||||||
text-align : left;
|
text-decoration: none;
|
||||||
text-align : start;
|
text-shadow: none;
|
||||||
text-decoration : none;
|
text-transform: none;
|
||||||
text-shadow : none;
|
letter-spacing: normal;
|
||||||
text-transform : none;
|
word-break: normal;
|
||||||
letter-spacing : normal;
|
word-spacing: normal;
|
||||||
word-break : normal;
|
white-space: normal;
|
||||||
word-spacing : normal;
|
line-break: auto;
|
||||||
white-space : normal;
|
font-size: 0.875rem;
|
||||||
line-break : auto;
|
word-wrap: break-word;
|
||||||
font-size : 0.875rem;
|
background-color: var(--modalBackground);
|
||||||
word-wrap : break-word;
|
background-clip: padding-box;
|
||||||
background-color: #fff;
|
box-shadow: var(--mediaItemShadow), var(--mediaItemShadow-Shadow);
|
||||||
background-clip : padding-box;
|
border-radius: var(--mediaItemRadius);
|
||||||
border : 1px solid rgba(0, 0, 0, 0.2);
|
|
||||||
border-radius : 0.3rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.popover .popover-arrow {
|
.popover .popover-arrow {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
display : block;
|
display: block;
|
||||||
width : 1rem;
|
width: 1rem;
|
||||||
height : 0.5rem;
|
height: 0.5rem;
|
||||||
}
|
}
|
||||||
|
.popover .popover-arrow::before, .popover .popover-arrow::after {
|
||||||
.popover .popover-arrow::before,
|
position: absolute;
|
||||||
.popover .popover-arrow::after {
|
display: block;
|
||||||
position : absolute;
|
content: "";
|
||||||
display : block;
|
|
||||||
content : "";
|
|
||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bs-popover-top>.popover-arrow,
|
.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {
|
||||||
.bs-popover-auto[data-popper-placement^=top]>.popover-arrow {
|
|
||||||
bottom: calc(-0.5rem - 1px);
|
bottom: calc(-0.5rem - 1px);
|
||||||
}
|
}
|
||||||
|
.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {
|
||||||
.bs-popover-top>.popover-arrow::before,
|
bottom: 0;
|
||||||
.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before {
|
border-width: 0.5rem 0.5rem 0;
|
||||||
bottom : 0;
|
|
||||||
border-width : 0.5rem 0.5rem 0;
|
|
||||||
border-top-color: rgba(0, 0, 0, 0.25);
|
border-top-color: rgba(0, 0, 0, 0.25);
|
||||||
}
|
}
|
||||||
|
.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {
|
||||||
.bs-popover-top>.popover-arrow::after,
|
bottom: 1px;
|
||||||
.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after {
|
border-width: 0.5rem 0.5rem 0;
|
||||||
bottom : 1px;
|
|
||||||
border-width : 0.5rem 0.5rem 0;
|
|
||||||
border-top-color: #fff;
|
border-top-color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bs-popover-end>.popover-arrow,
|
.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {
|
||||||
.bs-popover-auto[data-popper-placement^=right]>.popover-arrow {
|
left: calc(-0.5rem - 1px);
|
||||||
left : calc(-0.5rem - 1px);
|
width: 0.5rem;
|
||||||
width : 0.5rem;
|
|
||||||
height: 1rem;
|
height: 1rem;
|
||||||
}
|
}
|
||||||
|
.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {
|
||||||
.bs-popover-end>.popover-arrow::before,
|
left: 0;
|
||||||
.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before {
|
border-width: 0.5rem 0.5rem 0.5rem 0;
|
||||||
left : 0;
|
|
||||||
border-width : 0.5rem 0.5rem 0.5rem 0;
|
|
||||||
border-right-color: rgba(0, 0, 0, 0.25);
|
border-right-color: rgba(0, 0, 0, 0.25);
|
||||||
}
|
}
|
||||||
|
.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {
|
||||||
.bs-popover-end>.popover-arrow::after,
|
left: 1px;
|
||||||
.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after {
|
border-width: 0.5rem 0.5rem 0.5rem 0;
|
||||||
left : 1px;
|
|
||||||
border-width : 0.5rem 0.5rem 0.5rem 0;
|
|
||||||
border-right-color: #fff;
|
border-right-color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bs-popover-bottom>.popover-arrow,
|
.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {
|
||||||
.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow {
|
|
||||||
top: calc(-0.5rem - 1px);
|
top: calc(-0.5rem - 1px);
|
||||||
}
|
}
|
||||||
|
.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {
|
||||||
.bs-popover-bottom>.popover-arrow::before,
|
top: 0;
|
||||||
.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before {
|
border-width: 0 0.5rem 0.5rem 0.5rem;
|
||||||
top : 0;
|
|
||||||
border-width : 0 0.5rem 0.5rem 0.5rem;
|
|
||||||
border-bottom-color: rgba(0, 0, 0, 0.25);
|
border-bottom-color: rgba(0, 0, 0, 0.25);
|
||||||
}
|
}
|
||||||
|
.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {
|
||||||
.bs-popover-bottom>.popover-arrow::after,
|
top: 1px;
|
||||||
.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after {
|
border-width: 0 0.5rem 0.5rem 0.5rem;
|
||||||
top : 1px;
|
|
||||||
border-width : 0 0.5rem 0.5rem 0.5rem;
|
|
||||||
border-bottom-color: #fff;
|
border-bottom-color: #fff;
|
||||||
}
|
}
|
||||||
|
.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
|
||||||
.bs-popover-bottom .popover-header::before,
|
position: absolute;
|
||||||
.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {
|
top: 0;
|
||||||
position : absolute;
|
left: 50%;
|
||||||
top : 0;
|
display: block;
|
||||||
left : 50%;
|
width: 1rem;
|
||||||
display : block;
|
margin-left: -0.5rem;
|
||||||
width : 1rem;
|
content: "";
|
||||||
margin-left : -0.5rem;
|
|
||||||
content : "";
|
|
||||||
border-bottom: 1px solid #f0f0f0;
|
border-bottom: 1px solid #f0f0f0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bs-popover-start>.popover-arrow,
|
.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {
|
||||||
.bs-popover-auto[data-popper-placement^=left]>.popover-arrow {
|
right: calc(-0.5rem - 1px);
|
||||||
right : calc(-0.5rem - 1px);
|
width: 0.5rem;
|
||||||
width : 0.5rem;
|
|
||||||
height: 1rem;
|
height: 1rem;
|
||||||
}
|
}
|
||||||
|
.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {
|
||||||
.bs-popover-start>.popover-arrow::before,
|
right: 0;
|
||||||
.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before {
|
border-width: 0.5rem 0 0.5rem 0.5rem;
|
||||||
right : 0;
|
|
||||||
border-width : 0.5rem 0 0.5rem 0.5rem;
|
|
||||||
border-left-color: rgba(0, 0, 0, 0.25);
|
border-left-color: rgba(0, 0, 0, 0.25);
|
||||||
}
|
}
|
||||||
|
.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {
|
||||||
.bs-popover-start>.popover-arrow::after,
|
right: 1px;
|
||||||
.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after {
|
border-width: 0.5rem 0 0.5rem 0.5rem;
|
||||||
right : 1px;
|
|
||||||
border-width : 0.5rem 0 0.5rem 0.5rem;
|
|
||||||
border-left-color: #fff;
|
border-left-color: #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.popover-header {
|
.popover-header {
|
||||||
padding : 0.5rem 1rem;
|
padding: 0.5rem 1rem;
|
||||||
margin-bottom : 0;
|
margin-bottom: 0;
|
||||||
font-size : 1rem;
|
font-size: 1rem;
|
||||||
background-color : #f0f0f0;
|
background-color: #f0f0f0;
|
||||||
border-bottom : 1px solid rgba(0, 0, 0, 0.2);
|
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
border-top-left-radius : calc(0.3rem - 1px);
|
border-top-left-radius: calc(0.3rem - 1px);
|
||||||
border-top-right-radius: calc(0.3rem - 1px);
|
border-top-right-radius: calc(0.3rem - 1px);
|
||||||
}
|
}
|
||||||
|
|
||||||
.popover-header:empty {
|
.popover-header:empty {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.popover-body {
|
.popover-body {
|
||||||
padding: 1rem 1rem;
|
padding: 1rem 1rem;
|
||||||
color : #212529;
|
color: var(--textColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
// carousel
|
// carousel
|
||||||
|
|
|
@ -4,22 +4,72 @@
|
||||||
|
|
||||||
#app.twopanel {
|
#app.twopanel {
|
||||||
--chromeHeight1: 46px;
|
--chromeHeight1: 46px;
|
||||||
--chromeHeight2: 76px;
|
--chromeHeight2: 90px;
|
||||||
--chromeHeight : calc(var(--chromeHeight1) + var(--chromeHeight2));
|
--chromeHeight: calc(var(--chromeHeight1) + var(--chromeHeight2));
|
||||||
|
|
||||||
.app-chrome {
|
.app-chrome {
|
||||||
.app-mainmenu {
|
.app-mainmenu {
|
||||||
width : 30px;
|
width: 30px;
|
||||||
height: 30px;
|
height: 30px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-input {
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
height: var(--chromeHeight1);
|
height: var(--chromeHeight1);
|
||||||
|
|
||||||
&.chrome-bottom {
|
&.chrome-bottom {
|
||||||
|
background: var(--color2);
|
||||||
-webkit-app-region: no-drag;
|
-webkit-app-region: no-drag;
|
||||||
height : var(--chromeHeight2);
|
height: var(--chromeHeight2);
|
||||||
box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25);
|
box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.25);
|
||||||
z-index : 1;
|
z-index: 1;
|
||||||
|
|
||||||
|
.app-chrome-playback-duration-bottom {
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
.col {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-sm-auto {
|
||||||
|
width: 4em;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=range] {
|
||||||
|
appearance: none;
|
||||||
|
width: 100%;
|
||||||
|
height: 5px;
|
||||||
|
background-color: rgb(200 200 200 / 10%);
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: 0px 0px 0px 1px rgba(0 0 0 / 10%);
|
||||||
|
align-self: center;
|
||||||
|
|
||||||
|
&::-webkit-slider-thumb {
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(1);
|
||||||
|
-webkit-appearance: none;
|
||||||
|
appearance: none;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
border-radius: 100%;
|
||||||
|
background: var(--keyColor);
|
||||||
|
cursor: default;
|
||||||
|
transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
&::-webkit-slider-thumb {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,43 +81,43 @@
|
||||||
.app-playback-controls .actions {
|
.app-playback-controls .actions {
|
||||||
align-self: center;
|
align-self: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
-webkit-app-region: no-drag;
|
-webkit-app-region: no-drag;
|
||||||
|
|
||||||
.playback-button.play,
|
.playback-button.play,
|
||||||
.playback-button.pause {
|
.playback-button.pause,
|
||||||
width : 42px;
|
.playback-button.stop{
|
||||||
height : 42px;
|
width: 42px;
|
||||||
background-color: rgb(200 200 200 / 20%);
|
height: 42px;
|
||||||
border-radius : 50%;
|
border-radius: 50%;
|
||||||
margin : 6px;
|
margin: 6px;
|
||||||
box-shadow : 0px 0px 0px 2px var(--keyColor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-chrome--center {
|
.app-chrome--center {
|
||||||
display : flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
.app-chrome-playback-controls {
|
.app-chrome-playback-controls {
|
||||||
display : flex;
|
display: flex;
|
||||||
z-index : 1;
|
z-index: 1;
|
||||||
// margin-bottom: 12px;
|
// margin-bottom: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-chrome-playback-duration {
|
.app-chrome-playback-duration {
|
||||||
position : relative;
|
position: relative;
|
||||||
width : 80%;
|
width: 80%;
|
||||||
-webkit-app-region: no-drag;
|
-webkit-app-region: no-drag;
|
||||||
height : 16px;
|
height: 16px;
|
||||||
|
|
||||||
.song-progress {
|
.song-progress {
|
||||||
@bgColor : transparent;
|
@bgColor: transparent;
|
||||||
height : 16px;
|
height: 16px;
|
||||||
position : absolute;
|
position: absolute;
|
||||||
bottom : 4px;
|
bottom: 4px;
|
||||||
left : 0px;
|
left: 0px;
|
||||||
right : 4px;
|
right: 4px;
|
||||||
background: @bgColor;
|
background: @bgColor;
|
||||||
z-index : 0;
|
z-index: 0;
|
||||||
|
|
||||||
|
|
||||||
.song-duration {
|
.song-duration {
|
||||||
|
@ -76,41 +126,41 @@
|
||||||
|
|
||||||
.song-duration p {
|
.song-duration p {
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
font-size : 10px;
|
font-size: 10px;
|
||||||
height : 1.2em;
|
height: 1.2em;
|
||||||
line-height: 1.3em;
|
line-height: 1.3em;
|
||||||
overflow : hidden;
|
overflow: hidden;
|
||||||
margin : 0 0 0 0.25em;
|
margin: 0 0 0 0.25em;
|
||||||
}
|
}
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
>input[type=range] {
|
> input[type=range] {
|
||||||
&::-webkit-slider-thumb {
|
&::-webkit-slider-thumb {
|
||||||
opacity : 1;
|
opacity: 1;
|
||||||
transform: scale(1);
|
transform: scale(1);
|
||||||
z-index : 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=range] {
|
input[type=range] {
|
||||||
appearance : none;
|
appearance: none;
|
||||||
width : 100%;
|
width: 100%;
|
||||||
height : 4px;
|
height: 4px;
|
||||||
background-color: rgb(200 200 200 / 10%);
|
background-color: rgb(200 200 200 / 10%);
|
||||||
border-radius : 2px;
|
border-radius: 2px;
|
||||||
|
|
||||||
&::-webkit-slider-thumb {
|
&::-webkit-slider-thumb {
|
||||||
opacity : 0;
|
opacity: 0;
|
||||||
transform : scale(0.5);
|
transform: scale(0.5);
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
appearance : none;
|
appearance: none;
|
||||||
width : 12px;
|
width: 12px;
|
||||||
height : 12px;
|
height: 12px;
|
||||||
border-radius : 100%;
|
border-radius: 100%;
|
||||||
background : var(--keyColor);
|
background: var(--keyColor);
|
||||||
cursor : default;
|
cursor: default;
|
||||||
transition : opacity .10s var(--appleEase), transform .10s var(--appleEase);
|
transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,42 +169,48 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-chrome--left {
|
.app-chrome--left {
|
||||||
width : 30%;
|
width: 30%;
|
||||||
justify-content: flex-start;
|
justify-content: flex-start;
|
||||||
align-items : flex-start;
|
align-items: flex-start;
|
||||||
-webkit-app-region: no-drag!important;
|
-webkit-app-region: no-drag !important;
|
||||||
|
|
||||||
.playback-controls {
|
.playback-controls {
|
||||||
-webkit-app-region: no-drag!important;
|
-webkit-app-region: no-drag !important;
|
||||||
|
|
||||||
.artwork {
|
.artwork {
|
||||||
width : var(--chromeHeight2);
|
--offset: 20px;
|
||||||
height : var(--chromeHeight2);
|
--marginOffset: 2;
|
||||||
margin : 0px 6px 0px 0px;
|
--size: calc(var(--chromeHeight2) - var(--offset));
|
||||||
box-shadow: unset;
|
width: var(--size);
|
||||||
border : 0px;
|
height: var(--size);
|
||||||
|
margin: 0 calc(var(--offset) / var(--marginOffset)) 0 calc(var(--offset) / var(--marginOffset));
|
||||||
|
|
||||||
.mediaitem-artwork,
|
.mediaitem-artwork,
|
||||||
img {
|
img {
|
||||||
border-radius: 0px;
|
border-radius: calc(var(--mediaItemRadius) / 2);
|
||||||
box-shadow : unset;
|
|
||||||
border : 0px;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.playback-info {
|
.playback-info {
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
margin : 6px;
|
margin: 6px;
|
||||||
|
|
||||||
.song-name {
|
.song-name {
|
||||||
text-align : left;
|
text-align: left;
|
||||||
font-size : 15px;
|
font-size: 0.98em;
|
||||||
font-weight : initial;
|
font-weight: 500;
|
||||||
width : 100%;
|
width: 100%;
|
||||||
-webkit-mask-image: linear-gradient(-90deg, transparent 0%, transparent 10%, black 20%);
|
-webkit-mask-image: linear-gradient(-90deg, transparent 0%, transparent 10%, black 20%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.song-artist-album {
|
.song-artist, .song-album {
|
||||||
width : 100%;
|
font-size: 0.75em;
|
||||||
-webkit-mask-image: linear-gradient(-90deg, transparent 0%, transparent 10%, black 20%);
|
opacity: 0.8;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.audio-type {
|
.audio-type {
|
||||||
|
@ -163,23 +219,23 @@
|
||||||
|
|
||||||
.song-artist-album-content {
|
.song-artist-album-content {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-size : 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
width : 100%;
|
width: 100%;
|
||||||
height : 100%;
|
height: 100%;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
border : 0px;
|
border: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-chrome--right {
|
.app-chrome--right {
|
||||||
width : 30%;
|
width: 30%;
|
||||||
flex : 0 0 auto;
|
flex: 0 0 auto;
|
||||||
padding-right: 8px;
|
padding-right: 8px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -897,8 +897,10 @@
|
||||||
|
|
||||||
/* mediaitem-square */
|
/* mediaitem-square */
|
||||||
.cd-mediaitem-square {
|
.cd-mediaitem-square {
|
||||||
width: 220px;
|
--scaleRate: 1.25;
|
||||||
height: 238px;
|
--scaleRateArtwork: 1;
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -911,8 +913,8 @@
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
.artwork {
|
.artwork {
|
||||||
height: 190px;
|
height: 150px;
|
||||||
width: 190px;
|
width: 150px;
|
||||||
background: blue;
|
background: blue;
|
||||||
border-radius: var(--mediaItemRadius);
|
border-radius: var(--mediaItemRadius);
|
||||||
background: var(--artwork);
|
background: var(--artwork);
|
||||||
|
@ -920,7 +922,6 @@
|
||||||
flex: 0 0 auto;
|
flex: 0 0 auto;
|
||||||
margin: 6px;
|
margin: 6px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
.mediaitem-artwork {
|
.mediaitem-artwork {
|
||||||
box-shadow: unset;
|
box-shadow: unset;
|
||||||
}
|
}
|
||||||
|
@ -993,6 +994,15 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@media (min-width: 1600px) {
|
||||||
|
width: calc(200px * var(--scaleRate));
|
||||||
|
height: calc(200px * var(--scaleRate));
|
||||||
|
.artwork-container>.artwork {
|
||||||
|
width: calc(190px * var(--scaleRateArtwork));
|
||||||
|
height: calc(190px * var(--scaleRateArtwork));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.info-rect {
|
.info-rect {
|
||||||
width: 90%;
|
width: 90%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
@ -1074,8 +1084,6 @@
|
||||||
background: var(--spcolor);
|
background: var(--spcolor);
|
||||||
height: 298px;
|
height: 298px;
|
||||||
width: 230px;
|
width: 230px;
|
||||||
max-width: 250px;
|
|
||||||
max-height: 500px;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
position: relative;
|
position: relative;
|
||||||
border-radius: calc(var(--mediaItemRadius) * 2);
|
border-radius: calc(var(--mediaItemRadius) * 2);
|
||||||
|
@ -1126,6 +1134,10 @@
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
|
&+ .subtitle {
|
||||||
|
max-height: none !important;
|
||||||
|
margin-top: -0.5em;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.subtitle {
|
.subtitle {
|
||||||
|
@ -1134,7 +1146,11 @@
|
||||||
align-items: center;
|
align-items: center;
|
||||||
font-size: 0.75em;
|
font-size: 0.75em;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: -webkit-box;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-line-clamp: 3;
|
||||||
|
overflow: hidden;
|
||||||
|
max-height: 3.8em;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1149,6 +1165,15 @@
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
border-radius: inherit;
|
border-radius: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//@media (min-width: 1600px) {
|
||||||
|
// width: calc(230px * 1.25);
|
||||||
|
// height: calc(298px * 1.25);
|
||||||
|
// .artwork-container>.artwork {
|
||||||
|
// width: calc(230px * 1.25);
|
||||||
|
// height: calc(230px * 1.25);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1524,7 +1549,7 @@ input[type=checkbox][switch]:checked:active::before {
|
||||||
border-radius: 6px;
|
border-radius: 6px;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
background-size: 14px;
|
background-size: 0.98em;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
|
@ -1555,6 +1580,7 @@ input[type=checkbox][switch]:checked:active::before {
|
||||||
|
|
||||||
.playback-button--small.cast {
|
.playback-button--small.cast {
|
||||||
background-image: url("./assets/cast_white.svg");
|
background-image: url("./assets/cast_white.svg");
|
||||||
|
background-size: 1.25em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.playback-button--small.miniplayer {
|
.playback-button--small.miniplayer {
|
||||||
|
@ -1582,6 +1608,12 @@ input[type=checkbox][switch]:checked:active::before {
|
||||||
background-image: url("./assets/repeatOne.svg");
|
background-image: url("./assets/repeatOne.svg");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.playback-button.stop {
|
||||||
|
background-image: url('./assets/cider-icons/stop.svg');
|
||||||
|
background-size: 38px;
|
||||||
|
background-position: center;
|
||||||
|
}
|
||||||
|
|
||||||
.playback-button.pause {
|
.playback-button.pause {
|
||||||
background-image: url('./assets/cider-icons/pause.svg');
|
background-image: url('./assets/cider-icons/pause.svg');
|
||||||
background-size: 38px;
|
background-size: 38px;
|
||||||
|
@ -1605,6 +1637,15 @@ input[type=checkbox][switch]:checked:active::before {
|
||||||
background-size: 60%;
|
background-size: 60%;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
}
|
}
|
||||||
|
.playback-button.disabled, .playback-button--small.disabled {
|
||||||
|
opacity: 0.25 !important;
|
||||||
|
pointer-events: none;
|
||||||
|
transform: none !important;
|
||||||
|
&:hover{
|
||||||
|
background-color: transparent !important;
|
||||||
|
transform: none !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.playback-button {
|
.playback-button {
|
||||||
&.navigation {
|
&.navigation {
|
||||||
|
|
|
@ -1,349 +0,0 @@
|
||||||
.notyf__toast {
|
|
||||||
-webkit-app-region: no-drag;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.notyf-info {
|
|
||||||
background: var(--keyColor);
|
|
||||||
}
|
|
||||||
.tooltip-inner {
|
|
||||||
background: #2f2f2f;
|
|
||||||
opacity: 1;
|
|
||||||
border: 1px solid rgba(0, 0, 0, 0.35);
|
|
||||||
transition: all 0.3s ease-in-out;
|
|
||||||
box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.25);
|
|
||||||
}
|
|
||||||
.modal-fullscreen {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: rgba(0, 0, 0, 0.3);
|
|
||||||
z-index: 1000;
|
|
||||||
}
|
|
||||||
.modal-fullscreen .modal-window {
|
|
||||||
background: #333;
|
|
||||||
border-radius: 10px;
|
|
||||||
box-shadow: var(--mediaItemShadow-Shadow);
|
|
||||||
display: flex;
|
|
||||||
flex-flow: column;
|
|
||||||
max-height: 500px;
|
|
||||||
max-width: 360px;
|
|
||||||
background: #121212;
|
|
||||||
width: 100%;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.modal-fullscreen .modal-window:after {
|
|
||||||
content: "";
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
pointer-events: none;
|
|
||||||
box-shadow: var(--mediaItemShadow);
|
|
||||||
z-index: 1;
|
|
||||||
border-radius: inherit;
|
|
||||||
}
|
|
||||||
.modal-fullscreen .modal-window .modal-header {
|
|
||||||
width: 100%;
|
|
||||||
padding: 6px;
|
|
||||||
}
|
|
||||||
.modal-fullscreen .modal-window .modal-content {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
overflow: hidden;
|
|
||||||
overflow-y: overlay;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window {
|
|
||||||
height: 700px;
|
|
||||||
max-height: 700px;
|
|
||||||
width: 800px;
|
|
||||||
max-width: 800px;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .info-header {
|
|
||||||
padding-left: 12px;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .visual-container {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .visual {
|
|
||||||
position: relative;
|
|
||||||
height: 250px;
|
|
||||||
width: 300px;
|
|
||||||
display: inline-flex;
|
|
||||||
align-items: flex-end;
|
|
||||||
justify-content: center;
|
|
||||||
filter: drop-shadow(2px 12px 6px rgba(0, 0, 0, 0.25));
|
|
||||||
margin: 0 auto;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .visual .face {
|
|
||||||
position: absolute;
|
|
||||||
width: calc(12px * 6);
|
|
||||||
height: calc(12px * 6);
|
|
||||||
border-radius: 6px;
|
|
||||||
transform: rotateX(60deg) rotateZ(-45deg);
|
|
||||||
transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .visual .listener {
|
|
||||||
position: absolute;
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
border-radius: 6px;
|
|
||||||
transform: rotateX(60deg) rotateZ(-45deg);
|
|
||||||
transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
|
||||||
background: white;
|
|
||||||
color: black;
|
|
||||||
z-index: 2;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .visual .audiosource {
|
|
||||||
position: absolute;
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
border-radius: 6px;
|
|
||||||
transform: rotateX(60deg) rotateZ(-45deg);
|
|
||||||
transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
|
||||||
background: yellow;
|
|
||||||
z-index: 2;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .visual .face:nth-of-type(1) {
|
|
||||||
background: linear-gradient(45deg, #28223a, #1f2038);
|
|
||||||
z-index: 1;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .visual .face:nth-of-type(2) {
|
|
||||||
background: linear-gradient(45deg, #7d53ad, #5763ff);
|
|
||||||
transform: rotateX(60deg) rotateZ(-45deg) translateZ(30px);
|
|
||||||
opacity: 0.7;
|
|
||||||
z-index: 3;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .modal-header {
|
|
||||||
padding: 16px;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .modal-header .modal-title {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .modal-header .close-btn {
|
|
||||||
width: 50px;
|
|
||||||
height: 100%;
|
|
||||||
background-image: var(--gfx-closeBtn);
|
|
||||||
background-position: center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
-webkit-app-region: no-drag;
|
|
||||||
appearance: none;
|
|
||||||
border: 0;
|
|
||||||
background-color: transparent;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
.spatialproperties-panel .modal-window .modal-header .close-btn:hover {
|
|
||||||
background-color: #c42b1c;
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window {
|
|
||||||
max-height: 600px;
|
|
||||||
max-width: 400px;
|
|
||||||
background: rgba(18, 18, 18, 0.9);
|
|
||||||
overflow: hidden;
|
|
||||||
backdrop-filter: blur(16px) saturate(180%);
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .modal-header {
|
|
||||||
padding: 16px;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .modal-header .modal-title {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .modal-header .close-btn {
|
|
||||||
width: 50px;
|
|
||||||
height: 100%;
|
|
||||||
background-image: var(--gfx-closeBtn);
|
|
||||||
background-position: center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
-webkit-app-region: no-drag;
|
|
||||||
appearance: none;
|
|
||||||
border: 0;
|
|
||||||
background-color: transparent;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .modal-header .close-btn:hover {
|
|
||||||
background-color: #c42b1c;
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .modal-search {
|
|
||||||
width: 100%;
|
|
||||||
padding: 0px 16px;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .playlist-item {
|
|
||||||
appearance: none;
|
|
||||||
border: 0px;
|
|
||||||
text-align: left;
|
|
||||||
width: 100%;
|
|
||||||
margin: 0;
|
|
||||||
display: flex;
|
|
||||||
background: rgba(32, 32, 32, 0.46);
|
|
||||||
color: #eee;
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: 0.98em;
|
|
||||||
padding: 6px 12px;
|
|
||||||
align-items: center;
|
|
||||||
flex-flow: row;
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .playlist-item .icon {
|
|
||||||
pointer-events: none;
|
|
||||||
width: 32px;
|
|
||||||
height: 32px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
margin-right: 6px;
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .playlist-item .name {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .playlist-item:hover {
|
|
||||||
background: var(--selected);
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .playlist-item:active {
|
|
||||||
background: var(--selected-click);
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .playlist-item.focused {
|
|
||||||
background: var(--keyColor);
|
|
||||||
}
|
|
||||||
.addtoplaylist-panel .modal-window .playlist-item:last-child {
|
|
||||||
border-bottom: 0px;
|
|
||||||
}
|
|
||||||
.menu-panel {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
position: fixed;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
z-index: 100001;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
-webkit-app-region: no-drag;
|
|
||||||
}
|
|
||||||
.menu-panel .menu-header-body {
|
|
||||||
padding: 6px;
|
|
||||||
display: flex;
|
|
||||||
background: rgba(200, 200, 200, 0.1);
|
|
||||||
}
|
|
||||||
.menu-panel .menu-header-body .menu-option-header {
|
|
||||||
width: 40px;
|
|
||||||
height: 40px;
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
border-radius: var(--mediaItemRadius);
|
|
||||||
appearance: none;
|
|
||||||
border: 0;
|
|
||||||
background: transparent;
|
|
||||||
}
|
|
||||||
.menu-panel .menu-header-body .menu-option-header.active .sidebar-icon > .svg-icon {
|
|
||||||
--color: var(--keyColor);
|
|
||||||
}
|
|
||||||
.menu-panel .menu-header-body .menu-option-header:hover {
|
|
||||||
background: var(--selected);
|
|
||||||
}
|
|
||||||
.menu-panel .menu-header-body .menu-option-header:active {
|
|
||||||
background: var(--selected-click);
|
|
||||||
}
|
|
||||||
.menu-panel .menu-panel-body {
|
|
||||||
display: flex;
|
|
||||||
flex-flow: column;
|
|
||||||
background: #262626;
|
|
||||||
position: relative;
|
|
||||||
min-width: 200px;
|
|
||||||
box-shadow: var(--ciderShadow-Generic);
|
|
||||||
border-radius: var(--mediaItemRadius);
|
|
||||||
overflow: hidden;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
.menu-panel .menu-panel-body .menu-option {
|
|
||||||
text-align: left;
|
|
||||||
display: flex;
|
|
||||||
width: 100%;
|
|
||||||
padding: 9px 16px;
|
|
||||||
appearance: none;
|
|
||||||
border: 0px;
|
|
||||||
font: inherit;
|
|
||||||
background: transparent;
|
|
||||||
color: inherit;
|
|
||||||
}
|
|
||||||
.menu-panel .menu-panel-body .menu-option:hover {
|
|
||||||
background: var(--selected);
|
|
||||||
}
|
|
||||||
.menu-panel .menu-panel-body .menu-option:active {
|
|
||||||
background: var(--selected-click);
|
|
||||||
}
|
|
||||||
.menu-panel .menu-header-text {
|
|
||||||
margin: 18px 6px;
|
|
||||||
}
|
|
||||||
.menu-panel .menu-header-text .close-btn {
|
|
||||||
width: 50px;
|
|
||||||
height: 42px;
|
|
||||||
background-image: var(--gfx-closeBtn);
|
|
||||||
background-position: center;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
-webkit-app-region: no-drag;
|
|
||||||
appearance: none;
|
|
||||||
border: 0;
|
|
||||||
background-color: transparent;
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
.menu-panel .menu-header-text .close-btn:hover {
|
|
||||||
background-color: #c42b1c;
|
|
||||||
}
|
|
||||||
.menu-panel .menu-body {
|
|
||||||
overflow: overlay;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.menu-panel .menu-footer {
|
|
||||||
width: 100%;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
.queue-panel {
|
|
||||||
height: 100%;
|
|
||||||
width: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-flow: column;
|
|
||||||
}
|
|
||||||
.queue-panel .queue-header-text {
|
|
||||||
margin: 18px 6px;
|
|
||||||
}
|
|
||||||
.queue-panel .queue-body {
|
|
||||||
overflow: overlay;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.queue-panel .queue-footer {
|
|
||||||
width: 100%;
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
.queue-panel .autoplay {
|
|
||||||
background: rgba(200, 200, 200, 0.15);
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
appearance: none;
|
|
||||||
border: 0;
|
|
||||||
border-radius: 6px;
|
|
||||||
height: 32px;
|
|
||||||
width: 32px;
|
|
||||||
}
|
|
||||||
.queue-panel .infinity {
|
|
||||||
content: url("assets/infinity.svg");
|
|
||||||
margin: auto;
|
|
||||||
}
|
|
|
@ -333,6 +333,7 @@
|
||||||
position : relative;
|
position : relative;
|
||||||
width : 100%;
|
width : 100%;
|
||||||
padding : 9px 14px;
|
padding : 9px 14px;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
&::before {
|
&::before {
|
||||||
background : var(--hover);
|
background : var(--hover);
|
||||||
|
@ -485,3 +486,38 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mediainfo-popover {
|
||||||
|
user-select: none;
|
||||||
|
background-color: rgb(0 0 0 / 100%);
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.content {
|
||||||
|
.shadow-artwork {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
z-index: -1;
|
||||||
|
filter:blur(32px) brightness(50%) saturate(280%);
|
||||||
|
}
|
||||||
|
.popover-artwork {
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
|
margin: 0 0 20px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.song-name {
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
.song-artist,.song-album {
|
||||||
|
opacity: 0.75;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -661,6 +661,7 @@ const app = new Vue({
|
||||||
}
|
}
|
||||||
|
|
||||||
this.mk._bag.features['seamless-audio-transitions'] = this.cfg.audio.seamless_audio
|
this.mk._bag.features['seamless-audio-transitions'] = this.cfg.audio.seamless_audio
|
||||||
|
this.mk._bag.features["broadcast-radio"] = true
|
||||||
this.mk._services.apiManager.store.storekit._restrictedEnabled = false
|
this.mk._services.apiManager.store.storekit._restrictedEnabled = false
|
||||||
// API Fallback
|
// API Fallback
|
||||||
if (!this.chrome.userinfo) {
|
if (!this.chrome.userinfo) {
|
||||||
|
@ -1804,6 +1805,25 @@ const app = new Vue({
|
||||||
app.skipToPreviousItem()
|
app.skipToPreviousItem()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
isDisabled() {
|
||||||
|
if(!app.mk.nowPlayingItem || app.mk.nowPlayingItem.attributes.playParams.kind == 'radioStation') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
isPrevDisabled() {
|
||||||
|
if(this.isDisabled() || (app.mk.queue._position == 0 && app.mk.currentPlaybackTime <= 2)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
isNextDisabled() {
|
||||||
|
if(this.isDisabled() || app.mk.queue._position + 1 == app.mk.queue.length) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
async getNowPlayingItemDetailed(target) {
|
async getNowPlayingItemDetailed(target) {
|
||||||
try {
|
try {
|
||||||
let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind,
|
let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind,
|
||||||
|
@ -3698,7 +3718,7 @@ const app = new Vue({
|
||||||
if (app.getThemeDirective("lcdArtworkSize") != "") {
|
if (app.getThemeDirective("lcdArtworkSize") != "") {
|
||||||
artworkSize = app.getThemeDirective("lcdArtworkSize")
|
artworkSize = app.getThemeDirective("lcdArtworkSize")
|
||||||
} else if (this.cfg.visual.directives.windowLayout == "twopanel") {
|
} else if (this.cfg.visual.directives.windowLayout == "twopanel") {
|
||||||
artworkSize = 80
|
artworkSize = 110
|
||||||
}
|
}
|
||||||
this.currentArtUrl = '';
|
this.currentArtUrl = '';
|
||||||
this.currentArtUrlRaw = '';
|
this.currentArtUrlRaw = '';
|
||||||
|
@ -4188,11 +4208,8 @@ const app = new Vue({
|
||||||
this.fullscreenState = flag;
|
this.fullscreenState = flag;
|
||||||
if (flag) {
|
if (flag) {
|
||||||
ipcRenderer.send('setFullScreen', true);
|
ipcRenderer.send('setFullScreen', true);
|
||||||
if (app.mk.nowPlayingItem.type && app.mk.nowPlayingItem.type.toLowerCase().includes("video")) {
|
|
||||||
// document.querySelector('video#apple-music-video-player').requestFullscreen()
|
|
||||||
} else {
|
|
||||||
app.appMode = 'fullscreen';
|
app.appMode = 'fullscreen';
|
||||||
}
|
|
||||||
document.addEventListener('keydown', event => {
|
document.addEventListener('keydown', event => {
|
||||||
if (event.key === 'Escape' && app.appMode === 'fullscreen') {
|
if (event.key === 'Escape' && app.appMode === 'fullscreen') {
|
||||||
this.fullscreen(false);
|
this.fullscreen(false);
|
||||||
|
@ -4200,12 +4217,8 @@ const app = new Vue({
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
ipcRenderer.send('setFullScreen', false);
|
ipcRenderer.send('setFullScreen', false);
|
||||||
if (app.mk.nowPlayingItem.type && app.mk.nowPlayingItem.type.toLowerCase().includes("video")) {
|
|
||||||
|
|
||||||
} else {
|
|
||||||
app.appMode = 'player';
|
app.appMode = 'player';
|
||||||
}
|
}
|
||||||
}
|
|
||||||
},
|
},
|
||||||
pip(){
|
pip(){
|
||||||
document.querySelector('video#apple-music-video-player').requestPictureInPicture()
|
document.querySelector('video#apple-music-video-player').requestPictureInPicture()
|
||||||
|
|
13209
src/renderer/style.css
13209
src/renderer/style.css
File diff suppressed because it is too large
Load diff
|
@ -1,10 +1,10 @@
|
||||||
@import url("assets/fonts/Inter/inter.css");
|
@import url("assets/fonts/Pretendard/pretendardvariable.css");
|
||||||
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;300;400;500;700;900&display=swap');
|
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;300;400;500;700;900&display=swap');
|
||||||
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap");
|
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap");
|
||||||
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+HK:wght@100;300;400;500;700;900&display=swap");
|
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+HK:wght@100;300;400;500;700;900&display=swap");
|
||||||
@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+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("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap");
|
||||||
@import url("less/bootstrap-vue.min.css");
|
@import url("less/bootstrap-vue.min.less");
|
||||||
@import url("less/ameframework.less");
|
@import url("less/ameframework.less");
|
||||||
@import url("less/codicon.css");
|
@import url("less/codicon.css");
|
||||||
@import url("less/bootstrap.less");
|
@import url("less/bootstrap.less");
|
||||||
|
@ -63,7 +63,7 @@ body {
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
background: #0000;
|
background: #0000;
|
||||||
font-family: "Inter var experimental", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
font-family: "Pretendard Variable", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
|
||||||
transition: opacity .10s var(--appleEase);
|
transition: opacity .10s var(--appleEase);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,8 +146,16 @@ body.notransparency::before {
|
||||||
}
|
}
|
||||||
|
|
||||||
#app {
|
#app {
|
||||||
--color1: rgba(15, 15, 15, 30%);
|
@panelBrightness : 0%;
|
||||||
--color2: rgba(30, 30, 30, 50%);
|
@panelTransparency: 50%;
|
||||||
|
@msColor1 : #202020;
|
||||||
|
@msColor2 : #272727;
|
||||||
|
@msColor3 : #2b2b2b;
|
||||||
|
--panelColor1 : darken(mix(@msColor1, transparent, @panelTransparency), @panelBrightness);
|
||||||
|
--panelColor2 : darken(mix(@msColor2, transparent, @panelTransparency), @panelBrightness);
|
||||||
|
--color1 : var(--panelColor2);
|
||||||
|
--color2 : var(--panelColor1);
|
||||||
|
--color3 : rgb(0 0 0 / 20%);
|
||||||
--bgColor: transparent;
|
--bgColor: transparent;
|
||||||
--bgWidth: 0px;
|
--bgWidth: 0px;
|
||||||
--bgHeight: 0px;
|
--bgHeight: 0px;
|
||||||
|
@ -399,7 +407,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
||||||
}
|
}
|
||||||
|
|
||||||
#app-content {
|
#app-content {
|
||||||
background-color: var(--color2);
|
background-color: var(--color3);
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
overflow-y: scroll;
|
overflow-y: scroll;
|
||||||
|
@ -827,6 +835,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
||||||
color: #eee;
|
color: #eee;
|
||||||
transition: transform 0.1s;
|
transition: transform 0.1s;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
&.app-sidebar-item-playlist {
|
&.app-sidebar-item-playlist {
|
||||||
-webkit-user-drag: element;
|
-webkit-user-drag: element;
|
||||||
|
@ -1006,22 +1015,12 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
||||||
height: 14px;
|
height: 14px;
|
||||||
width: 14px;
|
width: 14px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: rgb(50 50 50);
|
background: #A5A8BA;
|
||||||
|
box-shadow: 0px 0px 0px 1px rgba(0 0 0 / 10%);
|
||||||
cursor: default;
|
cursor: default;
|
||||||
box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
|
|
||||||
transition: all var(--appleTransition);
|
transition: all var(--appleTransition);
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-thumb:hover {
|
|
||||||
background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
|
|
||||||
transform: scale(1.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-chrome .app-chrome-item.volume > input[type=range]::-webkit-slider-thumb:active {
|
|
||||||
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
|
|
||||||
transform: scale(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
.app-chrome .app-chrome-item.volume > input[type=range] {
|
.app-chrome .app-chrome-item.volume > input[type=range] {
|
||||||
-webkit-appearance: none;
|
-webkit-appearance: none;
|
||||||
height: 4px;
|
height: 4px;
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
.menu-panel .menu-panel-body {
|
|
||||||
background-color: rgba(30, 30, 30, 0.45);
|
|
||||||
backdrop-filter: blur(32px) saturate(180%);
|
|
||||||
animation: menuIn 0.1s var(--appleEase);
|
|
||||||
}
|
|
||||||
@keyframes menuIn {
|
|
||||||
0% {
|
|
||||||
opacity: 0;
|
|
||||||
transform: translateY(-10px) translate3d(0, 0, 0);
|
|
||||||
background: #1e1e1e;
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
opacity: 1;
|
|
||||||
transform: translateY(0);
|
|
||||||
background: rgba(30, 30, 30, 0.45);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.cd-mediaitem-square:not(.mediaitem-card) {
|
|
||||||
transition: transform 0.2s var(--appleEase);
|
|
||||||
transition-delay: 0.1s;
|
|
||||||
padding: 12px;
|
|
||||||
height: 250px;
|
|
||||||
}
|
|
||||||
.cd-mediaitem-square:not(.mediaitem-card) .artwork-container,
|
|
||||||
.cd-mediaitem-square:not(.mediaitem-card) .info-rect {
|
|
||||||
transition: transform 0.22s var(--appleEase);
|
|
||||||
transition-delay: 0.05s;
|
|
||||||
}
|
|
||||||
.cd-mediaitem-square:not(.mediaitem-card):hover .artwork-container {
|
|
||||||
transform: scale(1.1);
|
|
||||||
transition: transform 0.1s var(--appleEase);
|
|
||||||
transition-delay: 0s;
|
|
||||||
transform-origin: center;
|
|
||||||
}
|
|
||||||
.cd-mediaitem-square:not(.mediaitem-card):hover .info-rect {
|
|
||||||
z-index: 1;
|
|
||||||
transition: transform 0.1s var(--appleEase);
|
|
||||||
transition-delay: 0s;
|
|
||||||
transform: translateY(8px) translate3d(0, 0, 0);
|
|
||||||
}
|
|
|
@ -46,6 +46,13 @@
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.cd-mediaitem-square {
|
||||||
|
--transition: width 1s, height 1s;
|
||||||
|
transition: var(--transition);
|
||||||
|
.artwork {
|
||||||
|
transition: var(--transition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.cd-mediaitem-square:not(.mediaitem-card) {
|
.cd-mediaitem-square:not(.mediaitem-card) {
|
||||||
transition : transform .2s var(--appleEase);
|
transition : transform .2s var(--appleEase);
|
||||||
|
@ -53,7 +60,7 @@
|
||||||
padding : 12px;
|
padding : 12px;
|
||||||
|
|
||||||
// background-color: red;
|
// background-color: red;
|
||||||
height: 250px;
|
height: 220px;
|
||||||
|
|
||||||
|
|
||||||
.artwork-container {}
|
.artwork-container {}
|
||||||
|
|
|
@ -4,9 +4,30 @@
|
||||||
<template v-if="mkReady()">
|
<template v-if="mkReady()">
|
||||||
<div class="app-playback-controls" @mouseover="chrome.progresshover = true"
|
<div class="app-playback-controls" @mouseover="chrome.progresshover = true"
|
||||||
@mouseleave="chrome.progresshover = false" @contextmenu="nowPlayingContextMenu">
|
@mouseleave="chrome.progresshover = false" @contextmenu="nowPlayingContextMenu">
|
||||||
<div class="artwork" @click="drawer.open = false; fullscreen(true)">
|
<div class="artwork" id="artworkLCD">
|
||||||
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
|
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
|
||||||
</div>
|
</div>
|
||||||
|
<b-popover custom-class="mediainfo-popover" target="artworkLCD" triggers="hover" placement="right">
|
||||||
|
<div class="content">
|
||||||
|
<div class="shadow-artwork">
|
||||||
|
<mediaitem-artwork :url="currentArtUrl" :url="currentArtUrlRaw"></mediaitem-artwork>
|
||||||
|
</div>
|
||||||
|
<div class="popover-artwork">
|
||||||
|
<mediaitem-artwork :size="210" :url="currentArtUrlRaw"></mediaitem-artwork>
|
||||||
|
</div>
|
||||||
|
<div class="song-name">{{ mk.nowPlayingItem["attributes"]["name"] }}</div>
|
||||||
|
<div class="song-artist" @click="getNowPlayingItemDetailed(`artist`)">{{ mk.nowPlayingItem["attributes"]["artistName"] }}</div>
|
||||||
|
<div class="song-album" @click="getNowPlayingItemDetailed(`album`)">
|
||||||
|
{{(mk.nowPlayingItem["attributes"]["albumName"]) ?
|
||||||
|
(mk.nowPlayingItem["attributes"]["albumName"]) : "" }}
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div class="btn-group" style="width:100%;">
|
||||||
|
<button class="md-btn md-btn-small" style="width: 100%;" @click="drawer.open = false; miniPlayer(true)">{{ $root.getLz("term.miniplayer") }}</button>
|
||||||
|
<button class="md-btn md-btn-small" style="width: 100%;" @click="drawer.open = false; fullscreen(true)">{{ $root.getLz("term.fullscreenView") }}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</b-popover>
|
||||||
<div class="playback-info">
|
<div class="playback-info">
|
||||||
<div class="song-name"
|
<div class="song-name"
|
||||||
:class="[isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-name') ? 'marquee' : '']">
|
:class="[isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-name') ? 'marquee' : '']">
|
||||||
|
@ -15,26 +36,16 @@
|
||||||
v-if="mk.nowPlayingItem['attributes']['contentRating'] == 'explicit'"
|
v-if="mk.nowPlayingItem['attributes']['contentRating'] == 'explicit'"
|
||||||
style="display: inline-block"></div>
|
style="display: inline-block"></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="chrome-icon-container">
|
<div class="song-artist" @click="getNowPlayingItemDetailed(`artist`)">
|
||||||
<div class="audio-type private-icon" v-if="cfg.general.privateEnabled === true"></div>
|
|
||||||
<div class="audio-type ppe-icon" v-if="cfg.audio.maikiwiAudio.ciderPPE === true"></div>
|
|
||||||
</div>
|
|
||||||
<div class="song-artist-album">
|
|
||||||
<div class="song-artist-album-content"
|
|
||||||
:class="[isElementOverflowing('#app-main > .app-chrome .app-chrome-item > .app-playback-controls > div >.song-artist-album > .song-artist-album-content') ? 'marquee' : '']"
|
|
||||||
style="display: inline-block; -webkit-box-orient: horizontal; white-space: nowrap;">
|
|
||||||
<div class="item-navigate song-artist" style="display: inline-block"
|
|
||||||
@click="getNowPlayingItemDetailed(`artist`)">
|
|
||||||
{{ mk.nowPlayingItem["attributes"]["artistName"] }}
|
{{ mk.nowPlayingItem["attributes"]["artistName"] }}
|
||||||
</div>
|
</div>
|
||||||
<div class="song-artist item-navigate" style="display: inline-block"
|
<div class="song-album" @click="getNowPlayingItemDetailed('album')" v-if='mk.nowPlayingItem["attributes"]["albumName"]'>
|
||||||
@click="getNowPlayingItemDetailed('album')"
|
|
||||||
v-if="mk.nowPlayingItem['attributes']['albumName'] != ''">
|
|
||||||
<div class="separator" style="display: inline-block;">{{"—"}}</div>
|
|
||||||
{{(mk.nowPlayingItem["attributes"]["albumName"]) ?
|
{{(mk.nowPlayingItem["attributes"]["albumName"]) ?
|
||||||
(mk.nowPlayingItem["attributes"]["albumName"]) : "" }}
|
(mk.nowPlayingItem["attributes"]["albumName"]) : "" }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="chrome-icon-container">
|
||||||
|
<div class="audio-type private-icon" v-if="cfg.general.privateEnabled === true"></div>
|
||||||
|
<div class="audio-type ppe-icon" v-if="cfg.audio.maikiwiAudio.ciderPPE === true"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<template v-if="mk.nowPlayingItem['attributes']['playParams']">
|
<template v-if="mk.nowPlayingItem['attributes']['playParams']">
|
||||||
|
@ -53,55 +64,54 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome--center">
|
<div class="app-chrome--center">
|
||||||
<div class="app-chrome-playback-controls">
|
<div class="app-chrome-playback-duration-bottom">
|
||||||
<div class="app-chrome-item">
|
<b-row>
|
||||||
<button class="playback-button--small shuffle" v-if="mk.shuffleMode == 0"
|
<b-col sm="auto">{{ convertTime(getSongProgress()) }}</b-col>
|
||||||
@click="mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')"
|
<b-col>
|
||||||
v-b-tooltip.hover></button>
|
|
||||||
<button class="playback-button--small shuffle active" v-else
|
|
||||||
@click="mk.shuffleMode = 0" :title="$root.getLz('term.disableShuffle')"
|
|
||||||
v-b-tooltip.hover></button>
|
|
||||||
</div>
|
|
||||||
<div class="app-chrome-item">
|
|
||||||
<button class="playback-button previous" @click="prevButton()"
|
|
||||||
:title="$root.getLz('term.previous')" v-b-tooltip.hover></button>
|
|
||||||
</div>
|
|
||||||
<div class="app-chrome-item">
|
|
||||||
<button class="playback-button pause" @click="mk.pause()" v-if="mk.isPlaying"
|
|
||||||
:title="$root.getLz('term.pause')" v-b-tooltip.hover></button>
|
|
||||||
<button class="playback-button play" @click="mk.play()" v-else
|
|
||||||
:title="$root.getLz('term.play')" v-b-tooltip.hover></button>
|
|
||||||
</div>
|
|
||||||
<div class="app-chrome-item">
|
|
||||||
<button class="playback-button next" @click="skipToNextItem()"
|
|
||||||
:title="$root.getLz('term.next')" v-b-tooltip.hover></button>
|
|
||||||
</div>
|
|
||||||
<div class="app-chrome-item">
|
|
||||||
<button class="playback-button--small repeat" v-if="mk.repeatMode == 0"
|
|
||||||
@click="mk.repeatMode = 1" :title="$root.getLz('term.enableRepeatOne')"
|
|
||||||
v-b-tooltip.hover></button>
|
|
||||||
<button class="playback-button--small repeat repeatOne" @click="mk.repeatMode = 2"
|
|
||||||
v-else-if="mk.repeatMode == 1" :title="$root.getLz('term.disableRepeatOne')"
|
|
||||||
v-b-tooltip.hover></button>
|
|
||||||
<button class="playback-button--small repeat active" @click="mk.repeatMode = 0"
|
|
||||||
v-else-if="mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')"
|
|
||||||
v-b-tooltip.hover></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="app-chrome-playback-duration">
|
|
||||||
<div class="song-progress">
|
|
||||||
<div class="song-duration"
|
|
||||||
style="justify-content: space-between; height: 1px;">
|
|
||||||
<p style="width: auto">{{ convertTime(getSongProgress()) }}</p>
|
|
||||||
<p style="width: auto">{{ convertTime(mk.currentPlaybackDuration) }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<input type="range" step="0.01" min="0" :style="progressBarStyle()"
|
<input type="range" step="0.01" min="0" :style="progressBarStyle()"
|
||||||
@input="playerLCD.desiredDuration = $event.target.value;playerLCD.userInteraction = true"
|
@input="playerLCD.desiredDuration = $event.target.value;playerLCD.userInteraction = true"
|
||||||
@mouseup="mk.seekToTime($event.target.value);setTimeout(()=>{playerLCD.desiredDuration = 0;playerLCD.userInteraction = false}, 1000);"
|
@mouseup="mk.seekToTime($event.target.value);setTimeout(()=>{playerLCD.desiredDuration = 0;playerLCD.userInteraction = false}, 1000);"
|
||||||
@touchend="mk.seekToTime($event.target.value);setTimeout(()=>{playerLCD.desiredDuration = 0;playerLCD.userInteraction = false}, 1000);"
|
@touchend="mk.seekToTime($event.target.value);setTimeout(()=>{playerLCD.desiredDuration = 0;playerLCD.userInteraction = false}, 1000);"
|
||||||
:max="mk.currentPlaybackDuration" :value="getSongProgress()">
|
:max="mk.currentPlaybackDuration" :value="getSongProgress()">
|
||||||
|
</b-col>
|
||||||
|
<b-col sm="auto">{{ convertTime(mk.currentPlaybackDuration) }}</b-col>
|
||||||
|
</b-row>
|
||||||
|
</div>
|
||||||
|
<div class="app-chrome-playback-controls">
|
||||||
|
<div class="app-chrome-item">
|
||||||
|
<button class="playback-button--small shuffle" v-if="mk.shuffleMode == 0" :class="isDisabled() && 'disabled'"
|
||||||
|
@click="mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')"
|
||||||
|
v-b-tooltip.hover></button>
|
||||||
|
<button class="playback-button--small shuffle active" v-else :class="isDisabled() && 'disabled'"
|
||||||
|
@click="mk.shuffleMode = 0" :title="$root.getLz('term.disableShuffle')"
|
||||||
|
v-b-tooltip.hover></button>
|
||||||
|
</div>
|
||||||
|
<div class="app-chrome-item">
|
||||||
|
<button class="playback-button previous" @click="prevButton()" :class="isPrevDisabled() && 'disabled'"
|
||||||
|
:title="$root.getLz('term.previous')" v-b-tooltip.hover></button>
|
||||||
|
</div>
|
||||||
|
<div class="app-chrome-item">
|
||||||
|
<button class="playback-button stop" @click="mk.stop()" v-if="mk.isPlaying && mk.nowPlayingItem.attributes.playParams.kind == 'radioStation'"
|
||||||
|
:title="$root.getLz('term.stop')" v-b-tooltip.hover></button>
|
||||||
|
<button class="playback-button pause" @click="mk.pause()" v-else-if="mk.isPlaying"
|
||||||
|
:title="$root.getLz('term.pause')" v-b-tooltip.hover></button>
|
||||||
|
<button class="playback-button play" @click="mk.play()" v-else
|
||||||
|
:title="$root.getLz('term.play')" v-b-tooltip.hover></button>
|
||||||
|
</div>
|
||||||
|
<div class="app-chrome-item">
|
||||||
|
<button class="playback-button next" @click="skipToNextItem()" :class="isNextDisabled() && 'disabled'"
|
||||||
|
:title="$root.getLz('term.next')" v-b-tooltip.hover></button>
|
||||||
|
</div>
|
||||||
|
<div class="app-chrome-item">
|
||||||
|
<button class="playback-button--small repeat" v-if="mk.repeatMode == 0" :class="isDisabled() && 'disabled'"
|
||||||
|
@click="mk.repeatMode = 1" :title="$root.getLz('term.enableRepeatOne')"
|
||||||
|
v-b-tooltip.hover></button>
|
||||||
|
<button class="playback-button--small repeat repeatOne" @click="mk.repeatMode = 2" :class="isDisabled() && 'disabled'"
|
||||||
|
v-else-if="mk.repeatMode == 1" :title="$root.getLz('term.disableRepeatOne')"
|
||||||
|
v-b-tooltip.hover></button>
|
||||||
|
<button class="playback-button--small repeat active" @click="mk.repeatMode = 0" :class="isDisabled() && 'disabled'"
|
||||||
|
v-else-if="mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')"
|
||||||
|
v-b-tooltip.hover></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -116,10 +126,10 @@
|
||||||
v-b-tooltip.hover :title="formatVolumeTooltip()">
|
v-b-tooltip.hover :title="formatVolumeTooltip()">
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome-item generic">
|
<div class="app-chrome-item generic">
|
||||||
<button class="playback-button--small miniplayer"
|
<button class="playback-button--small cast"
|
||||||
:title="$root.getLz('term.miniplayer')"
|
:title="$root.getLz('term.cast')"
|
||||||
v-b-tooltip.hover
|
v-b-tooltip.hover
|
||||||
@click="drawer.open = false; miniPlayer(true)"></button>
|
@click="cfg.advanced.AudioContext ? modals.castMenu = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome-item generic">
|
<div class="app-chrome-item generic">
|
||||||
<button class="playback-button--small queue" :class="{'active': drawer.panel == 'queue'}"
|
<button class="playback-button--small queue" :class="{'active': drawer.panel == 'queue'}"
|
||||||
|
|
|
@ -35,35 +35,37 @@
|
||||||
</template>
|
</template>
|
||||||
<template v-if="getThemeDirective('windowLayout') != 'twopanel'">
|
<template v-if="getThemeDirective('windowLayout') != 'twopanel'">
|
||||||
<div class="app-chrome-item display--large">
|
<div class="app-chrome-item display--large">
|
||||||
<button class="playback-button--small shuffle" v-if="mk.shuffleMode == 0"
|
<button class="playback-button--small shuffle" v-if="mk.shuffleMode == 0" :class="isDisabled() && 'disabled'"
|
||||||
@click="mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')"
|
@click="mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')"
|
||||||
v-b-tooltip.hover></button>
|
v-b-tooltip.hover></button>
|
||||||
<button class="playback-button--small shuffle active" v-else
|
<button class="playback-button--small shuffle active" v-else :class="isDisabled() && 'disabled'"
|
||||||
@click="mk.shuffleMode = 0" :title="$root.getLz('term.disableShuffle')"
|
@click="mk.shuffleMode = 0" :title="$root.getLz('term.disableShuffle')"
|
||||||
v-b-tooltip.hover></button>
|
v-b-tooltip.hover></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome-item display--large">
|
<div class="app-chrome-item display--large">
|
||||||
<button class="playback-button previous" @click="prevButton()"
|
<button class="playback-button previous" @click="prevButton()" :class="isPrevDisabled() && 'disabled'"
|
||||||
:title="$root.getLz('term.previous')" v-b-tooltip.hover></button>
|
:title="$root.getLz('term.previous')" v-b-tooltip.hover></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome-item display--large">
|
<div class="app-chrome-item display--large">
|
||||||
<button class="playback-button pause" @click="mk.pause()" v-if="mk.isPlaying"
|
<button class="playback-button stop" @click="mk.stop()" v-if="mk.isPlaying && mk.nowPlayingItem.attributes.playParams.kind == 'radioStation'"
|
||||||
|
:title="$root.getLz('term.stop')" v-b-tooltip.hover></button>
|
||||||
|
<button class="playback-button pause" @click="mk.pause()" v-else-if="mk.isPlaying"
|
||||||
:title="$root.getLz('term.pause')" v-b-tooltip.hover></button>
|
:title="$root.getLz('term.pause')" v-b-tooltip.hover></button>
|
||||||
<button class="playback-button play" @click="mk.play()" v-else
|
<button class="playback-button play" @click="mk.play()" v-else
|
||||||
:title="$root.getLz('term.play')" v-b-tooltip.hover></button>
|
:title="$root.getLz('term.play')" v-b-tooltip.hover></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome-item display--large">
|
<div class="app-chrome-item display--large">
|
||||||
<button class="playback-button next" @click="skipToNextItem()"
|
<button class="playback-button next" @click="skipToNextItem()" :class="isNextDisabled() && 'disabled'"
|
||||||
:title="$root.getLz('term.next')" v-b-tooltip.hover></button>
|
:title="$root.getLz('term.next')" v-b-tooltip.hover></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome-item display--large">
|
<div class="app-chrome-item display--large">
|
||||||
<button class="playback-button--small repeat" v-if="mk.repeatMode == 0"
|
<button class="playback-button--small repeat" v-if="mk.repeatMode == 0" :class="isDisabled() && 'disabled'"
|
||||||
@click="mk.repeatMode = 1" :title="$root.getLz('term.enableRepeatOne')"
|
@click="mk.repeatMode = 1" :title="$root.getLz('term.enableRepeatOne')"
|
||||||
v-b-tooltip.hover></button>
|
v-b-tooltip.hover></button>
|
||||||
<button class="playback-button--small repeat repeatOne" @click="mk.repeatMode = 2"
|
<button class="playback-button--small repeat repeatOne" @click="mk.repeatMode = 2" :class="isDisabled() && 'disabled'"
|
||||||
v-else-if="mk.repeatMode == 1" :title="$root.getLz('term.disableRepeatOne')"
|
v-else-if="mk.repeatMode == 1" :title="$root.getLz('term.disableRepeatOne')"
|
||||||
v-b-tooltip.hover></button>
|
v-b-tooltip.hover></button>
|
||||||
<button class="playback-button--small repeat active" @click="mk.repeatMode = 0"
|
<button class="playback-button--small repeat active" @click="mk.repeatMode = 0" :class="isDisabled() && 'disabled'"
|
||||||
v-else-if="mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')"
|
v-else-if="mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')"
|
||||||
v-b-tooltip.hover></button>
|
v-b-tooltip.hover></button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -74,9 +76,30 @@
|
||||||
<template v-if="mkReady()">
|
<template v-if="mkReady()">
|
||||||
<div class="app-playback-controls" @mouseover="chrome.progresshover = true"
|
<div class="app-playback-controls" @mouseover="chrome.progresshover = true"
|
||||||
@mouseleave="chrome.progresshover = false" @contextmenu="nowPlayingContextMenu">
|
@mouseleave="chrome.progresshover = false" @contextmenu="nowPlayingContextMenu">
|
||||||
<div class="artwork" @click="drawer.open = false; fullscreen(true)">
|
<div class="artwork" id="artworkLCD">
|
||||||
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
|
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
|
||||||
</div>
|
</div>
|
||||||
|
<b-popover custom-class="mediainfo-popover" target="artworkLCD" triggers="hover" placement="bottom">
|
||||||
|
<div class="content">
|
||||||
|
<div class="shadow-artwork">
|
||||||
|
<mediaitem-artwork :url="currentArtUrl" :url="currentArtUrlRaw"></mediaitem-artwork>
|
||||||
|
</div>
|
||||||
|
<div class="popover-artwork">
|
||||||
|
<mediaitem-artwork :size="210" :url="currentArtUrlRaw"></mediaitem-artwork>
|
||||||
|
</div>
|
||||||
|
<div class="song-name">{{ mk.nowPlayingItem["attributes"]["name"] }}</div>
|
||||||
|
<div class="song-artist" @click="getNowPlayingItemDetailed(`artist`)">{{ mk.nowPlayingItem["attributes"]["artistName"] }}</div>
|
||||||
|
<div class="song-album" @click="getNowPlayingItemDetailed(`album`)">
|
||||||
|
{{(mk.nowPlayingItem["attributes"]["albumName"]) ?
|
||||||
|
(mk.nowPlayingItem["attributes"]["albumName"]) : "" }}
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div class="btn-group" style="width:100%;">
|
||||||
|
<button class="md-btn md-btn-small" style="width: 100%;" @click="drawer.open = false; miniPlayer(true)">{{ $root.getLz("term.miniplayer") }}</button>
|
||||||
|
<button class="md-btn md-btn-small" style="width: 100%;" @click="drawer.open = false; fullscreen(true)">{{ $root.getLz("term.fullscreenView") }}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</b-popover>
|
||||||
<div class="playback-info">
|
<div class="playback-info">
|
||||||
<div class="chrome-icon-container">
|
<div class="chrome-icon-container">
|
||||||
<div class="audio-type private-icon" v-if="cfg.general.privateEnabled === true"></div>
|
<div class="audio-type private-icon" v-if="cfg.general.privateEnabled === true"></div>
|
||||||
|
@ -136,8 +159,24 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="app-title-text" v-if="false">
|
<div class="app-chrome-item" v-else>
|
||||||
Cider
|
<div class="search-input-container">
|
||||||
|
<div class="search-input--icon"></div>
|
||||||
|
<input type="search" spellcheck="false" @click="showSearch()" @focus="search.showHints = true"
|
||||||
|
@blur="setTimeout(()=>{search.showHints = false}, 300)"
|
||||||
|
v-on:keyup.enter="searchQuery();search.showHints = false" @change="showSearch();"
|
||||||
|
@input="getSearchHints()" :placeholder="$root.getLz('term.search') + '...'" v-model="search.term"
|
||||||
|
ref="searchInput" class="search-input">
|
||||||
|
|
||||||
|
<div class="search-hints-container" v-if="search.showHints && search.hints.length != 0">
|
||||||
|
<div class="search-hints">
|
||||||
|
<button class="search-hint text-overflow-elipsis" v-for="hint in search.hints"
|
||||||
|
@click="search.term = hint;search.showHints = false;searchQuery(hint)">
|
||||||
|
{{ hint }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome--right">
|
<div class="app-chrome--right">
|
||||||
|
@ -152,10 +191,11 @@
|
||||||
v-b-tooltip.hover :title="formatVolumeTooltip()">
|
v-b-tooltip.hover :title="formatVolumeTooltip()">
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome-item generic">
|
<div class="app-chrome-item generic">
|
||||||
<button class="playback-button--small miniplayer"
|
<button class="playback-button--small cast"
|
||||||
:title="$root.getLz('term.miniplayer')"
|
:title="$root.getLz('term.cast')"
|
||||||
|
@click="cfg.advanced.AudioContext ? modals.castMenu = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"
|
||||||
v-b-tooltip.hover
|
v-b-tooltip.hover
|
||||||
@click="drawer.open = false; miniPlayer(true)"></button>
|
></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="app-chrome-item generic">
|
<div class="app-chrome-item generic">
|
||||||
<button class="playback-button--small queue"
|
<button class="playback-button--small queue"
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<div id="app-sidebar">
|
<div id="app-sidebar">
|
||||||
|
<template v-if="getThemeDirective('windowLayout') != 'twopanel'">
|
||||||
<div class="app-sidebar-header">
|
<div class="app-sidebar-header">
|
||||||
<div class="search-input-container">
|
<div class="search-input-container">
|
||||||
<div class="search-input--icon"></div>
|
<div class="search-input--icon"></div>
|
||||||
|
@ -7,8 +8,7 @@
|
||||||
v-on:keyup.enter="searchQuery();search.showHints = false" @change="showSearch();"
|
v-on:keyup.enter="searchQuery();search.showHints = false" @change="showSearch();"
|
||||||
@input="getSearchHints()" :placeholder="$root.getLz('term.search') + '...'" v-model="search.term"
|
@input="getSearchHints()" :placeholder="$root.getLz('term.search') + '...'" v-model="search.term"
|
||||||
ref="searchInput" class="search-input">
|
ref="searchInput" class="search-input">
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="search-hints-container" v-if="search.showHints && search.hints.length != 0">
|
<div class="search-hints-container" v-if="search.showHints && search.hints.length != 0">
|
||||||
<div class="search-hints">
|
<div class="search-hints">
|
||||||
<button class="search-hint text-overflow-elipsis" v-for="hint in search.hints"
|
<button class="search-hint text-overflow-elipsis" v-for="hint in search.hints"
|
||||||
|
@ -17,6 +17,10 @@
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<div class="app-sidebar-content" scrollaxis="y">
|
<div class="app-sidebar-content" scrollaxis="y">
|
||||||
<div class="app-sidebar-header-text"
|
<div class="app-sidebar-header-text"
|
||||||
@click="cfg.general.sidebarCollapsed.cider = !cfg.general.sidebarCollapsed.cider"
|
@click="cfg.general.sidebarCollapsed.cider = !cfg.general.sidebarCollapsed.cider"
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
{{playbackRate}} ×
|
{{playbackRate}} ×
|
||||||
</div>
|
</div>
|
||||||
<div class="md-option-segment md-option-segment_auto">
|
<div class="md-option-segment md-option-segment_auto">
|
||||||
<input type="range" :step="0.05" min="0.25" :max="2" v-model="playbackRate">
|
<input type="range" :step="0.05" min="0.25" :max="2" @wheel="playbackRateWheel" v-model="playbackRate">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -34,9 +34,25 @@
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
playbackRate: function (newValue, _oldValue) {
|
playbackRate: function (newValue, _oldValue) {
|
||||||
this.$root.mk.playbackRate = newValue
|
this.saveValue(newValue);
|
||||||
this.$root.cfg.audio.playbackRate = newValue
|
}
|
||||||
this.playbackRate = newValue
|
},
|
||||||
|
methods: {
|
||||||
|
playbackRateWheel(event) {
|
||||||
|
if (app.checkScrollDirectionIsUp(event)) {
|
||||||
|
this.saveValue(this.$root.cfg.audio.playbackRate + 0.05);
|
||||||
|
} else {
|
||||||
|
this.saveValue(this.$root.cfg.audio.playbackRate - 0.05);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
saveValue(newValue) {
|
||||||
|
newValue = Number(newValue);
|
||||||
|
if (newValue >= 0.25 && newValue <= 2) {
|
||||||
|
newValue = String(newValue).length > 4 ? newValue.toFixed(2) : newValue;
|
||||||
|
this.$root.mk.playbackRate = newValue;
|
||||||
|
this.$root.cfg.audio.playbackRate = newValue;
|
||||||
|
this.playbackRate = newValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -98,7 +98,7 @@
|
||||||
async mounted() {
|
async mounted() {
|
||||||
await this.getBadges()
|
await this.getBadges()
|
||||||
if (typeof this.item.attributes.playParams == "object") {
|
if (typeof this.item.attributes.playParams == "object") {
|
||||||
if (this.item.attributes.playParams.kind.includes("radioStation") && (this.item.attributes.playParams.streamingKind == 1 || this.item.attributes.playParams.streamingKind == 2)) {
|
if (this.item.attributes.playParams.kind.includes("radioStation") && (this.item.attributes.playParams.streamingKind == 1)) {
|
||||||
this.unavailable = true
|
this.unavailable = true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -118,20 +118,6 @@
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="spprofile-line" v-show="app.cfg.audio.maikiwiAudio.spatial === true">
|
|
||||||
<div class="spprofile-viewport">
|
|
||||||
<button class="spprev" @click="profilePrev"></button>
|
|
||||||
<button class="nextprev" @click="profileNext"></button>
|
|
||||||
<template v-for="profile in spprofiles" v-if="$root.cfg.audio.maikiwiAudio.spatialProfile == profile.id">
|
|
||||||
<transition name="spfade">
|
|
||||||
<div class="spslide" :key="profile.id">
|
|
||||||
<img v-if="profile.img" loading="eager" decoding="async" :src="profile.img" alt="">
|
|
||||||
<h1 class="sptitle">{{ profile.name }}</h1>
|
|
||||||
</div>
|
|
||||||
</transition>
|
|
||||||
</template>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div style="opacity: 0.5; pointer-events: none">
|
<div style="opacity: 0.5; pointer-events: none">
|
||||||
<div class="md-option-header">
|
<div class="md-option-header">
|
||||||
<span>{{$root.getLz('settings.header.unfinished')}}</span>
|
<span>{{$root.getLz('settings.header.unfinished')}}</span>
|
||||||
|
@ -192,6 +178,14 @@
|
||||||
case "Maikiwi":
|
case "Maikiwi":
|
||||||
return "Maikiwi";
|
return "Maikiwi";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "Maikiwi+":
|
||||||
|
return "Maikiwi+";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "live":
|
||||||
|
return "LIVE";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "CAR":
|
case "CAR":
|
||||||
|
@ -204,39 +198,6 @@
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
profileNext() {
|
|
||||||
var next = this.spprofiles.find(function (profile) {
|
|
||||||
return profile.id === this.$root.cfg.audio.maikiwiAudio.spatialProfile;
|
|
||||||
}.bind(this));
|
|
||||||
if (next) {
|
|
||||||
next = this.spprofiles[this.spprofiles.indexOf(next) + 1];
|
|
||||||
if (next) {
|
|
||||||
this.$root.cfg.audio.maikiwiAudio.spatialProfile = next.id;
|
|
||||||
} else {
|
|
||||||
this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[0].id;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[0].id;
|
|
||||||
}
|
|
||||||
this.toggleMaikiwiSpatial()
|
|
||||||
},
|
|
||||||
profilePrev() {
|
|
||||||
// select the previous profile based on $root.cfg.audio.maikiwiAudio.spatialProfile
|
|
||||||
var prev = this.spprofiles.find(function (profile) {
|
|
||||||
return profile.id === this.$root.cfg.audio.maikiwiAudio.spatialProfile;
|
|
||||||
}.bind(this));
|
|
||||||
if (prev) {
|
|
||||||
prev = this.spprofiles[this.spprofiles.indexOf(prev) - 1];
|
|
||||||
if (prev) {
|
|
||||||
this.$root.cfg.audio.maikiwiAudio.spatialProfile = prev.id;
|
|
||||||
} else {
|
|
||||||
this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[this.spprofiles.length - 1].id;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this.$root.cfg.audio.maikiwiAudio.spatialProfile = this.spprofiles[this.spprofiles.length - 1].id;
|
|
||||||
}
|
|
||||||
this.toggleMaikiwiSpatial()
|
|
||||||
},
|
|
||||||
toggleSpatial: function () {
|
toggleSpatial: function () {
|
||||||
if (app.cfg.audio.maikiwiAudio.spatial) {
|
if (app.cfg.audio.maikiwiAudio.spatial) {
|
||||||
CiderAudio.spatialOn()
|
CiderAudio.spatialOn()
|
||||||
|
|
|
@ -94,13 +94,25 @@
|
||||||
<img :class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'">
|
<img :class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'">
|
||||||
{{app.getLz('term.confirm')}}
|
{{app.getLz('term.confirm')}}
|
||||||
</button>
|
</button>
|
||||||
<button class="more-btn-round" style="float:right;" @click="menu" :aria-label="app.getLz('term.more')">
|
<div style="display: flex; float: right;">
|
||||||
|
<div class="search-input-container" style="margin-right: 8px;">
|
||||||
|
<div class="search-input--icon"></div>
|
||||||
|
<input type="search"
|
||||||
|
style="width:100%;"
|
||||||
|
spellcheck="false"
|
||||||
|
:placeholder="$root.getLz('term.search') + '...'"
|
||||||
|
@input="search()"
|
||||||
|
v-model="searchQuery"
|
||||||
|
class="search-input">
|
||||||
|
</div>
|
||||||
|
<button class="more-btn-round" @click="menu" :aria-label="app.getLz('term.more')">
|
||||||
<div class="svg-icon"></div>
|
<div class="svg-icon"></div>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div class="artworkContainer" v-if="data.attributes.artwork != null">
|
<div class="artworkContainer" v-if="data.attributes.artwork != null">
|
||||||
<artwork-material :url="data.attributes.artwork.url" size="260" images="1"></artwork-material>
|
<artwork-material :url="data.attributes.artwork.url" size="260" images="1"></artwork-material>
|
||||||
</div>
|
</div>
|
||||||
|
@ -160,12 +172,12 @@
|
||||||
<draggable :options="{disabled: !editing}"
|
<draggable :options="{disabled: !editing}"
|
||||||
v-model="data.relationships.tracks.data" @start="drag=true"
|
v-model="data.relationships.tracks.data" @start="drag=true"
|
||||||
@end="drag=false;put()">
|
@end="drag=false;put()">
|
||||||
<template v-if="nestedPlaylist == [] || nestedPlaylist.length <= 1">
|
<template v-if="!hasNestedPlaylist">
|
||||||
<mediaitem-list-item :item="item" :parent="getItemParent(data)" :index="index"
|
<mediaitem-list-item :item="item" :parent="getItemParent(data)" :index="index"
|
||||||
:showIndex="true"
|
:showIndex="true"
|
||||||
:showIndexPlaylist="(data.attributes.playParams.kind ?? data.type ?? '').includes('playlist')"
|
:showIndexPlaylist="(data.attributes.playParams.kind ?? data.type ?? '').includes('playlist')"
|
||||||
:context-ext="buildContextMenu()"
|
:context-ext="buildContextMenu()"
|
||||||
v-for="(item,index) in data.relationships.tracks.data"></mediaitem-list-item>
|
v-for="(item,index) in displayListing"></mediaitem-list-item>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div v-for="disc in nestedPlaylist">
|
<div v-for="disc in nestedPlaylist">
|
||||||
|
@ -262,7 +274,11 @@
|
||||||
useArtistChip: false,
|
useArtistChip: false,
|
||||||
nestedPlaylist: [],
|
nestedPlaylist: [],
|
||||||
classes: [],
|
classes: [],
|
||||||
editing: false
|
editing: false,
|
||||||
|
inPlaylist: false,
|
||||||
|
searchQuery: "",
|
||||||
|
displayListing: [],
|
||||||
|
hasNestedPlaylist: false,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted: function () {
|
mounted: function () {
|
||||||
|
@ -271,11 +287,21 @@
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
data: function () {
|
data: {
|
||||||
this.nestedPlaylist = [];
|
handler: function () {
|
||||||
this.isInLibrary()
|
this.isInLibrary()
|
||||||
this.getBadges()
|
this.getBadges()
|
||||||
this.generateNestedPlaylist()
|
|
||||||
|
if (this.data.relationships) {
|
||||||
|
this.generateNestedPlaylist(this.data.relationships.tracks.data)
|
||||||
|
if (!this.hasNestedPlaylist) {
|
||||||
|
this.displayListing = this.data.relationships.tracks.data
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.inPlaylist = this.data.type == "library-playlists";
|
||||||
|
},
|
||||||
|
deep: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -296,23 +322,24 @@
|
||||||
}
|
}
|
||||||
app.modals.moreInfo = true;
|
app.modals.moreInfo = true;
|
||||||
},
|
},
|
||||||
generateNestedPlaylist() {
|
generateNestedPlaylist(songlists) {
|
||||||
this.nestedPlaylist = [];
|
this.nestedPlaylist = [];
|
||||||
if (this.data?.type?.includes("album")) {
|
if (this.data?.type?.includes("album")) {
|
||||||
console.log(this.data.relationships.tracks.data)
|
|
||||||
let songlists = this.data.relationships.tracks.data;
|
|
||||||
let discs = songlists.map(x => {
|
let discs = songlists.map(x => {
|
||||||
return x.attributes.discNumber
|
return x.attributes.discNumber
|
||||||
}).filter((item, i, ar) => ar.indexOf(item) === i);
|
}).filter((item, i, ar) => ar.indexOf(item) === i);
|
||||||
if (discs && discs.length > 1) {
|
|
||||||
|
if ((discs && discs.length > 1) || (discs && this.hasNestedPlaylist)) {
|
||||||
for (disc of discs) {
|
for (disc of discs) {
|
||||||
let songs = songlists.filter(x => x.attributes.discNumber == disc);
|
let songs = songlists.filter(x => x.attributes.discNumber == disc);
|
||||||
this.nestedPlaylist.push({disc: disc, tracks: songs})
|
this.nestedPlaylist.push({ disc: disc, tracks: songs })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log(this.nestedPlaylist)
|
console.log(this.nestedPlaylist)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!this.hasNestedPlaylist)
|
||||||
|
this.hasNestedPlaylist = this.nestedPlaylist != [] && this.nestedPlaylist.length > 1;
|
||||||
},
|
},
|
||||||
isHeaderVisible(visible) {
|
isHeaderVisible(visible) {
|
||||||
this.headerVisible = visible
|
this.headerVisible = visible
|
||||||
|
@ -398,7 +425,7 @@
|
||||||
this.confirm = false
|
this.confirm = false
|
||||||
},
|
},
|
||||||
async removeFromLibrary(id) {
|
async removeFromLibrary(id) {
|
||||||
const params = {"fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library"};
|
const params = { "fields[songs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library" };
|
||||||
var id = this.data.id ?? this.data.attributes.playParams.id
|
var id = this.data.id ?? this.data.attributes.playParams.id
|
||||||
const res = await app.mkapi(this.data.attributes.playParams.kind ?? this.data.type, this.data.attributes.playParams.isLibrary ?? false, this.data.attributes.playParams.id ?? this.data.id, params);
|
const res = await app.mkapi(this.data.attributes.playParams.kind ?? this.data.type, this.data.attributes.playParams.isLibrary ?? false, this.data.attributes.playParams.id ?? this.data.id, params);
|
||||||
if (res.data.data[0] && res.data.data[0].relationships && res.data.data[0].relationships.library && res.data.data[0].relationships.library.data && res.data.data[0].relationships.library.data.length > 0) {
|
if (res.data.data[0] && res.data.data[0].relationships && res.data.data[0].relationships.library && res.data.data[0].relationships.library.data && res.data.data[0].relationships.library.data.length > 0) {
|
||||||
|
@ -706,7 +733,7 @@
|
||||||
|
|
||||||
let query = (this.data ?? app.showingPlaylist).relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
|
let query = (this.data ?? app.showingPlaylist).relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
|
||||||
app.mk.stop().then(function () {
|
app.mk.stop().then(function () {
|
||||||
app.mk.setQueue({[truekind]: [id], parameters: {l: app.mklang}}).then(function () {
|
app.mk.setQueue({ [truekind]: [id], parameters: { l: app.mklang } }).then(function () {
|
||||||
app.mk.play().then(function () {
|
app.mk.play().then(function () {
|
||||||
if (query.length > 100) {
|
if (query.length > 100) {
|
||||||
let u = query.slice(100);
|
let u = query.slice(100);
|
||||||
|
@ -724,8 +751,48 @@
|
||||||
navClass(data) {
|
navClass(data) {
|
||||||
if (data && typeof data.views != "undefined") return "";
|
if (data && typeof data.views != "undefined") return "";
|
||||||
return "d-none";
|
return "d-none";
|
||||||
|
},
|
||||||
|
search() {
|
||||||
|
let filtered = [];
|
||||||
|
|
||||||
|
if (this.searchQuery == "") {
|
||||||
|
filtered = this.data.relationships.tracks.data;
|
||||||
|
} else {
|
||||||
|
filtered = this.data.relationships.tracks.data.filter((item) => {
|
||||||
|
let itemName = item.attributes.name.toLowerCase();
|
||||||
|
let searchTerm = this.searchQuery.toLowerCase();
|
||||||
|
let artistName = "";
|
||||||
|
let albumName = "";
|
||||||
|
if (item.attributes.artistName != null) {
|
||||||
|
artistName = item.attributes.artistName.toLowerCase();
|
||||||
|
}
|
||||||
|
if (item.attributes.albumName != null) {
|
||||||
|
albumName = item.attributes.albumName.toLowerCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove any non-alphanumeric characters and spaces from search term and item name
|
||||||
|
searchTerm = searchTerm.replace(/[^\p{L}\p{N} ]/gu, "");
|
||||||
|
itemName = itemName.replace(/[^\p{L}\p{N} ]/gu, "");
|
||||||
|
artistName = artistName.replace(/[^\p{L}\p{N} ]/gu, "");
|
||||||
|
albumName = albumName.replace(/[^\p{L}\p{N} ]/gu, "");
|
||||||
|
|
||||||
|
let match = itemName.includes(searchTerm) || artistName.includes(searchTerm);
|
||||||
|
// only include album name in playlists
|
||||||
|
// this allows to search for the title track (itemName == albumName)
|
||||||
|
if (this.inPlaylist) match = match || albumName.includes(searchTerm)
|
||||||
|
|
||||||
|
if (match) return item;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this.hasNestedPlaylist) {
|
||||||
|
// Regular album/playlist
|
||||||
|
this.displayListing = filtered;
|
||||||
|
} else {
|
||||||
|
// Album with multiple discs
|
||||||
|
this.generateNestedPlaylist(filtered);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
|
@ -89,6 +89,9 @@
|
||||||
<label>
|
<label>
|
||||||
<select class="md-select" style="width:180px;"
|
<select class="md-select" style="width:180px;"
|
||||||
v-model="$root.cfg.general.resumeTabs.tab">
|
v-model="$root.cfg.general.resumeTabs.tab">
|
||||||
|
<option value="dynamic">
|
||||||
|
{{$root.getLz('settings.option.general.resumetabs.dynamic')}}
|
||||||
|
</option>
|
||||||
<option value="home">{{$root.getLz('home.title')}}</option>
|
<option value="home">{{$root.getLz('home.title')}}</option>
|
||||||
<option value="listen_now">{{$root.getLz('term.listenNow')}}</option>
|
<option value="listen_now">{{$root.getLz('term.listenNow')}}</option>
|
||||||
<option value="browse">{{$root.getLz('term.browse')}}</option>
|
<option value="browse">{{$root.getLz('term.browse')}}</option>
|
||||||
|
@ -99,9 +102,6 @@
|
||||||
<option value="library-artists">{{$root.getLz('term.artists')}}</option>
|
<option value="library-artists">{{$root.getLz('term.artists')}}</option>
|
||||||
<option value="library-videos">{{$root.getLz('term.videos')}}</option>
|
<option value="library-videos">{{$root.getLz('term.videos')}}</option>
|
||||||
<option value="podcasts">{{$root.getLz('term.podcasts')}}</option>
|
<option value="podcasts">{{$root.getLz('term.podcasts')}}</option>
|
||||||
<option value="dynamic">
|
|
||||||
{{$root.getLz('settings.option.general.resumetabs.dynamic')}}
|
|
||||||
</option>
|
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"electronVersion": "18.2.3",
|
"electronVersion": "18.2.4",
|
||||||
"electronDownload": {
|
"electronDownload": {
|
||||||
"version": "18.2.3+wvcus",
|
"version": "18.2.4+wvcus",
|
||||||
"mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
|
"mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
|
||||||
},
|
},
|
||||||
"appId": "cider",
|
"appId": "cider",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue