Merge branch 'main' into enhancement/lastfm

This commit is contained in:
Core 2022-06-15 23:28:21 +01:00 committed by GitHub
commit 78349e875d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
28 changed files with 693 additions and 215 deletions

View file

@ -3,7 +3,7 @@ version: 2.1
executors:
cider-ci:
docker:
- image: circleci/node:16
- image: cimg/node:lts-browsers
working_directory: ~/Cider
orbs: # Add orbs to your configuration
@ -15,15 +15,9 @@ jobs:
executor: cider-ci
steps:
- checkout
# - run:
# name: Rename Repository
# command: sed -i 's/github:ciderapp\/Cider/github:ciderapp\/cider-releases/' package.json
- run:
name: Update Version Number of App
command: sudo chmod +x resources/version.sh && ./resources/version.sh || true
- run:
name: Update Package Managers
command: sudo npm update -g npm yarn
- restore_cache:
name: Restore Yarn Package Cache
keys:
@ -60,9 +54,6 @@ jobs:
steps:
- attach_workspace:
at: ~/Cider
# - run:
# name: Fix Versioning and Add Channel
# command: yarn circle:script
- run:
name: Generate Builds (Linux)
command: yarn electron-builder -l -p never
@ -89,9 +80,6 @@ jobs:
sudo dpkg --add-architecture i386
sudo apt-get update -y
sudo apt-get install -y wine32
# - run:
# name: Fix Versioning and Add Channel
# command: yarn circle:script
- run:
name: Generate Builds (Windows)
command: yarn electron-builder -w --x64 -p never
@ -117,9 +105,6 @@ jobs:
sudo dpkg --add-architecture i386
sudo apt-get update -y
sudo apt-get install -y wine32
# - run:
# name: Fix Versioning and Add Channel
# command: yarn circle:script
- run:
name: Generate Builds (Winget)
command: yarn electron-builder --win -c winget.json -p never
@ -156,9 +141,6 @@ jobs:
mv ~/Cider/dist/*.blockmap ~/Cider/dist/artifacts
- store_artifacts:
path: ~/Cider/dist/artifacts
# - run:
# name: Fix Versioning and Add Channel
# command: yarn circle:script
- run:
name: Update Version Number of App
command: sudo chmod +x resources/version.sh && ./resources/version.sh || true

View file

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1002 1000" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<path d="M501,21C765.367,21 980,235.633 980,500C980,764.367 765.367,979 501,979C236.633,979 22,764.367 22,500C22,235.633 236.633,21 501,21ZM501,169C683.684,169 832,317.316 832,500C832,682.684 683.684,831 501,831C318.316,831 170,682.684 170,500C170,317.316 318.316,169 501,169Z" style="fill:rgb(255,38,84);"/>
<path d="M501,224C653.053,224 776.5,347.447 776.5,499.5C776.5,651.553 653.053,775 501,775C348.947,775 225.5,651.553 225.5,499.5C225.5,347.447 348.947,224 501,224ZM589.165,492.207C595.163,495.672 595.163,504.328 589.165,507.793L439.502,594.256C433.502,597.722 426,593.392 426,586.463L426,413.537C426,406.608 433.502,402.278 439.502,405.744L589.165,492.207Z" style="fill:rgb(255,38,84);"/>
<svg width="100%" height="100%" viewBox="0 0 958 958" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(1,0,0,1,-22,-21)">
<circle cx="501" cy="500" r="420" style="fill:rgb(15,15,15);"/>
<path d="M501,21C765.367,21 980,235.633 980,500C980,764.367 765.367,979 501,979C236.633,979 22,764.367 22,500C22,235.633 236.633,21 501,21ZM501,169C683.684,169 832,317.316 832,500C832,682.684 683.684,831 501,831C318.316,831 170,682.684 170,500C170,317.316 318.316,169 501,169Z" style="fill:rgb(255,43,81);"/>
<path d="M501,224C653.053,224 776.5,347.447 776.5,499.5C776.5,651.553 653.053,775 501,775C348.947,775 225.5,651.553 225.5,499.5C225.5,347.447 348.947,224 501,224ZM589.165,492.207C595.163,495.672 595.163,504.328 589.165,507.793L439.502,594.256C433.502,597.722 426,593.392 426,586.463L426,413.537C426,406.608 433.502,402.278 439.502,405.744L589.165,492.207Z" style="fill:rgb(255,43,81);"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

@ -448,6 +448,11 @@ Update 10/06/2022 20:00 UTC
* `settings.option.visual.purplePodcastPlaybackBar`: Added to `en_US`
Update 14/06/2022 14:10 UTC
* `term.themeManaged`: Added to `en_US`
Update 15/06/2022 20:00 UTC
* `settings.notyf.connectivity.lastfmScrobble.connectError`: Added to `en_US`

View file

@ -2,7 +2,7 @@
"i18n.languageName": "English (UK)",
"i18n.languageNameEnglish": "English (UK)",
"i18n.category": "main",
"i18n.authors": "Core, inalone, nosh118",
"i18n.authors": "Core, inalone, nosh118, booploops",
"date.format": "${d} ${m}, ${y}",
"term.equalizer": "Equaliser",
"settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalisation, Equalisers and Visualisers - however on some systems this may cause stuttering in audio tracks.",
@ -14,5 +14,14 @@
"term.track": {
"one" : "song",
"other" : "songs"
}
},
"home.syncFavorites": "Sync Favourites",
"home.syncFavorites.gettingArtists": "Getting Favourited Artists...",
"action.addToFavorites": "Add to Favourites",
"action.favorite": "Favourite",
"action.removeFavorite": "Remove Favourite",
"settings.option.visual.customAccentColor": "Custom Accent Colour",
"settings.option.visual.accentColor": "Accent Colour",
"settings.option.visual.windowColor": "Window Tint Colour",
"settings.header.visual.windowBackgroundStyle.color": "Colour Tint"
}

View file

@ -154,6 +154,7 @@
},
"term.videos": "Videos",
"term.menu": "Menu",
"term.themeManaged": "Managed by a theme",
"term.check": "Check",
"term.aboutArtist": "About {{artistName}}",
"term.topResult": "Top Result",

View file

@ -154,6 +154,7 @@
},
"term.videos": "Videók",
"term.menu": "Menü",
"term.themeManaged": "Egy téma kezeli a beállítást",
"term.check": "Ellenőrzés",
"term.aboutArtist": "{{artistName}}-ról/ről",
"term.topResult": "Legjobb találatok",

View file

@ -153,6 +153,7 @@
},
"term.videos": "Videos",
"term.menu": "Menu",
"term.themeManaged": "Managed by a theme",
"term.check": "Check",
"term.aboutArtist": "About {{artistName}}",
"term.topResult": "Top Result",

View file

@ -10,6 +10,7 @@
"notification.updatingLibrarySongs": "正在更新歌曲资料库...",
"notification.updatingLibraryAlbums": "正在更新专辑资料库...",
"notification.updatingLibraryArtists": "正在更新艺人资料库...",
"term.variables": "Variables",
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
@ -20,8 +21,12 @@
"term.accountSettings": "账户设置",
"term.logout": "退出登录",
"term.login": "登录",
"term.quickNav":"快速导航",
"term.cast":"投射",
"term.about": "关于",
"term.privateSession": "私人聆听",
"term.privateSession": "隐身聆听",
"term.disablePrivateSession":"停止隐身聆听",
"term.autoplay":"自动播放",
"term.lyrics": "歌词",
"term.queue": "待播清单",
"term.history": "历史记录",
@ -37,18 +42,27 @@
"term.artists": "艺人",
"term.podcasts": "播客",
"term.playlists": "播放列表",
"term.charts":"排行榜",
"term.playlist": "播放列表",
"term.newPlaylist": "新播放列表",
"term.newPlaylistFolder": "新播放列表文件夹",
"term.createNewPlaylist": "新建播放列表",
"term.createNewPlaylistFolder": "新建播放列表文件夹",
"term.deletePlaylist": "您确定要删除该播放列表吗?",
"term.navigateBack":"上一页",
"term.navigateForward":"下一页",
"term.play": "播放",
"term.pause": "暂停",
"term.stop": "停止",
"term.previous": "上一首",
"term.next": "下一首",
"term.shuffle": "随机播放",
"term.repeat": "重复播放",
"term.enableShuffle":"开启随机播放",
"term.disableShuffle":"关闭随机播放",
"term.repeat": "循环播放",
"term.enableRepeatOne": "开启单曲循环",
"term.disableRepeatOne": "关闭单曲循环",
"term.disableRepeat": "关闭循环播放",
"term.volume": "音量",
"term.mute": "静音",
"term.unmute": "解除静音",
@ -63,12 +77,14 @@
"term.sortBy.genre": "类型",
"term.sortBy.releaseDate": "发行日期",
"term.sortBy.duration": "时长",
"term.sortBy.dateAdded":"加入日期",
"term.sortOrder": "字母排序",
"term.sortOrder.ascending": "升序",
"term.sortOrder.descending": "倒序",
"term.viewAs": "显示模式",
"term.viewAs.coverArt": "专辑封面",
"term.viewAs.list": "列表",
"term.dynamic":"动态",
"term.size": "大小",
"term.size.normal": "正常",
"term.size.compact": "紧凑",
@ -101,7 +117,9 @@
"term.audioControls": "音频控制",
"term.audioSettings": "音频设置",
"term.clearAll": "清空",
"term.recentStations": "最近播放的频道",
"term.recentStations": "最近播放的广播",
"term.personalStations":"最近播放的个人广播",
"term.amLive":"amLive",
"term.language": "语言",
"term.funLanguages": "恶搞",
"term.noLyrics": "加载中... / 无搜索结果 / 纯音乐",
@ -140,10 +158,25 @@
"term.radioShows": "广播单集",
"term.recordLabels": "唱片公司",
"term.videoExtras": "视频特辑",
"term.top":"顶部",
"term.version": "版本",
"term.noVideos":"无视频",
"term.plugin": "插件",
"term.pluginMenu": "插件菜单",
"term.pluginMenu.none": "沒有交互式插件",
"term.replay":"重新播放",
"term.uniqueAlbums":"Unique Albums",
"term.uniqueArtists":"Unique Artists",
"term.uniqueSongs":"Unique Songs",
"term.topArtists":"热门艺人",
"term.listenedTo":"听过",
"term.times":"次",
"term.topAlbums":"热门专辑",
"term.plays":"次",
"term.topGenres":"热门类型",
"term.confirmLogout":"你确定要退出登录吗?",
"term.creditDesignedBy":"由 ${authorUsername} 设计",
"term.discNumber":"碟 ${discNumber}",
"home.title": "主页",
"home.recentlyPlayed": "最近播放",
"home.recentlyAdded": "最近添加",
@ -164,6 +197,12 @@
"podcast.episodes": "单集",
"podcast.playEpisode": "播放单集",
"podcast.website": "Podcast 网站",
"action.hideLibrary":"隐藏资料库",
"action.showLibrary":"显示资料可查",
"action.cut":"剪切",
"action.paste":"粘贴",
"action.selectAll":"全选",
"action.delete":"删除",
"action.edit": "编辑",
"action.done": "完成",
"action.editTracklist": "编辑歌曲清单",
@ -193,7 +232,8 @@
"action.startRadio": "开始电台",
"action.goToArtist": "前往艺人",
"action.goToAlbum": "前往专辑",
"action.showInAppleMusic": "显示于 Apple Music",
"action.showInPlaylist":"在播放列表中显示",
"action.showInAppleMusic": "在 Apple Music 中显示",
"action.moveToTop": "移到顶部",
"action.share": "分享歌曲",
"action.rename": "重命名",
@ -210,19 +250,68 @@
"action.showAlbum": "显示专辑",
"action.tray.minimize": "最小化",
"action.tray.quit": "退出",
"action.tray.show": "显示 Cider",
"action.tray.playpause": "播放/暂停",
"action.tray.next": "下一首",
"action.tray.previous": "上一首",
"action.tray.listento": "Listen To:",
"action.update": "更新",
"action.install": "安装",
"action.copy": "复制",
"action.newpreset": "新建默认...",
"action.deletepreset": "删除默认",
"action.open": "打开",
"action.close": "关闭",
"action.relaunch.confirm":"你想重新启动 Cider 吗?",
"action.cast.chromecast": "Chromecast",
"action.cast.todevices": "投射到设备",
"action.cast.stop": "停止投射到所有设备",
"action.cast.airplay": "AirPlay",
"action.cast.airplay.underdevelopment": "AirPlay 仍处于开发阶段中,敬请期待。",
"action.cast.airplay": "隔空播放",
"action.cast.airplay.underdevelopment": "隔空播放仍处于开发阶段中,敬请期待。",
"action.cast.scan": "搜索",
"action.cast.scanning": "搜索中...",
"action.createNew": "添加...",
"action.openArtworkInBrowser": "在浏览器中打开专辑封面",
"action.scrollToTop": "回到顶部",
"menubar.options.about": "关于",
"menubar.options.settings": "设置",
"menubar.options.quit": "退出 Cider",
"menubar.options.view": "查看 ",
"menubar.options.reload": "重新载入",
"menubar.options.forcereload": "强制重新载入",
"menubar.options.toggledevtools": "切换开发人员工具",
"menubar.options.window": "窗口",
"menubar.options.minimize": "最小化",
"menubar.options.toggleprivate": "切换隐身聆听",
"menubar.options.webremote": "远程控制",
"menubar.options.audio": "音频设定",
"menubar.options.plugins": "插件目录",
"menubar.options.controls": "控制",
"menubar.options.next": "下一首",
"menubar.options.playpause": "播放/暂停",
"menubar.options.previous": "上一首",
"menubar.options.volumeup": "增大音量",
"menubar.options.volumedown": "减小音量",
"menubar.options.browse": "浏览",
"menubar.options.artists": "艺人",
"menubar.options.search": "搜索",
"menubar.options.albums": "专辑",
"menubar.options.cast": "投射至设备",
"menubar.options.account": "账户",
"menubar.options.accountsettings": "账户设置",
"menubar.options.signout": "注销",
"menubar.options.support": "支持",
"menubar.options.discord": "Discord",
"menubar.options.github": "GitHub Wiki",
"menubar.options.report": "报告...",
"menubar.options.bug": "Bug",
"menubar.options.feature": "功能请求",
"menubar.options.trans": "翻译报告/请求",
"menubar.options.license": "查看授权",
"menubar.options.conf": "在编辑器打开配置文件",
"menubar.options.listennow": "现在就听",
"menubar.options.recentlyAdded": "最近添加",
"menubar.options.songs": "歌曲",
"settings.header.general": "通用",
"settings.header.general.description": "调整 Cider 的通用设置",
"settings.option.audio.volumeStep": "音量改变量",
@ -244,25 +333,54 @@
"settings.option.general.customizeSidebar": "自定义侧边栏的功能",
"settings.option.general.customizeSidebar.customize": "自定义",
"settings.option.general.keybindings": "快捷操作键",
"settings.option.general.keybindings.pressCombination":"按下两个键组合来更新操作设定。",
"settings.option.general.keybindings.pressEscape": "按下 Esc 键返回。",
"settings.notyf.general.keybindings.update.success":"快捷键更新成功。",
"settings.prompt.general.keybindings.update.success":"快捷键更新成功,按下 OK 重新启动 Cider.",
"settings.option.general.keybindings.open": "打开",
"settings.option.general.themeUpdateNotification":"自动检查主题更新",
"settings.option.general.showLovedTracksInline":"行内显示喜爱曲目",
"settings.description.search":"搜索",
"settings.description.albums":"资料库专辑",
"settings.description.artists":"资料库艺人",
"settings.description.browse":"浏览",
"settings.description.private":"隐身聆听",
"settings.description.remote":"远程控制",
"settings.description.audio":"音频设定",
"settings.description.plugins":"插件目录",
"settings.description.cast":"投射到装置",
"settings.description.settings":"设置",
"settings.description.developer":"开发者",
"settings.description.listnow":"现在就听",
"settings.description.recentAdd":"最近加入",
"settings.description.songs":"歌曲",
"settings.notyf.updateCider.update-not-available": "没有可用的更新",
"settings.notyf.updateCider.update-downloaded": "更新已成功下载,重启后进行更新",
"settings.notyf.updateCider.update-timeout": "更新超时",
"settings.header.audio": "音频",
"settings.header.audio.description": "调整 Cider 的音频设置",
"settings.option.audio.advanced":"高级功能",
"settings.option.audio.changePlaybackRate":"修改播放速度",
"settings.option.audio.playbackRate":"播放速度",
"settings.option.audio.playbackRate.change":"播放速度已修改",
"settings.option.audio.quality": "音质",
"settings.header.audio.quality.hireslossless": "高解析度无损",
"settings.header.audio.quality.hireslossless.description": "(最高 24 位/192 kHz)",
"settings.header.audio.quality.lossless": "无损",
"settings.header.audio.quality.lossless.description": "(最高 24 位/48 kHz)",
"settings.header.audio.quality.high": "高音质",
"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.enableAdvancedFunctionality": "高级音频功能",
"settings.option.audio.enableAdvancedFunctionality.description": "打开 AudioContext 将启用类似音量平衡和等化器的高级设置。但这并不一定适合每部电脑,可能会发生音乐卡顿。",
"settings.warn.audio.enableAdvancedFunctionality.lowcores":"您的电脑可能无法处理这些功能, 您确定要继续?",
"settings.option.audio.audioLab": "Cider 音频实验室",
"settings.option.audio.audioLab.description": "包含由 Cider 开发团队进行的各种音频优化功能。",
"settings.option.audio.audioLab.subheader":"Designed by Cider Acoustic Technologies in California",
"settings.warn.audioLab.withoutAF": "使用 Cider 音频实验室需要打开进阶音频功能才可使用。",
"settings.warn.enableAdvancedFunctionality":"此功能需要开启高级音频功能才可使用。",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "模拟温暖",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "以 Korg Nutube 6P1 为蓝本的模拟温暖。",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "模拟温暖强度",
@ -279,13 +397,18 @@
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "宇治抹茶奶茶",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "春毫茉莉玛琪雅朵",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "北海道奶茶",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "月光软饼干",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500": "月光软饼干",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM":"布蕾黑糖鲜奶",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE":"温暖抱抱",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 数码增强音频处理™️",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "通过人类的听力心理学模型和 AAC 编码特色的即时算法,强化 AAC 音频的感知音频质量。",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "数码增强音频处理设置",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "将更改音频处理的激进/振奋程度(增强选项有可能会引起杂讯)。",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "标准",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive":"自适应",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy":"传统",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "增强",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility":"数码增强音频处理与空间音频不兼容,请先停用空间音频。",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音量平衡",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "自动将歌曲播放音量调整到相同水平,享受更舒适的聆听体验。",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "此功能由音频实验室管理",
@ -294,11 +417,19 @@
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider 音频空间配置档",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "变更音频空间的配置档,需重新启动应用程序。",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "标准",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage":"声场",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation":"分离感",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal":"微调",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "发烧友",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "音频空间无法与 CAP 相容,请关闭 CAP 在进行操作。",
"settings.option.audio.dbspl.display":"显示 dB SPL(声压)",
"settings.option.audio.dbspl.description":"(专业用户选项) 音量滑动条显示 dB SPL 而非 dBFS.",
"settings.option.audio.dbfs.calibration":"0 dBFS 校正",
"settings.option.audio.dbfs.description":"Enter the peak Z-weighted dB SPL when Cider is at 0 dBFS.",
"settings.option.visual.uiscale": "UI界面大小",
"settings.header.visual": "外观",
"settings.header.visual.description": "调整 Cider 的外观",
"settings.option.visual.windowStyle":"窗口风格",
"settings.option.visual.windowBackgroundStyle": "窗口背景样式",
"settings.header.visual.windowBackgroundStyle.none": "无",
"settings.header.visual.windowBackgroundStyle.artwork": "专辑插图",
@ -320,8 +451,18 @@
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
"settings.header.visual.theme": "主题",
"settings.option.visual.theme.github.download": "从 GitHub 链接安装",
"settings.option.visual.theme.github.openfolder":"开启主题文件夹",
"settings.option.visual.theme.github.explore": "浏览 GitHub 上的主题",
"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.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.error": "主题安装失败",
"settings.header.visual.plugin": "插件",
@ -358,8 +499,11 @@
"settings.option.connectivity.discordRPC.clientName": "应用程序名称",
"settings.option.connectivity.discordRPC.clearOnPause": "暂停时清除 Discord 动态",
"settings.option.connectivity.discordRPC.hideButtons": "隐藏 Discord 动态上的按钮",
"settings.option.connectivity.discordRPC.hideTimestamp":"隐藏 Discord 动态上的时间戳",
"settings.option.connectivity.discordRPC.detailsFormat": "详细信息格式",
"settings.option.connectivity.discordRPC.stateFormat": "动态格式",
"settings.option.connectivity.discordRPC.reload":"重新加载 DiscordRPC",
"settings.option.connectivity.discordRPC.reconnectedToUser":"DiscordRPC 重新连接至用户: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.FM 音乐记录",
"settings.option.connectivity.lastfmScrobble.delay": "Last.FM 歌曲追踪延迟 (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "打开 Last.FM 正在聆听",
@ -382,6 +526,9 @@
"settings.option.visual.transparent": "透明窗口框架",
"settings.option.visual.transparent.description": "需主题有支持透明框架,且须重新启动才会生效。",
"settings.header.advanced": "高级",
"settings.header.connect":"同步",
"settings.option.connect.link_account":"开启 Cider Connect 同步",
"settings.option.connect.link_account.description":"将您的 Discord 帐户与 Cider Connect 关联后,您可以储存用户资料,包括设定、均衡器,并在后续版本中加入更多可同步选项。(正在更新中)",
"spatial.notTurnedOn": "请在设置中开启空间音频。",
"spatial.spatialProperties": "空间属性",
"spatial.width": "宽度",
@ -404,5 +551,54 @@
"settings.header.unfinished": "未完成",
"remote.web.title": "Cider 远程控制",
"remote.web.description": "扫描以下的二维码以控制 Cider",
"about.thanks": "郑重感谢 Cider Collective 以及为这个项目提供支持的贡献者。"
"about.thanks": "郑重感谢 Cider Collective 以及为这个项目提供支持的贡献者。",
"share.platform.twitter.tweet":"在 Apple Music 上聆听 {{song}}。 \n\n{{url}}\n\n#AppleMusic #Cider",
"share.platform.twitter":"Twitter",
"share.platform.facebook":"Facebook",
"share.platform.reddit":"Reddit",
"share.platform.telegram":"Telegram",
"share.platform.whatsapp":"WhatsApp",
"share.platform.messenger":"Messenger",
"share.platform.email":"电子邮件",
"share.platform.songLink":"复制 song.link 链接",
"share.platform.clipboard":"复制到剪贴板",
"oobe.yes":"好的",
"oobe.no":"不",
"oobe.next":"下一步",
"oobe.previous":"上一步",
"oobe.done":"完成",
"oobe.amupsell.title":"在我们开始之前",
"oobe.amupsell.text":"使用 Cider 需要付费的 Apple Music 订阅。\nCider 不能在 Apple Music Voice 计划或某些促销试用订阅状态下使用。 如果您已经订阅 Apple Music请点击下一步继续。",
"oobe.amupsell.subscribeBtn":"订阅 Apple Music",
"oobe.amupsell.explainBtn":"这是什么?",
"oobe.amupsell.subscribeUrl":"https://apple.co/3MdqJVQ",
"oobe.amupsell.amWebUrl":"https://beta.music.apple.com/",
"oobe.amupsell.promoExplained":"Cider 无法获取部分促销活动与非美区 Apple Muisc 试用状态下的网络播放器API. 要验证您的试用订阅是否能够在Cider内使用, 点击<a href='{{ amWebUrl }}'>{{ amWebUrl }}</a>, 登陆后尝试播放音乐。如果能够播放,您就可以使用 Cider 了!否则请考虑订阅 Apple Music 服务: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>。",
"oobe.intro.title":"欢迎使用 Cider",
"oobe.intro.subtitle":"",
"oobe.intro.text":"为了按您喜欢的方式使用 Cider ,请先完成一些设置。您之后可以随时改变这些设置。",
"oobe.general.title":"通用设置",
"oobe.general.subtitle":"",
"oobe.general.text":"",
"oobe.audio.title":"音频设置",
"oobe.audio.subtitle":"",
"oobe.audio.text":"Cider 能够自定义调整和设置的音频属性提供丰富的高品质音频体验包括Cider Adrenaline Processor气氛实现器和空间音频。要启用这些功能必须启用 \"高级音频功能\"。",
"oobe.audio.advancedFunctionality":"",
"oobe.visual.title":"外观设置",
"oobe.visual.subtitle":"",
"oobe.visual.text":"",
"oobe.visual.layout.text":"Cider 拥有两种不同的窗口布局。Maverick 是一个类似 iTunes 的布局播放器在窗口的顶部。Mojave 是由 Cider 团队设计的一种新的布局。您可以在设置中随时改变布局。",
"oobe.visual.suggestingThemes":"主题能够个性化您的播放器。以下是推荐的几个主题:",
"oobe.visual.suggestingThemes.subtext":"(主题会从 GitHub 上下载)",
"oobe.visual.suggestingThemes.default":"Cider",
"oobe.visual.suggestingThemes.default.text":"传统的 Cider 主题。",
"oobe.visual.suggestingThemes.dark":"Dark",
"oobe.visual.suggestingThemes.dark.text":"暗黑模式。",
"oobe.visual.suggestingThemes.community1":"Groovy",
"oobe.visual.suggestingThemes.community1.text":"类 WinUI 主题。",
"oobe.visual.suggestingThemes.community2":"iTheme",
"oobe.visual.suggestingThemes.community2.text":"基于 MacOS Monterey 的 Apple Music bata 主题。",
"oobe.visual.suggestingThemes.community3":"Dracula",
"oobe.visual.suggestingThemes.community3.text":"著名的德古拉吸血鬼主题。",
"oobe.amsignin.title": ""
}

View file

@ -53,6 +53,7 @@ export class BrowserWindow {
dev: app.isPackaged,
osRelease: os.release(),
updatable: !process.windowsStore || !process.mas,
useV3: utils.getStoreValue('advanced.experiments').includes("ampv3"),
components: [
"pages/podcasts",
"pages/apple-account-settings",
@ -848,6 +849,7 @@ export class BrowserWindow {
})
ipcMain.handle("get-github-plugin", async (event, url) => {
await this.StopWatcher()
const returnVal = {
success: true,
theme: null,
@ -892,9 +894,11 @@ export class BrowserWindow {
returnVal.success = false;
}
BrowserWindow.win.webContents.send("plugin-installed", returnVal);
this.StartWatcher(utils.getPath('themes'));
});
ipcMain.handle("get-github-theme", async (event, url) => {
await this.StopWatcher()
const returnVal = {
success: true,
theme: null,
@ -939,6 +943,8 @@ export class BrowserWindow {
returnVal.success = false;
}
BrowserWindow.win.webContents.send("theme-installed", returnVal);
this.StartWatcher(utils.getPath('themes'));
BrowserWindow.win.webContents.send("theme-update", "")
});
ipcMain.on("get-themes", (event, _key) => {

View file

@ -400,15 +400,15 @@
.listitem-content {
width: 100%;
height: 60px;
display: flex;
flex: 0 0 auto;
flex-direction: row;
font-size: 14px;
justify-content: center-between;
align-items: center;
border-radius: var(--mediaItemRadius);
position: relative;
height: 60px;
display: flex;
flex: 0 0 auto;
flex-direction: row;
font-size: 14px;
justify-content: center-between;
align-items: center;
border-radius: var(--mediaItemRadius);
position: relative;
}
&:hover {
@ -444,6 +444,7 @@
.mediaitem-artwork {
border-radius: var(--mediaItemRadiusSmall);
}
.overlay-play {
background: rgba(0, 0, 0, 0.5);
opacity: 0;
@ -957,6 +958,7 @@
/* mediaitem-square */
.cd-mediaitem-square {
--transitionDuration: .25s;
--scaleRate: 1.25;
--scaleRateArtwork: 1;
width: 200px;
@ -968,6 +970,7 @@
justify-content: center;
align-items: center;
border-radius: 6px;
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
.artwork-container {
position: relative;
@ -982,6 +985,7 @@
flex: 0 0 auto;
margin: 6px;
cursor: pointer;
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
.mediaitem-artwork {
box-shadow: unset;
@ -1055,16 +1059,33 @@
}
}
@media (min-width: 1600px) {
width: calc(200px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
&:not(.mediaitem-card):not(.mediaitem-brick):not(.mediaitem-video):not(.noscale) {
@media (min-width: 1460px) {
--scaleRate: 1.1;
--scaleRateArtwork: 0.9;
width: calc(200px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(190px * var(--scaleRateArtwork));
height: calc(190px * var(--scaleRateArtwork));
.artwork-container > .artwork {
width: calc(190px * var(--scaleRateArtwork));
height: calc(190px * var(--scaleRateArtwork));
}
}
@media (min-width: 1550px) {
--scaleRate: 1.25;
--scaleRateArtwork: 1;
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 {
width: 90%;
height: 100%;
@ -1112,8 +1133,6 @@
}
&.mediaitem-video {
--scaleRate: 1.25;
--scaleRateArtwork: 1.25;
height: 200px;
width: 240px;
@ -1122,13 +1141,29 @@
width: 212px;
}
@media (min-width: 1600px) {
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(212px * var(--scaleRateArtwork));
height: calc(120px * var(--scaleRateArtwork));
&:not(.noscale) {
@media (min-width: 1460px) {
--scaleRate: 1.1;
--scaleRateArtwork: 1.1;
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(220px * var(--scaleRateArtwork));
height: calc(123px * var(--scaleRateArtwork));
}
}
@media (min-width: 1550px) {
--scaleRate: 1.25;
--scaleRateArtwork: 1.25;
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(220px * var(--scaleRateArtwork));
height: calc(123px * var(--scaleRateArtwork));
}
}
}
}
@ -1141,6 +1176,32 @@
height: 123px;
width: 220px;
}
&:not(.noscale) {
@media (min-width: 1460px) {
--scaleRate: 1.1;
--scaleRateArtwork: 1.1;
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(220px * var(--scaleRateArtwork));
height: calc(123px * var(--scaleRateArtwork));
}
}
@media (min-width: 1550px) {
--scaleRate: 1.25;
--scaleRateArtwork: 1.25;
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(220px * var(--scaleRateArtwork));
height: calc(123px * var(--scaleRateArtwork));
}
}
}
}
&.mediaitem-small {
@ -1169,7 +1230,7 @@
overflow: hidden;
border-radius: 0px;
margin: 0;
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear, filter 0.2s ease-in-out;
.mediaitem-artwork {
border-radius: 0px;
@ -1183,6 +1244,8 @@
padding: 10px 10px 14px;
position: relative;
width: 100%;
display: grid;
align-content: center;
&::before {
background: var(--bgartwork);
@ -1197,6 +1260,7 @@
z-index: 0;
opacity: 1;
filter: brightness(0.5) blur(50px) saturate(180%);
transition: filter 0.2s ease-in-out;
}
}
@ -1211,7 +1275,7 @@
& + .subtitle {
max-height: none !important;
margin-top: -0.5em;
// margin-top: -0.5em;
}
}
@ -1241,14 +1305,34 @@
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);
// }
//}
&:hover {
.artwork{
filter: brightness(0.8);
}
.info-rect-card::before {
filter: brightness(0.3) blur(50px) saturate(180%);
}
}
&:not(.noscale) {
@media (min-width: 1460px) {
width: calc(230px * 1.1);
height: calc(298px * 1.1);
.artwork-container > .artwork {
width: calc(230px * 1.1);
height: calc(230px * 1.1);
}
}
@media (min-width: 1550px) {
width: calc(230px * 1.25);
height: calc(298px * 1.25);
.artwork-container > .artwork {
width: calc(230px * 1.25);
height: calc(230px * 1.25);
}
}
}
}
}

