Merge branch 'ciderapp:main' into main

This commit is contained in:
UnbreakCode 2022-06-23 00:26:02 +02:00 committed by GitHub
commit 1ac7ab6b86
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
43 changed files with 1854 additions and 1313 deletions

View file

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

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

93
resources/icons/icon.svg Normal file
View file

@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg316"
width="1000"
height="1000"
viewBox="0 0 1000 1000"
sodipodi:docname="atreus.svg"
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
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="defs320">
<inkscape:path-effect
effect="bspline"
id="path-effect21501"
is_visible="true"
lpeversion="1"
weight="33.333333"
steps="2"
helper_size="0"
apply_no_weight="true"
apply_with_weight="true"
only_selected="false" />
<inkscape:path-effect
effect="spiro"
id="path-effect21497"
is_visible="true"
lpeversion="1" />
<inkscape:path-effect
effect="spiro"
id="path-effect21277"
is_visible="true"
lpeversion="1" />
<inkscape:path-effect
effect="spiro"
id="path-effect21273"
is_visible="true"
lpeversion="1" />
</defs>
<sodipodi:namedview
id="namedview318"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="true"
inkscape:zoom="1"
inkscape:cx="471.5"
inkscape:cy="396.5"
inkscape:window-width="1920"
inkscape:window-height="1044"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g322" />
<g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g322">
<path
style="display:inline;opacity:1;fill:#ff2654;fill-opacity:1;fill-rule:nonzero;stroke-width:0.7;stroke-dasharray:none"
d="M 43.442873,500 C 44.729355,381.57807 94.612705,264.40544 179.08104,181.39635 263.54937,98.387264 381.57364,50.553165 500,51.331533 617.43261,52.10337 733.85918,100.6317 817.07592,183.49296 900.29266,266.35423 949.31889,382.57178 950.59458,500 951.88811,619.07066 904.01174,737.93437 820.54876,822.86626 737.08578,907.79814 619.07511,957.74081 500,958.52344 379.93115,959.3126 260.30587,910.07147 175.5853,824.98577 90.86473,739.90007 42.138548,620.06436 43.442873,500 Z"
id="path21271"
inkscape:path-effect="#path-effect21273"
inkscape:original-d="M 43.442873,500 C -108.74384,347.15785 347.81529,200.88869 500,51.331533 652.18471,-98.225623 800.39739,350.44484 950.59458,500 1100.7918,649.55516 650.19919,805.68329 500,958.52344 349.80081,1111.3636 195.62958,652.84215 43.442873,500 Z" />
<path
style="display:inline;opacity:1;fill:#161616;fill-opacity:1;fill-rule:nonzero;stroke-width:7;stroke-dasharray:none"
d="M 810.53125,500 C 809.3521,419.22061 775.44998,339.38827 718.14176,282.4456 660.83353,225.50293 580.78531,192.11226 500,191.45312 418.36315,190.78703 336.94829,223.58389 278.56844,280.65237 220.18858,337.72085 185.55094,418.36913 184.35937,500 183.14556,583.1542 216.70905,666.27439 275.32351,725.26964 333.93798,784.2649 416.83971,818.36602 500,817.6875 582.30875,817.01593 663.82438,782.31258 721.36031,723.45004 778.89624,664.5875 811.73263,582.30273 810.53125,500 Z"
id="path21495"
inkscape:path-effect="#path-effect21497"
inkscape:original-d="M 810.53125,500 C 914.04066,394.10317 603.51142,294.30308 500,191.45312 396.48858,88.603166 289.57392,397.15204 184.35937,500 79.144833,602.84796 394.78746,711.79267 500,817.6875 605.21254,923.58233 707.02183,605.89683 810.53125,500 Z" />
<path
style="display:inline;opacity:1;fill:#ff2654;fill-opacity:1;fill-rule:nonzero;stroke-width:7;stroke-dasharray:none"
d="M 759.34429,500 C 758.19835,432.60151 729.83099,366.05221 681.99531,318.55888 634.15963,271.06554 567.40514,243.17636 500,242.53125 431.75952,241.87814 363.66577,269.1855 314.77936,316.80177 265.89296,364.41804 236.80347,431.76626 235.64333,500 234.45795,569.71803 262.50003,639.47618 311.6155,688.97042 360.73098,738.46466 430.27509,767.04231 500,766.375 568.88957,765.71568 637.07217,736.5466 685.12903,687.18319 733.18589,637.81977 760.51546,568.88277 759.34429,500 Z"
id="path21275"
inkscape:path-effect="#path-effect21277"
inkscape:original-d="M 759.34429,500 C 845.79139,411.20733 586.4491,328.35517 500,242.53125 413.5509,156.70733 323.76322,414.17808 235.64333,500 147.52345,585.82192 411.88211,677.58433 500,766.375 588.11789,855.16566 672.8972,588.79267 759.34429,500 Z" />
<path
style="display:inline;opacity:1;fill:#161616;fill-opacity:1;fill-rule:nonzero;stroke-width:7;stroke-dasharray:none"
d="m 425.88442,448.01182 c -0.0883,28.34345 0.0296,84.32273 0.31267,112.73951 0.2831,28.41677 0.73019,29.26962 1.17791,30.12367 0,0 1.625,2.25 1.625,2.25 0,0 2.0625,1 2.0625,1 0,0 6.1875,0.625 6.1875,0.625 48.08333,-27.91667 96.16698,-55.83352 120.646,-70.22927 24.47902,-14.39575 25.354,-15.27073 25.9164,-16.08294 0.56241,-0.81221 0.8124,-1.56219 0.91669,-2.43698 0.10429,-0.87479 0.0626,-1.87477 -0.16633,-2.89553 -0.22895,-1.02076 -0.64561,-2.0624 -1.16617,-2.87503 -0.52057,-0.81263 -1.14556,-1.39595 -1.66634,-1.83354 -0.52079,-0.43759 -0.93744,-0.72924 -24.80769,-14.62209 -23.87026,-13.89285 -71.19225,-41.38567 -95.50189,-55.36818 -24.30965,-13.98252 -25.60599,-14.45391 -26.90262,-14.51314 -1.29664,-0.0592 -2.59298,0.29431 -3.74228,0.82467 -1.1493,0.53036 -2.15101,1.23745 -2.82884,1.85636 -0.67782,0.61891 -1.03137,1.14923 -1.35549,1.76809 -0.32412,0.61886 -0.61874,1.32595 -0.70702,29.6694 z"
id="path21499"
inkscape:path-effect="#path-effect21501"
inkscape:original-d="m 425.67828,420.37498 c 0.11885,55.98029 0.2367,111.95957 0.35355,167.93786 0.44873,0.85507 1.34317,2.56216 1.34317,2.56216 0,0 1.625,2.25 1.625,2.25 0,0 2.0625,1 2.0625,1 0,0 6.1875,0.625 6.1875,0.625 0,0 96.16767,-55.83233 144.25,-83.75 0.87602,-0.87402 1.751,-1.749 2.625,-2.625 0.251,-0.74902 0.501,-1.499 0.75,-2.25 -0.0407,-0.99902 -0.0823,-1.999 -0.125,-3 -0.41568,-1.04069 -0.83233,-2.08233 -1.25,-3.125 -0.62401,-0.58235 -1.249,-1.16567 -1.875,-1.75 -0.41568,-0.29067 -0.83233,-0.58233 -1.25,-0.875 -47.32288,-27.49292 -94.64487,-54.98573 -141.9688,-82.4801 -1.29539,-0.47041 -2.59172,-0.94181 -3.88908,-1.41421 -1.29539,0.35456 -2.59173,0.70811 -3.88909,1.06066 -1.00076,0.70812 -2.00247,1.41521 -3.00521,2.12132 -0.35256,0.53134 -0.7061,1.06166 -1.06066,1.59099 -0.29363,0.70812 -0.58825,1.41521 -0.88388,2.12132 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.5 KiB

View file

@ -444,7 +444,56 @@ Update 03/06/2022 11:40 UTC
* `settings.option.connectivity.discordRPC.reload`: Added to `en_US` * `settings.option.connectivity.discordRPC.reload`: Added to `en_US`
* `settings.option.connectivity.discordRPC.reconnectedToUser`: Added to `en_US` * `settings.option.connectivity.discordRPC.reconnectedToUser`: Added to `en_US`
Update 04/06/2022 03:00 UTC
* `term.cast`: Added to `en_US`
* `term.playpause`: Added to `en_US`
* `term.reload`: Added to `en_US`
* `term.toggleprivate`: Added to `en_US`
* `term.webremote`: Added to `en_US`
* `term.cast2`: Added to `en_US`
* `term.quit`: Added to `en_US`
* `menubar.options.zoom`: Added to `en_US`
* `term.zoomin`: Added to `en_US`
* `term.zoomout`: Added to `en_US`
* `term.zoomreset`: Added to `en_US`
* `term.fullscreen`: Added to `en_US`
* `settings.option.general.keybindings.library`: Added to `en_US`
* `settings.option.general.keybindings.session`: Added to `en_US`
* `settings.option.general.keybindings.control`: Added to `en_US`
* `settings.option.general.keybindings.interface`: Added to `en_US`
* `settings.option.general.keybindings.advanced`: Added to `en_US`
* `action.tray.quit`: Deleted for all language files
* `action.tray.playpause`: Deleted for all language files
* `action.tray.next`: Deleted for all language files
* `action.tray.previous`: Deleted for all language files
* `menubar.options.about`: Deleted for all language files
* `menubar.options.settings`: Deleted for all language files
* `menubar.options.quit`: Deleted for all language files
* `menubar.options.toggleprivate`: Deleted for all language files
* `menubar.options.webremote`: Deleted for all language files
* `menubar.options.audio`: Deleted for all language files
* `menubar.options.next`: Deleted for all language files
* `menubar.options.previous`: Deleted for all language files
* `menubar.options.browse`: Deleted for all language files
* `menubar.options.artists`: Deleted for all language files
* `menubar.options.search`: Deleted for all language files
* `menubar.options.albums`: Deleted for all language files
* `menubar.options.cast`: Deleted for all language files
* `menubar.options.accountsettings`: Deleted for all language files
* `menubar.options.discord`: Deleted for all language files
* `menubar.options.github`: Deleted for all language files,
* `menubar.options.listennow`: Deleted for all language files
* `menubar.options.recentlyAdded`: Deleted for all language files
* `menubar.options.songs`: Deleted for all language files
* `settings.option.general.keybindings.open`: Deleted for all language files
* `menubar.options.playpause`: Deleted for all language files
Update 10/06/2022 20:00 UTC Update 10/06/2022 20:00 UTC
* `settings.option.visual.purplePodcastPlaybackBar`: Added to `en_US` * `settings.option.visual.purplePodcastPlaybackBar`: Added to `en_US`
Update 14/06/2022 14:10 UTC
* `term.themeManaged`: Added to `en_US`

View file

@ -2,7 +2,7 @@
"i18n.languageName": "English (UK)", "i18n.languageName": "English (UK)",
"i18n.languageNameEnglish": "English (UK)", "i18n.languageNameEnglish": "English (UK)",
"i18n.category": "main", "i18n.category": "main",
"i18n.authors": "Core, inalone, nosh118", "i18n.authors": "Core, inalone, nosh118, booploops",
"date.format": "${d} ${m}, ${y}", "date.format": "${d} ${m}, ${y}",
"term.equalizer": "Equaliser", "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.", "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": { "term.track": {
"one" : "song", "one" : "song",
"other" : "songs" "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

@ -22,7 +22,6 @@
"term.logout": "Logout", "term.logout": "Logout",
"term.login": "Log In", "term.login": "Log In",
"term.quickNav": "Quick Nav", "term.quickNav": "Quick Nav",
"term.cast": "Cast",
"term.about": "About", "term.about": "About",
"term.privateSession": "Private Session", "term.privateSession": "Private Session",
"term.disablePrivateSession": "Disable Private Session", "term.disablePrivateSession": "Disable Private Session",
@ -52,6 +51,7 @@
"term.navigateBack": "Navigate back", "term.navigateBack": "Navigate back",
"term.navigateForward": "Navigate forward", "term.navigateForward": "Navigate forward",
"term.play": "Play", "term.play": "Play",
"term.playpause": "Play/Pause",
"term.pause": "Pause", "term.pause": "Pause",
"term.stop": "Stop", "term.stop": "Stop",
"term.previous": "Previous", "term.previous": "Previous",
@ -134,6 +134,7 @@
"term.recentStations": "Recent Stations", "term.recentStations": "Recent Stations",
"term.personalStations": "Personal Stations", "term.personalStations": "Personal Stations",
"term.amLive": "Apple Music Live", "term.amLive": "Apple Music Live",
"term.live": "LIVE",
"term.language": "Language", "term.language": "Language",
"term.funLanguages": "Fun", "term.funLanguages": "Fun",
"term.noLyrics": "Loading... / Lyrics not found./ Instrumental.", "term.noLyrics": "Loading... / Lyrics not found./ Instrumental.",
@ -154,6 +155,7 @@
}, },
"term.videos": "Videos", "term.videos": "Videos",
"term.menu": "Menu", "term.menu": "Menu",
"term.themeManaged": "Managed by a theme",
"term.check": "Check", "term.check": "Check",
"term.aboutArtist": "About {{artistName}}", "term.aboutArtist": "About {{artistName}}",
"term.topResult": "Top Result", "term.topResult": "Top Result",
@ -193,6 +195,16 @@
"term.confirmLogout": "Are you sure you want to logout?", "term.confirmLogout": "Are you sure you want to logout?",
"term.creditDesignedBy": "Designed by ${authorUsername}", "term.creditDesignedBy": "Designed by ${authorUsername}",
"term.discNumber": "Disc ${discNumber}", "term.discNumber": "Disc ${discNumber}",
"term.reload" : "Reload Cider ?",
"term.toggleprivate" : "Toggle Private Session",
"term.webremote" : "Web Remote",
"term.cast" : "Cast",
"term.cast2" : "Cast to Devices",
"term.quit" : "Quit",
"term.zoomin" : "Zoom In",
"term.zoomout" : "Zoom Out",
"term.zoomreset" : "Reset Zoom",
"term.fullscreen" : "Fullscreen",
"home.syncFavorites": "Sync Favorites", "home.syncFavorites": "Sync Favorites",
"home.syncFavorites.gettingArtists": "Getting Favorited Artists...", "home.syncFavorites.gettingArtists": "Getting Favorited Artists...",
"home.title": "Home", "home.title": "Home",
@ -269,11 +281,7 @@
"action.export": "Export", "action.export": "Export",
"action.showAlbum": "Show Complete Album", "action.showAlbum": "Show Complete Album",
"action.tray.minimize": "Minimize to Tray", "action.tray.minimize": "Minimize to Tray",
"action.tray.quit": "Quit",
"action.tray.show": "Show Cider", "action.tray.show": "Show Cider",
"action.tray.playpause": "Play/Pause",
"action.tray.next": "Next",
"action.tray.previous": "Previous",
"action.tray.listento": "Listen To:", "action.tray.listento": "Listen To:",
"action.update": "Update", "action.update": "Update",
"action.install": "Install", "action.install": "Install",
@ -293,45 +301,27 @@
"action.createNew": "Create New...", "action.createNew": "Create New...",
"action.openArtworkInBrowser": "Open artwork in browser", "action.openArtworkInBrowser": "Open artwork in browser",
"action.scrollToTop": "Scroll to top", "action.scrollToTop": "Scroll to top",
"menubar.options.about": "About", "action.refresh": "Refresh",
"menubar.options.settings": "Settings",
"menubar.options.quit": "Quit Cider",
"menubar.options.view": "View", "menubar.options.view": "View",
"menubar.options.reload": "Reload", "menubar.options.reload": "Reload",
"menubar.options.forcereload": "Force Reload", "menubar.options.forcereload": "Force Reload",
"menubar.options.toggledevtools": "Toggle Developer Tools", "menubar.options.toggledevtools": "Toggle Developer Tools",
"menubar.options.window": "Window", "menubar.options.window": "Window",
"menubar.options.minimize": "Minimize", "menubar.options.minimize": "Minimize",
"menubar.options.toggleprivate": "Toggle Private Session",
"menubar.options.webremote": "Web Remote",
"menubar.options.audio": "Audio Settings",
"menubar.options.plugins": "Plu-gins Menu", "menubar.options.plugins": "Plu-gins Menu",
"menubar.options.controls": "Controls", "menubar.options.controls": "Controls",
"menubar.options.next": "Next",
"menubar.options.playpause": "Play/Pause",
"menubar.options.previous": "Previous",
"menubar.options.volumeup": "Volume Up", "menubar.options.volumeup": "Volume Up",
"menubar.options.volumedown": "Volume Down", "menubar.options.volumedown": "Volume Down",
"menubar.options.browse": "Browse",
"menubar.options.artists": "Artists",
"menubar.options.search": "Search",
"menubar.options.albums": "Albums",
"menubar.options.cast": "Cast To Devices",
"menubar.options.account": "Account", "menubar.options.account": "Account",
"menubar.options.accountsettings": "Account Settings",
"menubar.options.signout": "Sign Out", "menubar.options.signout": "Sign Out",
"menubar.options.support": "Support", "menubar.options.support": "Support",
"menubar.options.discord": "Discord",
"menubar.options.github": "GitHub Wiki",
"menubar.options.report": "Report a...", "menubar.options.report": "Report a...",
"menubar.options.bug": "Bug", "menubar.options.bug": "Bug",
"menubar.options.feature": "Feature Request", "menubar.options.feature": "Feature Request",
"menubar.options.trans": "Translation Report/Request", "menubar.options.trans": "Translation Report/Request",
"menubar.options.license": "View License", "menubar.options.license": "View License",
"menubar.options.conf": "Open Configuration File in Editor", "menubar.options.conf": "Open Configuration File in Editor",
"menubar.options.listennow": "Listen Now", "menubar.options.zoom": "Zoom",
"menubar.options.recentlyAdded": "Recently Added",
"menubar.options.songs": "Songs",
"settings.header.general": "General", "settings.header.general": "General",
"settings.header.general.description": "Adjust the general settings for Cider.", "settings.header.general.description": "Adjust the general settings for Cider.",
"settings.option.general.language": "Language", "settings.option.general.language": "Language",
@ -351,11 +341,15 @@
"settings.option.general.customizeSidebar": "Customize Sidebar Items", "settings.option.general.customizeSidebar": "Customize Sidebar Items",
"settings.option.general.customizeSidebar.customize": "Customize", "settings.option.general.customizeSidebar.customize": "Customize",
"settings.option.general.keybindings": "Keybindings", "settings.option.general.keybindings": "Keybindings",
"settings.option.general.keybindings.library": "Library",
"settings.option.general.keybindings.session": "Session",
"settings.option.general.keybindings.control": "Controls",
"settings.option.general.keybindings.interface": "Interface",
"settings.option.general.keybindings.advanced": "Advanced",
"settings.option.general.keybindings.pressCombination": "Press a combination of two keys to update keybind.", "settings.option.general.keybindings.pressCombination": "Press a combination of two keys to update keybind.",
"settings.option.general.keybindings.pressEscape": "Press Escape key to go back.", "settings.option.general.keybindings.pressEscape": "Press Escape key to go back.",
"settings.notyf.general.keybindings.update.success": "Keybind updated successfully", "settings.notyf.general.keybindings.update.success": "Keybind updated successfully",
"settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider", "settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider",
"settings.option.general.keybindings.open": "Open",
"settings.option.general.themeUpdateNotification": "Automatically check for theme updates", "settings.option.general.themeUpdateNotification": "Automatically check for theme updates",
"settings.option.general.showLovedTracksInline": "Show loved tracks inline", "settings.option.general.showLovedTracksInline": "Show loved tracks inline",
"settings.description.search": "Search", "settings.description.search": "Search",

View file

@ -22,7 +22,6 @@
"term.logout": "Cerrar Sesión", "term.logout": "Cerrar Sesión",
"term.login": "Iniciar Sesión", "term.login": "Iniciar Sesión",
"term.quickNav": "Navegación rápida", "term.quickNav": "Navegación rápida",
"term.cast": "Transmitir",
"term.about": "Acerca de", "term.about": "Acerca de",
"term.privateSession": "Sesión Privada", "term.privateSession": "Sesión Privada",
"term.disablePrivateSession": "Deshabilitar Sesión Privada", "term.disablePrivateSession": "Deshabilitar Sesión Privada",
@ -42,6 +41,7 @@
"term.artists": "Artistas", "term.artists": "Artistas",
"term.podcasts": "Podcasts", "term.podcasts": "Podcasts",
"term.playlists": "Listas de Reproducción", "term.playlists": "Listas de Reproducción",
"term.charts": "Charts",
"term.playlist": "Lista de Reproducción", "term.playlist": "Lista de Reproducción",
"term.newPlaylist": "Nueva Lista de Reproducción", "term.newPlaylist": "Nueva Lista de Reproducción",
"term.newPlaylistFolder": "Nueva Carpeta de Listas de Reproducción", "term.newPlaylistFolder": "Nueva Carpeta de Listas de Reproducción",
@ -51,7 +51,9 @@
"term.navigateBack": "Navegar Hacia Atrás", "term.navigateBack": "Navegar Hacia Atrás",
"term.navigateForward": "Navegar Hacia Adelante", "term.navigateForward": "Navegar Hacia Adelante",
"term.play": "Reproducir", "term.play": "Reproducir",
"term.playpause": "Reproducir/Pausar",
"term.pause": "Pausar", "term.pause": "Pausar",
"term.stop": "Detener",
"term.previous": "Anterior", "term.previous": "Anterior",
"term.next": "Siguiente", "term.next": "Siguiente",
"term.shuffle": "Aleatorio", "term.shuffle": "Aleatorio",
@ -124,12 +126,15 @@
"one": "Segundo", "one": "Segundo",
"other": "Segundos" "other": "Segundos"
}, },
"term.fullscreenView": "Vista de Pantalla Completa", "term.fullscreenView": "Pantalla Completa",
"term.defaultView": "Vista Predeterminada", "term.defaultView": "Vista Predeterminada",
"term.audioSettings": "Configuración de Audio", "term.audioSettings": "Configuración de Audio",
"term.audioControls": "Configuración volumen", "term.audioControls": "Configuración volumen",
"term.clearAll": "Borrar todo", "term.clearAll": "Borrar todo",
"term.recentStations": "Estaciones Recientes", "term.recentStations": "Estaciones Recientes",
"term.personalStations": "Estaciones Personales",
"term.amLive": "Apple Music Live",
"term.live": "LIVE",
"term.language": "Idioma", "term.language": "Idioma",
"term.funLanguages": "Idiomas Fun (Parodias)", "term.funLanguages": "Idiomas Fun (Parodias)",
"term.noLyrics": "Cargando... / Letras no encontradas./ Instrumental.", "term.noLyrics": "Cargando... / Letras no encontradas./ Instrumental.",
@ -150,6 +155,7 @@
}, },
"term.videos": "Videos", "term.videos": "Videos",
"term.menu": "Menú", "term.menu": "Menú",
"term.themeManaged": "Administrado por un tema",
"term.check": "Comprobar", "term.check": "Comprobar",
"term.aboutArtist": "Acerca de {{artistName}}", "term.aboutArtist": "Acerca de {{artistName}}",
"term.topResult": "Mejor Resultado", "term.topResult": "Mejor Resultado",
@ -189,6 +195,18 @@
"term.confirmLogout": "¿Estás seguro de que quieres cerrar sesión?", "term.confirmLogout": "¿Estás seguro de que quieres cerrar sesión?",
"term.creditDesignedBy": "Diseñado por ${authorUsername}", "term.creditDesignedBy": "Diseñado por ${authorUsername}",
"term.discNumber": "Disco ${discNumber}", "term.discNumber": "Disco ${discNumber}",
"term.reload" : "¿ Recargar Cider ?",
"term.toggleprivate" : "Cambiar sesión privada",
"term.webremote" : "Web Remoto",
"term.cast" : "Transmitir",
"term.cast2" : "Transmitir a los dispositivos",
"term.quit" : "Salir",
"term.zoomin" : "Acercar",
"term.zoomout" : "Alejar",
"term.zoomreset" : "Restablecer",
"term.fullscreen" : "Pantalla Completa",
"home.syncFavorites": "Sincronizar Favoritos",
"home.syncFavorites.gettingArtists": "Consiguiendo Artistas Favoritos...",
"home.title": "Principal", "home.title": "Principal",
"home.recentlyPlayed": "Escuchado Recientemente", "home.recentlyPlayed": "Escuchado Recientemente",
"home.recentlyAdded": "Agregado Recientemente", "home.recentlyAdded": "Agregado Recientemente",
@ -209,9 +227,17 @@
"podcast.episodes": "Episodios", "podcast.episodes": "Episodios",
"podcast.playEpisode": "Reproducir Episodio", "podcast.playEpisode": "Reproducir Episodio",
"podcast.website": "Sitio web de Podcasts", "podcast.website": "Sitio web de Podcasts",
"action.favorite": "Favorito",
"action.removeFavorite": "Eliminar Favorito",
"action.hideLibrary": "Ocultar biblioteca",
"action.showLibrary": "Mostrar biblioteca",
"action.cut": "Cortar",
"action.paste": "Pegar",
"action.selectAll": "Seleccionar Todo",
"action.delete": "Borrar",
"action.edit": "Editar", "action.edit": "Editar",
"action.done": "Hecho", "action.done": "Hecho",
"action.editTracklist": "Edit Tracklist", "action.editTracklist": "Editar Lista de Canciones",
"action.addToLibrary": "Agregar a la Biblioteca", "action.addToLibrary": "Agregar a la Biblioteca",
"action.addToLibrary.success": "Agregado a la Biblioteca", "action.addToLibrary.success": "Agregado a la Biblioteca",
"action.addToLibrary.error": "Error al agregar a la Biblioteca", "action.addToLibrary.error": "Error al agregar a la Biblioteca",
@ -255,8 +281,8 @@
"action.export": "Exportar", "action.export": "Exportar",
"action.showAlbum": "Mostrar Álbum Completo", "action.showAlbum": "Mostrar Álbum Completo",
"action.tray.minimize": "Minimizar a la bandeja", "action.tray.minimize": "Minimizar a la bandeja",
"action.tray.quit": "Salir",
"action.tray.show": "Mostrar Cider", "action.tray.show": "Mostrar Cider",
"action.tray.listento": "Escuchando a:",
"action.update": "Actualizar", "action.update": "Actualizar",
"action.install": "Instalar", "action.install": "Instalar",
"action.copy": "Copiar", "action.copy": "Copiar",
@ -275,45 +301,26 @@
"action.createNew": "Crear Nuevo...", "action.createNew": "Crear Nuevo...",
"action.openArtworkInBrowser": "Abrir Ilustración en el navegador", "action.openArtworkInBrowser": "Abrir Ilustración en el navegador",
"action.scrollToTop": "Ir al inicio", "action.scrollToTop": "Ir al inicio",
"menubar.options.about": "Acerca de",
"menubar.options.settings": "Ajustes",
"menubar.options.quit": "Salir",
"menubar.options.view": "Ver", "menubar.options.view": "Ver",
"menubar.options.reload": "Recargar", "menubar.options.reload": "Recargar",
"menubar.options.forcereload": "Forzar Recarga", "menubar.options.forcereload": "Forzar Recarga",
"menubar.options.toggledevtools": "Herramientas de Desarrollo", "menubar.options.toggledevtools": "Herramientas de Desarrollo",
"menubar.options.window": "Ventana", "menubar.options.window": "Ventana",
"menubar.options.minimize": "Minimizar", "menubar.options.minimize": "Minimizar",
"menubar.options.toggleprivate": "Cambiar Sesión Privada", "menubar.options.plugins": "Menú de Plug-ins",
"menubar.options.webremote": "Web Remoto",
"menubar.options.audio": "Configuraciones de Audio",
"menubar.options.plugins": "Menu de Plu-gins",
"menubar.options.controls": "Controles", "menubar.options.controls": "Controles",
"menubar.options.next": "Siguiente",
"menubar.options.playpause": "Reproducir/Pausar",
"menubar.options.previous": "Anterior",
"menubar.options.volumeup": "Subir Volumen", "menubar.options.volumeup": "Subir Volumen",
"menubar.options.volumedown": "Bajar Volumen", "menubar.options.volumedown": "Bajar Volumen",
"menubar.options.browse": "Explorar",
"menubar.options.artists": "Artistas",
"menubar.options.search": "Buscar",
"menubar.options.albums": "Álbumes",
"menubar.options.cast": "Transmitir a Dispositivos",
"menubar.options.account": "Cuenta", "menubar.options.account": "Cuenta",
"menubar.options.accountsettings": "Ajustes de Cuenta",
"menubar.options.signout": "Cerrar Sesión", "menubar.options.signout": "Cerrar Sesión",
"menubar.options.support": "Soporte", "menubar.options.support": "Soporte",
"menubar.options.discord": "Discord",
"menubar.options.github": "GitHub Wiki",
"menubar.options.report": "Reportar a...", "menubar.options.report": "Reportar a...",
"menubar.options.bug": "Bug", "menubar.options.bug": "Bug",
"menubar.options.feature": "Solicitud de características", "menubar.options.feature": "Solicitud de características",
"menubar.options.trans": "Solicitud de Informe/Traducción", "menubar.options.trans": "Solicitud de Informe/Traducción",
"menubar.options.license": "Ver licencia", "menubar.options.license": "Ver licencia",
"menubar.options.conf": "Abrir archivo de configuración en el editor", "menubar.options.conf": "Abrir archivo de configuración en el editor",
"menubar.options.listennow": "Escuchar Ahora", "menubar.options.zoom": "Zoom",
"menubar.options.recentlyAdded": "Agregadas Recientemente",
"menubar.options.songs": "Canciones",
"settings.header.general": "General", "settings.header.general": "General",
"settings.header.general.description": "Ajuste la configuración general de Cider.", "settings.header.general.description": "Ajuste la configuración general de Cider.",
"settings.option.general.language": "Idioma", "settings.option.general.language": "Idioma",
@ -333,11 +340,17 @@
"settings.option.general.customizeSidebar": "Personalizar elementos de la barra lateral", "settings.option.general.customizeSidebar": "Personalizar elementos de la barra lateral",
"settings.option.general.customizeSidebar.customize": "Personalizar", "settings.option.general.customizeSidebar.customize": "Personalizar",
"settings.option.general.keybindings": "Combinaciones de Teclas", "settings.option.general.keybindings": "Combinaciones de Teclas",
"settings.option.general.keybindings.library": "Biblioteca",
"settings.option.general.keybindings.session": "Sesión",
"settings.option.general.keybindings.control": "Controles",
"settings.option.general.keybindings.interface": "Interfaz",
"settings.option.general.keybindings.advanced": "Avanzado",
"settings.option.general.keybindings.pressCombination": "Presione una combinación de dos teclas para actualizar la combinación de teclas.", "settings.option.general.keybindings.pressCombination": "Presione una combinación de dos teclas para actualizar la combinación de teclas.",
"settings.option.general.keybindings.pressEscape": "Pulse la tecla Escape para volver.", "settings.option.general.keybindings.pressEscape": "Pulse la tecla Escape para volver.",
"settings.notyf.general.keybindings.update.success": "Combinación de teclas actualizada correctamente", "settings.notyf.general.keybindings.update.success": "Combinación de teclas actualizada correctamente",
"settings.prompt.general.keybindings.update.success": "La combinación de teclas se actualizó correctamente. Pulsa OK para reiniciar Cider", "settings.prompt.general.keybindings.update.success": "La combinación de teclas se actualizó correctamente. Pulsa OK para reiniciar Cider",
"settings.option.general.keybindings.open": "Abrir", "settings.option.general.themeUpdateNotification": "Buscar actualizaciones de temas automáticamente",
"settings.option.general.showLovedTracksInline": "Mostrar pistas favoritas en la línea",
"settings.description.search": "Buscar", "settings.description.search": "Buscar",
"settings.description.albums": "Álbumes de la biblioteca", "settings.description.albums": "Álbumes de la biblioteca",
"settings.description.artists": "Artistas de la biblioteca", "settings.description.artists": "Artistas de la biblioteca",
@ -356,8 +369,9 @@
"settings.notyf.updateCider.update-downloaded": "La actualización se ha descargado, Reinicie para aplicarla", "settings.notyf.updateCider.update-downloaded": "La actualización se ha descargado, Reinicie para aplicarla",
"settings.notyf.updateCider.update-timeout": "Tiempo de espera agotado para actualizar Cider", "settings.notyf.updateCider.update-timeout": "Tiempo de espera agotado para actualizar Cider",
"settings.header.audio": "Audio", "settings.header.audio": "Audio",
"settings.header.audio.description": "Ajuste la Configuración de Audio para Cider.", "settings.header.audio.description": "Ajuste la configuración de audio para Cider.",
"settings.option.audio.volumeStep": "Paso de Volumen", "settings.option.audio.volumeStep": "Pasos de Volumen",
"settings.option.audio.advanced": "Control de Volumen Avanzado",
"settings.option.audio.maxVolume": "Volumen Máximo", "settings.option.audio.maxVolume": "Volumen Máximo",
"settings.option.audio.changePlaybackRate": "Cambiar la Velocidad de Reproducción", "settings.option.audio.changePlaybackRate": "Cambiar la Velocidad de Reproducción",
"settings.option.audio.playbackRate": "Velocidad de Reproducción", "settings.option.audio.playbackRate": "Velocidad de Reproducción",
@ -390,38 +404,58 @@
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Realiza una Atmósfera musical diferente modelada a partir de las configuraciones de audio de última generación.", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Realiza una Atmósfera musical diferente modelada a partir de las configuraciones de audio de última generación.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™ Mode", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™ Mode",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Cambia el modo de funcionamiento del módulo Atmosphere Realizer.", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Cambia el modo de funcionamiento del módulo Atmosphere Realizer.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Natural (Estándar)", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Té De Espuma de Queso Hōjicha",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Natural (Plus)", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Té con Leche de Tapioca Genmaicha",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Té De Espuma De Queso Con Sal de Roca",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Té con Leche Uji Matcha",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jazmín Macchiato",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Té de leche de Hokkaido",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Pastel Suave de Luz de Luna",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis de Cerezas",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Leche Creme Brûlée de Azúcar Morena",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Abrazo de Calidez",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Mejora la calidad de audio percibida del audio AAC de 256 kbps mediante el uso de un algoritmo en tiempo real que aprovecha los modelos psicoacústicos de la audición humana y las características de codificación AAC.", "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Mejora la calidad de audio percibida del codificador de audio en AAC mediante el uso de un algoritmo en 'Tiempo Real' que aprovecha los modelos psicoacústicos de la audición humana y las características de codificación de AAC.",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP no es compatible con la Espacialización. Desactive la Espacialización para continuar.", "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP no es compatible con la Espacialización. Desactive la Espacialización para continuar.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Intensidad de CAP", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Fuerza de CAP",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Cambia la intensidad del procesamiento realizado en el audio. (Agresivo puede producir resultados no deseados)", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Cambia la intensidad del procesamiento realizado en el audio. (Agresivo puede producir resultados no deseados)",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Estándar", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Estándar",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptativo",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Legacy",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresivo", "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresivo",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalización de audio", "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalización de audio",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza el volumen máximo de pistas individuales para crear una experiencia auditiva más uniforme. (No funciona en las pistas cargadas por el usuario)", "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza el volumen máximo de las Canciones individuales para crear una experiencia auditiva más uniforme. (No funciona en las Canciones cargadas por el usuario)",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Gestionado por AudioLab", "settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Gestionado por AudioLab",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Espacialización Sintonizada de Cider", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Espacialización ajustada de Cider",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efecto de preajuste de espacialización, deshabilita la configuración personalizable de la espacialización de audio. La espacialización debe estar habilitada como requisito previo.", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efecto de Preajuste de espacialización, desactiva la configuración personalizable de espacialización de audio.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Perfil de espacialización de Cider", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Perfil de espacialización de Cider",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Cambia el Perfil de Ajuste de Espacialización.", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Cambia el Perfil de Ajuste de la Espacialización.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Estándar", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Estandar",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Estudio de Sonido", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Estudio de Sonido",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separación", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separación",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Mínimo", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Mínimo",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "La Espacialización no es compatible con CAP. Deshabilite CAP para continuar.", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiófilo",
"settings.option.audio.dbspl.display": "Visualización dB SPL", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Difuso",
"settings.option.audio.dbspl.description": "(Solo usuarios avanzados) Muestra 'dB SPL' en lugar de 'dBFS' en el control deslizante de volumen.", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "La espacialización no es compatible con CAP. Deshabilite CAP para continuar.",
"settings.option.audio.dbspl.display": "Visualización de dB SPL",
"settings.option.audio.dbspl.description": "(Solo para usuarios avanzados) Muestra dB SPL en lugar de dBFS en el control deslizante de Volumen.",
"settings.option.audio.dbfs.calibration": "Calibración de 0 dBFS", "settings.option.audio.dbfs.calibration": "Calibración de 0 dBFS",
"settings.option.audio.dbfs.description": "Ingrese el pico 'dB SPL con Ponderación-Z' cuando Cider esté en 0 dBFS.", "settings.option.audio.dbfs.description": "Ingrese el Pico de dB SPL con 'Ponderación Z' cuando Cider esté en 0 dBFS.",
"settings.header.visual": "Visual", "settings.header.visual": "Visual",
"settings.header.visual.description": "Ajuste la configuración visual de Cider.", "settings.header.visual.description": "Ajuste la configuración visual de Cider.",
"settings.option.visual.windowStyle": "Estilo de Ventana", "settings.option.visual.windowStyle": "Estilo de Ventana",
"settings.option.visual.customAccentColor": "Color de Acento Personalizado",
"settings.option.visual.accentColor": "Color de Acento",
"settings.option.visual.purplePodcastPlaybackBar": "Barra de Reproducción Púrpura para Podcasts",
"settings.option.visual.windowColor": "Color de Tinte de Ventana",
"settings.option.visual.windowBackgroundStyle": "Estilo de Fondo de Ventana", "settings.option.visual.windowBackgroundStyle": "Estilo de Fondo de Ventana",
"settings.header.visual.windowBackgroundStyle.none": "Ninguno", "settings.header.visual.windowBackgroundStyle.none": "Ninguno",
"settings.header.visual.windowBackgroundStyle.artwork": "ilustración", "settings.header.visual.windowBackgroundStyle.artwork": "ilustración",
"settings.header.visual.windowBackgroundStyle.image": "Imagen", "settings.header.visual.windowBackgroundStyle.image": "Imagen",
"settings.header.visual.windowBackgroundStyle.color": "Tinte de Color",
"settings.option.visual.animatedArtwork": "Ilustración Animada", "settings.option.visual.animatedArtwork": "Ilustración Animada",
"settings.header.visual.animatedArtwork.always": "Siempre", "settings.header.visual.animatedArtwork.always": "Siempre",
"settings.header.visual.animatedArtwork.limited": "Limitado a páginas y entradas especiales", "settings.header.visual.animatedArtwork.limited": "Limitado a páginas y entradas especiales",
@ -491,6 +525,8 @@
"settings.option.connectivity.discordRPC.hideTimestamp": "Ocultar Marca de Tiempo en Discord Rich Presence", "settings.option.connectivity.discordRPC.hideTimestamp": "Ocultar Marca de Tiempo en Discord Rich Presence",
"settings.option.connectivity.discordRPC.detailsFormat": "Formato de los detalles", "settings.option.connectivity.discordRPC.detailsFormat": "Formato de los detalles",
"settings.option.connectivity.discordRPC.stateFormat": "Formato de Estado", "settings.option.connectivity.discordRPC.stateFormat": "Formato de Estado",
"settings.option.connectivity.discordRPC.reload": "Recargar Discord RPC",
"settings.option.connectivity.discordRPC.reconnectedToUser": "Discord RPC reconectando al usuario: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling", "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm Retraso de Scrobble (%)", "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Retraso de Scrobble (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Activar Last.fm Now Playing", "settings.option.connectivity.lastfmScrobble.nowPlaying": "Activar Last.fm Now Playing",