View file

@ -153,22 +153,8 @@
}
.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;
.menu-panel.menu-header-text.close-btn
&:hover {
background-color: rgb(196, 43, 28)
}
}
}
}
@ -191,22 +177,7 @@
}
.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;
&:hover {
background-color: rgb(196, 43, 28)
}
.menu-panel.menu-header-text.close-btn
}
}
@ -371,23 +342,31 @@
}
}
.menu-header-text {
margin: 18px 6px;
.close-btn {
width : 50px;
height : 42px;
background-image : var(--gfx-closeBtn);
width: 36px;
height: 36px;
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;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
appearance: none;
border: 0;
background-color: transparent;
position: absolute;
top: 10px;
right: 10px;
border-radius: 50px;
display: grid;
align-content: center;
&:before {
content: "";
font-family: "codicon";
color: var(--textColor);
font-size: 20px;
}
&:hover {
background-color: rgb(196, 43, 28)
@ -505,7 +484,8 @@
.popover-artwork {
width: 200px;
height: 200px;
margin: 0 0 20px 0;
margin: 0 auto;
margin-bottom: 20px;
}
.song-name {

View file

@ -3,4 +3,57 @@ body[platform="linux"] {
#window-controls-container {
//display: none;
}
.window-controls {
justify-content: flex-end;
align-items : center;
padding-right : 6px;
>div {
--iconSize: 16px;
&.close,
&.minmax,
&.minimize,
&.minmax.restore {
background-image: unset!important;
position : relative;
display : grid;
align-content : center;
text-align : center;
height : 36px!important;
width : 36px!important;
border-radius : 50px;
transition: background-color .1s ease-in-out;
&:hover {
background: rgb(200 200 200 / 10%)!important;
}
}
&.close::before {
font-family: "codicon";
font-size : var(--iconSize);
content : "";
}
&.minmax::before {
font-family: "codicon";
font-size : var(--iconSize);
content : "";
}
&.minimize::before {
font-family: "codicon";
font-size : var(--iconSize);
content : "";
}
&.restore::before {
font-family: "codicon";
font-size : var(--iconSize);
content : "";
}
}
}
}

View file

@ -634,7 +634,7 @@
opacity : .7;
animation : playlistArtworkFadeIn 1s var(--appleEase);
.artworkMaterial>img {
.artworkMaterial img {
filter : brightness(100%) blur(80px) saturate(100%) contrast(1);
object-position: center;
object-fit : cover;
@ -962,6 +962,10 @@
right : 28px;
}
&.animated .artist-header {
min-height: 500px;
}
.artist-header {
//background: linear-gradient(45deg, var(--keyColor), #0e0e0e);
color : white;
@ -977,6 +981,19 @@
// margin-top: -16px;
}
.artist-hero {
height:100%;
position: absolute;
top:0;
left:0;
right:0;
bottom:0;
.mediaitem-artwork {
border-radius: 0px;
}
}
.artworkContainer {
position : absolute;
@ -990,7 +1007,7 @@
opacity : .7;
animation : playlistArtworkFadeIn 1s var(--appleEase);
.artworkMaterial>img {
.artworkMaterial img {
filter : brightness(100%) blur(80px) saturate(100%) contrast(1);
object-position: center;
object-fit : cover;
@ -1013,6 +1030,7 @@
position : absolute;
overflow : hidden;
box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset;
z-index: 1;
video {
overflow : hidden;

View file

@ -926,6 +926,15 @@ const app = new Vue({
}
})
this.mk.addEventListener(MusicKit.Events.timedMetadataDidChange, (e) => {
app.mk.nowPlayingItem.attributes.name = e.title
app.mk.nowPlayingItem.attributes.artistName = e.performer
app.mk.nowPlayingItem.attributes.albumName = e.album
app.currentArtUrl = e.links[0].url
app.mk.nowPlayingItem._songId = e._adamId ? e._adamId : -1
app.mk.nowPlayingItem.id = e._adamId ? e._adamId : -1
})
this.mk.addEventListener(MusicKit.Events.nowPlayingItemDidChange, (a) => {
if (self.$refs.queue) {
self.$refs.queue.updateQueue();
@ -1176,9 +1185,20 @@ const app = new Vue({
},
getAppClasses() {
let classes = {}
if (this.cfg.advanced.experiments.includes('compactui')) {
classes.compact = true
switch (this.getThemeDirective('forceUI') ?? "none") {
case "compact":
classes.compact = true;
break;
case "standard":
classes.compact = false;
break;
default:
if (this.cfg.advanced.experiments.includes('compactui')) {
classes.compact = true;
}
break;
}
if (this.cfg.visual.window_background_style == "none") {
classes.simplebg = true
}
@ -1986,14 +2006,21 @@ const app = new Vue({
},
async getNowPlayingItemDetailed(target) {
let nowPlayingItem = JSON.parse(JSON.stringify(this.mk.nowPlayingItem))
if(nowPlayingItem.type === "radioStation" && app.mk.nowPlayingItem.id !== -1) {
nowPlayingItem.playParams = {kind: "songs"}
nowPlayingItem.attributes.playParams.catalogId = app.mk.nowPlayingItem.id
nowPlayingItem.attributes.playParams.id = app.mk.nowPlayingItem.id
nowPlayingItem.id = app.mk.nowPlayingItem.id
}
try {
let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind,
(app.mk.nowPlayingItem.songId == -1),
(app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"],
let u = await app.mkapi(nowPlayingItem.playParams.kind,
(nowPlayingItem.songId == -1),
(nowPlayingItem.songId != -1) ? nowPlayingItem.songId : nowPlayingItem["id"],
{ "include[songs]": "albums,artists", l: app.mklang });
app.searchAndNavigate(u.data.data[0], target)
} catch (e) {
app.searchAndNavigate(app.mk.nowPlayingItem, target)
app.searchAndNavigate(nowPlayingItem, target)
}
},
async searchAndNavigate(item, target) {
@ -4316,7 +4343,15 @@ const app = new Vue({
this.showMenuPanel(menus[useMenu], event)
try {
let result = await this.inLibrary([this.mk.nowPlayingItem])
// if its a radio station, then change the attributes to match a song
const nowPlayingItem = JSON.parse(JSON.stringify(this.mk.nowPlayingItem))
if(nowPlayingItem.type == "radioStation" && app.mk.nowPlayingItem.id != -1) {
nowPlayingItem.type = "song"
nowPlayingItem.attributes.playParams.catalogId = app.mk.nowPlayingItem.id
nowPlayingItem.attributes.playParams.id = app.mk.nowPlayingItem.id
nowPlayingItem.id = app.mk.nowPlayingItem.id
}
let result = await this.inLibrary([nowPlayingItem])
if (result[0].attributes.inLibrary) {
menus.normal.items.find(x => x.id == 'addToLibrary').hidden = true
menus.normal.items.find(x => x.id == 'removeFromLibrary').hidden = false

View file

@ -1,9 +1,8 @@
@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+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+TC: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+KR: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+SC:wght@100;300;400;500;700;900&display=swap");
@import url("less/appvars.less");
@import url("less/bootstrap-vue.min.less");
@import url("less/ameframework.less");
@ -69,7 +68,7 @@ body {
background-size: cover;
background-position: center;
background: #0000;
font-family: "Pretendard Variable", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
font-family: "Pretendard Variable", "Noto Sans JP", "Noto Sans KR", "Noto Sans TC", "Noto Sans SC", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
transition: opacity .10s var(--appleEase);
}
@ -311,19 +310,19 @@ a.dropdown-item {
overflow: hidden;
pointer-events: none;
> img {
img {
position: absolute;
width: 200%;
opacity: 0.5;
filter: brightness(200%) blur(180px) saturate(280%) contrast(2);
}
> img:first-child {
img:first-child {
top: 0;
left: 0;
}
> img:last-child {
img:last-child {
bottom: 0;
right: 0;
transform: rotate(180deg);
@ -1163,52 +1162,47 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
&-macos {
width: 100px;
}
}
.app-chrome .app-chrome-item > .window-controls > div {
height: 100%;
width: 32px;
}
.app-chrome .app-chrome-item > .window-controls > div:hover {
background: rgb(200 200 200 / 10%);
}
.app-chrome .app-chrome-item > .window-controls > div.close {
width: 100%;
height: 100%;
background-image: var(--gfx-closeBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
&:hover {
background-color: rgb(196, 43, 28)
> div {
height: 100%;
width: 32px;
&:hover {
background: rgb(200 200 200 / 10%);
}
&.close {
width: 100%;
height: 100%;
background-image: var(--gfx-closeBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
&:hover {
background-color: rgb(196, 43, 28)
}
}
&.minmax {
background-image: var(--gfx-maxBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
width: 100%;
height: 100%;
}
&.minmax.restore {
background-image: var(--gfx-restoreBtn);
}
&.minimize {
background-image: var(--gfx-minBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
width: 100%;
height: 100%;
}
}
}
.app-chrome .app-chrome-item > .window-controls > div.minmax {
background-image: var(--gfx-maxBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
width: 100%;
height: 100%;
}
.app-chrome .app-chrome-item > .window-controls > div.minmax.restore {
background-image: var(--gfx-restoreBtn);
}
.app-chrome .app-chrome-item > .window-controls > div.minimize {
background-image: var(--gfx-minBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
width: 100%;
height: 100%;
}
body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minimize {
display: none;
}
@ -1452,10 +1446,13 @@ div[data-type="musicVideo"] .info-rect .title::before {
background-position: center;
background-size: contain;
background-repeat: no-repeat;
border-radius: 4px;
border-radius: var(--mediaItemRadiusSmall);
flex: 0 0 auto;
margin: 6px;
image-rendering: -webkit-optimize-contrast;
.mediaitem-artwork {
border-radius: var(--mediaItemRadiusSmall);
}
}
.app-chrome .app-chrome-item > .app-playback-controls .actions {
@ -1656,7 +1653,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
overflow-x: hidden;
display: flex;
flex-flow: column;
font-family: "Pretendard Variable", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
font-family: "Pretendard Variable", "Noto Sans JP", "Noto Sans KR", "Noto Sans TC", "Noto Sans SC", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
}
.lyric-body .no-lyrics {
@ -1761,7 +1758,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.lyrics-translation {
font-size: 1.6rem;
font-weight: 450;
font-family: "Pretendard Variable", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
font-family: "Pretendard Variable", "Noto Sans JP", "Noto Sans KR", "Noto Sans TC", "Noto Sans SC", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
filter: contrast(0.5);
}
@ -3475,22 +3472,7 @@ body.no-gpu {
}
.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;
&:hover {
background-color: rgb(196, 43, 28)
}
.menu-panel.menu-header-text.close-btn
}
}

View file

@ -57,10 +57,6 @@
.cd-mediaitem-square:not(.mediaitem-card) {
transition : transform .2s var(--appleEase);
transition-delay: .1s;
padding : 12px;
// background-color: red;
height: 220px;
.artwork-container {}
@ -73,9 +69,16 @@
transition-delay: .05s;
}
.artwork-container {
transform : scale(0.962) translateZ(0);
transition : transform .1s var(--appleEase);
transition-delay: 0s;
transform-origin: center;
}
&:hover {
.artwork-container {
transform : scale(1.1);
transform : scale(1.0);
transition : transform .1s var(--appleEase);
transition-delay: 0s;
transform-origin: center;

View file

@ -10,10 +10,10 @@
<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>
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="popover-artwork">
<mediaitem-artwork :size="210" :url="currentArtUrlRaw"></mediaitem-artwork>
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="song-name">{{ mk.nowPlayingItem["attributes"]["name"] }}</div>
<div class="song-artist" @click="getNowPlayingItemDetailed(`artist`)">{{ mk.nowPlayingItem["attributes"]["artistName"] }}</div>
@ -60,6 +60,19 @@
</div>
</template>
<template v-else>
<div class="app-playback-controls">
<div class="artwork" id="artworkLCD" style="pointer-events: none;">
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="playback-info">
<div class="song-name">
</div>
</div>
</div>
</template>
</div>
</div>

View file

@ -89,10 +89,10 @@
<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>
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="popover-artwork">
<mediaitem-artwork :size="210" :url="currentArtUrlRaw"></mediaitem-artwork>
<mediaitem-artwork :size="210" :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="song-name">
{{ mk.nowPlayingItem["attributes"]["name"] }}
@ -183,6 +183,18 @@
</template>
</div>
</template>
<template v-else>
<div class="app-playback-controls">
<div class="artwork" id="artworkLCD" style="pointer-events: none;">
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="playback-info">
<div class="info-rect">
</div>
</div>
</div>
</template>
</div>
<div class="app-chrome-item" v-else>
<div class="top-nav-group">

View file

@ -1,7 +1,9 @@
<script type="text/x-template" id="artist-chip">
<div class="artist-chip" @click.self="route" tabindex="0">
<div class="artist-chip__image">
<mediaitem-artwork v-if="artist.id != null" :url="artist.attributes.artwork.url" :size="32"></mediaitem-artwork>
<div class="artist-chip__image" v-if="image" :style="{backgroundColor: '#' + (artist.attributes.artwork?.bgColor ?? '000')}">
<mediaitem-artwork v-if="artist.id != null" :url="artist.attributes.artwork.url" :size="80"></mediaitem-artwork>
</div>
<div class="artist-chip__image" v-else>
</div>
<div class="artist-chip__name">
<span>{{ item.attributes.name }}</span>
@ -21,6 +23,7 @@
},
data: function() {
return {
image: false,
artist: {
id: null
}
@ -34,6 +37,7 @@
}
app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/artists/${artistId}`).then(response => {
this.artist = response.data.data[0];
this.image = true;
});
},
methods: {

View file

@ -1,6 +1,6 @@
<script type="text/x-template" id="artwork-material">
<div class="artworkMaterial">
<img :src="src" v-for="image in images"/>
<mediaitem-artwork :url="src" :size="500" v-for="image in images"/>
</div>
</script>

View file

@ -14,7 +14,9 @@
<div class="artwork" @click="app.fullscreen(false)">
<mediaitem-artwork
:size="600"
:url="(image ?? '').replace('{w}','600').replace('{h}','600') "
:video="video"
:videoPriority="true"
:url="(image ?? '').replace('{w}','600').replace('{h}','600')"
></mediaitem-artwork>
</div>
<div class="controls-parents">
@ -149,6 +151,37 @@
return {
app: this.$root,
tabMode: "lyrics",
video: null
}
},
async mounted() {
if (app.mk.nowPlayingItem._container.type == "albums") {
try {
const result = (await app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/${app.mk.nowPlayingItem._container.type}/${app.mk.nowPlayingItem._container.id}`, {
"fields": "editorialArtwork,editorialVideo",
})).data.data[0].attributes?.editorialVideo?.motionDetailSquare?.video
if (result) {
this.video = result
} else {
this.video = null
}
} catch (e) {
this.video = null
e = null
}
} else if (app.mk.nowPlayingItem._container.type == "library-albums") {
try {
const result = (await app.mk.api.v3.music(`/v1/me/library/albums/${app.mk.nowPlayingItem._container.id}/catalog`
, { "fields": "editorialArtwork,editorialVideo" })).data.data[0].attributes?.editorialVideo?.motionDetailSquare?.video
if (result) {
this.video = result
} else {
this.video = null
}
} catch (e) {
e = null
this.video = null
}
}
},
beforeMount() {

View file

@ -87,6 +87,11 @@
default: false,
required: false
},
noScale: {
type: Boolean,
default: false,
required: false
},
'contextExt': { type: Object, required: false },
},
data: function () {
@ -251,6 +256,10 @@
},
getClasses() {
let type = []
let classes = []
if(this.noScale) {
classes.push("noscale")
}
try {
type = this.item.type
@ -263,25 +272,26 @@
}
switch (type) {
default:
return []
break;
case "editorial-elements":
case "card":
return ["mediaitem-card"]
classes.push("mediaitem-card")
break;
case "385": // editorial
return ["mediaitem-brick"]
classes.push("mediaitem-brick")
break;
case "small":
return ["mediaitem-small"]
classes.push("mediaitem-small")
break;
case "music-videos":
case "uploadedVideo":
case "uploaded-videos":
case "library-music-videos":
return "mediaitem-video";
classes.push("mediaitem-video")
break;
}
return classes
},
visibilityChanged: function (isVisible, entry) {
this.isVisible = isVisible

View file

@ -71,7 +71,7 @@
<div id="LOADER">
<%- include("../assets/cider-round.svg") %>
</div>
<div id="app" :class="getAppClasses()" :style="getAppStyle()" :window-style="cfg.visual.directives.windowLayout">
<div id="app" :class="getAppClasses()" :style="getAppStyle()" :library-visbile="(chrome.sidebarCollapsed ? 0 : 1)" :window-style="cfg.visual.directives.windowLayout">
<transition name="fsModeSwitch">
<div id="app-main" v-show="appMode == 'player'">
<%- include('app/chrome-top'); %>
@ -105,7 +105,8 @@
<% } %>
<script async src="https://js-cdn.music.apple.com/musickit/v3/amp/musickit.js" data-web-components></script>
<script async src="<%- (env.useV3 ? "https://js-cdn.music.apple.com/musickit/v3/amp/musickit.js" : "https://js-cdn.music.apple.com/musickit/v2/amp/musickit.js" ) %>" data-web-components>
</script>
<script src="index.js?v=1"></script>
<script type="text/x-template" id="am-musiccovershelf">

View file

@ -4,7 +4,7 @@
<div class="artist-header" :key="data.id" v-observe-visibility="{callback: isHeaderVisible}">
<animatedartwork-view
:priority="true"
v-if="data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9)"
v-if="hasAnimated()"
:video="data.attributes.editorialVideo.motionArtistWide16x9.video ?? (data.attributes.editorialVideo.motionArtistFullscreen16x9.video ?? '')">
</animatedartwork-view>
<div class="header-content" style="pointer-events: all;">
@ -41,9 +41,12 @@
<div class="svg-icon"></div>
</button>
</div>
<div class="artworkContainer"
<div class="artworkContainer"
v-if="!(data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9))">
<artwork-material :url="data.attributes.artwork.url" size="190" images="1"></artwork-material>
<artwork-material :url="data.attributes.artwork.url" size="190" images="1"></artwork-material>
</div>
<div class="artist-hero" v-if="hasHero() && !hasAnimated()">
<mediaitem-artwork shadow="none" :url="hasHero()" size="2048" />
</div>
</div>
<div class="floating-header"
@ -69,7 +72,7 @@
<div class="latestRelease" v-if="data.views['latest-release'].data.length != 0">
<h3>{{app.getLz('term.latestReleases')}}</h3>
<div style="width: auto;margin: 0 auto;">
<mediaitem-square kind="card" v-for="song in data.views['latest-release'].data"
<mediaitem-square kind="card" :no-scale="true" v-for="song in data.views['latest-release'].data"
:item="song">
</mediaitem-square>
</div>
@ -164,6 +167,20 @@
}
},
methods: {
hasAnimated() {
if(this.data.attributes?.editorialVideo && (this.data.attributes?.editorialVideo?.motionArtistWide16x9 || this.data.attributes?.editorialVideo?.motionArtistFullscreen16x9)) {
return true;
}
return false;
},
hasHero() {
if(this.data.attributes?.editorialArtwork?.bannerUber) {
return this.data.attributes?.editorialArtwork?.bannerUber.url
}else if(this.data.attributes?.editorialArtwork?.subscriptionHero){
return this.data.attributes?.editorialArtwork?.subscriptionHero.url
}
return false;
},
isHeaderVisible(visible) {
this.headerVisible = visible
},

View file

@ -121,7 +121,7 @@
</div>
</div>
<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="500" images="1"></artwork-material>
</div>
<button class="md-btn md-btn-small editTracksBtn" v-if="(data.attributes.canEdit && data.type == 'library-playlists')" @click="editing = !editing">
<span v-if="!editing">

View file

@ -28,7 +28,7 @@
<h4>{{ loaded.attributes.uniqueSongCount }} {{$root.getLz('term.uniqueSongs')}}</h4>
</div>
<div class="col-auto replay-playlist-container">
<mediaitem-square kind="card" :force-video="true" :item="loaded.playlist"></mediaitem-square>
<mediaitem-square kind="card" :no-scale="true" :force-video="true" :item="loaded.playlist"></mediaitem-square>
</div>
</div>
<!-- Top Artists-->

View file

@ -1154,6 +1154,20 @@
</div>
</div>
<div class="md-option-line">
<div class="md-option-segment">
Use MusicKit V3
<small>Requires relaunch</small>
</div>
<div class="md-option-segment md-option-segment_auto">
<label>
<input type="checkbox" v-model="app.cfg.advanced.experiments.includes('ampv3')"
@click="app.cfg.advanced.experiments.includes('ampv3') ? removeExperiment('ampv3') : addExperiment('ampv3')"
switch/>
</label>
</div>
</div>
<div class="md-option-line">
<div class="md-option-segment">
{{$root.getLz('settings.option.advanced.playlistTrackMapping')}}
@ -1170,12 +1184,13 @@
<div class="md-option-line">
<div class="md-option-segment">
{{$root.getLz('settings.option.experimental.compactUI')}}
<small v-if="!!app.getThemeDirective('forceUI')">{{$root.getLz('term.themeManaged')}}</small>
</div>
<div class="md-option-segment md-option-segment_auto">
<label>
<input type="checkbox" v-model="app.cfg.advanced.experiments.includes('compactui')"
@click="app.cfg.advanced.experiments.includes('compactui') ? removeExperiment('compactui') : addExperiment('compactui')"
switch/>
switch :disabled="!!app.getThemeDirective('forceUI')"/>
</label>
</div>
</div>

View file

@ -9,6 +9,20 @@
v-if="artistLoaded"
:item="artist"
></artist-chip>
<amp-chrome-player/>
<!-- <amp-footer-player/> -->
<hr>
<amp-lcd-progress/>
<hr>
<amp-playback-controls-shuffle/>
<apple-music-playback-controls theme="dark" />
<apple-music-progress theme="dark"></apple-music-progress>
<apple-music-volume theme="dark"></apple-music-volume>
<amp-user-menu/>
<amp-tv-overlay/>
<amp-podcast-playback-controls/>
<amp-lcd/>
</div>
</script>
<script>