View file

@ -154,6 +154,7 @@
}, },
"term.videos": "Videók", "term.videos": "Videók",
"term.menu": "Menü", "term.menu": "Menü",
"term.themeManaged": "Egy téma kezeli a beállítást",
"term.check": "Ellenőrzés", "term.check": "Ellenőrzés",
"term.aboutArtist": "{{artistName}}-ról/ről", "term.aboutArtist": "{{artistName}}-ról/ről",
"term.topResult": "Legjobb találatok", "term.topResult": "Legjobb találatok",
@ -250,7 +251,7 @@
"action.goToAlbum": "Album megjelenítése", "action.goToAlbum": "Album megjelenítése",
"action.showInPlaylist": "Lejátszási lista megjelenítése", "action.showInPlaylist": "Lejátszási lista megjelenítése",
"action.showInAppleMusic": "Megjelenítés az Apple Musicban", "action.showInAppleMusic": "Megjelenítés az Apple Musicban",
"action.moveToTop": "Mozgatás legfelülre", "action.moveToTop": "Kivétel a mappákból",
"action.share": "Megosztás", "action.share": "Megosztás",
"action.rename": "Átnevezés", "action.rename": "Átnevezés",
"action.love": "Szeretem", "action.love": "Szeretem",

View file

@ -22,7 +22,6 @@
"term.logout": "Terminar sessão", "term.logout": "Terminar sessão",
"term.login": "Iniciar sessão", "term.login": "Iniciar sessão",
"term.quickNav": "Navegação rápida", "term.quickNav": "Navegação rápida",
"term.cast": "Transmitir",
"term.about": "Sobre", "term.about": "Sobre",
"term.privateSession": "Sessão privada", "term.privateSession": "Sessão privada",
"term.disablePrivateSession": "Desativar sessão privada", "term.disablePrivateSession": "Desativar sessão privada",
@ -52,6 +51,7 @@
"term.navigateBack": "Retroceder uma página", "term.navigateBack": "Retroceder uma página",
"term.navigateForward": "Avançar uma página", "term.navigateForward": "Avançar uma página",
"term.play": "Reproduzir", "term.play": "Reproduzir",
"term.playpause": "Reproduzir/Pausa",
"term.pause": "Pausa", "term.pause": "Pausa",
"term.stop": "Parar", "term.stop": "Parar",
"term.previous": "Anterior", "term.previous": "Anterior",
@ -101,7 +101,7 @@
"term.less": "Menos", "term.less": "Menos",
"term.showMore": "Mostrar mais", "term.showMore": "Mostrar mais",
"term.showLess": "Mostrar menos", "term.showLess": "Mostrar menos",
"term.topSongs": "Músicas populares", "term.topSongs": "Top de músicas",
"term.latestReleases": "Últimos lançamentos", "term.latestReleases": "Últimos lançamentos",
"term.time.added": "Adicionado", "term.time.added": "Adicionado",
"term.time.released": "Lançado", "term.time.released": "Lançado",
@ -134,6 +134,7 @@
"term.recentStations": "Estações recentes", "term.recentStations": "Estações recentes",
"term.personalStations": "Estações pessoais", "term.personalStations": "Estações pessoais",
"term.amLive": "Apple Music Live", "term.amLive": "Apple Music Live",
"term.live": "AO VIVO",
"term.language": "Idioma", "term.language": "Idioma",
"term.funLanguages": "Divertido", "term.funLanguages": "Divertido",
"term.noLyrics": "A carregar... / Letra não encontrada. / Instrumental.", "term.noLyrics": "A carregar... / Letra não encontrada. / Instrumental.",
@ -154,6 +155,7 @@
}, },
"term.videos": "Vídeos", "term.videos": "Vídeos",
"term.menu": "Menu", "term.menu": "Menu",
"term.themeManaged": "Gerido por um tema",
"term.check": "Verificar", "term.check": "Verificar",
"term.aboutArtist": "Sobre {{artistName}}", "term.aboutArtist": "Sobre {{artistName}}",
"term.topResult": "Melhor resultado", "term.topResult": "Melhor resultado",
@ -184,15 +186,27 @@
"term.uniqueAlbums": "Álbuns únicos", "term.uniqueAlbums": "Álbuns únicos",
"term.uniqueArtists": "Intérpretes únicos", "term.uniqueArtists": "Intérpretes únicos",
"term.uniqueSongs": "Músicas únicas", "term.uniqueSongs": "Músicas únicas",
"term.topArtists": "Intérpretes populares", "term.topArtists": "Top de intérpretes",
"term.listenedTo": "Reproduzido:", "term.listenedTo": "Reproduzido:",
"term.times": "vezes", "term.times": "vezes",
"term.topAlbums": "Álbuns populares", "term.topAlbums": "Top de álbuns",
"term.plays": "Reproduções", "term.plays": "Reproduções",
"term.topGenres": "Géneros populares", "term.topGenres": "Top de géneros",
"term.confirmLogout": "Tem a certeza de que pretende terminar sessão?", "term.confirmLogout": "Tem a certeza de que pretende terminar sessão?",
"term.creditDesignedBy": "Concebido por ${authorUsername}", "term.creditDesignedBy": "Concebido por ${authorUsername}",
"term.discNumber": "Disco ${discNumber}", "term.discNumber": "Disco ${discNumber}",
"term.reload": "Reiniciar o Cider ?",
"term.toggleprivate": "Alternar sessão privada",
"term.webremote": "Web Remote",
"term.cast": "Transmitir",
"term.cast2": "Transmitir para dispositivos",
"term.quit": "Fechar",
"term.zoomin": "Aumentar o zoom",
"term.zoomout": "Diminuir o zoom",
"term.zoomreset": "Repor zoom",
"term.fullscreen": "Ecrã inteiro",
"home.syncFavorites": "Sincronizar favoritos",
"home.syncFavorites.gettingArtists": "A obter os artistas favoritos...",
"home.title": "Início", "home.title": "Início",
"home.recentlyPlayed": "Reproduzido recentemente", "home.recentlyPlayed": "Reproduzido recentemente",
"home.recentlyAdded": "Adicionado recentemente", "home.recentlyAdded": "Adicionado recentemente",
@ -213,6 +227,8 @@
"podcast.episodes": "Episódios", "podcast.episodes": "Episódios",
"podcast.playEpisode": "Reproduzir episódio", "podcast.playEpisode": "Reproduzir episódio",
"podcast.website": "Website do Podcast", "podcast.website": "Website do Podcast",
"action.favorite": "Adicionar favorito",
"action.removeFavorite": "Remover favorito",
"action.hideLibrary": "Ocultar biblioteca", "action.hideLibrary": "Ocultar biblioteca",
"action.showLibrary": "Mostrar biblioteca", "action.showLibrary": "Mostrar biblioteca",
"action.cut": "Cortar", "action.cut": "Cortar",
@ -265,11 +281,7 @@
"action.export": "Exportar", "action.export": "Exportar",
"action.showAlbum": "Mostrar álbum completo", "action.showAlbum": "Mostrar álbum completo",
"action.tray.minimize": "Minimizar para a bandeja", "action.tray.minimize": "Minimizar para a bandeja",
"action.tray.quit": "Fechar",
"action.tray.show": "Mostrar o Cider", "action.tray.show": "Mostrar o Cider",
"action.tray.playpause": "Reproduzir/Pausa",
"action.tray.next": "Seguinte",
"action.tray.previous": "Anterior",
"action.tray.listento": "Ouvir:", "action.tray.listento": "Ouvir:",
"action.update": "Atualizar", "action.update": "Atualizar",
"action.install": "Instalar", "action.install": "Instalar",
@ -289,45 +301,26 @@
"action.createNew": "Criar nova...", "action.createNew": "Criar nova...",
"action.openArtworkInBrowser": "Abrir grafismo no navegador", "action.openArtworkInBrowser": "Abrir grafismo no navegador",
"action.scrollToTop": "Voltar ao topo", "action.scrollToTop": "Voltar ao topo",
"menubar.options.about": "Sobre",
"menubar.options.settings": "Definições",
"menubar.options.quit": "Fechar o Cider",
"menubar.options.view": "Ver", "menubar.options.view": "Ver",
"menubar.options.reload": "Atualizar", "menubar.options.reload": "Atualizar",
"menubar.options.forcereload": "Forçar atualização", "menubar.options.forcereload": "Forçar atualização",
"menubar.options.toggledevtools": "Alternar ferramentas do programador", "menubar.options.toggledevtools": "Alternar ferramentas do programador",
"menubar.options.window": "Janela", "menubar.options.window": "Janela",
"menubar.options.minimize": "Minimizar", "menubar.options.minimize": "Minimizar",
"menubar.options.toggleprivate": "Alternar sessão privada",
"menubar.options.webremote": "Web Remote",
"menubar.options.audio": "Definições de áudio",
"menubar.options.plugins": "Menu de plug-ins", "menubar.options.plugins": "Menu de plug-ins",
"menubar.options.controls": "Controlos", "menubar.options.controls": "Controlos",
"menubar.options.next": "Seguinte",
"menubar.options.playpause": "Reproduzir/Pausa",
"menubar.options.previous": "Anterior",
"menubar.options.volumeup": "Aumentar o volume", "menubar.options.volumeup": "Aumentar o volume",
"menubar.options.volumedown": "Diminuir o volume", "menubar.options.volumedown": "Diminuir o volume",
"menubar.options.browse": "Explorar",
"menubar.options.artists": "Intérpretes",
"menubar.options.search": "Pesquisa",
"menubar.options.albums": "Álbuns",
"menubar.options.cast": "Transmitir para dispositivos",
"menubar.options.account": "Conta", "menubar.options.account": "Conta",
"menubar.options.accountsettings": "Definições da conta",
"menubar.options.signout": "Terminar sessão", "menubar.options.signout": "Terminar sessão",
"menubar.options.support": "Suporte", "menubar.options.support": "Suporte",
"menubar.options.discord": "Discord",
"menubar.options.github": "GitHub Wiki",
"menubar.options.report": "Reportar um...", "menubar.options.report": "Reportar um...",
"menubar.options.bug": "Problema", "menubar.options.bug": "Problema",
"menubar.options.feature": "Pedido de funcionalidade", "menubar.options.feature": "Pedido de funcionalidade",
"menubar.options.trans": "Pedido de tradução", "menubar.options.trans": "Pedido de tradução",
"menubar.options.license": "Ver licença", "menubar.options.license": "Ver licença",
"menubar.options.conf": "Abrir ficheiro de configuração no editor", "menubar.options.conf": "Abrir ficheiro de configuração no editor",
"menubar.options.listennow": "Ouvir agora", "menubar.options.zoom": "Zoom",
"menubar.options.recentlyAdded": "Adições recentes",
"menubar.options.songs": "Músicas",
"settings.header.general": "Geral", "settings.header.general": "Geral",
"settings.header.general.description": "Ajustar as definições gerais do Cider.", "settings.header.general.description": "Ajustar as definições gerais do Cider.",
"settings.option.general.language": "Idioma", "settings.option.general.language": "Idioma",
@ -347,11 +340,15 @@
"settings.option.general.customizeSidebar": "Personalizar os itens da barra lateral", "settings.option.general.customizeSidebar": "Personalizar os itens da barra lateral",
"settings.option.general.customizeSidebar.customize": "Personalizar", "settings.option.general.customizeSidebar.customize": "Personalizar",
"settings.option.general.keybindings": "Atalhos do teclado", "settings.option.general.keybindings": "Atalhos do teclado",
"settings.option.general.keybindings.library": "Biblioteca",
"settings.option.general.keybindings.session": "Sessão",
"settings.option.general.keybindings.control": "Controlos",
"settings.option.general.keybindings.interface": "Interface",
"settings.option.general.keybindings.advanced": "Avançado",
"settings.option.general.keybindings.pressCombination": "Prima uma combinação de duas teclas para atualizar o atalho.", "settings.option.general.keybindings.pressCombination": "Prima uma combinação de duas teclas para atualizar o atalho.",
"settings.option.general.keybindings.pressEscape": "Prima a tecla Escape para voltar atrás.", "settings.option.general.keybindings.pressEscape": "Prima a tecla Escape para voltar atrás.",
"settings.notyf.general.keybindings.update.success": "Atalho atualizado com sucesso", "settings.notyf.general.keybindings.update.success": "Atalho atualizado com sucesso",
"settings.prompt.general.keybindings.update.success": "Atalho atualizado com sucesso. Prima OK para reiniciar o Cider", "settings.prompt.general.keybindings.update.success": "Atalho atualizado com sucesso. Prima OK para reiniciar o Cider",
"settings.option.general.keybindings.open": "Abrir",
"settings.option.general.themeUpdateNotification": "Verificação automática de atualizações de temas", "settings.option.general.themeUpdateNotification": "Verificação automática de atualizações de temas",
"settings.option.general.showLovedTracksInline": "Mostrar músicas que gosta \"inline\"", "settings.option.general.showLovedTracksInline": "Mostrar músicas que gosta \"inline\"",
"settings.description.search": "Pesquisa", "settings.description.search": "Pesquisa",
@ -413,7 +410,9 @@
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Uji Matcha Milk Tea", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Uji Matcha Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jasmine Macchiato", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jasmine Macchiato",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Milk Tea", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500": "Moonlight Softcake", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Moonwight Softcake",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis aux Cerises",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Brown Sugar Creme Brûlée Milk", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Brown Sugar Creme Brûlée Milk",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Cuddle Warmth", "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Cuddle Warmth",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™", "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™",
@ -448,6 +447,11 @@
"settings.header.visual": "Aparência", "settings.header.visual": "Aparência",
"settings.header.visual.description": "Ajustar as definições visuais do Cider.", "settings.header.visual.description": "Ajustar as definições visuais do Cider.",
"settings.option.visual.windowStyle": "Estilo da janela", "settings.option.visual.windowStyle": "Estilo da janela",
"settings.option.visual.customAccentColor": "Cor de destaque personalizada",
"settings.option.visual.accentColor": "Cor de destaque",
"settings.option.visual.purplePodcastPlaybackBar": "Barra de reprodução roxa para Podcasts",
"settings.option.visual.windowColor": "Tonalidade da cor da janela",
"settings.header.visual.windowBackgroundStyle.color": "Tonalidade da cor",
"settings.option.visual.windowBackgroundStyle": "Estilo do fundo da janela", "settings.option.visual.windowBackgroundStyle": "Estilo do fundo da janela",
"settings.header.visual.windowBackgroundStyle.none": "Nenhum", "settings.header.visual.windowBackgroundStyle.none": "Nenhum",
"settings.header.visual.windowBackgroundStyle.artwork": "Grafismo", "settings.header.visual.windowBackgroundStyle.artwork": "Grafismo",

View file

@ -22,7 +22,6 @@
"term.logout": "Logout", "term.logout": "Logout",
"term.login": "Log In", "term.login": "Log In",
"term.quickNav": "Quick Nav", "term.quickNav": "Quick Nav",
"term.cast": "Cast",
"term.about": "About", "term.about": "About",
"term.privateSession": "Private Session", "term.privateSession": "Private Session",
"term.disablePrivateSession": "Disable Private Session", "term.disablePrivateSession": "Disable Private Session",
@ -42,6 +41,7 @@
"term.artists": "Artists", "term.artists": "Artists",
"term.podcasts": "Podcasts", "term.podcasts": "Podcasts",
"term.playlists": "Playlists", "term.playlists": "Playlists",
"term.charts": "Charts",
"term.playlist": "Playlist", "term.playlist": "Playlist",
"term.newPlaylist": "New Playlist", "term.newPlaylist": "New Playlist",
"term.newPlaylistFolder": "New Playlist Folder", "term.newPlaylistFolder": "New Playlist Folder",
@ -51,6 +51,7 @@
"term.navigateBack": "Navigate back", "term.navigateBack": "Navigate back",
"term.navigateForward": "Navigate forward", "term.navigateForward": "Navigate forward",
"term.play": "Play", "term.play": "Play",
"term.playpause": "Play/Pause",
"term.pause": "Pause", "term.pause": "Pause",
"term.stop": "Stop", "term.stop": "Stop",
"term.previous": "Previous", "term.previous": "Previous",
@ -153,6 +154,7 @@
}, },
"term.videos": "Videos", "term.videos": "Videos",
"term.menu": "Menu", "term.menu": "Menu",
"term.themeManaged": "Managed by a theme",
"term.check": "Check", "term.check": "Check",
"term.aboutArtist": "About {{artistName}}", "term.aboutArtist": "About {{artistName}}",
"term.topResult": "Top Result", "term.topResult": "Top Result",
@ -192,6 +194,16 @@
"term.confirmLogout": "Are you sure you want to logout?", "term.confirmLogout": "Are you sure you want to logout?",
"term.creditDesignedBy": "Designed by ${authorUsername}", "term.creditDesignedBy": "Designed by ${authorUsername}",
"term.discNumber": "Disc ${discNumber}", "term.discNumber": "Disc ${discNumber}",
"term.reload" : "Reload Cider ?",
"term.toggleprivate" : "Toggle Private Session",
"term.webremote" : "Web Remote",
"term.cast" : "Cast",
"term.cast2" : "Cast to Devices",
"term.quit" : "Quit",
"term.zoomin" : "Zoom In",
"term.zoomout" : "Zoom Out",
"term.zoomreset" : "Reset Zoom",
"term.fullscreen" : "Fullscreen",
"home.title": "Home", "home.title": "Home",
"home.recentlyPlayed": "Recently Played", "home.recentlyPlayed": "Recently Played",
"home.recentlyAdded": "Recently Added", "home.recentlyAdded": "Recently Added",
@ -264,11 +276,7 @@
"action.export": "Export", "action.export": "Export",
"action.showAlbum": "Show Complete Album", "action.showAlbum": "Show Complete Album",
"action.tray.minimize": "Minimize to Tray", "action.tray.minimize": "Minimize to Tray",
"action.tray.quit": "Quit",
"action.tray.show": "Show Cider", "action.tray.show": "Show Cider",
"action.tray.playpause": "Play/Pause",
"action.tray.next": "Next",
"action.tray.previous": "Previous",
"action.tray.listento": "Listen To:", "action.tray.listento": "Listen To:",
"action.update": "Update", "action.update": "Update",
"action.install": "Install", "action.install": "Install",
@ -288,45 +296,26 @@
"action.createNew": "Create New...", "action.createNew": "Create New...",
"action.openArtworkInBrowser": "Open artwork in browser", "action.openArtworkInBrowser": "Open artwork in browser",
"action.scrollToTop": "Scroll to top", "action.scrollToTop": "Scroll to top",
"menubar.options.about": "About",
"menubar.options.settings": "Settings",
"menubar.options.quit": "Quit Cider",
"menubar.options.view": "View", "menubar.options.view": "View",
"menubar.options.reload": "Reload", "menubar.options.reload": "Reload",
"menubar.options.forcereload": "Force Reload", "menubar.options.forcereload": "Force Reload",
"menubar.options.toggledevtools": "Toggle Developer Tools", "menubar.options.toggledevtools": "Toggle Developer Tools",
"menubar.options.window": "Window", "menubar.options.window": "Window",
"menubar.options.minimize": "Minimize", "menubar.options.minimize": "Minimize",
"menubar.options.toggleprivate": "Toggle Private Session",
"menubar.options.webremote": "Web Remote",
"menubar.options.audio": "Audio Settings",
"menubar.options.plugins": "Plu-gins Menu", "menubar.options.plugins": "Plu-gins Menu",
"menubar.options.controls": "Controls", "menubar.options.controls": "Controls",
"menubar.options.next": "Next",
"menubar.options.playpause": "Play/Pause",
"menubar.options.previous": "Previous",
"menubar.options.volumeup": "Volume Up", "menubar.options.volumeup": "Volume Up",
"menubar.options.volumedown": "Volume Down", "menubar.options.volumedown": "Volume Down",
"menubar.options.browse": "Browse",
"menubar.options.artists": "Artists",
"menubar.options.search": "Search",
"menubar.options.albums": "Albums",
"menubar.options.cast": "Cast To Devices",
"menubar.options.account": "Account", "menubar.options.account": "Account",
"menubar.options.accountsettings": "Account Settings",
"menubar.options.signout": "Sign Out", "menubar.options.signout": "Sign Out",
"menubar.options.support": "Support", "menubar.options.support": "Support",
"menubar.options.discord": "Discord",
"menubar.options.github": "GitHub Wiki",
"menubar.options.report": "Report a...", "menubar.options.report": "Report a...",
"menubar.options.bug": "Bug", "menubar.options.bug": "Bug",
"menubar.options.feature": "Feature Request", "menubar.options.feature": "Feature Request",
"menubar.options.trans": "Translation Report/Request", "menubar.options.trans": "Translation Report/Request",
"menubar.options.license": "View License", "menubar.options.license": "View License",
"menubar.options.conf": "Open Configuration File in Editor", "menubar.options.conf": "Open Configuration File in Editor",
"menubar.options.listennow": "Listen Now", "menubar.options.zoom": "Zoom",
"menubar.options.recentlyAdded": "Recently Added",
"menubar.options.songs": "Songs",
"settings.header.general": "General", "settings.header.general": "General",
"settings.header.general.description": "Adjust the general settings for Cider.", "settings.header.general.description": "Adjust the general settings for Cider.",
"settings.option.general.language": "Language", "settings.option.general.language": "Language",
@ -346,11 +335,15 @@
"settings.option.general.customizeSidebar": "Customize Sidebar Items", "settings.option.general.customizeSidebar": "Customize Sidebar Items",
"settings.option.general.customizeSidebar.customize": "Customize", "settings.option.general.customizeSidebar.customize": "Customize",
"settings.option.general.keybindings": "Keybindings", "settings.option.general.keybindings": "Keybindings",
"settings.option.general.keybindings.library": "Library",
"settings.option.general.keybindings.session": "Session",
"settings.option.general.keybindings.control": "Controls",
"settings.option.general.keybindings.interface": "Interface",
"settings.option.general.keybindings.advanced": "Advanced",
"settings.option.general.keybindings.pressCombination": "Press a combination of two keys to update keybind.", "settings.option.general.keybindings.pressCombination": "Press a combination of two keys to update keybind.",
"settings.option.general.keybindings.pressEscape": "Press Escape key to go back.", "settings.option.general.keybindings.pressEscape": "Press Escape key to go back.",
"settings.notyf.general.keybindings.update.success": "Keybind updated successfully", "settings.notyf.general.keybindings.update.success": "Keybind updated successfully",
"settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider", "settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider",
"settings.option.general.keybindings.open": "Open",
"settings.option.general.themeUpdateNotification": "Automatically check for theme updates", "settings.option.general.themeUpdateNotification": "Automatically check for theme updates",
"settings.option.general.showLovedTracksInline": "Show loved tracks inline", "settings.option.general.showLovedTracksInline": "Show loved tracks inline",
"settings.description.search": "Search", "settings.description.search": "Search",

View file

@ -164,7 +164,7 @@
"term.plugin": "插件", "term.plugin": "插件",
"term.pluginMenu": "插件菜单", "term.pluginMenu": "插件菜单",
"term.pluginMenu.none": "沒有交互式插件", "term.pluginMenu.none": "沒有交互式插件",
"term.replay":"重新播放", "term.replay":"音乐回忆",
"term.uniqueAlbums":"Unique Albums", "term.uniqueAlbums":"Unique Albums",
"term.uniqueArtists":"Unique Artists", "term.uniqueArtists":"Unique Artists",
"term.uniqueSongs":"Unique Songs", "term.uniqueSongs":"Unique Songs",
@ -177,6 +177,8 @@
"term.confirmLogout":"你确定要退出登录吗?", "term.confirmLogout":"你确定要退出登录吗?",
"term.creditDesignedBy":"由 ${authorUsername} 设计", "term.creditDesignedBy":"由 ${authorUsername} 设计",
"term.discNumber":"碟 ${discNumber}", "term.discNumber":"碟 ${discNumber}",
"home.syncFavorites": "同步喜爱艺人",
"home.syncFavorites.gettingArtists": "获取喜爱艺人...",
"home.title": "主页", "home.title": "主页",
"home.recentlyPlayed": "最近播放", "home.recentlyPlayed": "最近播放",
"home.recentlyAdded": "最近添加", "home.recentlyAdded": "最近添加",
@ -197,6 +199,8 @@
"podcast.episodes": "单集", "podcast.episodes": "单集",
"podcast.playEpisode": "播放单集", "podcast.playEpisode": "播放单集",
"podcast.website": "Podcast 网站", "podcast.website": "Podcast 网站",
"action.favorite":"喜爱",
"action.removeFavorite":"取消喜爱",
"action.hideLibrary":"隐藏资料库", "action.hideLibrary":"隐藏资料库",
"action.showLibrary":"显示资料可查", "action.showLibrary":"显示资料可查",
"action.cut":"剪切", "action.cut":"剪切",
@ -362,7 +366,7 @@
"settings.option.audio.advanced":"高级功能", "settings.option.audio.advanced":"高级功能",
"settings.option.audio.changePlaybackRate":"修改播放速度", "settings.option.audio.changePlaybackRate":"修改播放速度",
"settings.option.audio.playbackRate":"播放速度", "settings.option.audio.playbackRate":"播放速度",
"settings.option.audio.playbackRate.change":"播放速度已修改", "settings.option.audio.playbackRate.change":"修改",
"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 位/192 kHz)", "settings.header.audio.quality.hireslossless.description": "(最高 24 位/192 kHz)",
@ -430,10 +434,15 @@
"settings.header.visual": "外观", "settings.header.visual": "外观",
"settings.header.visual.description": "调整 Cider 的外观", "settings.header.visual.description": "调整 Cider 的外观",
"settings.option.visual.windowStyle":"窗口风格", "settings.option.visual.windowStyle":"窗口风格",
"settings.option.visual.customAccentColor": "自定义强调色",
"settings.option.visual.accentColor": "强调色",
"settings.option.visual.purplePodcastPlaybackBar": "播放播客时使用紫色进度条",
"settings.option.visual.windowColor": "窗口色调",
"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": "专辑插图",
"settings.header.visual.windowBackgroundStyle.image": "图像", "settings.header.visual.windowBackgroundStyle.image": "图像",
"settings.header.visual.windowBackgroundStyle.color":"色调",
"settings.option.visual.animatedArtwork": "动态专辑插图", "settings.option.visual.animatedArtwork": "动态专辑插图",
"settings.header.visual.animatedArtwork.always": "总是显示", "settings.header.visual.animatedArtwork.always": "总是显示",
"settings.header.visual.animatedArtwork.limited": "只在艺人页面和专辑插图显示", "settings.header.visual.animatedArtwork.limited": "只在艺人页面和专辑插图显示",

View file

@ -335,7 +335,7 @@ export class AppEvents {
{ {
visible: !visible, visible: !visible,
label: this.i18n['action.tray.playpause'], label: this.i18n['term.playpause'],
click: () => { click: () => {
utils.getWindow().webContents.executeJavaScript('MusicKitInterop.playPause()') utils.getWindow().webContents.executeJavaScript('MusicKitInterop.playPause()')
} }
@ -343,7 +343,7 @@ export class AppEvents {
{ {
visible: !visible, visible: !visible,
label: this.i18n['action.tray.next'], label: this.i18n['term.next'],
click: () => { click: () => {
utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`) utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`)
} }
@ -351,7 +351,7 @@ export class AppEvents {
{ {
visible: !visible, visible: !visible,
label: this.i18n['action.tray.previous'], label: this.i18n['term.previous'],
click: () => { click: () => {
utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`) utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`)
} }
@ -372,7 +372,7 @@ export class AppEvents {
} }
}, },
{ {
label: this.i18n['action.tray.quit'], label: this.i18n['term.quit'],
click: () => { click: () => {
app.quit() app.quit()
} }

View file

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

View file

@ -21,6 +21,7 @@ export class Store {
"state_format": "by {artist}", "state_format": "by {artist}",
"details_format": "{title}", "details_format": "{title}",
}, },
"refreshInterval": 120000,
"language": "en_US", // electron.app.getLocale().replace('-', '_') this can be used in future "language": "en_US", // electron.app.getLocale().replace('-', '_') this can be used in future
"playbackNotifications": true, "playbackNotifications": true,
"resumeOnStartupBehavior": "local", "resumeOnStartupBehavior": "local",
@ -106,6 +107,18 @@ export class Store {
"CommandOrControl", // Who the hell uses a different key for this? Fucking Option? "CommandOrControl", // Who the hell uses a different key for this? Fucking Option?
"," ","
], ],
"zoomn": [
"Control",
"numadd",
],
"zoomt": [
"Control",
"numsub",
],
"zoomrst": [
"Control",
"num0",
],
"openDeveloperTools": [ "openDeveloperTools": [
"CommandOrControl", "CommandOrControl",
"Shift", "Shift",
@ -206,7 +219,6 @@ export class Store {
}, },
"windowControlPosition": 0, // 0 default right "windowControlPosition": 0, // 0 default right
"nativeTitleBar": false, "nativeTitleBar": false,
"uiScale": 1.0,
"windowColor": "#000000", "windowColor": "#000000",
"customAccentColor": false, "customAccentColor": false,
"accentColor": "#fc3c44", "accentColor": "#fc3c44",
@ -228,10 +240,11 @@ export class Store {
"NowPlaying": "true" "NowPlaying": "true"
}, },
"advanced": { "advanced": {
"AudioContext": false, "AudioContext": true,
"experiments": [], "experiments": [],
"playlistTrackMapping": true, "playlistTrackMapping": true,
"ffmpegLocation": "" "ffmpegLocation": "",
"disableLogging": false
}, },
"connectUser": { "connectUser": {
"auth": null, "auth": null,

View file

@ -2,7 +2,7 @@ import * as fs from "fs";
import * as path from "path"; import * as path from "path";
import {Store} from "./store"; import {Store} from "./store";
import {BrowserWindow as bw} from "./browserwindow"; import {BrowserWindow as bw} from "./browserwindow";
import {app, dialog, ipcMain, Notification, shell } from "electron"; import {app, dialog, ipcMain, Notification, shell, BrowserWindow} from "electron";
import fetch from "electron-fetch"; import fetch from "electron-fetch";
import {AppImageUpdater, NsisUpdater} from "electron-updater"; import {AppImageUpdater, NsisUpdater} from "electron-updater";
import * as log from "electron-log"; import * as log from "electron-log";
@ -124,7 +124,11 @@ export class utils {
* Gets the browser window * Gets the browser window
*/ */
static getWindow(): Electron.BrowserWindow { static getWindow(): Electron.BrowserWindow {
if (bw.win) {
return bw.win return bw.win
} else {
return BrowserWindow.getAllWindows()[0]
}
} }
static loadPluginFrontend(path: string): void { static loadPluginFrontend(path: string): void {

View file

@ -17,6 +17,8 @@ export default class Thumbar {
* Menubar Assets * Menubar Assets
* @private * @private
*/ */
private isNotMac: boolean = process.platform !== 'darwin';
private isMac: boolean = process.platform === 'darwin'; private isMac: boolean = process.platform === 'darwin';
private _menuTemplate: any = [ private _menuTemplate: any = [
{ {
@ -28,12 +30,12 @@ export default class Thumbar {
}, },
{type: 'separator'}, {type: 'separator'},
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.toggleprivate'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.toggleprivate'),
accelerator: utils.getStoreValue("general.keybindings.togglePrivateSession").join('+'), accelerator: utils.getStoreValue("general.keybindings.togglePrivateSession").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.cfg.general.privateEnabled = !app.cfg.general.privateEnabled`) click: () => utils.getWindow().webContents.executeJavaScript(`app.cfg.general.privateEnabled = !app.cfg.general.privateEnabled`)
}, },
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.settings'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.settings'),
accelerator: utils.getStoreValue("general.keybindings.settings").join('+'), accelerator: utils.getStoreValue("general.keybindings.settings").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('settings')`) click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('settings')`)
}, },
@ -47,11 +49,21 @@ export default class Thumbar {
{type: 'separator'}, {type: 'separator'},
{role: 'quit'} {role: 'quit'}
] : []), ] : []),
...(this.isNotMac ? [
{type: 'separator'},
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.quit'),
accelerator: 'Control+Q',
click: () => app.quit()
}
] : [])
] ]
}, },
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.view'), label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.view'),
submenu: [ submenu: [
...(this.isMac ? [
{role: 'reload'}, {role: 'reload'},
{role: 'forceReload'}, {role: 'forceReload'},
{role: 'toggleDevTools'}, {role: 'toggleDevTools'},
@ -62,40 +74,41 @@ export default class Thumbar {
{type: 'separator'}, {type: 'separator'},
{role: 'togglefullscreen'}, {role: 'togglefullscreen'},
{type: 'separator'}, {type: 'separator'},
] : []),
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.search'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.search'),
accelerator: utils.getStoreValue("general.keybindings.search").join('+'), accelerator: utils.getStoreValue("general.keybindings.search").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript('app.focusSearch()') click: () => utils.getWindow().webContents.executeJavaScript('app.focusSearch()')
}, },
{type:'separator'}, {type:'separator'},
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.listennow'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.listenNow'),
accelerator: utils.getStoreValue('general.keybindings.listnow').join('+'), accelerator: utils.getStoreValue('general.keybindings.listnow').join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('listen_now')`) click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('listen_now')`)
}, },
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.browse'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.browse'),
accelerator: utils.getStoreValue("general.keybindings.browse").join('+'), accelerator: utils.getStoreValue("general.keybindings.browse").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('browse')`) click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('browse')`)
}, },
{type: 'separator'}, {type: 'separator'},
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.recentlyAdded') label: utils.getLocale(utils.getStoreValue('general.language'), 'term.recentlyAdded')
,accelerator: utils.getStoreValue("general.keybindings.recentAdd").join('+'), ,accelerator: utils.getStoreValue("general.keybindings.recentAdd").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-recentlyadded')`) click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-recentlyadded')`)
}, },
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.songs'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.songs'),
accelerator: utils.getStoreValue("general.keybindings.songs").join('+'), accelerator: utils.getStoreValue("general.keybindings.songs").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-songs')`) click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-songs')`)
}, },
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.albums'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.albums'),
accelerator: utils.getStoreValue("general.keybindings.albums").join('+'), accelerator: utils.getStoreValue("general.keybindings.albums").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-albums')`) click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-albums')`)
}, },
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.artists'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.artists'),
accelerator: utils.getStoreValue("general.keybindings.artists").join('+'), accelerator: utils.getStoreValue("general.keybindings.artists").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-artists')`) click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-artists')`)
}, },
@ -105,26 +118,13 @@ export default class Thumbar {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.window'), label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.window'),
submenu: [ submenu: [
{role: 'minimize', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.minimize')}, {role: 'minimize', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.minimize')},
{type: 'separator'},
...(this.isMac ? [ ...(this.isMac ? [
{ {
label: 'Show', label: 'Show',
click: () => utils.getWindow().show() click: () => utils.getWindow().show()
}, },
{role: 'toggleDevTools'},
{type: 'separator'},
{
label:'Zoom',
submenu: [
{role: 'zoom'}, {role: 'zoom'},
{role: 'resetZoom'},
{role: 'zoomIn'},
{role: 'zoomOut'},
]
},
{type: 'separator'},
{role: 'togglefullscreen'},
{type: 'separator'}, {type: 'separator'},
{role: 'front'}, {role: 'front'},
{role: 'close'}, {role: 'close'},
@ -139,29 +139,74 @@ export default class Thumbar {
{role: 'paste'}, {role: 'paste'},
] ]
}, },
] : [
{type: 'separator'}, {type: 'separator'},
{role: 'reload', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.reload')}, ] : [ ]),
{role: 'forceReload', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.forcereload')}, ...(this.isNotMac ? [
]),
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.zoom'),
submenu: [
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.zoomin'),
role: 'zoomIn',
accelerator: utils.getStoreValue("general.keybindings.zoomn").join('+')
},
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.zoomout'),
role: 'zoomOut',
accelerator: utils.getStoreValue("general.keybindings.zoomt").join('+')
},
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.zoomreset'),
role: 'resetZoom',
accelerator: utils.getStoreValue("general.keybindings.zoomrst").join('+')
}
] ]
}, },
{type: 'separator'},
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.fullscreen'),
accelerator: 'Control+Enter',
role: 'togglefullscreen'
},
{type: 'separator'},
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'action.close'),
accelerator: 'Control+W',
role: 'close'
},
{type:'separator'},
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.reload'),
accelerator: 'Control+R',
role: 'reload'
},
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.forcereload'),
accelerator: 'Control+Shift+R',
role: 'forceReload'
},
] : []),
],
},
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.controls'), label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.controls'),
submenu: [ submenu: [
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.playpause'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.playpause'),
accelerator: 'Space', accelerator: 'Space',
click: () => utils.getWindow().webContents.executeJavaScript(`app.SpacePause()`) click: () => utils.getWindow().webContents.executeJavaScript(`app.SpacePause()`)
}, },
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.next'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.next'),
accelerator: 'CommandOrControl+Right', accelerator: 'CommandOrControl+Right',
click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`) click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`)
}, },
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.previous'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.previous'),
accelerator: 'CommandOrControl+Left', accelerator: 'CommandOrControl+Left',
click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`) click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`)
}, },
@ -178,19 +223,19 @@ export default class Thumbar {
}, },
{type: 'separator'}, {type: 'separator'},
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.cast'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.cast2'),
accelerator: utils.getStoreValue("general.keybindings.castToDevices").join('+'), accelerator: utils.getStoreValue("general.keybindings.castToDevices").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.castMenu = true`) click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.castMenu = true`)
}, },
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.webremote'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.webremote'),
accelerator: utils.getStoreValue("general.keybindings.webRemote").join('+'), accelerator: utils.getStoreValue("general.keybindings.webRemote").join('+'),
sublabel: 'Opens in external window', sublabel: 'Opens in external window',
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('remote-pair')`) click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('remote-pair')`)
}, },
{type: 'separator'}, {type: 'separator'},
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.audio'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.audioSettings'),
accelerator: utils.getStoreValue("general.keybindings.audioSettings").join('+'), accelerator: utils.getStoreValue("general.keybindings.audioSettings").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.audioSettings = true`) click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.audioSettings = true`)
}, },
@ -207,7 +252,7 @@ export default class Thumbar {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.account'), label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.account'),
submenu: [ submenu: [
{ {
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.accountsettings'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.accountSettings'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('apple-account-settings')`) click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('apple-account-settings')`)
}, },
{ {
@ -221,11 +266,11 @@ export default class Thumbar {
role: 'help', role: 'help',
submenu: [ submenu: [
{ {
label: utils.getLocale('Discord', 'menubar.options.discord'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.discord'),
click: () => shell.openExternal("https://discord.gg/AppleMusic").catch(console.error) click: () => shell.openExternal("https://discord.gg/AppleMusic").catch(console.error)
}, },
{ {
label: utils.getLocale('GitHub Wiki', 'menubar.options.github'), label: utils.getLocale(utils.getStoreValue('general.language'), 'term.github'),
click: () => shell.openExternal("https://github.com/ciderapp/Cider/wiki/Troubleshooting").catch(console.error) click: () => shell.openExternal("https://github.com/ciderapp/Cider/wiki/Troubleshooting").catch(console.error)
}, },
{type: 'separator'}, {type: 'separator'},

View file

@ -80,6 +80,7 @@ const CiderAudio = {
} }
} catch (e) { } catch (e) {
console.debug("[Cider][MaikiwiSoundCheck] normalizer func err: " + e)
} }
}, },
normalizerOff: function () { normalizerOff: function () {
@ -666,41 +667,6 @@ const CiderAudio = {
console.debug("[Cider][Audio] CAP Adaptive - (Error Fallback) 256kbps"); console.debug("[Cider][Audio] CAP Adaptive - (Error Fallback) 256kbps");
} }
switch (destination) {
case "spatial":
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
break;
case "n5":
try {
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer2);
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
} catch (e) { }
break;
case 'n4':
try {
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer1);
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
} catch (e) { }
break;
case 'n3':
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]);
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
break;
case 'n2':
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
break;
case 'n1':
try {
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.llpw[0]);
console.debug("[Cider][Audio] llpw_n1 -> llpw");
} catch (e) { }
break;
case 'n0':
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
break;
}
break; break;
case "MAIKIWI_LEGACY": case "MAIKIWI_LEGACY":
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver();
@ -709,41 +675,6 @@ const CiderAudio = {
let bufferedImpulse = await impulseData.arrayBuffer(); let bufferedImpulse = await impulseData.arrayBuffer();
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
}); });
switch (destination) {
case "spatial":
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
break;
case "n5":
try {
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer2);
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
} catch (e) { }
break;
case 'n4':
try {
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer1);
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
} catch (e) { }
break;
case 'n1':
try {
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[0]);
console.debug("[Cider][Audio] llpw_n1 -> llpw");
} catch (e) { }
break;
case 'n3':
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.vibrantbassNode[0]);
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
break;
case 'n2':
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
break;
case 'n0':
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
break;
}
console.debug("[Cider][Audio] CAP - Maikiwi Signature Mode"); console.debug("[Cider][Audio] CAP - Maikiwi Signature Mode");
break; break;
case "NATURAL": case "NATURAL":
@ -754,41 +685,6 @@ const CiderAudio = {
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
}); });
switch (destination) {
case "spatial":
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
break;
case "n5":
try {
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer2);
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
} catch (e) { }
break;
case 'n4':
try {
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer1);
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
} catch (e) { }
break;
case 'n1':
try {
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[0]);
console.debug("[Cider][Audio] llpw_n1 -> llpw");
} catch (e) { }
break;
case 'n3':
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.vibrantbassNode[0]);
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
break;
case 'n2':
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
break;
case 'n0':
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
break;
}
console.debug("[Cider][Audio] CAP - Natural Mode"); console.debug("[Cider][Audio] CAP - Natural Mode");
break; break;
@ -803,6 +699,23 @@ const CiderAudio = {
for (let i = 1; i < LLPW_FREQUENCIES.length; i ++) { for (let i = 1; i < LLPW_FREQUENCIES.length; i ++) {
CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]); CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]);
} }
console.debug("[Cider][Audio] CAP - Legacy Mode");
break;
default:
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false;
CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.57;
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]);
fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => {
let bufferedImpulse = await impulseData.arrayBuffer();
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
});
app.cfg.audio.maikiwiAudio.ciderPPE_value = "MAIKIWI";
console.debug("[Cider][Audio] CAP - Maikiwi Adaptive Mode (Defaulted from broki config)");
break;
}
switch (destination) { switch (destination) {
case "spatial": case "spatial":
@ -820,12 +733,6 @@ const CiderAudio = {
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1"); console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
} catch (e) { } } catch (e) { }
break; break;
case 'n1':
try {
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.llpw[0]);
console.debug("[Cider][Audio] llpw_n1 -> llpw");
} catch (e) { }
break;
case 'n3': case 'n3':
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]); try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]);
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { } console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
@ -833,60 +740,16 @@ const CiderAudio = {
case 'n2': case 'n2':
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { } try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
break; break;
case 'n0':
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
break;
}
console.debug("[Cider][Audio] CAP - Legacy Mode");
break;
default:
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false;
CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.57;
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]);
fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => {
let bufferedImpulse = await impulseData.arrayBuffer();
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
});
app.cfg.audio.maikiwiAudio.ciderPPE_value = "MAIKIWI";
switch (destination) {
case "spatial":
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
break;
case "n5":
try {
CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.atmosphereRealizer2);
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
} catch (e) { }
break;
case 'n4':
try {
CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.atmosphereRealizer1);
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
} catch (e) { }
break;
case 'n1': case 'n1':
try { try {
CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.llpw[0]); CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.llpw[0]);
console.debug("[Cider][Audio] llpw_n1 -> llpw"); console.debug("[Cider][Audio] llpw_n1 -> llpw");
} catch (e) { } } catch (e) { }
break; break;
case 'n3':
try { CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.vibrantbassNode[0]);
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
break;
case 'n2':
try { CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
break;
case 'n0': case 'n0':
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { } try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
break; break;
} }
console.debug("[Cider][Audio] CAP - Maikiwi Adaptive Mode (Defaulted from broki config)");
break;
}
} }
}, },

View file

@ -444,6 +444,7 @@
.mediaitem-artwork { .mediaitem-artwork {
border-radius: var(--mediaItemRadiusSmall); border-radius: var(--mediaItemRadiusSmall);
} }
.overlay-play { .overlay-play {
background: rgba(0, 0, 0, 0.5); background: rgba(0, 0, 0, 0.5);
opacity: 0; opacity: 0;
@ -957,6 +958,7 @@
/* mediaitem-square */ /* mediaitem-square */
.cd-mediaitem-square { .cd-mediaitem-square {
--transitionDuration: .25s;
--scaleRate: 1.25; --scaleRate: 1.25;
--scaleRateArtwork: 1; --scaleRateArtwork: 1;
width: 200px; width: 200px;
@ -968,6 +970,7 @@
justify-content: center; justify-content: center;
align-items: center; align-items: center;
border-radius: 6px; border-radius: 6px;
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
.artwork-container { .artwork-container {
position: relative; position: relative;
@ -982,6 +985,7 @@
flex: 0 0 auto; flex: 0 0 auto;
margin: 6px; margin: 6px;
cursor: pointer; cursor: pointer;
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
.mediaitem-artwork { .mediaitem-artwork {
box-shadow: unset; box-shadow: unset;
@ -1055,7 +1059,10 @@
} }
} }
@media (min-width: 1600px) { &: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)); width: calc(200px * var(--scaleRate));
height: calc(200px * var(--scaleRate)); height: calc(200px * var(--scaleRate));
@ -1065,6 +1072,20 @@
} }
} }
@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 { .info-rect {
width: 90%; width: 90%;
height: 100%; height: 100%;
@ -1112,8 +1133,6 @@
} }
&.mediaitem-video { &.mediaitem-video {
--scaleRate: 1.25;
--scaleRateArtwork: 1.25;
height: 200px; height: 200px;
width: 240px; width: 240px;
@ -1122,13 +1141,29 @@
width: 212px; width: 212px;
} }
@media (min-width: 1600px) { &:not(.noscale) {
@media (min-width: 1460px) {
--scaleRate: 1.1;
--scaleRateArtwork: 1.1;
width: calc(240px * var(--scaleRate)); width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate)); height: calc(200px * var(--scaleRate));
.artwork-container > .artwork { .artwork-container > .artwork {
width: calc(212px * var(--scaleRateArtwork)); width: calc(220px * var(--scaleRateArtwork));
height: calc(120px * 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; height: 123px;
width: 220px; 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 { &.mediaitem-small {
@ -1169,7 +1230,7 @@
overflow: hidden; overflow: hidden;
border-radius: 0px; border-radius: 0px;
margin: 0; margin: 0;
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear, filter 0.2s ease-in-out;
.mediaitem-artwork { .mediaitem-artwork {
border-radius: 0px; border-radius: 0px;
@ -1183,6 +1244,8 @@
padding: 10px 10px 14px; padding: 10px 10px 14px;
position: relative; position: relative;
width: 100%; width: 100%;
display: grid;
align-content: center;
&::before { &::before {
background: var(--bgartwork); background: var(--bgartwork);
@ -1197,6 +1260,7 @@
z-index: 0; z-index: 0;
opacity: 1; opacity: 1;
filter: brightness(0.5) blur(50px) saturate(180%); filter: brightness(0.5) blur(50px) saturate(180%);
transition: filter 0.2s ease-in-out;
} }
} }
@ -1211,7 +1275,7 @@
& + .subtitle { & + .subtitle {
max-height: none !important; max-height: none !important;
margin-top: -0.5em; // margin-top: -0.5em;
} }
} }
@ -1241,14 +1305,34 @@
border-radius: inherit; border-radius: inherit;
} }
//@media (min-width: 1600px) { &:hover {
// width: calc(230px * 1.25); .artwork{
// height: calc(298px * 1.25); filter: brightness(0.8);
// .artwork-container>.artwork { }
// width: calc(230px * 1.25); .info-rect-card::before {
// height: calc(230px * 1.25); 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 { .close-btn {
width : 50px; .menu-panel.menu-header-text.close-btn
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)
}
} }
} }
} }
@ -191,22 +177,7 @@
} }
.close-btn { .close-btn {
width : 50px; .menu-panel.menu-header-text.close-btn
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)
}
} }
} }
@ -371,14 +342,12 @@
} }
} }
.menu-header-text { .menu-header-text {
margin: 18px 6px; margin: 18px 6px;
.close-btn { .close-btn {
width : 50px; width: 36px;
height : 42px; height: 36px;
background-image : var(--gfx-closeBtn);
background-position: center; background-position: center;
background-repeat: no-repeat; background-repeat: no-repeat;
-webkit-app-region: no-drag; -webkit-app-region: no-drag;
@ -386,8 +355,18 @@
border: 0; border: 0;
background-color: transparent; background-color: transparent;
position: absolute; position: absolute;
top : 0; top: 10px;
right : 0; right: 10px;
border-radius: 50px;
display: grid;
align-content: center;
&:before {
content: "";
font-family: "codicon";
color: var(--textColor);
font-size: 20px;
}
&:hover { &:hover {
background-color: rgb(196, 43, 28) background-color: rgb(196, 43, 28)
@ -505,7 +484,8 @@
.popover-artwork { .popover-artwork {
width: 200px; width: 200px;
height: 200px; height: 200px;
margin: 0 0 20px 0; margin: 0 auto;
margin-bottom: 20px;
} }
.song-name { .song-name {

View file

@ -3,4 +3,57 @@ body[platform="linux"] {
#window-controls-container { #window-controls-container {
//display: none; //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

@ -288,6 +288,7 @@
.podcast-header { .podcast-header {
text-align: center; text-align: center;
padding: 0 1rem;
} }
.podcast-play-btn { .podcast-play-btn {
@ -634,7 +635,7 @@
opacity : .7; opacity : .7;
animation : playlistArtworkFadeIn 1s var(--appleEase); animation : playlistArtworkFadeIn 1s var(--appleEase);
.artworkMaterial>img { .artworkMaterial img {
filter : brightness(100%) blur(80px) saturate(100%) contrast(1); filter : brightness(100%) blur(80px) saturate(100%) contrast(1);
object-position: center; object-position: center;
object-fit : cover; object-fit : cover;
@ -696,6 +697,16 @@
width : 60vw; width : 60vw;
} }
.descriptionEdit {
font-size : 14px;
flex-shrink : unset;
background : transparent;
border : 0px;
color : inherit;
font-family : inherit;
width : 60vw;
}
.playlist-artist { .playlist-artist {
font-size : 20px; font-size : 20px;
margin-bottom: 6px; margin-bottom: 6px;
@ -962,6 +973,10 @@
right : 28px; right : 28px;
} }
&.animated .artist-header {
min-height: 500px;
}
.artist-header { .artist-header {
//background: linear-gradient(45deg, var(--keyColor), #0e0e0e); //background: linear-gradient(45deg, var(--keyColor), #0e0e0e);
color : white; color : white;
@ -977,6 +992,19 @@
// margin-top: -16px; // margin-top: -16px;
} }
.artist-hero {
height:100%;
position: absolute;
top:0;
left:0;
right:0;
bottom:0;
.mediaitem-artwork {
border-radius: 0px;
}
}
.artworkContainer { .artworkContainer {
position : absolute; position : absolute;
@ -990,7 +1018,7 @@
opacity : .7; opacity : .7;
animation : playlistArtworkFadeIn 1s var(--appleEase); animation : playlistArtworkFadeIn 1s var(--appleEase);
.artworkMaterial>img { .artworkMaterial img {
filter : brightness(100%) blur(80px) saturate(100%) contrast(1); filter : brightness(100%) blur(80px) saturate(100%) contrast(1);
object-position: center; object-position: center;
object-fit : cover; object-fit : cover;
@ -1013,6 +1041,7 @@
position : absolute; position : absolute;
overflow : hidden; overflow : hidden;
box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset; box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset;
z-index: 1;
video { video {
overflow : hidden; overflow : hidden;

View file

@ -17,14 +17,26 @@ window.CiderCache = CiderCache
window.CiderFrontAPI = CiderFrontAPI window.CiderFrontAPI = CiderFrontAPI
window.wsapi = wsapi window.wsapi = wsapi
if (app.cfg.advanced.disableLogging === true) {
window.console = {
log: function() {},
error: function() {},
warn: function() {},
assert: function() {},
debug: function() {}
}
}
// Mount Vue to #app // Mount Vue to #app
app.$mount("#app") app.$mount("#app")
// Init CiderAudio // Init CiderAudio
if (app.cfg.advanced.AudioContext){ if (app.cfg.advanced.AudioContext === false){
CiderAudio.init() app.cfg.advanced.AudioContext === true;
} }
CiderAudio.init()
// Import gamepad support // Import gamepad support
app.simulateGamepad = simulateGamepad app.simulateGamepad = simulateGamepad
app.spawnMica = spawnMica app.spawnMica = spawnMica

View file

@ -24,7 +24,7 @@ const Events = {
// CTRL + R // CTRL + R
if (event.keyCode === 82 && event.ctrlKey) { if (event.keyCode === 82 && event.ctrlKey) {
event.preventDefault() event.preventDefault()
bootbox.confirm("Reload Cider?", (res)=>{ bootbox.confirm(app.getLz('term.reload'), (res)=>{
if (res) { if (res) {
window.location.reload() window.location.reload()
} }
@ -91,8 +91,6 @@ const Events = {
setTimeout(refreshFocus, 200); setTimeout(refreshFocus, 200);
} }
app.getHTMLStyle()
refreshFocus(); refreshFocus();
} }
} }

View file

@ -325,11 +325,7 @@ const app = new Vue({
let advancedTooltip = this.cfg.audio.dBSPL ? (Number(this.cfg.audio.dBSPLcalibration) + (Math.log10(this.mk.volume) * 20)).toFixed(2) + ' dB SPL' : (Math.log10(this.mk.volume) * 20).toFixed(2) + ' dBFS' let advancedTooltip = this.cfg.audio.dBSPL ? (Number(this.cfg.audio.dBSPLcalibration) + (Math.log10(this.mk.volume) * 20)).toFixed(2) + ' dB SPL' : (Math.log10(this.mk.volume) * 20).toFixed(2) + ' dBFS'
return this.cfg.audio.advanced ? advancedTooltip : (this.mk.volume * 100).toFixed(0) + '%' return this.cfg.audio.advanced ? advancedTooltip : (this.mk.volume * 100).toFixed(0) + '%'
}, },
mainMenuVisibility(val, isContextMenu) { mainMenuVisibility(val) {
if (this.chrome.sidebarCollapsed && !isContextMenu) {
this.chrome.sidebarCollapsed = false
return
}
if (val) { if (val) {
(this.mk.isAuthorized) ? this.chrome.menuOpened = !this.chrome.menuOpened : false; (this.mk.isAuthorized) ? this.chrome.menuOpened = !this.chrome.menuOpened : false;
if (!this.mk.isAuthorized) { if (!this.mk.isAuthorized) {
@ -440,6 +436,9 @@ const app = new Vue({
} }
}) })
}, },
quit() {
ipcRenderer.invoke("quit-app")
},
async openAppleMusicURL(url) { async openAppleMusicURL(url) {
let properties = MusicKit.formattedMediaURL(url) let properties = MusicKit.formattedMediaURL(url)
let item = { let item = {
@ -527,11 +526,6 @@ const app = new Vue({
navigateForward() { navigateForward() {
history.forward() history.forward()
}, },
getHTMLStyle() {
ipcRenderer.send("setScreenScale", app.cfg.visual.uiScale);
},
resetState() { resetState() {
this.menuPanel.visible = false; this.menuPanel.visible = false;
app.selectedMediaItems = []; app.selectedMediaItems = [];
@ -874,6 +868,7 @@ const app = new Vue({
try { try {
//CiderAudio.audioNodes.gainNode.gain.value = (Math.min(Math.pow(10, (replaygain.gain / 20)), (1 / replaygain.peak))) //CiderAudio.audioNodes.gainNode.gain.value = (Math.min(Math.pow(10, (replaygain.gain / 20)), (1 / replaygain.peak)))
CiderAudio.audioNodes.gainNode.gain.value = gain CiderAudio.audioNodes.gainNode.gain.value = gain
CiderAudio.hierarchical_loading();
} catch (e) { } catch (e) {
} }
} }
@ -922,32 +917,44 @@ const app = new Vue({
} }
}) })
// Used for Live Radio stations to set Metadata
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
if(e.links[1]) {
app.currentArtUrl = e.links[1].url
app.currentArtUrlRaw = e.links[1].url
}else{
app.currentArtUrl = e.links[0].url
app.currentArtUrlRaw = 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) => { this.mk.addEventListener(MusicKit.Events.nowPlayingItemDidChange, (a) => {
if (self.$refs.queue) { if (self.$refs.queue) {
self.$refs.queue.updateQueue(); self.$refs.queue.updateQueue();
} }
this.currentSongInfo = a this.currentSongInfo = a
if (this.currentSongInfo === null || this.currentSongInfo === undefined) {return;} // EVIL EMPTY OBJECTS BE GONE
console.debug("songinfo: " + JSON.stringify(a))
if (app.cfg.advanced.AudioContext) { if (app.cfg.advanced.AudioContext) {
try { try {
if (app.mk.nowPlayingItem.flavor.includes("64")) { if (app.mk.nowPlayingItem.flavor.includes("64")) {
if (localStorage.getItem("playingBitrate") !== "64") {
localStorage.setItem("playingBitrate", "64") localStorage.setItem("playingBitrate", "64")
CiderAudio.hierarchical_loading();
}
} else if (app.mk.nowPlayingItem.flavor.includes("256")) { } else if (app.mk.nowPlayingItem.flavor.includes("256")) {
if (localStorage.getItem("playingBitrate") !== "256") {
localStorage.setItem("playingBitrate", "256") localStorage.setItem("playingBitrate", "256")
CiderAudio.hierarchical_loading();
}
} else { } else {
localStorage.setItem("playingBitrate", "256") localStorage.setItem("playingBitrate", "256")
CiderAudio.hierarchical_loading();
} }
} catch (e) { } catch (e) {
localStorage.setItem("playingBitrate", "256") localStorage.setItem("playingBitrate", "256")
CiderAudio.hierarchical_loading();
} }
if (!app.cfg.audio.normalization) {CiderAudio.hierarchical_loading();}
} }
if (app.cfg.audio.normalization) { if (app.cfg.audio.normalization) {
@ -962,14 +969,17 @@ const app = new Vue({
app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/songs/${app.mk.nowPlayingItem?._songId ?? (app.mk.nowPlayingItem["songId"] ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id)}`).then((response) => { app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/songs/${app.mk.nowPlayingItem?._songId ?? (app.mk.nowPlayingItem["songId"] ?? app.mk.nowPlayingItem.relationships.catalog.data[0].id)}`).then((response) => {
previewURL = response.data.data[0].attributes.previews[0].url previewURL = response.data.data[0].attributes.previews[0].url
if (previewURL) if (previewURL)
console.debug("[Cider][MaikiwiSoundCheck] previewURL response.data.data[0].attributes.previews[0].url: " + previewURL)
ipcRenderer.send('getPreviewURL', previewURL) ipcRenderer.send('getPreviewURL', previewURL)
}) })
} else { } else {
if (previewURL) if (previewURL)
console.debug("[Cider][MaikiwiSoundCheck] previewURL in app.mk.nowPlayingItem.previewURL: " + previewURL)
ipcRenderer.send('getPreviewURL', previewURL) ipcRenderer.send('getPreviewURL', previewURL)
} }
} catch (e) { } catch (e) {
if (e instanceof TypeError === false) {console.debug("[Cider][MaikiwiSoundCheck] normalizer function err: " + e)}
} }
} }
@ -1172,9 +1182,20 @@ const app = new Vue({
}, },
getAppClasses() { getAppClasses() {
let classes = {} let classes = {}
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')) { if (this.cfg.advanced.experiments.includes('compactui')) {
classes.compact = true classes.compact = true;
} }
break;
}
if (this.cfg.visual.window_background_style == "none") { if (this.cfg.visual.window_background_style == "none") {
classes.simplebg = true classes.simplebg = true
} }
@ -1430,6 +1451,12 @@ const app = new Vue({
action: () => { action: () => {
this.newPlaylistFolder() this.newPlaylistFolder()
} }
},
{
name: app.getLz("action.refresh"),
action: ()=>{
this.refreshPlaylists()
}
} }
] ]
} }
@ -1675,7 +1702,7 @@ const app = new Vue({
this.page = "" this.page = ""
const artistData = await this.mkapi("artists", false, id, { const artistData = await this.mkapi("artists", false, id, {
"views": "featured-release,full-albums,appears-on-albums,featured-albums,featured-on-albums,singles,compilation-albums,live-albums,latest-release,top-music-videos,similar-artists,top-songs,playlists,more-to-hear,more-to-see", "views": "featured-release,full-albums,appears-on-albums,featured-albums,featured-on-albums,singles,compilation-albums,live-albums,latest-release,top-music-videos,similar-artists,top-songs,playlists,more-to-hear,more-to-see",
"extend": "artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero", "extend": "centeredFullscreenBackground,artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero",
"extend[playlists]": "trackCount", "extend[playlists]": "trackCount",
"include[songs]": "albums", "include[songs]": "albums",
"fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount", "fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount",
@ -1982,14 +2009,21 @@ const app = new Vue({
}, },
async getNowPlayingItemDetailed(target) { 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 { try {
let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind, let u = await app.mkapi(nowPlayingItem.playParams.kind,
(app.mk.nowPlayingItem.songId == -1), (nowPlayingItem.songId == -1),
(app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"], (nowPlayingItem.songId != -1) ? nowPlayingItem.songId : nowPlayingItem["id"],
{ "include[songs]": "albums,artists", l: app.mklang }); { "include[songs]": "albums,artists", l: app.mklang });
app.searchAndNavigate(u.data.data[0], target) app.searchAndNavigate(u.data.data[0], target)
} catch (e) { } catch (e) {
app.searchAndNavigate(app.mk.nowPlayingItem, target) app.searchAndNavigate(nowPlayingItem, target)
} }
}, },
async searchAndNavigate(item, target) { async searchAndNavigate(item, target) {
@ -2424,6 +2458,7 @@ const app = new Vue({
let library = [] let library = []
let cacheId = "library-songs" let cacheId = "library-songs"
let downloaded = null; let downloaded = null;
this.$store.commit("resetRecentlyAdded")
if ((this.library.songs.downloadState == 2) && !force) { if ((this.library.songs.downloadState == 2) && !force) {
return return
} }
@ -4312,7 +4347,15 @@ const app = new Vue({
this.showMenuPanel(menus[useMenu], event) this.showMenuPanel(menus[useMenu], event)
try { 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) { if (result[0].attributes.inLibrary) {
menus.normal.items.find(x => x.id == 'addToLibrary').hidden = true menus.normal.items.find(x => x.id == 'addToLibrary').hidden = true
menus.normal.items.find(x => x.id == 'removeFromLibrary').hidden = false menus.normal.items.find(x => x.id == 'removeFromLibrary').hidden = false

View file

@ -19,6 +19,11 @@ const store = new Vuex.Store({
} }
}, },
mutations: { mutations: {
resetRecentlyAdded(state) {
state.pageState.recentlyAdded.loaded = false;
state.pageState.recentlyAdded.nextUrl = null;
state.pageState.recentlyAdded.items = [];
},
setLCDArtwork(state, artwork) { setLCDArtwork(state, artwork) {
state.artwork.playerLCD = artwork state.artwork.playerLCD = artwork
} }

View file

@ -1,9 +1,8 @@
@import url("assets/fonts/Pretendard/pretendardvariable.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+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+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("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/appvars.less");
@import url("less/bootstrap-vue.min.less"); @import url("less/bootstrap-vue.min.less");
@import url("less/ameframework.less"); @import url("less/ameframework.less");
@ -69,7 +68,7 @@ body {
background-size: cover; background-size: cover;
background-position: center; background-position: center;
background: #0000; 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); transition: opacity .10s var(--appleEase);
} }
@ -311,19 +310,19 @@ a.dropdown-item {
overflow: hidden; overflow: hidden;
pointer-events: none; pointer-events: none;
> img { img {
position: absolute; position: absolute;
width: 200%; width: 200%;
opacity: 0.5; opacity: 0.5;
filter: brightness(200%) blur(180px) saturate(280%) contrast(2); filter: brightness(200%) blur(180px) saturate(280%) contrast(2);
} }
> img:first-child { img:first-child {
top: 0; top: 0;
left: 0; left: 0;
} }
> img:last-child { img:last-child {
bottom: 0; bottom: 0;
right: 0; right: 0;
transform: rotate(180deg); transform: rotate(180deg);
@ -1163,18 +1162,14 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
&-macos { &-macos {
width: 100px; width: 100px;
} }
}
.app-chrome .app-chrome-item > .window-controls > div { > div {
height: 100%; height: 100%;
width: 32px; width: 32px;
} &:hover {
.app-chrome .app-chrome-item > .window-controls > div:hover {
background: rgb(200 200 200 / 10%); background: rgb(200 200 200 / 10%);
} }
&.close {
.app-chrome .app-chrome-item > .window-controls > div.close {
width: 100%; width: 100%;
height: 100%; height: 100%;
background-image: var(--gfx-closeBtn); background-image: var(--gfx-closeBtn);
@ -1186,8 +1181,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
background-color: rgb(196, 43, 28) background-color: rgb(196, 43, 28)
} }
} }
&.minmax {
.app-chrome .app-chrome-item > .window-controls > div.minmax {
background-image: var(--gfx-maxBtn); background-image: var(--gfx-maxBtn);
background-position: center; background-position: center;
background-repeat: no-repeat; background-repeat: no-repeat;
@ -1195,12 +1189,10 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
&.minmax.restore {
.app-chrome .app-chrome-item > .window-controls > div.minmax.restore {
background-image: var(--gfx-restoreBtn); background-image: var(--gfx-restoreBtn);
} }
&.minimize {
.app-chrome .app-chrome-item > .window-controls > div.minimize {
background-image: var(--gfx-minBtn); background-image: var(--gfx-minBtn);
background-position: center; background-position: center;
background-repeat: no-repeat; background-repeat: no-repeat;
@ -1208,6 +1200,8 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
}
}
body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minimize { body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minimize {
display: none; display: none;
@ -1452,10 +1446,13 @@ div[data-type="musicVideo"] .info-rect .title::before {
background-position: center; background-position: center;
background-size: contain; background-size: contain;
background-repeat: no-repeat; background-repeat: no-repeat;
border-radius: 4px; border-radius: var(--mediaItemRadiusSmall);
flex: 0 0 auto; flex: 0 0 auto;
margin: 6px; margin: 6px;
image-rendering: -webkit-optimize-contrast; image-rendering: -webkit-optimize-contrast;
.mediaitem-artwork {
border-radius: var(--mediaItemRadiusSmall);
}
} }
.app-chrome .app-chrome-item > .app-playback-controls .actions { .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; overflow-x: hidden;
display: flex; display: flex;
flex-flow: column; 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 { .lyric-body .no-lyrics {
@ -1761,7 +1758,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.lyrics-translation { .lyrics-translation {
font-size: 1.6rem; font-size: 1.6rem;
font-weight: 450; 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); filter: contrast(0.5);
} }
@ -3422,20 +3419,7 @@ body.no-gpu {
} }
} }
.keybindings-border {
padding-left: 15px;
padding-right: 15px;
border-style: solid;
border-radius: 5px;
border-color: #CBCBCB;
}
.keybinding-text {
width: 95px;
display: flex;
justify-content: center;
align-items: center;
}
.qrimg { .qrimg {
width: -webkit-fill-available; width: -webkit-fill-available;
@ -3475,22 +3459,7 @@ body.no-gpu {
} }
.close-btn { .close-btn {
width: 50px; .menu-panel.menu-header-text.close-btn
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)
}
} }
} }
@ -3609,8 +3578,10 @@ body[platform='darwin'] {
display: none; display: none;
} }
.keybinds-page .md-option-header { .keybinds-page{
padding: 0px 0px;
.md-option-header {
padding: 10px 0px;
border-bottom: unset; border-bottom: unset;
border-top: unset; border-top: unset;
font-weight: 600; font-weight: 600;
@ -3618,6 +3589,21 @@ body[platform='darwin'] {
font-size: 2em; font-size: 2em;
} }
.md-option-header-sub {
padding: 15px 10px;
border-bottom: unset;
border-top: unset;
background: rgba(255, 255, 255, 0);
font-weight: 600;
font-size: 1.7em;
}
.md-option-line{
padding: 15px 20px;
font-size: 0.90em;
}
}
.content-inner.keybinds-page { .content-inner.keybinds-page {
top: var(--navigationBarHeight); top: var(--navigationBarHeight);
padding: 15px; padding: 15px;

View file

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

View file

@ -121,6 +121,14 @@
$root.getLz("term.logout") $root.getLz("term.logout")
}}</span> }}</span>
</button> </button>
<button class="usermenu-item" @click="quit()">
<span class="usermenu-item-icon" style="right: 2.5px">
<%- include("../svg/x.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.quit")
}}</span>
</button>
</div> </div>
</div> </div>
</transition> </transition>

View file

@ -10,10 +10,10 @@
<b-popover custom-class="mediainfo-popover" target="artworkLCD" triggers="hover" placement="right"> <b-popover custom-class="mediainfo-popover" target="artworkLCD" triggers="hover" placement="right">
<div class="content"> <div class="content">
<div class="shadow-artwork"> <div class="shadow-artwork">
<mediaitem-artwork :url="currentArtUrl" :url="currentArtUrlRaw"></mediaitem-artwork> <mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div> </div>
<div class="popover-artwork"> <div class="popover-artwork">
<mediaitem-artwork :size="210" :url="currentArtUrlRaw"></mediaitem-artwork> <mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div> </div>
<div class="song-name">{{ mk.nowPlayingItem["attributes"]["name"] }}</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-artist" @click="getNowPlayingItemDetailed(`artist`)">{{ mk.nowPlayingItem["attributes"]["artistName"] }}</div>
@ -60,13 +60,27 @@
</div> </div>
</template> </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>
</div> </div>
<div class="app-chrome--center"> <div class="app-chrome--center">
<div class="app-chrome-playback-duration-bottom"> <div class="app-chrome-playback-duration-bottom">
<b-row> <b-row v-if="mkReady()">
<b-col sm="auto">{{ convertTime(getSongProgress()) }}</b-col> <b-col sm="auto" v-if="!mk.nowPlayingItem?.isLiveRadioStation">{{ convertTime(getSongProgress()) }}</b-col>
<b-col sm="auto" v-else>--:--</b-col>
<b-col> <b-col>
<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"
@ -74,7 +88,8 @@
@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>
<b-col sm="auto">{{ convertTime(mk.currentPlaybackDuration) }}</b-col> <b-col sm="auto" v-if="!mk.nowPlayingItem?.isLiveRadioStation">{{ convertTime(mk.currentPlaybackDuration) }}</b-col>
<b-col sm="auto" v-else>{{ getLz("term.live") }}</b-col>
</b-row> </b-row>
</div> </div>
<div class="app-chrome-playback-controls"> <div class="app-chrome-playback-controls">

View file

@ -9,8 +9,8 @@
</div> </div>
</div> </div>
<div class="app-chrome-item full-height" v-else> <div class="app-chrome-item full-height" v-else>
<button class="app-mainmenu" @blur="mainMenuVisibility(false, true)" @click="mainMenuVisibility(true, false)" <button class="app-mainmenu" @blur="mainMenuVisibility(false)" @click="mainMenuVisibility(true)"
@contextmenu="mainMenuVisibility(true, true)" :class="{active: chrome.menuOpened}" @contextmenu="mainMenuVisibility(true)" :class="{active: chrome.menuOpened}"
:aria-label="$root.getLz('term.quickNav')"></button> :aria-label="$root.getLz('term.quickNav')"></button>
</div> </div>
<template v-if="getThemeDirective('appNavigation') != 'seperate'"> <template v-if="getThemeDirective('appNavigation') != 'seperate'">
@ -89,10 +89,10 @@
<b-popover custom-class="mediainfo-popover" target="artworkLCD" triggers="hover" placement="bottom"> <b-popover custom-class="mediainfo-popover" target="artworkLCD" triggers="hover" placement="bottom">
<div class="content"> <div class="content">
<div class="shadow-artwork"> <div class="shadow-artwork">
<mediaitem-artwork :url="currentArtUrl" :url="currentArtUrlRaw"></mediaitem-artwork> <mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div> </div>
<div class="popover-artwork"> <div class="popover-artwork">
<mediaitem-artwork :size="210" :url="currentArtUrlRaw"></mediaitem-artwork> <mediaitem-artwork :size="210" :url="currentArtUrl"></mediaitem-artwork>
</div> </div>
<div class="song-name"> <div class="song-name">
{{ mk.nowPlayingItem["attributes"]["name"] }} {{ mk.nowPlayingItem["attributes"]["name"] }}
@ -183,6 +183,18 @@
</template> </template>
</div> </div>
</template> </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>
<div class="app-chrome-item" v-else> <div class="app-chrome-item" v-else>
<div class="top-nav-group"> <div class="top-nav-group">
@ -257,8 +269,8 @@
</div> </div>
</div> </div>
<div class="app-chrome-item full-height" v-else-if="platform != 'darwin' && !chrome.nativeControls"> <div class="app-chrome-item full-height" v-else-if="platform != 'darwin' && !chrome.nativeControls">
<button class="app-mainmenu" @blur="mainMenuVisibility(false, true)" @click="mainMenuVisibility(true, false)" <button class="app-mainmenu" @blur="mainMenuVisibility(false)" @click="mainMenuVisibility(true)"
@contextmenu="mainMenuVisibility(true, true)" :class="{active: chrome.menuOpened}"></button> @contextmenu="mainMenuVisibility(true)" :class="{active: chrome.menuOpened}"></button>
</div> </div>
</div> </div>
</div> </div>

View file

@ -196,6 +196,7 @@
v-if="mk.shuffleMode == 0" v-if="mk.shuffleMode == 0"
@click="mk.shuffleMode = 1" @click="mk.shuffleMode = 1"
:title="$root.getLz('term.enableShuffle')" :title="$root.getLz('term.enableShuffle')"
:class="$root.isDisabled() && 'disabled'"
v-b-tooltip.hover.righttop v-b-tooltip.hover.righttop
></button> ></button>
<button <button
@ -203,6 +204,7 @@
v-else v-else
@click="mk.shuffleMode = 0" @click="mk.shuffleMode = 0"
:title="$root.getLz('term.disableShuffle')" :title="$root.getLz('term.disableShuffle')"
:class="$root.isDisabled() && 'disabled'"
v-b-tooltip.hover.righttop v-b-tooltip.hover.righttop
></button> ></button>
</div> </div>
@ -210,31 +212,26 @@
<button <button
class="playback-button previous" class="playback-button previous"
@click="prevButton()" @click="prevButton()"
:class="$root.isPrevDisabled() && 'disabled'"
:title="$root.getLz('term.previous')" :title="$root.getLz('term.previous')"
v-b-tooltip.hover v-b-tooltip.hover
></button> ></button>
</div> </div>
<div class="app-chrome-item"> <div class="app-chrome-item">
<button <button class="playback-button stop" @click="$root.mk.stop()"
class="playback-button pause" v-if="$root.mk.isPlaying && $root.mk.nowPlayingItem.attributes.playParams.kind == 'radioStation'"
@click="mk.pause()" :title="$root.getLz('term.stop')" v-b-tooltip.hover></button>
v-if="mk.isPlaying" <button class="playback-button pause" @click="$root.mk.pause()" v-else-if="$root.mk.isPlaying"
:title="$root.getLz('term.pause')" :title="$root.getLz('term.pause')" v-b-tooltip.hover></button>
v-b-tooltip.hover <button class="playback-button play" @click="$root.mk.play()" v-else :title="$root.getLz('term.play')"
></button> 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>
<div class="app-chrome-item"> <div class="app-chrome-item">
<button <button
class="playback-button next" class="playback-button next"
@click="skipToNextItem()" @click="skipToNextItem()"
:title="$root.getLz('term.next')" :title="$root.getLz('term.next')"
:class="$root.isNextDisabled() && 'disabled'"
v-b-tooltip.hover v-b-tooltip.hover
></button> ></button>
</div> </div>
@ -243,6 +240,7 @@
class="playback-button--small repeat" class="playback-button--small repeat"
v-if="mk.repeatMode == 0" v-if="mk.repeatMode == 0"
@click="mk.repeatMode = 1" @click="mk.repeatMode = 1"
:class="$root.isDisabled() && 'disabled'"
:title="$root.getLz('term.enableRepeatOne')" :title="$root.getLz('term.enableRepeatOne')"
v-b-tooltip.hover v-b-tooltip.hover
></button> ></button>
@ -251,6 +249,7 @@
@click="mk.repeatMode = 2" @click="mk.repeatMode = 2"
v-else-if="mk.repeatMode == 1" v-else-if="mk.repeatMode == 1"
:title="$root.getLz('term.disableRepeatOne')" :title="$root.getLz('term.disableRepeatOne')"
:class="$root.isDisabled() && 'disabled'"
v-b-tooltip.hover v-b-tooltip.hover
></button> ></button>
<button <button
@ -258,6 +257,7 @@
@click="mk.repeatMode = 0" @click="mk.repeatMode = 0"
v-else-if="mk.repeatMode == 2" v-else-if="mk.repeatMode == 2"
:title="$root.getLz('term.disableRepeat')" :title="$root.getLz('term.disableRepeat')"
:class="$root.isDisabled() && 'disabled'"
v-b-tooltip.hover v-b-tooltip.hover
></button> ></button>
</div> </div>

View file

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

View file

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

View file

@ -14,6 +14,8 @@
<div class="artwork" @click="app.fullscreen(false)"> <div class="artwork" @click="app.fullscreen(false)">
<mediaitem-artwork <mediaitem-artwork
:size="600" :size="600"
:video="video"
:videoPriority="true"
:url="(image ?? '').replace('{w}','600').replace('{h}','600')" :url="(image ?? '').replace('{w}','600').replace('{h}','600')"
></mediaitem-artwork> ></mediaitem-artwork>
</div> </div>
@ -52,40 +54,41 @@
</div> </div>
</div> </div>
<div class="control-buttons"> <div class="control-buttons">
<div class="app-chrome-item"> <div class="app-chrome-item display--large">
<button class="playback-button--small shuffle" v-if="app.mk.shuffleMode == 0" <button class="playback-button--small shuffle" v-if="$root.mk.shuffleMode == 0" :class="$root.isDisabled() && 'disabled'"
@click="app.mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')" @click="$root.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 :class="$root.isDisabled() && 'disabled'"
<button class="playback-button--small shuffle active" v-else @click="$root.mk.shuffleMode = 0" :title="$root.getLz('term.disableShuffle')" v-b-tooltip.hover></button>
@click="app.mk.shuffleMode = 0" :title="$root.getLz('term.disableShuffle')"
v-b-tooltip.hover></button>
</div> </div>
<div class="app-chrome-item"> <div class="app-chrome-item display--large">
<button class="playback-button previous" @click="app.prevButton()" <button class="playback-button previous" @click="$root.prevButton()" :class="$root.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"> <div class="app-chrome-item display--large">
<button class="playback-button pause" @click="app.mk.pause()" v-if="app.mk.isPlaying" <button class="playback-button stop" @click="$root.mk.stop()"
v-if="$root.mk.isPlaying && $root.mk.nowPlayingItem.attributes.playParams.kind == 'radioStation'"
:title="$root.getLz('term.stop')" v-b-tooltip.hover></button>
<button class="playback-button pause" @click="$root.mk.pause()" v-else-if="$root.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="app.mk.play()" v-else <button class="playback-button play" @click="$root.mk.play()" v-else :title="$root.getLz('term.play')"
:title="$root.getLz('term.play')" v-b-tooltip.hover></button> v-b-tooltip.hover></button>
</div> </div>
<div class="app-chrome-item"> <div class="app-chrome-item display--large">
<button class="playback-button next" @click="app.skipToNextItem()" <button class="playback-button next" @click="$root.skipToNextItem()" :class="$root.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"> <div class="app-chrome-item display--large">
<button class="playback-button--small repeat" v-if="app.mk.repeatMode == 0" <button class="playback-button--small repeat" v-if="$root.mk.repeatMode == 0" :class="$root.isDisabled() && 'disabled'"
@click="app.mk.repeatMode = 1" :title="$root.getLz('term.enableRepeatOne')" @click="$root.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="app.mk.repeatMode = 2" :class="$root.isDisabled() && 'disabled'" v-else-if="$root.mk.repeatMode == 1"
v-else-if="app.mk.repeatMode == 1" :title="$root.getLz('term.disableRepeatOne')" :title="$root.getLz('term.disableRepeatOne')" v-b-tooltip.hover></button>
v-b-tooltip.hover></button> <button class="playback-button--small repeat active" @click="$root.mk.repeatMode = 0"
<button class="playback-button--small repeat active" @click="app.mk.repeatMode = 0" :class="$root.isDisabled() && 'disabled'" v-else-if="$root.mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')"
v-else-if="app.mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')"
v-b-tooltip.hover></button> v-b-tooltip.hover></button>
</div> </div>
</div> </div>
</div>
<div class="app-chrome-item volume display--large"> <div class="app-chrome-item volume display--large">
<div class="input-container"> <div class="input-container">
<button class="volume-button--small volume" @click="app.muteButtonPressed()" :class="{'active': app.cfg.audio.volume == 0}" <button class="volume-button--small volume" @click="app.muteButtonPressed()" :class="{'active': app.cfg.audio.volume == 0}"
@ -149,6 +152,37 @@
return { return {
app: this.$root, app: this.$root,
tabMode: "lyrics", 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() { beforeMount() {

View file

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

View file

@ -66,29 +66,39 @@
</div> </div>
</div> </div>
<div class="control-buttons"> <div class="control-buttons">
<div class="app-chrome-item"> <div class="app-chrome-item display--large">
<button class="playback-button--small shuffle" v-if="app.mk.shuffleMode == 0" <button class="playback-button--small shuffle" v-if="$root.mk.shuffleMode == 0" :class="$root.isDisabled() && 'disabled'"
@click="app.mk.shuffleMode = 1"></button> @click="$root.mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')" v-b-tooltip.hover></button>
<button class="playback-button--small shuffle active" v-else <button class="playback-button--small shuffle active" v-else :class="$root.isDisabled() && 'disabled'"
@click="app.mk.shuffleMode = 0"></button> @click="$root.mk.shuffleMode = 0" :title="$root.getLz('term.disableShuffle')" v-b-tooltip.hover></button>
</div> </div>
<div class="app-chrome-item"> <div class="app-chrome-item display--large">
<button class="playback-button previous" @click="app.prevButton()"></button> <button class="playback-button previous" @click="$root.prevButton()" :class="$root.isPrevDisabled() && 'disabled'"
:title="$root.getLz('term.previous')" v-b-tooltip.hover></button>
</div> </div>
<div class="app-chrome-item"> <div class="app-chrome-item display--large">
<button class="playback-button pause" @click="app.mk.pause()" v-if="app.mk.isPlaying"></button> <button class="playback-button stop" @click="$root.mk.stop()"
<button class="playback-button play" @click="app.mk.play()" v-else></button> v-if="$root.mk.isPlaying && $root.mk.nowPlayingItem.attributes.playParams.kind == 'radioStation'"
:title="$root.getLz('term.stop')" v-b-tooltip.hover></button>
<button class="playback-button pause" @click="$root.mk.pause()" v-else-if="$root.mk.isPlaying"
:title="$root.getLz('term.pause')" v-b-tooltip.hover></button>
<button class="playback-button play" @click="$root.mk.play()" v-else :title="$root.getLz('term.play')"
v-b-tooltip.hover></button>
</div> </div>
<div class="app-chrome-item"> <div class="app-chrome-item display--large">
<button class="playback-button next" @click="app.skipToNextItem()"></button> <button class="playback-button next" @click="$root.skipToNextItem()" :class="$root.isNextDisabled() && 'disabled'"
:title="$root.getLz('term.next')" v-b-tooltip.hover></button>
</div>
<div class="app-chrome-item display--large">
<button class="playback-button--small repeat" v-if="$root.mk.repeatMode == 0" :class="$root.isDisabled() && 'disabled'"
@click="$root.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="$root.isDisabled() && 'disabled'" v-else-if="$root.mk.repeatMode == 1"
:title="$root.getLz('term.disableRepeatOne')" v-b-tooltip.hover></button>
<button class="playback-button--small repeat active" @click="$root.mk.repeatMode = 0"
:class="$root.isDisabled() && 'disabled'" v-else-if="$root.mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')"
v-b-tooltip.hover></button>
</div> </div>
<div class="app-chrome-item">
<button class="playback-button--small repeat" v-if="app.mk.repeatMode == 0"
@click="app.mk.repeatMode = 1"></button>
<button class="playback-button--small repeat repeatOne" @click="app.mk.repeatMode = 2"
v-else-if="app.mk.repeatMode == 1"></button>
<button class="playback-button--small repeat active" @click="app.mk.repeatMode = 0"
v-else-if="app.mk.repeatMode == 2"></button>
</div> </div>
</div> </div>
<div class="app-chrome-item volume display--large"> <div class="app-chrome-item volume display--large">

View file

@ -71,7 +71,7 @@
<div id="LOADER"> <div id="LOADER">
<%- include("../assets/cider-round.svg") %> <%- include("../assets/cider-round.svg") %>
</div> </div>
<div id="app" :class="getAppClasses()" :style="getAppStyle()" :window-style="cfg.visual.directives.windowLayout"> <div id="app" :class="getAppClasses()" :style="getAppStyle()" :library-visible="(chrome.sidebarCollapsed ? 0 : 1)" :window-style="cfg.visual.directives.windowLayout">
<transition name="fsModeSwitch"> <transition name="fsModeSwitch">
<div id="app-main" v-show="appMode == 'player'"> <div id="app-main" v-show="appMode == 'player'">
<%- include('app/chrome-top'); %> <%- 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 src="index.js?v=1"></script>
<script type="text/x-template" id="am-musiccovershelf"> <script type="text/x-template" id="am-musiccovershelf">

View file

@ -1,17 +1,17 @@
<script type="text/x-template" id="cider-artist"> <script type="text/x-template" id="cider-artist">
<div class="content-inner artist-page" <div class="content-inner artist-page"
:class="[data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9) ? 'animated' : '']"> :class="[(data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9) || hasHero()) ? 'animated' : '']">
<div class="artist-header" :key="data.id" v-observe-visibility="{callback: isHeaderVisible}"> <div class="artist-header" :key="data.id" v-observe-visibility="{callback: isHeaderVisible}">
<animatedartwork-view <animatedartwork-view
:priority="true" :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 ?? '')"> :video="data.attributes.editorialVideo.motionArtistWide16x9.video ?? (data.attributes.editorialVideo.motionArtistFullscreen16x9.video ?? '')">
</animatedartwork-view> </animatedartwork-view>
<div class="header-content" style="pointer-events: all;"> <div class="header-content" style="pointer-events: all;">
<div class="row"> <div class="row">
<div class="col-sm" style="width: auto;"> <div class="col-sm" style="width: auto;">
<div class="artist-image" <div class="artist-image"
v-if="!(data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9))"> v-if="!(data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9))&& !hasHero()">
<mediaitem-artwork <mediaitem-artwork
shadow="large" shadow="large"
:url="data.attributes.artwork ? data.attributes.artwork.url : ''" :url="data.attributes.artwork ? data.attributes.artwork.url : ''"
@ -24,7 +24,7 @@
</div> </div>
</div> </div>
<div class="col flex-center artist-title" <div class="col flex-center artist-title"
:class="{'artist-animation-on': (data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9)) }" :class="{'artist-animation-on': (data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9)) || hasHero() }"
> >
<button class="artist-play" @click="app.mk.setStationQueue({artist:'a-'+data.id}).then(()=>{ <button class="artist-play" @click="app.mk.setStationQueue({artist:'a-'+data.id}).then(()=>{
app.mk.play() app.mk.play()
@ -42,9 +42,12 @@
</button> </button>
</div> </div>
<div class="artworkContainer" <div class="artworkContainer"
v-if="!(data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9))"> v-if="!(data.attributes.editorialVideo && (data.attributes.editorialVideo.motionArtistWide16x9 || data.attributes.editorialVideo.motionArtistFullscreen16x9)) && !hasHero()">
<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>
<div class="artist-hero" v-if="hasHero() && !hasAnimated()">
<mediaitem-artwork shadow="none" :url="hasHero()" size="2048" />
</div>
</div> </div>
<div class="floating-header" <div class="floating-header"
:style="{opacity: (headerVisible ? 0 : 1),'pointer-events': (headerVisible ? 'none' : '')}"> :style="{opacity: (headerVisible ? 0 : 1),'pointer-events': (headerVisible ? 'none' : '')}">
@ -69,7 +72,7 @@
<div class="latestRelease" v-if="data.views['latest-release'].data.length != 0"> <div class="latestRelease" v-if="data.views['latest-release'].data.length != 0">
<h3>{{app.getLz('term.latestReleases')}}</h3> <h3>{{app.getLz('term.latestReleases')}}</h3>
<div style="width: auto;margin: 0 auto;"> <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"> :item="song">
</mediaitem-square> </mediaitem-square>
</div> </div>
@ -164,6 +167,22 @@
} }
}, },
methods: { 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?.centeredFullscreenBackground){
return this.data.attributes?.editorialArtwork?.centeredFullscreenBackground.url
} else if(this.data.attributes?.editorialArtwork?.bannerUber) {
return this.data.attributes?.editorialArtwork?.bannerUber.url
}else if(this.data.attributes?.editorialArtwork?.subscriptionHero){
return this.data.attributes?.editorialArtwork?.subscriptionHero.url
}
return false;
},
isHeaderVisible(visible) { isHeaderVisible(visible) {
this.headerVisible = visible this.headerVisible = visible
}, },

View file

@ -121,7 +121,7 @@
</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="500" images="1"></artwork-material>
</div> </div>
<button class="md-btn md-btn-small editTracksBtn" v-if="(data.attributes.canEdit && data.type == 'library-playlists')" @click="editing = !editing"> <button class="md-btn md-btn-small editTracksBtn" v-if="(data.attributes.canEdit && data.type == 'library-playlists')" @click="editing = !editing">
<span v-if="!editing"> <span v-if="!editing">
@ -294,6 +294,18 @@
this.isInLibrary() this.isInLibrary()
}) })
}, },
beforeMount() {
if( window.location.hash.includes("playlist") ) {
window.addEventListener('keydown', this.getCopiedPlayListSongs);
window.addEventListener('keydown', this.pasteSongs);
}
},
beforeDestroy() {
if( window.location.hash.includes("playlist") ) {
window.removeEventListener('keydown', this.getCopiedPlayListSongs);
window.removeEventListener('keydown', this.pasteSongs);
}
},
watch: { watch: {
data: { data: {
handler: function () { handler: function () {
@ -752,6 +764,49 @@
if (data && typeof data.views != "undefined") return ""; if (data && typeof data.views != "undefined") return "";
return "d-none"; return "d-none";
}, },
async getCopiedPlayListSongs(event) {
if( event.ctrlKey && event.keyCode === 67 ) {
let urls = [];
app.selectedMediaItems.forEach(item => {
this.app.mk.api.v3.music(`/v1/me/library/songs/${item.id}`).then((response) => {
this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/songs/${response.data.data[0].attributes.playParams.catalogId}`).then((response1) => {
urls.push(response1.data.data[0].attributes.url)
navigator.clipboard.writeText(urls)
})
})
})
notyf.success(app.getLz('term.share.success'))
}
},
async pasteSongs(event) {
if( event.ctrlKey && event.keyCode === 86 && this.data.attributes.canEdit ) {
let clipboard = await navigator.clipboard.readText()
let songs = []
clipboard = clipboard.split(",")
clipboard.forEach(item => {
songs.push({
id: item.substring(item.indexOf("i=")+2, item.length),
type: "songs",
})
})
this.app.mk.api.v3.music(`/v1/me/library/playlists/${this.data.id}/tracks`, {}, {
fetchOptions: {
method: "POST",
body: JSON.stringify({
data: songs
})
}
}).then((response) => {
songs.forEach(item => {
this.app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/songs/${item.id}`).then((response1) => {
this.displayListing.push(response1.data.data[0])
})
})
})
}
},
search() { search() {
let filtered = []; let filtered = [];

View file

@ -4,6 +4,9 @@
<span>{{$root.getLz('settings.option.general.keybindings')}}</span> <span>{{$root.getLz('settings.option.general.keybindings')}}</span>
</div> </div>
<div class="settings-option-body"> <div class="settings-option-body">
<div class="md-option-header-sub">
<span>{{$root.getLz('settings.option.general.keybindings.library')}}</span>
</div>
<div class="md-option-line"> <div class="md-option-line">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.description.search')}} {{$root.getLz('settings.description.search')}}
@ -81,6 +84,9 @@
</button> </button>
</div> </div>
</div> </div>
<div class="md-option-header-sub">
<span>{{$root.getLz('settings.option.general.keybindings.session')}}</span>
</div>
<div class="md-option-line"> <div class="md-option-line">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.description.private')}} {{$root.getLz('settings.description.private')}}
@ -92,6 +98,9 @@
</button> </button>
</div> </div>
</div> </div>
<div class="md-option-header-sub">
<span>{{$root.getLz('settings.option.general.keybindings.control')}}</span>
</div>
<div class="md-option-line"> <div class="md-option-line">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.description.remote')}} {{$root.getLz('settings.description.remote')}}
@ -147,6 +156,45 @@
</button> </button>
</div> </div>
</div> </div>
<div class="md-option-header-sub" v-if="app.platform !== 'darwin'">
<span>{{$root.getLz('settings.option.general.keybindings.interface')}}</span>
</div>
<div class="md-option-line" v-if="app.platform !== 'darwin'">
<div class="md-option-segment">
{{$root.getLz('term.zoomin')}}
</div>
<div class="md-option-segment md-option-segment_auto">
<button class="md-btn md-btn-small md-btn-block"
@click="keyBindUpdate('zoomn')">
{{app.cfg.general.keybindings.zoomn.join(' + ')}}
</button>
</div>
</div>
<div class="md-option-line" v-if="app.platform !== 'darwin'">
<div class="md-option-segment">
{{$root.getLz('term.zoomout')}}
</div>
<div class="md-option-segment md-option-segment_auto">
<button class="md-btn md-btn-small md-btn-block"
@click="keyBindUpdate('zoomt')">
{{app.cfg.general.keybindings.zoomt.join(' + ')}}
</button>
</div>
</div>
<div class="md-option-line" v-if="app.platform !== 'darwin'">
<div class="md-option-segment">
{{$root.getLz('term.zoomreset')}}
</div>
<div class="md-option-segment md-option-segment_auto">
<button class="md-btn md-btn-small md-btn-block"
@click="keyBindUpdate('zoomrst')">
{{app.cfg.general.keybindings.zoomrst.join(' + ')}}
</button>
</div>
</div>
<div class="md-option-header-sub">
<span>{{$root.getLz('settings.option.general.keybindings.advanced')}}</span>
</div>
<div class="md-option-line"> <div class="md-option-line">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.description.developer')}} {{$root.getLz('settings.description.developer')}}
@ -243,6 +291,9 @@
app.cfg.general.keybindings.pluginMenu = [app.platform == "darwin" ? "Command" : "Control",app.platform == "darwin" ? "Option" : (app.platform == "linux" ? "Shift" : "Alt"), "P"]; app.cfg.general.keybindings.pluginMenu = [app.platform == "darwin" ? "Command" : "Control",app.platform == "darwin" ? "Option" : (app.platform == "linux" ? "Shift" : "Alt"), "P"];
app.cfg.general.keybindings.castToDevices = [app.platform == "darwin" ? "Command" : "Control",app.platform == "darwin" ? "Option" : (app.platform == "linux" ? "Shift" : "Alt"), "C"]; app.cfg.general.keybindings.castToDevices = [app.platform == "darwin" ? "Command" : "Control",app.platform == "darwin" ? "Option" : (app.platform == "linux" ? "Shift" : "Alt"), "C"];
app.cfg.general.keybindings.settings = [app.platform == "darwin" ? "Command" : "Control", ","]; app.cfg.general.keybindings.settings = [app.platform == "darwin" ? "Command" : "Control", ","];
app.cfg.general.keybindings.zoomn = [app.platform == "darwin" ? "Command" : "Control", "numadd"];
app.cfg.general.keybindings.zoomt = [app.platform == "darwin" ? "Command" : "Control", "numsub"];
app.cfg.general.keybindings.zoomrst = [app.platform == "darwin" ? "Command" : "Control", "num0"];
app.cfg.general.keybindings.openDeveloperTools = [app.platform == "darwin" ? "Command" : "Control", app.platform == "darwin" ? "Option" : "Shift", "I"]; app.cfg.general.keybindings.openDeveloperTools = [app.platform == "darwin" ? "Command" : "Control", app.platform == "darwin" ? "Option" : "Shift", "I"];
notyf.success(app.getLz('settings.notyf.general.keybindings.update.success')); notyf.success(app.getLz('settings.notyf.general.keybindings.update.success'));
bootbox.confirm(app.getLz("settings.prompt.general.keybindings.update.success"), (ok) => { bootbox.confirm(app.getLz("settings.prompt.general.keybindings.update.success"), (ok) => {

View file

@ -28,7 +28,7 @@
<h4>{{ loaded.attributes.uniqueSongCount }} {{$root.getLz('term.uniqueSongs')}}</h4> <h4>{{ loaded.attributes.uniqueSongCount }} {{$root.getLz('term.uniqueSongs')}}</h4>
</div> </div>
<div class="col-auto replay-playlist-container"> <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>
</div> </div>
<!-- Top Artists--> <!-- Top Artists-->

View file

@ -96,8 +96,7 @@
<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>
<option value="radio">{{$root.getLz('term.radio')}}</option> <option value="radio">{{$root.getLz('term.radio')}}</option>
<option value="library-recentlyadded">{{$root.getLz('term.recentlyAdded')}} <option value="library-recentlyadded">{{$root.getLz('term.recentlyAdded')}}</option>
</option>
<option value="library-songs">{{$root.getLz('term.songs')}}</option> <option value="library-songs">{{$root.getLz('term.songs')}}</option>
<option value="library-albums">{{$root.getLz('term.albums')}}</option> <option value="library-albums">{{$root.getLz('term.albums')}}</option>
<option value="library-artists">{{$root.getLz('term.artists')}}</option> <option value="library-artists">{{$root.getLz('term.artists')}}</option>
@ -195,7 +194,7 @@
</div> </div>
<div class="md-option-segment md-option-segment_auto"> <div class="md-option-segment md-option-segment_auto">
<button class="md-btn" @click="app.appRoute('keybinds-settings')" > <button class="md-btn" @click="app.appRoute('keybinds-settings')" >
{{$root.getLz('settings.option.general.keybindings.open')}} {{$root.getLz('action.open')}}
</button> </button>
</div> </div>
</div> </div>
@ -293,7 +292,7 @@
<div class="md-option-segment md-option-segment_auto"> <div class="md-option-segment md-option-segment_auto">
<label> <label>
<input type="checkbox" v-model="app.cfg.advanced.AudioContext" <input type="checkbox" v-model="app.cfg.advanced.AudioContext"
v-on:change="toggleAudioContext" v-on:change="toggleAudioContext" :disabled="app.cfg.advanced.AudioContext === true"
switch/> switch/>
</label> </label>
</div> </div>
@ -339,7 +338,7 @@
</div> </div>
</div> </div>
<div class="md-option-line" <div class="md-option-line"
v-show="app.cfg.advanced.AudioContext && app.cfg.audio.normalization"> v-show="app.cfg.advanced.AudioContext && app.cfg.audio.normalization && app.cfg.audio.advanced">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.option.audio.dbspl.display')}} {{$root.getLz('settings.option.audio.dbspl.display')}}
<br> <br>
@ -595,19 +594,7 @@
</label> </label>
</div> </div>
</div> </div>
<div class="md-option-line">
<div class="md-option-segment">
{{$root.getLz('settings.option.visual.uiscale')}}
</div> </div>
<div class="md-option-segment md-option-segment_auto">
<label>
<input type="number" min="0.5" max="4.0" step="0.25" @change="$root.getHTMLStyle()"
v-model="app.cfg.visual.uiScale"/>
</label>
</div>
</div>
</div>
</div> </div>
</b-tab> </b-tab>
<b-tab :title="$root.getLz('settings.header.lyrics')"> <b-tab :title="$root.getLz('settings.header.lyrics')">
@ -1140,6 +1127,17 @@
</button> </button>
</div> </div>
</div> </div>
<div class="md-option-line">
<div class="md-option-segment">
Performant Logging
<small>Disables debug logging, resulting in a slightly faster Cider. (Requires relaunch)</small>
</div>
<div class="md-option-segment md-option-segment_auto">
<label>
<input type="checkbox" v-model="app.cfg.advanced.disableLogging" switch/>
</label>
</div>
</div>
</div> </div>
<!-- Experimental Settings --> <!-- Experimental Settings -->
@ -1185,6 +1183,20 @@
</div> </div>
</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-line">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.option.advanced.playlistTrackMapping')}} {{$root.getLz('settings.option.advanced.playlistTrackMapping')}}
@ -1201,12 +1213,13 @@
<div class="md-option-line"> <div class="md-option-line">
<div class="md-option-segment"> <div class="md-option-segment">
{{$root.getLz('settings.option.experimental.compactUI')}} {{$root.getLz('settings.option.experimental.compactUI')}}
<small v-if="!!app.getThemeDirective('forceUI')">{{$root.getLz('term.themeManaged')}}</small>
</div> </div>
<div class="md-option-segment md-option-segment_auto"> <div class="md-option-segment md-option-segment_auto">
<label> <label>
<input type="checkbox" v-model="app.cfg.advanced.experiments.includes('compactui')" <input type="checkbox" v-model="app.cfg.advanced.experiments.includes('compactui')"
@click="app.cfg.advanced.experiments.includes('compactui') ? removeExperiment('compactui') : addExperiment('compactui')" @click="app.cfg.advanced.experiments.includes('compactui') ? removeExperiment('compactui') : addExperiment('compactui')"
switch/> switch :disabled="!!app.getThemeDirective('forceUI')"/>
</label> </label>
</div> </div>
</div> </div>
@ -1443,9 +1456,6 @@
if (app.cfg.audio.normalization === true) { if (app.cfg.audio.normalization === true) {
CiderAudio.normalizerOn() CiderAudio.normalizerOn()
} }
if (app.cfg.audio.maikiwiAudio.spatial === true) {
CiderAudio.hierarchical_loading();
}
} }
}) })
} else { } else {
@ -1453,9 +1463,6 @@
if (app.cfg.audio.normalization === true) { if (app.cfg.audio.normalization === true) {
CiderAudio.normalizerOn() CiderAudio.normalizerOn()
} }
if (app.cfg.audio.maikiwiAudio.spatial === true) {
CiderAudio.hierarchical_loading();
}
} }
} else { } else {
CiderAudio.off(); CiderAudio.off();

View file

@ -9,6 +9,20 @@
v-if="artistLoaded" v-if="artistLoaded"
:item="artist" :item="artist"
></artist-chip> ></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> </div>
</script> </script>
<script> <script>