Merge branch 'main' of https://github.com/ciderapp/Cider into main

This commit is contained in:
Jason Chen 2022-06-17 11:33:32 -07:00
commit 90dcde279a
137 changed files with 8653 additions and 4265 deletions

View file

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

View file

@ -6,8 +6,8 @@ contact_links:
- name: Discord Support
url: https://discord.com/invite/AppleMusic
about: For quick support, make a ticket or ask for community support here.
- name: GitHub Troublshooting
url: https://github.com/ciderapp/Cider/wiki/Troubleshooting
- name: Cider Documentation
url: https://docs.cider.sh/support/troubleshooting
about: In most cases, these troubleshooting tips can resolve basic issues. Try them out before opening an issue.
- name: GitHub Issues
url: https://github.com/ciderapp/Cider/issues

Binary file not shown.

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1024 1024" 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;">
<rect x="0" y="0" width="1024" height="1024" style="fill:rgb(110,110,110);"/>
<g transform="matrix(6.05996,0,0,6.05996,189.003,209)">
<path d="M93.161,0.071C59.66,-1.043 32.22,11.314 32.22,11.314L32.2,74.023C28.789,72.669 24.641,72.348 20.428,73.372C11.345,75.579 5.397,83.192 7.143,90.379C8.889,97.566 17.667,101.604 26.749,99.398C35.313,97.317 41.087,90.429 40.256,83.626L40.256,36.771C40.256,36.771 59.66,29.987 84.829,28.286L84.829,63.135C81.455,61.843 77.386,61.55 73.25,62.555C64.167,64.761 58.219,72.374 59.965,79.562C61.71,86.749 70.488,90.786 79.571,88.58C87.502,86.653 93.042,80.603 93.158,74.316L93.161,74.32L93.161,0.071Z" style="fill-opacity:0.16;fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

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

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before After
Before After

View file

@ -1,6 +1,6 @@
<p align="center">
<img src="./resources/banner.png" width="80%" height="60%" alt="Banner"><br>
<b>A new cross-platform Apple Music experience based on Electron and Vue.js written from scratch with performance in mind. 🚀</b>
<b>A new cross-platform Apple Music experience based on Electron and Vue.js written from scratch with performance & visuals in mind. 🚀</b>
<br><br>
<img src="https://img.shields.io/github/stars/ciderapp/Cider?label=Stars" alt="GitHub Stars"/>
<img src="https://img.shields.io/github/forks/ciderapp/Cider?label=Forks" alt="GitHub Forks"/>
@ -18,7 +18,7 @@
</p>
#### Links
* [Wiki](https://docs.cider.sh)
* [Documentation](https://docs.cider.sh)
* [Request Feature](https://github.com/ciderapp/Cider/discussions/new?category=feature-request)
* [Report Bug](https://github.com/ciderapp/Cider/issues/new?assignees=&labels=bug&template=bug_report.md&title=%5BBUG%5D+)
* [**View The Releases**](https://github.com/ciderapp/Cider/releases/latest)
@ -44,8 +44,8 @@
-->
[![Get it from the AUR](https://img.shields.io/badge/Get_It_From_The_AUR-100000?style=for-the-badge&logo=archlinux)](https://aur.archlinux.org/packages/cider)
### Compiling and Configuration
For more information surrounding configuration, compiling and other developer documentation, see the [compilation docs](https://cider.sh/compile.html).
### Insights Snapshot
[![CircleCI](https://dl.circleci.com/insights-snapshot/gh/ciderapp/Cider/main/build_and_release/badge.svg?window=30d)](https://app.circleci.com/insights/github/ciderapp/Cider/workflows/build_and_release/overview?branch=main&reporting-window=last-30-days&insights-snapshot=true)
### Credits
![Contributors](https://contrib.rocks/image?repo=ciderapp/Cider)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 KiB

After

Width:  |  Height:  |  Size: 110 KiB

Before After
Before After

4939
cider.lock

File diff suppressed because it is too large Load diff

View file

@ -39,7 +39,7 @@
"appx": {
"applicationId": "CiderAlpha",
"publisher": "CN=CiderCollective, OID.2.25.311729368913984317654407730594956997722=1",
"displayName": "Cider (Alpha)",
"displayName": "Cider",
"identityName": "CiderCollective.CiderAlpha",
"backgroundColor": "transparent",
"setBuildNumber": true

View file

@ -2,7 +2,7 @@
"name": "cider",
"applicationId": "Cider",
"productName": "Cider",
"version": "1.5.0",
"version": "1.5.1",
"description": "A new cross-platform Apple Music experience based on Electron and Vue.js written from scratch with performance in mind.",
"license": "AGPL-3.0",
"main": "./build/index.js",
@ -40,7 +40,7 @@
"@sentry/electron": "^3.0.7",
"@sentry/integrations": "^6.19.6",
"adm-zip": "0.4.10",
"airtunes2": "git+https://github.com/vapormusic/node_airtunes2.git#hap",
"airtunes2": "git+https://github.com/ciderapp/node_airtunes2",
"castv2-client": "^1.2.0",
"chokidar": "^3.5.3",
"discord-auto-rpc": "^1.0.16",
@ -54,6 +54,7 @@
"electron-window-state": "^5.0.3",
"express": "^4.17.3",
"get-port": "^5.1.1",
"jimp": "^0.16.1",
"jsonc": "^2.0.0",
"lastfmapi": "^0.1.1",
"mdns-js": "git+https://github.com/ciderapp/node-mdns-js.git",
@ -110,9 +111,9 @@
}
],
"build": {
"electronVersion": "19.0.1",
"electronVersion": "18.3.3",
"electronDownload": {
"version": "19.0.1+wvcus",
"version": "18.3.3+wvcus",
"mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
},
"appId": "cider",

View file

@ -15,7 +15,7 @@ const patch = version[2].split('-');
if (process.env['CIRCLE_BRANCH'] === 'release') {
pkg.version = `${version[0]}.${version[1]}.${patch[0]}`
} else if (process.env['CIRCLE_BRANCH'] === 'main') {
pkg.version = `${version[0]}.${version[1]}.${patch[0]}-beta.${patch[1]}`
pkg.version = `${version[0]}.${version[1]}.${patch[0]}.beta.${patch[1]}`
} else {
pkg.version = `${version[0]}.${version[1]}.${patch[0]}-${channel}.${process.env['CIRCLE_BUILD_NUM']}`
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 6 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 5 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

After

Width:  |  Height:  |  Size: 6.4 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

After

Width:  |  Height:  |  Size: 7 KiB

Before After
Before After

View file

@ -1,8 +1,20 @@
#!/bin/bash
LATESTSHA=$(curl -s https://api.github.com/repos/ciderapp/Cider/branches/stable | grep sha | cut -d '"' -f 4 | sed 's/v//' | xargs)
COMMITSINCESTABLE=$(git rev-list $LATESTSHA..HEAD --count)
VERSION=$(grep '"version":.*' package.json | cut -d '"' -f 4 | head -1)
echo
NEWVERSION=${VERSION/-/.}-$COMMITSINCESTABLE
npm version $NEWVERSION
LATEST_SHA=$(curl -s https://api.github.com/repos/ciderapp/Cider/branches/stable | grep sha | cut -d '"' -f 4 | sed 's/v//' | xargs)
COMMITSINCESTABLE=$(git rev-list $LATEST_SHA..HEAD --count)
CURRENT_VERSION=$(node -p -e "require('./package.json').version")
CIRCLE_BRANCH="main"
if [[ $CIRCLE_BRANCH == "main" && $COMMITSINCESTABLE -gt 0 ]]; then
NEW_VERSION="${CURRENT_VERSION}-beta.${COMMITSINCESTABLE}"
else
NEW_VERSION=${CURRENT_VERSION/0/$COMMITSINCESTABLE}
fi
if [[ $COMMITSINCESTABLE -gt 0 ]]; then
echo "Version: $NEW_VERSION"
sed -i "0,/$CURRENT_VERSION/s//$NEW_VERSION/" package.json
else
echo "Version unchanged, commits since stable is ${COMMITSINCESTABLE}"
fi
echo "export APP_VERSION=$(node -p -e 'require("./package.json").version')" >>$BASH_ENV

View file

@ -18,7 +18,7 @@ const CiderKit = {
body: body,
options: options
})
let response = await fetch("http://localhost:9000/api/musickit/v3", opts);
let response = await fetch("./api/musickit/v3", opts);
return response.json()
}
}

View file

@ -383,7 +383,9 @@ Update 14/05/2022 02:00 UTC
* `settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2`: Added for `en_US`
* `settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1`: Added for `en_US`
* `settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600`: Added for `en_US`
* `settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500`: Added for `en_US`
* `settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A`: Added for `en_US`
* `settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B`: Added for `en_US`
* `settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C`: Added for `en_US`
Update 18/05/2022 14:20 UTC
@ -427,3 +429,26 @@ Update 24/05/2022 21:15 UTC
* `settings.option.general.updateCider.branch.main`: Deleted for all language files
* `settings.option.general.updateCider.branch.develop`: Deleted for all language files
* `settings.notyf.updateCider.update-error`: Deleted for all language files
Update 30/5/2022 05:35 UTC
* `settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM`: Added to `en_US`
* `settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE`: Added to `en_US`
* `settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk`: Added to `en_US`
* `settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k`: Added to `en_US`
* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive`: Added to `en_US`
* `settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy`: Added to `en_US`
Update 03/06/2022 11:40 UTC
* `settings.option.connectivity.discordRPC.reload`: Added to `en_US`
* `settings.option.connectivity.discordRPC.reconnectedToUser`: Added to `en_US`
Update 10/06/2022 20:00 UTC
* `settings.option.visual.purplePodcastPlaybackBar`: Added to `en_US`
Update 14/06/2022 14:10 UTC
* `term.themeManaged`: Added to `en_US`

View file

@ -7,7 +7,7 @@
"date.format": "${d}.${m}.${y}",
"dialog.cancel": "Abbrechen",
"dialog.ok": "OK",
"notification.updatingLibrarySongs": "Aktualisiere Songs...",
"notification.updatingLibrarySongs": "Aktualisiere Titel...",
"notification.updatingLibraryAlbums": "Aktualisiere Alben...",
"notification.updatingLibraryArtists": "Aktualisiere Künstler...",
"term.appleInc": "Apple Inc.",
@ -24,13 +24,13 @@
"term.privateSession": "Private Sitzung",
"term.queue": "Warteschlange",
"term.history": "Verlauf",
"term.search": "Suche",
"term.search": "Suchen",
"term.library": "Mediathek",
"term.listenNow": "Jetzt hören",
"term.browse": "Entdecken",
"term.radio": "Radio",
"term.recentlyAdded": "Zuletzt hinzugefügt",
"term.songs": "Songs",
"term.songs": "Titel",
"term.albums": "Alben",
"term.artists": "Künstler",
"term.podcasts": "Podcasts",
@ -113,7 +113,7 @@
"term.contributors": "Mithelfer",
"term.equalizer": "Equalizer",
"term.reset": "Zurücksetzen",
"term.tracks": "Lieder",
"term.tracks": "Titel",
"term.videos": "Videos",
"term.menu": "Menü",
"term.check": "Nach Updates suchen",
@ -179,8 +179,8 @@
"action.unfollow": "Entfolgen",
"action.unfollow.success": "Entfolgt",
"action.unfollow.error": "Fehler beim Entfolgen",
"action.playNext": "Spiele als Nächstes",
"action.playLater": "Spiele später",
"action.playNext": "Nächster Titel",
"action.playLater": "Zuletzt wiedergeben",
"action.startRadio": "Starte Radio",
"action.goToArtist": "Gehe zu Künstler",
"action.goToAlbum": "Gehe zu Album",
@ -192,9 +192,9 @@
"action.dislike": "Dislike",
"action.undoDislike": "Dislike entfernen",
"action.showWebRemoteQR": "Web-Remote",
"action.playTracksNext": "Spiele ${app.selectedMediaItems.length} Lieder als Nächstes",
"action.playTracksLater": "Spiele ${app.selectedMediaItems.length} Lieder später",
"action.removeTracks": "Entferne ${self.selectedItems.length} Lieder aus der Warteschlange",
"action.playTracksNext": "Spiele ${app.selectedMediaItems.length} Titel als Nächstes",
"action.playTracksLater": "Spiele ${app.selectedMediaItems.length} Titel später",
"action.removeTracks": "Entferne ${self.selectedItems.length} Titel aus der Warteschlange",
"action.import": "Importieren",
"action.export": "Exportieren",
"action.showAlbum": "Ganzes Album anzeigen",
@ -282,6 +282,44 @@
"settings.option.experimental.compactUI": "Kompaktes UI",
"settings.option.window.close_button_hide": "Schließtaste soll die App verbergen",
"settings.option.experimental.inline_playlists": "Inline Playlists und Alben",
"settings.header.advanced": "Erweitert",
"settings.option.debug.openAppData": "Öffne Cider-Ordner",
"settings.option.visual.theme.github.explore": "Durchsuche GitHub Themes",
"settings.option.visual.plugin.github.explore": "Durchsuche GitHub Plugins",
"settings.option.experimental.reinstallwidevine": "WidevineCDM neu installieren",
"settings.option.experimental.reinstallwidevine.confirm": "Möchtest du wirklich Widevine neu installieren?",
"settings.option.visual.theme.checkForUpdates": "Nach Updates suchen",
"settings.option.visual.theme.manageStyles": "Styles verwalten",
"settings.option.window.useNativeTitleBar": "Native Fenster-Titelleiste verwenden",
"settings.option.window.windowControlStyle": "Fenstersteuerungs-Stil",
"settings.option.window.windowControlStyle.right": "Rechts",
"settings.option.experimental.unknownPlugin": "Unbekannte Quellen",
"settings.option.experimental.unknownPlugin.description": "Erlaube Installation von Plugins von anderen Quellen als der Cider-Plugin-Quelle",
"settings.option.window.windowControlStyle.left": "Links",
"settings.option.visual.windowStyle": "Fenster-Style",
"settings.option.general.resumebehavior": "Fortsetzungs-Verhalten",
"settings.option.general.resumebehavior.description": "Fortsetzungs-Verhalten beeinflusst, wie Cider die Sitzung fortsetzt, wenn man zur App zurückkehrt.",
"settings.option.general.resumebehavior.locally": "Lokal",
"settings.option.general.resumebehavior.locally.description": "Cider wird die letzte Sitzung auf diesem Rechner fortsetzen.",
"settings.option.general.resumebehavior.history": "Verlauf",
"settings.option.general.resumebehavior.history.description": "Cider wird den letzten Song aus dem geräteübergreifenden Apple-Music-Verlauf in die Warteschlange stellen.",
"settings.option.general.resumetabs" : "Tab beim Start öffnen",
"settings.option.general.resumetabs.description" : "Wähle welcher Tab beim Starten von Cider geöffnet werden soll.",
"settings.option.general.resumetabs.dynamic" : "Dynamisch",
"settings.option.general.resumetabs.dynamic.description" : "Cider wird den zuletzt genutzten Tab öffnen.",
"settings.option.general.keybindings": "Tastenkombinationen",
"settings.option.general.keybindings.pressCombination": "Drücke eine Kombination aus zwei Tasten um die Tastenkombination zu aktualisieren.",
"settings.option.general.keybindings.pressEscape": "Drücke Escape um zurückzukehren.",
"settings.notyf.general.keybindings.update.success": "Tastenkombination erfolgreich aktualisiert",
"settings.prompt.general.keybindings.update.success": "Tastenkombination erfolgreich aktualisiert. Drücke OK um Cider neuzustarten.",
"settings.option.general.keybindings.open": "Öffnen",
"settings.option.general.themeUpdateNotification": "Automatisch nach Theme-Updates suchen",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Verwaltet vom Audio Lab",
"settings.option.advanced.playlistTrackMapping.description": "Ermöglicht tiefes Scannen von Wiedergabelisten, um festzustellen, welche Titel sich in welchen Wiedergabelisten befinden. Die Erstellungszeiten für den Wiedergabelisten-Cache können sich erheblich verlängern.",
"settings.option.visual.transparent": "Transparentes Fenster",
"settings.option.visual.transparent.description": "Benötigt Theme Support, Neustart erforderlich",
"action.cast.todevices": "An Geräte streamen",
"action.cast.stop": "Streamen an alle Geräte beenden",
"spatial.notTurnedOn": "Die Audio-Spatialisierung ist deaktiviert. Um sie zu verwenden, musst du diese zuerst aktivieren.",
"spatial.spatialProperties": "Räumliche Einstellungen",
"spatial.width": "Breite",
@ -299,10 +337,54 @@
"spatial.right": "Rechts",
"spatial.back": "Hinten",
"spatial.down": "Unten",
"spatial.listener": "Hörer*in",
"spatial.listener": "Hörer",
"spatial.audioSource": "Audioquelle",
"settings.header.unfinished": "Unvollendet",
"settings.option.window.openOnStartup": "Öffne Cider beim Start",
"settings.option.window.openOnStartup.hidden": "Öffne Cider minimiert",
"term.audioControls": "Lautstärkeregelung",
"term.variables": "Variablen",
"settings.option.audio.volumeStep": "Lautstärke-Schritt",
"settings.option.audio.maxVolume": "Max. Lautstärke",
"settings.option.audio.changePlaybackRate": "Wiedergabegeschwindigkeit ändern",
"settings.option.audio.playbackRate": "Wiedergabegeschwindigkeit",
"settings.option.audio.playbackRate.change": "Ändern",
"settings.option.audio.dbspl.display": "dB SPL Anzeige",
"settings.option.audio.dbspl.description": "(Nur für erfahrene Benutzer) Zeigt dB SPL anstelle von dBFS am Lautstärkeregler.",
"settings.option.audio.dbfs.calibration": "0 dBFS Kalibration",
"settings.option.audio.dbfs.description": "Geb den Spitzenwert des Z-gewichteten dB SPL an, wenn Cider auf 0 dBFS steht.",
"settings.option.connectivity.discordRPC.hideButtons": "Buttons im Discord Rich Presence ausblenden",
"settings.option.connectivity.discordRPC.hideTimestamp": "Zeitstempel im Discord Rich Presence ausblenden",
"settings.option.general.showLovedTracksInline": "Zeige geliebte Titel inline",
"settings.option.audio.advanced": "Erweiterte Lautstärkeregelung",
"remote.web.title": "Cider Remote",
"remote.web.description": "Scanne den QR-Code um dein Handy mit dieser Cider-Instanz zu verbinden",
"about.thanks": "Vielen lieben Dank an das Cider Collective Team und an alle Mithelfer."
"about.thanks": "Vielen lieben Dank an das Cider Collective Team und an alle Mithelfer.",
"term.navigateBack": "Zurück",
"term.navigateForward": "Weiter",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Verbessert die wahrgenommene Audioqualität von AAC-kodierten Audiodaten durch die Verwendung eines Echtzeit-Algorithmus, der sowohl psychoakustische Modelle des menschlichen Gehörs als auch AAC-Kodierungsmerkmale nutzt.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Verwirklicht eine andere musikalische Atmosphäre, die nach dem Stand der Technik von Audio-Setups modelliert ist.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Ändert die Betriebsart des Atmosphere Realizer-Moduls.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Vorabgestimmter Spatialisierungseffekt. Deaktiviert die anpassbaren Einstellungen der Audio-Spatialisierung.",
"settings.option.audio.audioLab.description": "Eine Auswahl an selbst entwickelten Audioeffekten für Cider.",
"action.open": "Öffnen",
"settings.option.visual.theme.github.openfolder": "Öffne Themes Ordner",
"settings.option.debug.copy_log": "Logs in die Zwischenablage kopieren",
"settings.header.visual.theme.github.page": "Themes von GitHub",
"settings.header.visual.plugin.github.page": "Plugins von GitHub",
"settings.option.connectivity.discordRPC.reload": "DiscordRPC neu laden",
"menubar.options.reload": "Neu laden",
"settings.option.general.customizeSidebar": "Seitenleistenelemente anpassen",
"settings.option.general.customizeSidebar.customize": "Anpassen",
"settings.header.window": "Fenster",
"settings.option.visual.theme.github.available": "Verfügbar",
"settings.option.visual.theme.github.applied": "Angewandt",
"action.createNew": "Erstellen...",
"settings.option.connect.link_account": "Synchronisierung mit Cider Connect aktivieren",
"settings.option.connect.link_account.description": "Wenn du deinen Discord-Account mit Cider Connect verknüpfst, kannst du Benutzerdaten speichern, einschließlich Einstellungen, EQs und eventuell mehr, sobald es fertig ist. (Work in Progress)",
"action.editTracklist": "Playlist bearbeiten",
"term.track": {
"one": "Titel",
"other": "Titel"
}
}

View file

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

View file

@ -131,6 +131,8 @@
"term.audioControls": "Vowume Contwows",
"term.clearAll": "Cweaw Aww",
"term.recentStations": "Wecent Stations",
"term.personalStations": "Pewsonyaw Stations",
"term.amLive": "Appwe Music Wive",
"term.language": "Wanguage",
"term.funLanguages": "Fun",
"term.noLyrics": "Woading... / Wywics nyot found./ Instwumentaw.",
@ -210,6 +212,12 @@
"podcast.episodes": "Episodes",
"podcast.playEpisode": "Pway Episode",
"podcast.website": "Podcast Website",
"action.hideLibrary": "Hide Wibwawy",
"action.showLibrary": "Show Wibwawy",
"action.cut": "Cut",
"action.paste": "Paste",
"action.selectAll": "Sewect Aww",
"action.delete": "Dewete",
"action.edit": "Edit",
"action.done": "Donye",
"action.editTracklist": "Edit Twackwist",
@ -261,6 +269,7 @@
"action.tray.playpause": "Pway/Pause",
"action.tray.next": "Nyext",
"action.tray.previous": "Pwevious",
"action.tray.listento": "Wisten To:",
"action.update": "Update",
"action.install": "Instaww",
"action.copy": "Copy",
@ -364,6 +373,7 @@
"settings.header.audio": "Audio",
"settings.header.audio.description": "Adjust the audio settings fow Cidew.",
"settings.option.audio.volumeStep": "Vowume Step",
"settings.option.audio.advanced": "Advanced Vowume Contwow",
"settings.option.audio.maxVolume": "Max Vowume",
"settings.option.audio.changePlaybackRate": "Change Pwayback Wate",
"settings.option.audio.playbackRate": "Pwayback Wate",
@ -396,20 +406,29 @@
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Weawizes a diffewent musicaw atmosphewe modewwed aftew the state of the awt audio setups.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cidew Atmosphewe Weawizew™ Mode",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Changes the mode of opewation of the Atmosphewe Weawizew moduwe.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Nyatuwaw (Standawd)",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Nyatuwaw (Pwus)",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Hōjicha Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Genmaicha Tapioca Miwk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Wock Sawt Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Uji Matcha Miwk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jasminye Macchiato",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Miwk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Moonwight Softcake",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Bwown Sugaw Cweme Bwûwée Miwk",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Cuddwe Wawmth",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cidew Adwenyawinye Pwocessow™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Enhances the pewceived audio quawity of 256 kbps AAC audio by using a weaw-time awgowithm that takes advantage of both psychoacoustic modews of human heawing and AAC encoding chawactewistics.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Enhances the pewceived audio quawity of AAC encoded audio by using a weaw-time awgowithm that takes advantage of both psychoacoustic modews of human heawing and AAC encoding chawactewistics.",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP is nyot compatibwe with Spatiawization. Pwease disabwe Spatiawization to continyue.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Stwength",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the stwength of the pwocessing donye to the audio. (Aggwessive may yiewd undesiwabwe wesuwts)",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standawd",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptive",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Wegacy",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggwessive",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Nyowmawization",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Nyowmawizes peak vowume fow individuaw twacks to cweate a mowe unyifowm wistenying expewience. (Does nyot wowk on usew upwoaded twacks)",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Manyaged by Audio Wab",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cidew Tunyed Spatiawization",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pwe-tunyed Spatiawizing Effect, disabwes the customizabwe settings of Audio Spatiawization. Spatiawization must be enyabwed as a pwewequisite.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pwe-tunyed Spatiawizing Effect, disabwes the customizabwe settings of Audio Spatiawization.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cidew Spatiawization Pwofiwe",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Changes the Tunying Pwofiwe of the Spatiawization.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standawd",
@ -417,6 +436,9 @@
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Sepawation",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minyimaw",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophiwe",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Diffused",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encowe",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encowe",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatiawization is nyot compatibwe with CAP. Pwease disabwe CAP to continyue.",
"settings.option.audio.dbspl.display": "dB SPW Dispway",
"settings.option.audio.dbspl.description": "(Advanced usews onwy) Dispway dB SPW instead of dBFS on the vowume swidew.",
@ -498,6 +520,8 @@
"settings.option.connectivity.discordRPC.hideTimestamp": "Hide timestamp on Discowd Wich Pwesence",
"settings.option.connectivity.discordRPC.detailsFormat": "Detaiws Fowmat",
"settings.option.connectivity.discordRPC.stateFormat": "State Fowmat",
"settings.option.connectivity.discordRPC.reload": "Wewoad DiscowdWPC",
"settings.option.connectivity.discordRPC.reconnectedToUser": "DiscowdWPC Weconnyected to Usew: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Wast.fm Scwobbwing",
"settings.option.connectivity.lastfmScrobble.delay": "Wast.fm Scwobbwe Deway (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Enyabwe Wast.fm Nyow Pwaying",
@ -555,5 +579,44 @@
"share.platform.email": "Emaiw",
"share.platform.songLink": "Copy with song.wink",
"share.platform.clipboard": "Copy Wink",
"about.thanks": "Majow thanks to the Cidew Cowwective Team and aww of ouw contwibutows."
}
"about.thanks": "Majow thanks to the Cidew Cowwective Team and aww of ouw contwibutows.",
"oobe.yes": "Yes",
"oobe.no": "Nyo",
"oobe.next": "Nyext",
"oobe.previous": "Pwevious",
"oobe.done": "Donye",
"oobe.amupsell.title": "Befowe we stawt",
"oobe.amupsell.text": "Cidew wequiwes an active, paid Appwe Music subscwiption\nCidew wiww nyot wowk with Appwe Music Voice Pwan ow some pwomotionyaw twiaw subscwiptions. If you awweady have a quawified Appwe Music subscwiption cwick Nyext to continyue.",
"oobe.amupsell.subscribeBtn": "Subscwibe to Appwe Music",
"oobe.amupsell.explainBtn": "Expwain",
"oobe.amupsell.subscribeUrl": "https://appwe.co/3MdqJVQ",
"oobe.amupsell.amWebUrl": "https://beta.music.appwe.com/",
"oobe.amupsell.promoExplained": "Some pwomotionyaw and nyon US Appwe Music twiaw subscwiptions do nyot have access to the wequiwed Appwe Music Web Pwayew API's nyeeded fow Cidew to function. To vewify if youw active twiaw wiww wowk with Cidew go to <a hwef='{{ amWebUrl }}'>{{ amWebUrl }}</a> log in and try to play some music. If it works, great! You're ready to use Cider, however if it does not consider subscribing to Apple Music here: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
"oobe.intro.title": "Wewcome to Cidew",
"oobe.intro.subtitle": "",
"oobe.intro.text": "Wet's get a few things set up so you can use Cidew, how you'd wike. You can awways change these settings watew.",
"oobe.general.title": "Genyewaw",
"oobe.general.subtitle": "",
"oobe.general.text": "",
"oobe.audio.title": "Audio",
"oobe.audio.subtitle": "",
"oobe.audio.text": "Cidew featuwes a custom tunyed and designyed audio stack that dewivews a wich high quawity audio expewience.\nFeatuwing Cidew Adwenyawinye, Atmosphewe Weawizew, and Spatiawized Audio.\nTo enyabwe this functionyawity \"Advanced Audio Functionyawity\" must be enyabwed.\nEnyabwing Advanced Audio Functionyawity wiww give you access to these enhancements in the Cidew Audio Wabs, found in the app settings.",
"oobe.audio.advancedFunctionality": "",
"oobe.visual.title": "Visuaw",
"oobe.visual.subtitle": "",
"oobe.visual.text": "",
"oobe.visual.layout.text": "Cidew featuwes two window diffewent wayouts.\nMavewick is an iTunyes wike wayout with the pwayew at the top of the window.\nMojave is a nyew spin cweated by the Cidew Cowwective.\n\nYou can change the wayout any time in the settings.",
"oobe.visual.suggestingThemes": "Theming is a gweat way to pewsonyawize youw expewience. Hewe awe a few we suggest: ",
"oobe.visual.suggestingThemes.subtext": "(These themes wiww be downwoaded fwom GitHub)",
"oobe.visual.suggestingThemes.default": "Cidew",
"oobe.visual.suggestingThemes.default.text": "The cwassic Cidew theme.",
"oobe.visual.suggestingThemes.dark": "Dawk",
"oobe.visual.suggestingThemes.dark.text": "Dawknyess.",
"oobe.visual.suggestingThemes.community1": "Gwoovy",
"oobe.visual.suggestingThemes.community1.text": "A WinUI infwuenced theme",
"oobe.visual.suggestingThemes.community2": "iTheme",
"oobe.visual.suggestingThemes.community2.text": "The cwassic big fwuit wayout.",
"oobe.visual.suggestingThemes.community3": "Dwacuwa",
"oobe.visual.suggestingThemes.community3.text": "The iconyic Dwacuwa cowow scheme.",
"oobe.amsignin.title": ""
}

View file

@ -2,7 +2,7 @@
"i18n.languageName": "English (US)",
"i18n.languageNameEnglish": "English (US)",
"i18n.category": "main",
"i18n.authors": "@maikirakiwi @kyw504100 @nosh118",
"i18n.authors": "@notmaikiwi @kyw504100 @nosh118 @cryptofyre",
"app.name": "Cider",
"date.format": "${m} ${d}, ${y}",
"dialog.cancel": "Cancel",
@ -42,6 +42,7 @@
"term.artists": "Artists",
"term.podcasts": "Podcasts",
"term.playlists": "Playlists",
"term.charts": "Charts",
"term.playlist": "Playlist",
"term.newPlaylist": "New Playlist",
"term.newPlaylistFolder": "New Playlist Folder",
@ -133,6 +134,7 @@
"term.recentStations": "Recent Stations",
"term.personalStations": "Personal Stations",
"term.amLive": "Apple Music Live",
"term.live": "LIVE",
"term.language": "Language",
"term.funLanguages": "Fun",
"term.noLyrics": "Loading... / Lyrics not found./ Instrumental.",
@ -153,6 +155,7 @@
},
"term.videos": "Videos",
"term.menu": "Menu",
"term.themeManaged": "Managed by a theme",
"term.check": "Check",
"term.aboutArtist": "About {{artistName}}",
"term.topResult": "Top Result",
@ -192,6 +195,8 @@
"term.confirmLogout": "Are you sure you want to logout?",
"term.creditDesignedBy": "Designed by ${authorUsername}",
"term.discNumber": "Disc ${discNumber}",
"home.syncFavorites": "Sync Favorites",
"home.syncFavorites.gettingArtists": "Getting Favorited Artists...",
"home.title": "Home",
"home.recentlyPlayed": "Recently Played",
"home.recentlyAdded": "Recently Added",
@ -212,6 +217,14 @@
"podcast.episodes": "Episodes",
"podcast.playEpisode": "Play Episode",
"podcast.website": "Podcast Website",
"action.favorite": "Favorite",
"action.removeFavorite": "Remove Favorite",
"action.hideLibrary": "Hide Library",
"action.showLibrary": "Show Library",
"action.cut": "Cut",
"action.paste": "Paste",
"action.selectAll": "Select All",
"action.delete": "Delete",
"action.edit": "Edit",
"action.done": "Done",
"action.editTracklist": "Edit Tracklist",
@ -367,6 +380,7 @@
"settings.header.audio": "Audio",
"settings.header.audio.description": "Adjust the audio settings for Cider.",
"settings.option.audio.volumeStep": "Volume Step",
"settings.option.audio.advanced": "Advanced Volume Control",
"settings.option.audio.maxVolume": "Max Volume",
"settings.option.audio.changePlaybackRate": "Change Playback Rate",
"settings.option.audio.playbackRate": "Playback Rate",
@ -405,19 +419,25 @@
"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.Z3600": "Hokkaido Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500": "Moonlight Softcake",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Moonlight 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.CUDDLE": "Cuddle Warmth",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Enhances the perceived audio quality of AAC encoded audio by using a real-time algorithm that takes advantage of both psychoacoustic models of human hearing and AAC encoding characteristics.",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP is not compatible with Spatialization. Please disable Spatialization to continue.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptive",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Legacy",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggressive",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalization",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience. (Does not work on user uploaded tracks)",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Managed by Audio Lab",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider Tuned Spatialization",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pre-tuned Spatializing Effect, disables the customizable settings of Audio Spatialization. Spatialization must be enabled as a prerequisite.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pre-tuned Spatializing Effect, disables the customizable settings of Audio Spatialization.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider Spatialization Profile",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Changes the Tuning Profile of the Spatialization.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standard",
@ -426,6 +446,8 @@
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minimal",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Diffused",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatialization is not compatible with CAP. Please disable CAP to continue.",
"settings.option.audio.dbspl.display": "dB SPL Display",
"settings.option.audio.dbspl.description": "(Advanced users only) Display dB SPL instead of dBFS on the volume slider.",
@ -434,10 +456,15 @@
"settings.header.visual": "Visual",
"settings.header.visual.description": "Adjust the visual settings for Cider.",
"settings.option.visual.windowStyle": "Window Style",
"settings.option.visual.customAccentColor": "Custom Accent Color",
"settings.option.visual.accentColor": "Accent Color",
"settings.option.visual.purplePodcastPlaybackBar": "Purple Playback Bar for Podcasts",
"settings.option.visual.windowColor": "Window Tint Color",
"settings.option.visual.windowBackgroundStyle": "Window Background Style",
"settings.header.visual.windowBackgroundStyle.none": "None",
"settings.header.visual.windowBackgroundStyle.artwork": "Artwork",
"settings.header.visual.windowBackgroundStyle.image": "Image",
"settings.header.visual.windowBackgroundStyle.color": "Color Tint",
"settings.option.visual.animatedArtwork": "Animated Artwork",
"settings.header.visual.animatedArtwork.always": "Always",
"settings.header.visual.animatedArtwork.limited": "Limited to pages and special entries",
@ -507,6 +534,8 @@
"settings.option.connectivity.discordRPC.hideTimestamp": "Hide timestamp on Discord Rich Presence",
"settings.option.connectivity.discordRPC.detailsFormat": "Details Format",
"settings.option.connectivity.discordRPC.stateFormat": "State Format",
"settings.option.connectivity.discordRPC.reload": "Reload DiscordRPC",
"settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPC Reconnected to User: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing",
@ -564,5 +593,44 @@
"share.platform.email": "Email",
"share.platform.songLink": "Copy with song.link",
"share.platform.clipboard": "Copy Link",
"about.thanks": "Major thanks to the Cider Collective Team and all of our contributors."
"about.thanks": "Major thanks to the Cider Collective Team and all of our contributors.",
"oobe.yes": "Yes",
"oobe.no": "No",
"oobe.next": "Next",
"oobe.previous": "Previous",
"oobe.done": "Done",
"oobe.amupsell.title": "Before we start",
"oobe.amupsell.text": "Cider requires an active, paid Apple Music subscription\nCider will not work with Apple Music Voice Plan or some promotional trial subscriptions. If you already have a qualified Apple Music subscription click Next to continue.",
"oobe.amupsell.subscribeBtn": "Subscribe to Apple Music",
"oobe.amupsell.explainBtn": "Explain",
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
"oobe.amupsell.promoExplained": "Some promotional and non US Apple Music trial subscriptions do not have access to the required Apple Music Web Player API's needed for Cider to function. To verify if your active trial will work with Cider go to <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> log in and try to play some music. If it works, great! You're ready to use Cider, however if it does not consider subscribing to Apple Music here: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
"oobe.intro.title": "Welcome to Cider",
"oobe.intro.subtitle": "",
"oobe.intro.text": "Let's get a few things set up so you can use Cider, how you'd like. You can always change these settings later.",
"oobe.general.title": "General",
"oobe.general.subtitle": "",
"oobe.general.text": "",
"oobe.audio.title": "Audio",
"oobe.audio.subtitle": "",
"oobe.audio.text": "Cider features a custom tuned and designed audio stack that delivers a rich high quality audio experience.\nFeaturing Cider Adrenaline, Atmosphere Realizer, and Spatialized Audio.\nTo enable this functionality \"Advanced Audio Functionality\" must be enabled.\nEnabling Advanced Audio Functionality will give you access to these enhancements in the Cider Audio Labs, found in the app settings.",
"oobe.audio.advancedFunctionality": "",
"oobe.visual.title": "Visual",
"oobe.visual.subtitle": "",
"oobe.visual.text": "",
"oobe.visual.layout.text": "Cider features two window different layouts.\nMaverick is an iTunes like layout with the player at the top of the window.\nMojave is a new spin created by the Cider Collective.\n\nYou can change the layout any time in the settings.",
"oobe.visual.suggestingThemes": "Theming is a great way to personalize your experience. Here are a few we suggest: ",
"oobe.visual.suggestingThemes.subtext": "(These themes will be downloaded from GitHub)",
"oobe.visual.suggestingThemes.default": "Cider",
"oobe.visual.suggestingThemes.default.text": "The classic Cider theme.",
"oobe.visual.suggestingThemes.dark": "Dark",
"oobe.visual.suggestingThemes.dark.text": "Darkness.",
"oobe.visual.suggestingThemes.community1": "Groovy",
"oobe.visual.suggestingThemes.community1.text": "A WinUI influenced theme",
"oobe.visual.suggestingThemes.community2": "iTheme",
"oobe.visual.suggestingThemes.community2.text": "The classic big fruit layout.",
"oobe.visual.suggestingThemes.community3": "Dracula",
"oobe.visual.suggestingThemes.community3.text": "The iconic Dracula color scheme.",
"oobe.amsignin.title": ""
}

313
src/i18n/fi_FI.json Normal file
View file

@ -0,0 +1,313 @@
{
"i18n.languageName": "Suomi (FI)",
"i18n.languageNameEnglish": "Finnish (FI)",
"i18n.category": "main",
"i18n.authors": "@marcusziade",
"app.name": "Cider",
"date.format": "${d} ${m}, ${y}",
"dialog.cancel": "Peruuta",
"dialog.ok": "OK",
"notification.updatingLibrarySongs": "Päivitä kirjaston kappaleet...",
"notification.updatingLibraryAlbums": "Päivitä kirjaston albumit...",
"notification.updatingLibraryArtists": "Päivitä kirjaston artistit...",
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
"term.itunes": "iTunes",
"term.github": "GitHub",
"term.discord": "Discord",
"term.learnMore": "Näytä lisää",
"term.accountSettings": "Tilin asetukset",
"term.logout": "Kirjaudu ulos",
"term.login": "Kirjaudu sisään",
"term.about": "Lisätietoja",
"term.privateSession": "Yksityinen tila",
"term.queue": "Jono",
"term.search": "Etsi",
"term.library": "Kirjasto",
"term.listenNow": "Kuuntele nyt",
"term.browse": "Selaa",
"term.radio": "Radio",
"term.recentlyAdded": "Viimeksi lisätyt",
"term.songs": "Kappaleet",
"term.albums": "Albumit",
"term.artists": "Artistit",
"term.podcasts": "Podcastit",
"term.playlists": "Soittolistat",
"term.playlist": "Soittolista",
"term.newPlaylist": "Uusi soittolista",
"term.newPlaylistFolder": "Uusi soittolistakansio",
"term.createNewPlaylist": "Luo uusi soittolista",
"term.createNewPlaylistFolder": "Luo uusi soittolistakansio",
"term.deletePlaylist": "Oletko varma, että haluat poistaa tämän soittolistan?",
"term.play": "Soita",
"term.pause": "Tauko",
"term.previous": "Edellinen",
"term.next": "Seuraava",
"term.shuffle": "Sekoita",
"term.repeat": "Toista",
"term.volume": "Volyymi",
"term.mute": "Mykistä",
"term.unmute": "Poista mykistys",
"term.share": "Jaa",
"term.settings": "Asetukset",
"term.seeAll": "Näe kaikki",
"term.sortBy": "Järjestä",
"term.sortBy.album": "Järjestä albumin mukaan",
"term.sortBy.artist": "Järjestä artistin mukaan",
"term.sortBy.name": "Järjestä nimen mukaan",
"term.sortBy.genre": "Järjestä genren mukaan",
"term.sortBy.releaseDate": "Julkaisupäivä",
"term.sortBy.duration": "Pituus",
"term.sortOrder": "Järjestys",
"term.sortOrder.ascending": "Nousevassa järjestyksessä",
"term.sortOrder.descending": "Laskevassa järjestyksessä",
"term.viewAs": "Näytä kuin",
"term.viewAs.coverArt": "Kansikuva",
"term.viewAs.list": "Lista",
"term.size": "Koko",
"term.size.normal": "Normaali",
"term.size.compact": "Kompakti",
"term.enable": "Ota käyttöön",
"term.disable": "Poista käytöstä",
"term.enabled": "Käytössä",
"term.disabled": "Poissa käytöstä",
"term.connect": "Yhdistä",
"term.connecting": "Yhdistää",
"term.disconnect": "Katkaise",
"term.authed": "Tunnistettu",
"term.confirm": "Vahvista",
"term.more": "Lisää",
"term.less": "Vähemmän",
"term.showMore": "Näytä lisää",
"term.showLess": "Näytä vähemmän",
"term.topSongs": "Huippukappaleet",
"term.latestReleases": "Viimeisimmät julkaisut",
"term.time.added": "Lisätty",
"term.time.released": "Julkaistu",
"term.time.updated": "Päivitetty",
"term.time.hours": "Tuntia",
"term.time.hour": "Tunti",
"term.time.minutes": "Minuuttiaa",
"term.time.minute": "Minuutti",
"term.time.seconds": "Sekuntia",
"term.time.second": "Sekunti",
"term.fullscreenView": "Koko näytön näkymä",
"term.defaultView": "Oletusnäkymä",
"term.audioSettings": "Ääniasetukset",
"term.clearAll": "Puhdista kaikki",
"term.recentStations": "Viimeisimmät asemat",
"term.language": "Kieli",
"term.funLanguages": "Hauskat kielet",
"term.noLyrics": "Ei sanoituksia",
"term.copyright": "Tekijänoikeus",
"term.rightsReserved": "Oikeudet pidätetään",
"term.sponsor": "Sponsoroi tätä projektia",
"term.ciderTeam": "Cider tiimi",
"term.developer": "Kehittäjä",
"term.socialTeam": "Sosiaalinen tiimi",
"term.socials": "Sosiaaliset mediat",
"term.contributors": "Avustaja",
"term.equalizer": "Taajuuskorjain",
"term.reset": "Nollaa",
"term.tracks": "Kappaleita",
"term.videos": "Videoita",
"term.menu": "Valikko",
"term.check": "Tarkista",
"term.aboutArtist": "Lisätiedot {{artistName}}",
"home.title": "Koti",
"home.recentlyPlayed": "Viimeksi soitetut",
"home.recentlyAdded": "Viimeksi lisätyt",
"home.artistsFeed": "Artisti syöte",
"home.artistsFeed.noArtist": "Seuraa joitain artisteja nähdäksesi heidän uusimmat julkaisunsa.",
"home.madeForYou": "Tehty sinulle",
"home.friendsListeningTo": "Kaverit kuuntelee",
"home.followedArtists": "Seuratut artistit",
"error.appleMusicSubRequired": "Apple Music vaatii tilauksen.",
"error.connectionError": "Apple Musiciin yhdistämisessä oli ongelma.",
"error.noResults": "Ei tuloksia.",
"error.noResults.description": "Kokeile uutta hakua.",
"podcast.followOnCider": "Seuraa Ciderissa",
"podcast.followedOnCider": "Seurattu Ciderissa",
"podcast.subscribeOnItunes": "Tilaa iTunesissa",
"podcast.subscribedOnItunes": "Tilattu iTunesissa",
"podcast.itunesStore": "iTunes Store",
"podcast.episodes": "Jakso",
"podcast.playEpisode": "Toista jakso",
"podcast.website": "Avaa nettisivu",
"action.addToLibrary": "Lisää kirjastoon",
"action.addToLibrary.success": "Lisätty kirjastoon",
"action.addToLibrary.error": "Virhe lisättäessä kirjastoon",
"action.removeFromLibrary": "Poista kirjastosta",
"action.removeFromLibrary.success": "Poistettu kirjastosta",
"action.addToQueue": "Lisää jonoon",
"action.addToQueue.success": "Lisätty jonoon",
"action.addToQueue.error": "Virhe lisättäessä jonoon",
"action.removeFromQueue": "Poista jonosta",
"action.removeFromQueue.success": "Poistettu jonosta",
"action.removeFromQueue.error": "Virhe poistettaessa jonosta",
"action.createPlaylist": "Luo uusi soittolista",
"action.addToPlaylist": "Lisää soittolistaan",
"action.removeFromPlaylist": "Poista soittolistasta",
"action.addToFavorites": "Lisää suosikkeihin",
"action.follow": "Seuraa",
"action.follow.success": "Seurattu",
"action.follow.error": "Virhe seurattaessa",
"action.unfollow": "Lopeta seuraaminen",
"action.unfollow.success": "Seuraaminen lopetettu",
"action.unfollow.error": "Virhe seuraamisen lopetuksessa",
"action.playNext": "Toista seuraavaksi",
"action.playLater": "Toista myöhemmin",
"action.startRadio": "Aloita radio",
"action.goToArtist": "Näytä artisti",
"action.goToAlbum": "Näytä albumi",
"action.moveToTop": "Siirrä kärkeen",
"action.share": "Jaa",
"action.rename": "Nimeä uudelleen",
"action.love": "Tykkää",
"action.unlove": "Poista tykkäys",
"action.dislike": "En tykkää",
"action.undoDislike": "Kumoa en tykkää",
"action.showWebRemoteQR": "Cider web kaukoohjain",
"action.playTracksNext": "Toista ${app.selectedMediaItems.length} kappaleet seuraavaksi",
"action.playTracksLater": "Toista ${app.selectedMediaItems.length} kappaleet myöhemmin",
"action.removeTracks": "Poista ${self.selectedItems.length} kappaleet jonosta",
"action.import": "Tuonti",
"action.export": "Vienti",
"action.showAlbum": "Näytä albumi",
"action.tray.minimize": "Pienennä",
"action.tray.quit": "Sammuta",
"action.tray.show": "Näytä",
"action.update": "Päivitä",
"settings.header.general": "Yleistä",
"settings.header.general.description": "Muuta yleisasetuksia",
"settings.option.general.language": "Kieli",
"settings.option.general.language.main": "Kieli",
"settings.option.general.language.fun": "Hauskat kielet",
"settings.option.general.language.unsorted": "Lajittelematon",
"settings.header.audio": "Ääni",
"settings.header.audio.description": "Muuta ääniasetuksia",
"settings.option.audio.quality": "Äänenlaatu",
"settings.header.audio.quality.high": "Korkea",
"settings.option.audio.seamlessTransition": "Saumaton siirtyminen",
"settings.option.audio.enableAdvancedFunctionality": "Ota lisätoiminnot käyttöön",
"settings.option.audio.enableAdvancedFunctionality.description": "AudioContext-toiminnon ottaminen käyttöön mahdollistaa laajennetut ääniominaisuudet, kuten äänen normalisoinnin, taajuuskorjaimet ja visualisoijat, mutta joissakin järjestelmissä tämä voi aiheuttaa ääniraitojen pätkimistä.",
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider uskoo, että tietokoneesi ei voi käsitellä näitä ominaisuuksia. Oletko varma, että haluat jatkaa?",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Äänen normalisointi",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalisoi yksittäisten kappaleiden huippuäänenvoimakkuuden luodakseen yhtenäisemmän kuuntelukokemuksen. (Ei toimi käyttäjien lataamilla kappaleilla)",
"settings.header.visual": "Ulkonäkö",
"settings.header.visual.description": "Muuta ulkonäköä.",
"settings.option.visual.windowBackgroundStyle": "Taustatyyli",
"settings.header.visual.windowBackgroundStyle.none": "Ei taustatyyliä",
"settings.header.visual.windowBackgroundStyle.artwork": "Taideteos",
"settings.header.visual.windowBackgroundStyle.image": "Kuva",
"settings.option.visual.animatedArtwork": "Animoitu taideteos",
"settings.header.visual.animatedArtwork.always": "Aina",
"settings.header.visual.animatedArtwork.limited": "Ainoastaa sivuilla joilla se on tarvittua",
"settings.header.visual.animatedArtwork.disable": "Ei koskaan",
"settings.option.visual.animatedArtworkQuality": "Animoinnin laatu",
"settings.header.visual.animatedArtworkQuality.low": "Alhainen",
"settings.header.visual.animatedArtworkQuality.medium": "Keskinkertainen",
"settings.header.visual.animatedArtworkQuality.high": "Korkea",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Erittäin korkea",
"settings.header.visual.animatedArtworkQuality.extreme": "Korkein",
"settings.option.visual.animatedWindowBackground": "Animoitu tausta",
"settings.option.visual.hardwareAcceleration": "Laitteistokiihdytys",
"settings.option.visual.hardwareAcceleration.description": "Vaatii uudelleenkäynnistyksen",
"settings.header.visual.hardwareAcceleration.default": "Vakio",
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
"settings.option.visual.showPersonalInfo": "Näytä henkilökohtaiset tiedot",
"settings.header.lyrics": "Sanoitukset",
"settings.header.lyrics.description": "Muuta sanoitusasetuksia",
"settings.option.lyrics.enableMusixmatch": "Käytä MusicXMatchia Apple Music sanoituksien sijaan",
"settings.option.lyrics.enableMusixmatchKaraoke": "Aktivoi karaoketila (Vain MusicXMatch)",
"settings.option.lyrics.musixmatchPreferredLanguage": "MusicXMatch ensisijainen kieli",
"settings.option.lyrics.enableYoutubeLyrics": "Käytä Youtube sanoituksia videoissa",
"settings.header.connectivity": "Yhteys",
"settings.header.connectivity.description": "Muuta yhteysasetuksia",
"settings.option.connectivity.discordRPC": "Discord integraatio (discordRPC)",
"settings.option.connectivity.playbackNotifications": "Toistoilmoitukset",
"settings.option.connectivity.discordRPC.clearOnPause": "Poista Discord ilmoitus, kun tauotat kappaleen",
"settings.option.connectivity.lastfmScrobble": "Last.fm integraatio",
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm viive i %",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Näytä mikä kappale Last.fm palvelussa",
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Älä näytä extra tietoja Last.fm palvelussa",
"settings.option.connectivity.lastfmScrobble.filterLoop": "Suodata pakkotoisteut kappaleet",
"settings.header.experimental": "Testi",
"settings.header.experimental.description": "Muuta testi asetuksia.",
"settings.option.experimental.compactUI": "Kompakti näkymä",
"settings.option.window.close_button_hide": "Suljenappi pienentää Cider ikkunan",
"spatial.notTurnedOn": "Äänen spatialisointi on poistettu käytöstä. Ota se käyttöön ennen käyttöä.",
"spatial.spatialProperties": "Äänen spatialisointi asetukset",
"spatial.width": "Leveys",
"spatial.height": "Korkeus",
"spatial.depth": "Syvyys",
"spatial.gain": "Tilavyöhyke",
"spatial.roomMaterials": "Huoneen materiaalit",
"spatial.roomDimensions": "Huoneen koko",
"spatial.roomPositions": "Huoneen sijainti",
"spatial.setDimensions": "Valitse koko",
"spatial.setPositions": "Valitse sijainnit",
"spatial.up": "Ylös",
"spatial.front": "Eteenpäin",
"spatial.left": "Vasemmalle",
"spatial.right": "Oikealle",
"spatial.back": "Taaksepäin",
"spatial.down": "Alaspäin",
"spatial.listener": "Kuuntelija",
"spatial.audioSource": "Äänenlähde",
"settings.header.unfinished": "Keskeneräinen",
"remote.web.title": "Ciderin kaukosäädin",
"remote.web.description": "Skannaa QR-koodi yhdistääksesi puhelimesi tämän Cider-instanssin kanssa",
"about.thanks": "Suuri kiitos Cider Collective Teamille ja kaikille avustajillemme.",
"oobe.yes": "Kyllä",
"oobe.no": "Ei",
"oobe.next": "Seuraava",
"oobe.previous": "Edellinen",
"oobe.done": "Valmis",
"oobe.amupsell.title": "Ennenkuin aloitamme",
"oobe.amupsell.text": "Cider vaatii aktiivisen, maksullisen Apple Music -tilauksen\nCider ei toimi Apple Music Voice Planin tai joidenkin tarjouskilpailutilausten kanssa. Jos sinulla on jo hyväksytty Apple Music -tilaus, napsauta Seuraava jatkaaksesi",
"oobe.amupsell.subscribeBtn": "Tilaa Apple Music",
"oobe.amupsell.explainBtn": "Selitä",
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
"oobe.amupsell.promoExplained": "Joillakin promootiotilauksilla ja muilla kuin yhdysvaltalaisilla Apple Music -kokeilutilauksilla ei ole pääsyä vaadittuihin Apple Music Web Player API:ihin, joita Cider tarvitsee toimiakseen. Tarkistaaksesi, toimiiko aktiivinen kokeiluversiosi Ciderin kanssa, mene osoitteeseen: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
"oobe.intro.title": "Tervetuloa Cideriin",
"oobe.intro.subtitle": "",
"oobe.intro.text": "Otetaan käyttöön muutamia asioita, jotta voit käyttää Cideriä haluamallasi tavalla. Voit aina muuttaa näitä asetuksia myöhemmin.",
"oobe.general.title": "Yleistä",
"oobe.general.subtitle": "",
"oobe.general.text": "",
"oobe.audio.title": "Ääni",
"oobe.audio.subtitle": "",
"oobe.audio.text": "Cider sisältää mukautetun viritetyn ja suunnitellun äänipinon, joka tarjoaa rikkaan korkealaatuisen äänikokemuksen.\nSisältää Cider Adrenaliinin, Atmosphere Realizerin ja Spatialized Audion.\nTämän toiminnon mahdollistamiseksi \"Advanced Audio Functionality\" on otettava käyttöön.\nOta käyttöön Advanced Audio Toiminnallisuus antaa sinulle pääsyn näihin parannuksiin Cider Audio Labsissa, joka löytyy sovelluksen asetuksista.",
"oobe.audio.advancedFunctionality": "",
"oobe.visual.title": "Ulkonäkö",
"oobe.visual.subtitle": "",
"oobe.visual.text": "",
"oobe.visual.layout.text": "Ciderissä on kaksi erilaista ikkuna-asettelua.\nMaverick on iTunesin kaltainen asettelu, jossa soitin on ikkunan yläosassa.\nMojave on Cider Collectiven luoma uusi kierros.\n\nVoit muuttaa asettelua milloin tahansa asetuksista.",
"oobe.visual.suggestingThemes": "Teema on loistava tapa muokata kokemustasi. Tässä on muutamia ehdotuksia: ",
"oobe.visual.suggestingThemes.subtext": "(Nämä teemat ladataan GitHubista)",
"oobe.visual.suggestingThemes.default": "Cider",
"oobe.visual.suggestingThemes.default.text": "Klassinen Ciderteema.",
"oobe.visual.suggestingThemes.dark": "Pimeys",
"oobe.visual.suggestingThemes.dark.text": "Pimeys",
"oobe.visual.suggestingThemes.community1": "Groovy",
"oobe.visual.suggestingThemes.community1.text": "WinUI-vaikutteinen teema",
"oobe.visual.suggestingThemes.community2": "iTheme",
"oobe.visual.suggestingThemes.community2.text": "Klassinen Big fruit teema",
"oobe.visual.suggestingThemes.community3": "Dracula",
"oobe.visual.suggestingThemes.community3.text": "Ikoninen Dracula-värimaailma",
"oobe.amsignin.title": "",
"share.platform.twitter.tweet": "Kuuntele kappaletta {{song}} Apple Musicissa.\n\n{{url}}\n\n#AppleMusic #Cider",
"share.platform.twitter": "Twitter",
"share.platform.facebook": "Facebook",
"share.platform.reddit": "Reddit",
"share.platform.telegram": "Telegram",
"share.platform.whatsapp": "WhatsApp",
"share.platform.messenger": "Messenger",
"share.platform.email": "Sähköposti",
"share.platform.songLink": "Kopioi song.link",
"share.platform.clipboard": "Kopioi linkki"
}

View file

@ -2,7 +2,7 @@
"i18n.languageName": "हिन्दी",
"i18n.languageNameEnglish": "Hindi",
"i18n.category": "main",
"i18n.authors": "@maikirakiwi @vringster",
"i18n.authors": "@notmaikiwi @vringster",
"app.name": "Cider",
"date.format": "${m} ${d}, ${y}",
"dialog.cancel": "रोकें",

View file

@ -41,6 +41,7 @@
"term.albums": "Albumok",
"term.artists": "Előadók",
"term.podcasts": "Podcastok",
"term.charts": "Listák",
"term.playlists": "Lejátszási listák",
"term.playlist": "Lejátszási lista",
"term.newPlaylist": "Új lejátszási lista",
@ -52,6 +53,7 @@
"term.navigateForward": "Előrelépés",
"term.play": "Lejátszás",
"term.pause": "Megállítás",
"term.stop": "Leállítás",
"term.previous": "Előző",
"term.next": "Következő",
"term.shuffle": "Keverés",
@ -130,6 +132,8 @@
"term.audioControls": "Hangerő beállítás",
"term.clearAll": "Összes törlése",
"term.recentStations": "Nemrég játszott",
"term.personalStations": "Személyes állomások",
"term.amLive": "Apple Music Live",
"term.language": "Nyelv",
"term.funLanguages": "Fantázianyelvek",
"term.noLyrics": "Betöltés... / Dalszöveg nem található / Instrumentális",
@ -150,6 +154,7 @@
},
"term.videos": "Videók",
"term.menu": "Menü",
"term.themeManaged": "Egy téma kezeli a beállítást",
"term.check": "Ellenőrzés",
"term.aboutArtist": "{{artistName}}-ról/ről",
"term.topResult": "Legjobb találatok",
@ -209,6 +214,12 @@
"podcast.episodes": "Epizódok",
"podcast.playEpisode": "Epizód lejátszása",
"podcast.website": "Podcast weboldala",
"action.hideLibrary": "Könyvtár elrejtése",
"action.showLibrary": "Könyvtár megjelenítése",
"action.cut": "Kivágás",
"action.paste": "Beillesztés",
"action.selectAll": "Összes kijelölése",
"action.delete": "Törlés",
"action.edit": "Szerkesztés",
"action.done": "Kész",
"action.editTracklist": "Dalok szerkesztése",
@ -257,6 +268,10 @@
"action.tray.minimize": "Kicsinyítés a Tálcára",
"action.tray.quit": "Bezárás",
"action.tray.show": "Cider megjelenítése",
"action.tray.playpause": "Lejátszás/Megállítás",
"action.tray.next": "Következő",
"action.tray.previous": "Előző",
"action.tray.listento": "Ezt hallgatja:",
"action.update": "Frissítés",
"action.install": "Telepítés",
"action.copy": "Másolás",
@ -360,6 +375,7 @@
"settings.header.audio": "Hang",
"settings.header.audio.description": "A Cider hangbeállításainak módosítása.",
"settings.option.audio.volumeStep": "Hangerő lépték",
"settings.option.audio.advanced": "Haladó hangerőkezelés",
"settings.option.audio.maxVolume": "Maximum hangerő",
"settings.option.audio.changePlaybackRate": "Lejátszási sebesség módosítása",
"settings.option.audio.playbackRate": "Sebesség",
@ -400,6 +416,8 @@
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Erősség",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Megváltoztatja a hangra végzett feldolgozás erősségét. (Az Agresszív mód nemkívánatos eredményeket hozhat!)",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Szokásos",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptív",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Régi",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresszív",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalizálás",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizálja az egyes zeneszámok hangosabb részeit, hogy egységesebb hallgatási élményt hozzon létre. (Nem működik a felhasználó által feltöltött zenéken)",
@ -413,6 +431,9 @@
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separation",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minimal",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Diffused",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "A Térbeli Hang nem kompatibilis a CAP-pal. Kapcsold ki a CAP-ot a folytatáshoz.",
"settings.option.audio.dbspl.display": "dB SPL kijelzés",
"settings.option.audio.dbspl.description": "(Haladó felhasználóknak) A hangerő dB SPL-ben történő kijelzése a dBFS helyett.",
@ -421,6 +442,7 @@
"settings.header.visual": "Vizuális",
"settings.header.visual.description": "A Cider vizuális beállításainak módosítása.",
"settings.option.visual.windowStyle": "Ablakelrendezés",
"settings.option.visual.purplePodcastPlaybackBar": "Lila lejátszási sáv a Podcastoknál",
"settings.option.visual.windowBackgroundStyle": "Ablakháttér stílusa",
"settings.header.visual.windowBackgroundStyle.none": "Sehol",
"settings.header.visual.windowBackgroundStyle.artwork": "Borító",
@ -493,6 +515,8 @@
"settings.option.connectivity.discordRPC.hideTimestamp": "Rich Presence visszaszámláló elrejtése",
"settings.option.connectivity.discordRPC.detailsFormat": "Részletek formátuma",
"settings.option.connectivity.discordRPC.stateFormat": "Állapot formátuma",
"settings.option.connectivity.discordRPC.reload": "DiscordRPC újratöltése",
"settings.option.connectivity.discordRPC.reconnectedToUser": "A DiscordRPC újracsatlakozott a következő felhasználóhoz: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble késleltetés (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Last.fm Now Playing engedélyezése",

View file

@ -2,7 +2,7 @@
"i18n.languageName": "日本語",
"i18n.languageNameEnglish": "Japanese",
"i18n.category": "main",
"i18n.authors": "@maikirakiwi @tanaka_kakuel",
"i18n.authors": "@notmaikiwi @tanaka_kakuel @YTJVDCM",
"app.name": "Cider",
"date.format": "${y}年${m}月${d}日",
"dialog.cancel": "キャンセル",
@ -21,11 +21,13 @@
"term.accountSettings": "アカウント設定",
"term.logout": "サインアウト",
"term.login": "サインイン",
"term.quickNav": "Quick Nav",
"term.cast": "Cast",
"term.about": "Ciderについて",
"term.privateSession": "プライベートセッション",
"term.disablePrivateSession": "プライベートセッションを無効にする",
"term.queue": "次はこちら",
"term.autoplay": "自動再生",
"term.lyrics": "歌詞",
"term.miniplayer": "ミニプレイヤー",
"term.history": "履歴",
@ -40,22 +42,32 @@
"term.artists": "アーティスト",
"term.podcasts": "ポッドキャスト",
"term.playlists": "プレイリスト",
"term.charts": "チャート",
"term.playlist": "プレイリスト",
"term.newPlaylist": "New Playlist",
"term.newPlaylistFolder": "新しいプレイリストフォルダ",
"term.createNewPlaylist": "新しいプレイリストを作る",
"term.createNewPlaylistFolder": "新しいプレイリストフォルダを作る",
"term.deletePlaylist": "本当にこのプレイリストを削除しますか?",
"term.navigateBack": "戻る",
"term.navigateForward": "進む",
"term.play": "再生",
"term.pause": "停止",
"term.pause": "一時停止",
"term.stop": "停止",
"term.previous": "戻る",
"term.next": "次へ",
"term.shuffle": "シャッフル",
"term.enableShuffle": "シャッフル再生を有効化",
"term.disableShuffle": "シャッフル再生を無効化",
"term.repeat": "リピート",
"term.enableRepeatOne": "1曲リピートを有効化",
"term.disableRepeatOne": "1曲リピートを無効化",
"term.disableRepeat": "リピート再生を無効化",
"term.volume": "音量",
"term.mute": "ミュート",
"term.unmute": "ミュート解除",
"term.share": "共有",
"term.share.success": "クリップボードにコピーしました",
"term.settings": "設定",
"term.seeAll": "すべて見る",
"term.sortBy": "並べ替え",
@ -72,13 +84,14 @@
"term.viewAs": "表示",
"term.viewAs.coverArt": "カバーアート",
"term.viewAs.list": "リスト",
"term.dynamic": "ダイナミック",
"term.size": "サイズ",
"term.size.normal": "普通",
"term.size.compact": "コンパクト",
"term.enabled": "ON",
"term.disable": "OFF",
"term.disabled": "OFF",
"term.enable": "ON",
"term.disable": "OFF",
"term.enabled": "ON",
"term.disabled": "OFF",
"term.connect": "接続",
"term.connecting": "接続中",
"term.disconnect": "切断",
@ -119,9 +132,11 @@
"term.audioControls": "ボリューム設定",
"term.clearAll": "消去",
"term.recentStations": "最近の再生",
"term.personalStations": "あなたのステーション",
"term.amLive": "Apple Music Live",
"term.language": "言語",
"term.funLanguages": "Fun",
"term.noLyrics": "ローディング。。 / 歌詞が見つからない / 器楽曲.",
"term.noLyrics": "ロード中... / 歌詞が見つかりません / インストゥルメンタル.",
"term.copyright": "Copyright",
"term.rightsReserved": "All Rights Reserved.",
"term.sponsor": "スポンサーになりましょう",
@ -178,6 +193,8 @@
"term.confirmLogout": "本当にログアウトしますか?",
"term.creditDesignedBy": "${authorUsername}によってデザインされました",
"term.discNumber": "ディスク ${discNumber}",
"home.syncFavorites": "お気に入りを同期",
"home.syncFavorites.gettingArtists": "お気に入りのアーティストを同期中...",
"home.title": "ホーム",
"home.recentlyPlayed": "最近の再生",
"home.recentlyAdded": "最近追加した項目",
@ -198,6 +215,14 @@
"podcast.episodes": "番組",
"podcast.playEpisode": "再生",
"podcast.website": "Podcastウェブ",
"action.favorite": "お気に入り",
"action.removeFavorite": "リモートでお気に入り",
"action.hideLibrary": "ライブラリから非表示",
"action.showLibrary": "ライブラリに表示",
"action.cut": "切り取り",
"action.paste": "貼り付け",
"action.selectAll": "全選択",
"action.delete": "削除",
"action.edit": "編集",
"action.done": "完了",
"action.editTracklist": "トラックリストを編集",
@ -227,6 +252,8 @@
"action.startRadio": "ステーションを作成",
"action.goToArtist": "アーティストへ移動",
"action.goToAlbum": "アルバムへ移動",
"action.showInPlaylist": "プレイリストを表示",
"action.showInAppleMusic": "Apple Musicで表示",
"action.moveToTop": "上に戻る",
"action.share": "曲を共有",
"action.rename": "名前の変更",
@ -243,13 +270,18 @@
"action.showAlbum": "アルバムを表示",
"action.tray.minimize": "最小化",
"action.tray.quit": "終了",
"action.tray.show": "表示",
"action.tray.show": "Ciderで表示",
"action.tray.playpause": "再生/停止",
"action.tray.next": "次へ",
"action.tray.previous": "前へ",
"action.tray.listento": "次で聞く:",
"action.update": "アップデート",
"action.install": "インストール",
"action.copy": "コピー",
"action.newpreset": "新しいプリセット",
"action.deletepreset": "プリセットを削除",
"action.open": "開く",
"action.close": "閉じる",
"action.relaunch.confirm": "Ciderを再開しますか",
"action.cast.chromecast": "Chromecast",
"action.cast.todevices": "デバイスにキャストする",
@ -260,6 +292,46 @@
"action.cast.scanning": "スキャン中...",
"action.createNew": "新規作成...",
"action.openArtworkInBrowser": "アートワークをブラウザで表示する",
"action.scrollToTop": "上に戻る",
"menubar.options.about": "詳細",
"menubar.options.settings": "設定",
"menubar.options.quit": "Ciderを終了",
"menubar.options.view": "表示 ",
"menubar.options.reload": "再読み込み",
"menubar.options.forcereload": "強制的に再読み込み",
"menubar.options.toggledevtools": "Developer Toolsを切り替え",
"menubar.options.window": "ウィンドウ",
"menubar.options.minimize": "最小化",
"menubar.options.toggleprivate": "プライベートセッションに切り替え",
"menubar.options.webremote": "Webリモコン",
"menubar.options.audio": "オーティオ設定",
"menubar.options.plugins": "プラグインメニュー",
"menubar.options.controls": "操作",
"menubar.options.next": "次へ",
"menubar.options.playpause": "再生/停止",
"menubar.options.previous": "前に戻る",
"menubar.options.volumeup": "音量を上げる",
"menubar.options.volumedown": "音量を下げる",
"menubar.options.browse": "見つける",
"menubar.options.artists": "アーティスト",
"menubar.options.search": "検索",
"menubar.options.albums": "アルバム",
"menubar.options.cast": "デバイスにキャスト",
"menubar.options.account": "アカウント",
"menubar.options.accountsettings": "アカウント設定",
"menubar.options.signout": "サインアウト",
"menubar.options.support": "サポート",
"menubar.options.discord": "Discord",
"menubar.options.github": "GitHub Wiki",
"menubar.options.report": "報告...",
"menubar.options.bug": "バグ",
"menubar.options.feature": "将来的な提案",
"menubar.options.trans": "翻訳に関する報告/提案",
"menubar.options.license": "ライセンスを表示",
"menubar.options.conf": "設定ファイルをエディタで開く",
"menubar.options.listennow": "Listen Now",
"menubar.options.recentlyAdded": "最近追加した項目",
"menubar.options.songs": "曲",
"settings.header.general": "一般",
"settings.header.general.description": "Ciderの一般設定",
"settings.option.general.language": "言語",
@ -269,20 +341,24 @@
"settings.option.general.resumebehavior.locally.description": "このコンピューターでの最終セッションを復元",
"settings.option.general.resumebehavior.history": "履歴",
"settings.option.general.resumebehavior.history.description": "Apple Musicの履歴から曲を復元",
"settings.option.general.resumetabs": "起動時にタブを開く",
"settings.option.general.resumetabs.description": "Ciderを起動したときに開くタブを選択することができます",
"settings.option.general.resumetabs.dynamic": "ダイナミック",
"settings.option.general.resumetabs.dynamic.description": "最後のセッションで開いていたタブを開きます",
"settings.option.general.resumetabs" : "起動時にタブを開く",
"settings.option.general.resumetabs.description" : "Ciderを起動したときに開くタブを選択することができます",
"settings.option.general.resumetabs.dynamic" : "ダイナミック",
"settings.option.general.resumetabs.dynamic.description" : "最後のセッションで開いていたタブを開きます",
"settings.option.general.language.main": "メイン",
"settings.option.general.language.fun": "荒らし",
"settings.option.general.language.unsorted": "未分類",
"settings.option.general.customizeSidebar": "サイドバーをカスタマイズ",
"settings.option.general.customizeSidebar.customize": "カスタマイズ",
"settings.option.general.keybindings": "キーバインド",
"settings.option.general.keybindings.pressCombination": "2つのキーを同時に押してキーバインドを更新します",
"settings.option.general.keybindings.pressEscape": "Escキーを押すと戻ります",
"settings.notyf.general.keybindings.update.success": "キーバインドのアップデートに成功しました",
"settings.prompt.general.keybindings.update.success": "キーバインドのアップデートに成功しました。OKを押すとciderが再起動します",
"settings.option.general.keybindings.open": "開く",
"settings.description.search": "検索",
"settings.option.general.themeUpdateNotification": "テーマのアップデートを自動的に確認",
"settings.option.general.showLovedTracksInline": "ラブした楽曲を列挙",
"settings.description.albums": "ライブラリのアルバム",
"settings.description.artists": "ライブラリのアーティスト",
"settings.description.browse": "検索",
@ -293,12 +369,16 @@
"settings.description.cast": "デバイスでキャストする",
"settings.description.settings": "設定",
"settings.description.developer": "デベロッパーツール",
"settings.description.listnow": "Listen Now",
"settings.description.recentAdd": "最近追加した項目",
"settings.description.songs": "曲",
"settings.notyf.updateCider.update-not-available": "現在最新版です",
"settings.notyf.updateCider.update-downloaded": "アップデートは再起動後に適用されます",
"settings.notyf.updateCider.update-timeout": "アップデートはタイムアウトしました",
"settings.header.audio": "オーディオ",
"settings.header.audio.description": "Ciderのオーディオ設定",
"settings.option.audio.volumeStep": "音量調整のステップ",
"settings.option.audio.advanced": "追加のボリューム設定",
"settings.option.audio.maxVolume": "最大音量",
"settings.option.audio.changePlaybackRate": "再生速度の変更",
"settings.option.audio.playbackRate": "再生速度の変更",
@ -309,14 +389,18 @@
"settings.header.audio.quality.lossless": "ロスレス",
"settings.header.audio.quality.lossless.description": "(最大解像度 24 ビット48 kHz)",
"settings.header.audio.quality.high": "高品質",
"settings.header.audio.quality.high.description": "256 kbps",
"settings.header.audio.quality.standard": "高効率",
"settings.header.audio.quality.standard.description": "64 kbps",
"settings.option.audio.seamlessTransition": "曲間なしで再生",
"settings.option.audio.enableAdvancedFunctionality": "先進的な機能",
"settings.option.audio.enableAdvancedFunctionality.description": "AudioContextを有効にすると、オーディオーマライズ、空間オーディオ、イコライザーなどの機能を使用できますが、音が途切れるかもしれません。",
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "あなたのPCがこの処理に耐えられないかもしれません。",
"settings.option.audio.audioLab": "Cider Audio Lab",
"settings.option.audio.audioLab.description": "An assortment of in-house developed audio effects for Cider.",
"settings.option.audio.audioLab.description": "Cider自社開発の各種音響設定",
"settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California",
"settings.warn.audioLab.withoutAF": "Cider Audio Labを有効にするにはAudioContextを有効にする必要があります",
"settings.warn.enableAdvancedFunctionality": "AudioContext (高度な機能) はこの機能を有効化する必要があります",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Analog Warmth",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Korg Nutube 6P1をモデルにしたオーディオをシミュレートします",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Analog Warmth intensity",
@ -333,31 +417,52 @@
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "宇治抹茶ミルクティー",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "春毫ジャスミンマキアート",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "北海道のロイヤルミルクティー",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500": "ムーンライトソフトケーキ",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "ムーンライトソフトケーキ",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "チェリークラフティ",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "宇治抹茶だいふく",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "黒糖クレームブリュレミルク",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "布団はやわらかいなー",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "音楽をより豊かに、生き生きとさせます",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "人の聴覚心理モデルとAAC符号化の特徴を活用したリアルタイムアルゴリズムにより、AACの認知音質を向上させます。",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAPはSpatializationと互換性がありません",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAPの強さ",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "音に施す処理の強さを設定します (強くしすぎると望ましい結果が得られないかもしれません)",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "標準",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "高",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "アダプティブ",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "レガシー",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "オーディオノーマライズ",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "さまざまな曲の音量を均一にし、より整った音を楽しめるようにする機能です。",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Audio Labの設定",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider Tuned Spatialization",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "開発チームがチューニングした設定を使用することができます。(オーディオ空間化を有効にする必要があります)",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "開発チームがチューニングした設定を使用することができます。",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider Spatialization Profile",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "プロファイルをSpatializationに変更します",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "スタンダード",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "音場",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "分離感",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "ミニマル",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "オーディオマニア",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "拡散",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "アンコール",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "拡張アンコール",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "オーディオ空間化はCAPと互換性がありません",
"settings.option.audio.dbspl.display": "dB SPL 表示",
"settings.option.audio.dbspl.description": "(上級者向け) dBFS の代わりに dB SPL でボリュームスライダーを表示します",
"settings.option.audio.dbfs.calibration": "0 dBFS キャリブレーション",
"settings.option.audio.dbfs.description": "Ciderが0 dBFSとするZ特性の値を入力してください",
"settings.header.visual": "ビジュアル",
"settings.header.visual.description": "Ciderのビジュアル設定",
"settings.option.visual.windowStyle": "Window Style",
"settings.option.visual.customAccentColor": "カスタムアクセントカラー",
"settings.option.visual.accentColor": "アクセントカラー",
"settings.option.visual.purplePodcastPlaybackBar": "Podcasts再生時に紫色の再生バーにする",
"settings.option.visual.windowColor": "ウィンドウの色合い",
"settings.option.visual.windowBackgroundStyle": "背景の設定",
"settings.header.visual.windowBackgroundStyle.none": "なし",
"settings.header.visual.windowBackgroundStyle.artwork": "アートワーク",
"settings.header.visual.windowBackgroundStyle.image": "画像",
"settings.header.visual.windowBackgroundStyle.color": "色調",
"settings.option.visual.animatedArtwork": "アニメーションアートワーク",
"settings.header.visual.animatedArtwork.always": "常に表示",
"settings.header.visual.animatedArtwork.limited": "アーティストページのみ表示",
@ -381,6 +486,13 @@
"settings.header.visual.theme.github.page": "GitHub",
"settings.option.visual.theme.github.install.confirm": "本当に {{ repo }} をインストールしますか?",
"settings.prompt.visual.theme.github.URL": "インストールしたいテーマのURLを入力してください",
"settings.prompt.visual.theme.uninstallTheme": "本当に {{ theme }} をアンインストールしますか?",
"settings.option.visual.theme.checkForUpdates": "アップデートを確認",
"settings.option.visual.theme.manageStyles": "スタイルを管理",
"settings.option.visual.theme.uninstall": "アンインストール",
"settings.option.visual.theme.viewInfo": "情報を表示",
"settings.option.visual.theme.github.available": "利用可能",
"settings.option.visual.theme.github.applied": "適用済み",
"settings.notyf.visual.theme.install.success": "テーマのインストールが完了しました",
"settings.notyf.visual.theme.install.error": "テーマのインストールに失敗しました",
"settings.header.visual.plugin": "プラグイン",
@ -417,8 +529,11 @@
"settings.option.connectivity.discordRPC.clientName": "クライアントの名前",
"settings.option.connectivity.discordRPC.clearOnPause": "一時停止した時にDiscord Rich Presenceを非表示にする",
"settings.option.connectivity.discordRPC.hideButtons": "Discord Rich Presenceのボタンを非表示にする",
"settings.option.connectivity.discordRPC.hideTimestamp": "Discord Rich Presenceのタイムスタンプを非表示にする",
"settings.option.connectivity.discordRPC.detailsFormat": "ディティールのフォーマット",
"settings.option.connectivity.discordRPC.stateFormat": "状態のフォーマット",
"settings.option.connectivity.discordRPC.reload": "DiscordRPCを再読み込み",
"settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPCは以下のユーザーに再接続しました: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.fm に接続する",
"settings.option.connectivity.lastfmScrobble.delay": "遅延 (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Last.fm Now Playingを有効化する",
@ -476,5 +591,44 @@
"share.platform.email": "Email",
"share.platform.songLink": "song.linkのURLをコピーする",
"share.platform.clipboard": "URLをコピーする",
"about.thanks": "Cider Collective とご協力いただいた貢献者様に感謝申し上げます。"
"about.thanks": "Cider Collective とご協力いただいた貢献者様に感謝申し上げます。",
"oobe.yes": "はい",
"oobe.no": "いいえ",
"oobe.next": "次へ",
"oobe.previous": "戻る",
"oobe.done": "完了",
"oobe.amupsell.title": "始める前に",
"oobe.amupsell.text": "Ciderを利用するにはは有効なApple Musicサブスクリプションが必要です\nCiderはApple Music Voiceプランやその他のプロモーション向け試用サブスクリプションでは動作しません。 もし既にApple Musicのサブスクリプション資格がある場合は、次へをクリックして続けてください。",
"oobe.amupsell.subscribeBtn": "Apple Musicに登録",
"oobe.amupsell.explainBtn": "説明",
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
"oobe.amupsell.promoExplained": "いくつかのプロモーション向けかつアメリカ合衆国以外のApple Music試用サブスクリプションは、Ciderを使うために必要なApple Music Web Player APIにアクセスできません。 あなたの試用プランが有効かどうかを確認するには <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> にログインして、任意の楽曲が再生できるか確認してください。 もし正常に動作したならば、素晴らしい! あなたはCiderを利用することができます、しかしながら、もしApple Musicの購読をしていない場合はこちらから: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
"oobe.intro.title": "Ciderへようこそ",
"oobe.intro.subtitle": "",
"oobe.intro.text": "Ciderを自分好みに利用するための、いくつかのセットアップを行いましょう。これらの設定はあとから変更することができます。",
"oobe.general.title": "一般",
"oobe.general.subtitle": "",
"oobe.general.text": "",
"oobe.audio.title": "オーディオ",
"oobe.audio.subtitle": "",
"oobe.audio.text": "Ciderにはリッチで高品質なオーディオを提供するための、カスタマイズ、デザインされたオーディオスタック機能があります。\nCider Adrenaline、Atmosphere Realizer、ならびにSpatailized Audioがあります。\nこれらの機能を有効化するには、\"先進的な機能\"を有効化する必要があります。\n先進的な機能を有効化すると、これらの強化機能をアプリ設定のCider Audio Labsから利用することができるようになります。",
"oobe.audio.advancedFunctionality": "",
"oobe.visual.title": "ビジュアル",
"oobe.visual.subtitle": "",
"oobe.visual.text": "",
"oobe.visual.layout.text": "Ciderには2つの異なるウィンドウレイアウトがあります。\nMaverickはウィンドウ上部にプレイヤーのある、iTunes風のレイアウトです。\nMojaveはCider Collectiveによって作成された新たな試作品です。\n\nこれらのレイアウトはいつでも設定から変更することができます。",
"oobe.visual.suggestingThemes": "テーマの設定は、より良い経験を得るための優れた方法です。 これらは私達からの提案です : ",
"oobe.visual.suggestingThemes.subtext": "(これらのテーマはGitHubからダウンロードされます)",
"oobe.visual.suggestingThemes.default": "Cider",
"oobe.visual.suggestingThemes.default.text": "クラシックCiderテーマ",
"oobe.visual.suggestingThemes.dark": "Dark",
"oobe.visual.suggestingThemes.dark.text": "ダークテーマ",
"oobe.visual.suggestingThemes.community1": "Groovy",
"oobe.visual.suggestingThemes.community1.text": "WinUIに影響を受けたテーマ",
"oobe.visual.suggestingThemes.community2": "iTheme",
"oobe.visual.suggestingThemes.community2.text": "クラシックな巨大果物のレイアウト",
"oobe.visual.suggestingThemes.community3": "Dracula",
"oobe.visual.suggestingThemes.community3.text": "ドラキュラをイメージしたカラースキーム",
"oobe.amsignin.title": ""
}

584
src/i18n/pt_PT.json Normal file
View file

@ -0,0 +1,584 @@
{
"i18n.languageName": "Português (Portugal)",
"i18n.languageNameEnglish": "Portuguese (Portugal)",
"i18n.category": "main",
"i18n.authors": "@pgalhardo",
"app.name": "Cider",
"date.format": "${m} ${d}, ${y}",
"dialog.cancel": "Cancelar",
"dialog.ok": "OK",
"notification.updatingLibrarySongs": "A atualizar biblioteca de músicas...",
"notification.updatingLibraryAlbums": "A atualizar biblioteca de álbuns...",
"notification.updatingLibraryArtists": "A atualizar biblioteca de artistas...",
"term.variables": "Variáveis",
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
"term.itunes": "iTunes",
"term.github": "GitHub",
"term.discord": "Discord",
"term.learnMore": "Saiba mais",
"term.accountSettings": "Definições da conta",
"term.logout": "Terminar sessão",
"term.login": "Iniciar sessão",
"term.quickNav": "Navegação rápida",
"term.cast": "Transmitir",
"term.about": "Sobre",
"term.privateSession": "Sessão privada",
"term.disablePrivateSession": "Desativar sessão privada",
"term.queue": "Fila",
"term.autoplay": "Reprodução automática",
"term.lyrics": "Letra",
"term.miniplayer": "Mini-leitor",
"term.history": "Histórico",
"term.search": "Pesquisa",
"term.library": "Biblioteca",
"term.listenNow": "Ouvir agora",
"term.browse": "Explorar",
"term.radio": "Rádio",
"term.recentlyAdded": "Adições recentes",
"term.songs": "Músicas",
"term.albums": "Álbuns",
"term.artists": "Intérpretes",
"term.podcasts": "Podcasts",
"term.playlists": "Listas de reprodução",
"term.charts": "Gráficos",
"term.playlist": "Lista de reprodução",
"term.newPlaylist": "Nova lista de reprodução",
"term.newPlaylistFolder": "Nova pasta de listas de reprodução",
"term.createNewPlaylist": "Criar nova lista de reprodução",
"term.createNewPlaylistFolder": "Criar nova pasta de listas de reprodução",
"term.deletePlaylist": "Tem a certeza de que pretende apagar esta lista de reprodução?",
"term.navigateBack": "Retroceder uma página",
"term.navigateForward": "Avançar uma página",
"term.play": "Reproduzir",
"term.pause": "Pausa",
"term.stop": "Parar",
"term.previous": "Anterior",
"term.next": "Seguinte",
"term.shuffle": "Modo aleatório",
"term.enableShuffle": "Ativar modo aleatório",
"term.disableShuffle": "Desativar modo aleatório",
"term.repeat": "Repetir",
"term.enableRepeatOne": "Ativar repetir uma",
"term.disableRepeatOne": "Desativar repetir uma",
"term.disableRepeat": "Não repetir",
"term.volume": "Volume",
"term.mute": "Mudo",
"term.unmute": "Com som",
"term.share": "Partilhar",
"term.share.success": "Copiado para a área de transferência",
"term.settings": "Definições",
"term.seeAll": "Ver tudo",
"term.sortBy": "Ordenar por",
"term.sortBy.album": "Álbum",
"term.sortBy.artist": "Intérprete",
"term.sortBy.name": "Nome",
"term.sortBy.genre": "Género",
"term.sortBy.releaseDate": "Data de lançamento",
"term.sortBy.duration": "Duração",
"term.sortBy.dateAdded": "Data de adição",
"term.sortOrder": "A-Z",
"term.sortOrder.ascending": "Ascendente",
"term.sortOrder.descending": "Descendente",
"term.viewAs": "Ver como",
"term.viewAs.coverArt": "Grafismos",
"term.viewAs.list": "Lista",
"term.dynamic": "Dinâmico",
"term.size": "Tamanho",
"term.size.normal": "Normal",
"term.size.compact": "Compacto",
"term.enable": "Ativar",
"term.disable": "Desativar",
"term.enabled": "Ativado",
"term.disabled": "Desativado",
"term.connect": "Ligar",
"term.connecting": "A ligar",
"term.disconnect": "Desligar",
"term.authed": "Autenticado",
"term.confirm": "Confirmar?",
"term.more": "Mais",
"term.less": "Menos",
"term.showMore": "Mostrar mais",
"term.showLess": "Mostrar menos",
"term.topSongs": "Músicas populares",
"term.latestReleases": "Últimos lançamentos",
"term.time.added": "Adicionado",
"term.time.released": "Lançado",
"term.time.updated": "Atualizado",
"term.time.days": "dias",
"term.time.day": {
"one": "dia",
"other": "dias"
},
"term.time.hours": "horas",
"term.time.hour": {
"one": "hora",
"other": "horas"
},
"term.time.minutes": "minutos",
"term.time.minute": {
"one": "minuto",
"other": "minutos"
},
"term.time.seconds": "segundos",
"term.time.second": {
"one": "segundo",
"other": "segundos"
},
"term.fullscreenView": "Vista de ecrã inteiro",
"term.defaultView": "Vista normal",
"term.audioSettings": "Definições de áudio",
"term.audioControls": "Controlos de volume",
"term.clearAll": "Limpar tudo",
"term.recentStations": "Estações recentes",
"term.personalStations": "Estações pessoais",
"term.amLive": "Apple Music Live",
"term.language": "Idioma",
"term.funLanguages": "Divertido",
"term.noLyrics": "A carregar... / Letra não encontrada. / Instrumental.",
"term.copyright": "Copyright",
"term.rightsReserved": "Todos os direitos reservados.",
"term.sponsor": "Patrocine este projecto",
"term.ciderTeam": "Equipa do Cider",
"term.developer": "Programador",
"term.socialTeam": "Equipa social",
"term.socials": "Redes sociais",
"term.contributors": "Contribuidores",
"term.equalizer": "Equalizador",
"term.reset": "Repor",
"term.tracks": "músicas",
"term.track": {
"one": "música",
"other": "músicas"
},
"term.videos": "Vídeos",
"term.menu": "Menu",
"term.check": "Verificar",
"term.aboutArtist": "Sobre {{artistName}}",
"term.topResult": "Melhor resultado",
"term.sharedPlaylists": "Listas de reprodução partilhadas",
"term.people": "Pessoas",
"term.newpreset.name": "Nome da nova predefinição do EQ",
"term.addedpreset": "Predefinição adicionada",
"term.deletepreset.warn": "Tem a certeza de que pretende apagar esta predefinição?",
"term.deletedpreset": "Predefinição eliminada",
"term.defaultPresets": "Predefinições por omissão",
"term.userPresets": "Predefinições do utilizador",
"term.requestError": "Ocorreu um problema ao processar o pedido.",
"term.song.link.generate": "A obter o URL de partilha song.link...",
"term.musicVideos": "Videoclipes",
"term.stations": "Estações",
"term.curators": "Curadores",
"term.appleCurators": "Curadores da Apple",
"term.radioShows": "Programas de rádio",
"term.recordLabels": "Gravadoras",
"term.videoExtras": "Vídeos extra",
"term.top": "Top",
"term.version": "Versão",
"term.noVideos": "Não foram encontrados vídeos.",
"term.plugin": "Plug-in",
"term.pluginMenu": "Menu de plug-ins",
"term.pluginMenu.none": "Sem plug-ins interactivos",
"term.replay": "Repetir",
"term.uniqueAlbums": "Álbuns únicos",
"term.uniqueArtists": "Intérpretes únicos",
"term.uniqueSongs": "Músicas únicas",
"term.topArtists": "Intérpretes populares",
"term.listenedTo": "Reproduzido:",
"term.times": "vezes",
"term.topAlbums": "Álbuns populares",
"term.plays": "Reproduções",
"term.topGenres": "Géneros populares",
"term.confirmLogout": "Tem a certeza de que pretende terminar sessão?",
"term.creditDesignedBy": "Concebido por ${authorUsername}",
"term.discNumber": "Disco ${discNumber}",
"home.title": "Início",
"home.recentlyPlayed": "Reproduzido recentemente",
"home.recentlyAdded": "Adicionado recentemente",
"home.artistsFeed": "Feed dos seus artistas",
"home.artistsFeed.noArtist": "Siga alguns artistas para ver os seus últimos lançamentos",
"home.madeForYou": "Feito para si",
"home.friendsListeningTo": "O que os seus amigos estão a ouvir",
"home.followedArtists": "Artistas seguidos",
"error.appleMusicSubRequired": "A Apple Music requer uma subscrição.",
"error.connectionError": "Ocorreu um problema ao estabelecer ligação à Apple Music.",
"error.noResults": "Sem resultados.",
"error.noResults.description": "Tente uma nova pesquisa.",
"podcast.followOnCider": "Siga no Cider",
"podcast.followedOnCider": "A seguir no Cider",
"podcast.subscribeOnItunes": "Subscreva no iTunes",
"podcast.subscribedOnItunes": "Subscrito no iTunes",
"podcast.itunesStore": "iTunes Store",
"podcast.episodes": "Episódios",
"podcast.playEpisode": "Reproduzir episódio",
"podcast.website": "Website do Podcast",
"action.hideLibrary": "Ocultar biblioteca",
"action.showLibrary": "Mostrar biblioteca",
"action.cut": "Cortar",
"action.paste": "Colar",
"action.selectAll": "Seleccionar tudo",
"action.delete": "Apagar",
"action.edit": "Editar",
"action.done": "Concluído",
"action.editTracklist": "Editar lista de reprodução",
"action.addToLibrary": "Adicionar à biblioteca",
"action.addToLibrary.success": "Adicionado à biblioteca",
"action.addToLibrary.error": "Erro ao adicionar à biblioteca",
"action.removeFromLibrary": "Remover da biblioteca",
"action.removeFromLibrary.success": "Removido da biblioteca",
"action.addToQueue": "Adicionar à fila",
"action.addToQueue.success": "Adicionado à fila",
"action.addToQueue.error": "Erro ao adicionar à fila",
"action.removeFromQueue": "Remover da fila",
"action.removeFromQueue.success": "Removido da fila",
"action.removeFromQueue.error": "Erro ao remover da fila",
"action.createPlaylist": "Criar uma nova lista de reprodução",
"action.addToPlaylist": "Adicionar à lista de reprodução",
"action.removeFromPlaylist": "Removar da lista de reprodução",
"action.addToFavorites": "Adicionar aos favoritos",
"action.follow": "Seguir",
"action.follow.success": "Seguido",
"action.follow.error": "Erro ao seguir",
"action.unfollow": "Não seguir",
"action.unfollow.success": "Não seguido",
"action.unfollow.error": "Erro ao deixar de seguir",
"action.playNext": "Reproduzir a seguir",
"action.playLater": "Reproduzir mais tarde",
"action.startRadio": "Criar estação",
"action.goToArtist": "Ir para intérprete",
"action.goToAlbum": "Ir para álbum",
"action.showInPlaylist": "Mostrar na lista de reprodução",
"action.showInAppleMusic": "Mostrar na Apple Music",
"action.moveToTop": "Mover para fora da pasta",
"action.share": "Partilhar",
"action.rename": "Renomear",
"action.love": "Gostar",
"action.unlove": "Desfazer gostar",
"action.dislike": "Não gostar",
"action.undoDislike": "Desfazer não gostar",
"action.showWebRemoteQR": "Web Remote",
"action.playTracksNext": "Reproduzir ${app.selectedMediaItems.length} músicas a seguir",
"action.playTracksLater": "Reproduzir ${app.selectedMediaItems.length} músicas mais tarde",
"action.removeTracks": "Remover ${self.selectedItems.length} músicas da fila",
"action.import": "Importar",
"action.export": "Exportar",
"action.showAlbum": "Mostrar álbum completo",
"action.tray.minimize": "Minimizar para a bandeja",
"action.tray.quit": "Fechar",
"action.tray.show": "Mostrar o Cider",
"action.tray.playpause": "Reproduzir/Pausa",
"action.tray.next": "Seguinte",
"action.tray.previous": "Anterior",
"action.tray.listento": "Ouvir:",
"action.update": "Atualizar",
"action.install": "Instalar",
"action.copy": "Copiar",
"action.newpreset": "Nova predefinição...",
"action.deletepreset": "Eliminar predefinição",
"action.open": "Abrir",
"action.close": "Fechar",
"action.relaunch.confirm": "Pretende reiniciar o Cider?",
"action.cast.chromecast": "Chromecast",
"action.cast.todevices": "Transmitir para dispositivos",
"action.cast.stop": "Parar a transmissão para todos os dispositivos",
"action.cast.airplay": "AirPlay",
"action.cast.airplay.underdevelopment": "AirPlay ainda está em desenvolvimento",
"action.cast.scan": "Procurar",
"action.cast.scanning": "A procurar...",
"action.createNew": "Criar nova...",
"action.openArtworkInBrowser": "Abrir grafismo no navegador",
"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.reload": "Atualizar",
"menubar.options.forcereload": "Forçar atualização",
"menubar.options.toggledevtools": "Alternar ferramentas do programador",
"menubar.options.window": "Janela",
"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.controls": "Controlos",
"menubar.options.next": "Seguinte",
"menubar.options.playpause": "Reproduzir/Pausa",
"menubar.options.previous": "Anterior",
"menubar.options.volumeup": "Aumentar 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.accountsettings": "Definições da conta",
"menubar.options.signout": "Terminar sessão",
"menubar.options.support": "Suporte",
"menubar.options.discord": "Discord",
"menubar.options.github": "GitHub Wiki",
"menubar.options.report": "Reportar um...",
"menubar.options.bug": "Problema",
"menubar.options.feature": "Pedido de funcionalidade",
"menubar.options.trans": "Pedido de tradução",
"menubar.options.license": "Ver licença",
"menubar.options.conf": "Abrir ficheiro de configuração no editor",
"menubar.options.listennow": "Ouvir agora",
"menubar.options.recentlyAdded": "Adições recentes",
"menubar.options.songs": "Músicas",
"settings.header.general": "Geral",
"settings.header.general.description": "Ajustar as definições gerais do Cider.",
"settings.option.general.language": "Idioma",
"settings.option.general.resumebehavior": "Comportamento de retoma",
"settings.option.general.resumebehavior.description": "Define a forma como o Cider irá retomar a sua sessão quando regressar à aplicação.",
"settings.option.general.resumebehavior.locally": "Localmente",
"settings.option.general.resumebehavior.locally.description": "O Cider irá retomar a sua última sessão nesta máquina.",
"settings.option.general.resumebehavior.history": "Histórico",
"settings.option.general.resumebehavior.history.description": "O Cider irá colocar na fila a última música do seu histórico da Apple Music, através de todos os seus dispositivos.",
"settings.option.general.resumetabs": "Abrir separador no arranque",
"settings.option.general.resumetabs.description": "Pode escolher que separador quer abrir quando abre o Cider.",
"settings.option.general.resumetabs.dynamic": "Dinâmico",
"settings.option.general.resumetabs.dynamic.description": "O Cider abrirá o separador que utilizou pela última vez.",
"settings.option.general.language.main": "Idiomas",
"settings.option.general.language.fun": "Idiomas divertidos",
"settings.option.general.language.unsorted": "Indiferenciado",
"settings.option.general.customizeSidebar": "Personalizar os itens da barra lateral",
"settings.option.general.customizeSidebar.customize": "Personalizar",
"settings.option.general.keybindings": "Atalhos do teclado",
"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.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.option.general.keybindings.open": "Abrir",
"settings.option.general.themeUpdateNotification": "Verificação automática de atualizações de temas",
"settings.option.general.showLovedTracksInline": "Mostrar músicas que gosta \"inline\"",
"settings.description.search": "Pesquisa",
"settings.description.albums": "Álbuns da biblioteca",
"settings.description.artists": "Intérpretes da biblioteca",
"settings.description.browse": "Explorar",
"settings.description.private": "Alternar sessão privada",
"settings.description.remote": "Web Remote",
"settings.description.audio": "Definições de áudio",
"settings.description.plugins": "Menu de plug-ins",
"settings.description.cast": "Transmitir para dispositivos",
"settings.description.settings": "Definições",
"settings.description.developer": "Ferramentas do programador",
"settings.description.listnow": "Ouvir agora",
"settings.description.recentAdd": "Adições recentes",
"settings.description.songs": "Músicas",
"settings.notyf.updateCider.update-not-available": "Nenhuma atualização disponível",
"settings.notyf.updateCider.update-downloaded": "A atualização foi descarregada, reinicie para aplicar",
"settings.notyf.updateCider.update-timeout": "O pedido de atualização estou o tempo limite",
"settings.header.audio": "Áudio",
"settings.header.audio.description": "Ajustar as definições de áudio para o Cider.",
"settings.option.audio.volumeStep": "Nível de incremento de volume",
"settings.option.audio.advanced": "Controlo avançado de volume",
"settings.option.audio.maxVolume": "Volume máximo",
"settings.option.audio.changePlaybackRate": "Alterar velocidade de reprodução",
"settings.option.audio.playbackRate": "Velocidade de reprodução",
"settings.option.audio.playbackRate.change": "Alterar",
"settings.option.audio.quality": "Qualidade do áudio",
"settings.header.audio.quality.hireslossless": "Alta resolução sem perdas",
"settings.header.audio.quality.hireslossless.description": "até 24-bit/192 kHz",
"settings.header.audio.quality.lossless": "Sem perdas",
"settings.header.audio.quality.lossless.description": "até 24-bit/48 kHz",
"settings.header.audio.quality.high": "Alta",
"settings.header.audio.quality.high.description": "256 kbps",
"settings.header.audio.quality.standard": "Padrão",
"settings.header.audio.quality.standard.description": "64 kbps",
"settings.option.audio.seamlessTransition": "Transição gradual do áudio",
"settings.option.audio.enableAdvancedFunctionality": "Ativar funcionalidades avançadas",
"settings.option.audio.enableAdvancedFunctionality.description": "Ativar o AudioContext dá acesso a funcionalidades alargadas como Normalização de Áudio, Equalizadores e Visualizadores - contudo, isto pode causar dificuldades em alguns sistemas.",
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "O Cider pensa que o seu PC não é capaz de lidar com estas funcionalidades. Tem a certeza de que pretende continuar?",
"settings.option.audio.audioLab": "Cider Audio Lab",
"settings.option.audio.audioLab.description": "Efeitos de áudio desenvolvidos internamente para o Cider.",
"settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California",
"settings.warn.audioLab.withoutAF": "AudioContext (funcionalidade avançada) é necessário para suportar o Cider Audio Lab.",
"settings.warn.enableAdvancedFunctionality": "AudioContext (funcionalidade avançada) é necessário para suportar esta funcionalidade.",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calor Analógico",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula o calor analógico inspirado no Korg Nutube 6P1",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidade do calor analógico",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Altera a intensidade do processamento do módulo de calor analógico.",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Suave",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Quente",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Cria uma atmosfera musical diferente inspirada nas mais modernas aparelhagens.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Modo do Cider Atmosphere Realizer™",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Altera o modo de funcionamento do módulo Atmosphere Realizer.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Hōjicha Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Genmaicha Tapioca Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Rock Salt Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Uji Matcha Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jasmine Macchiato",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500": "Moonlight Softcake",
"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.ciderPPE": "Cider Adrenaline Processor™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Melhora a qualidade de áudio percecionada do áudio codificado em AAC, utilizando um algoritmo de tempo real que tira partido tanto dos modelos psicoacústicos da audição humana como das características de codificação do AAC.",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "O CAP não é compatível com a espacialização. Por favor, desative a espacialização para continuar.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Intensidade do CAP",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Muda a intensidade do processamento feito ao áudio (a agressividade pode produzir resultados indesejáveis).",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Padrão",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptativo",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Antigo",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agressivo",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalização de áudio",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza o volume de pico das músicas para criar uma experiência de audição mais uniforme (não funciona em músicas carregadas pelo utilizador).",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Gerido pelo Audio Lab",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Espacialização ajustada pelo Cider",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efeito de espacialização pré-ajustado, desactiva as configurações personalizáveis de espacialização de áudio.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Perfil de espacialização do Cider",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Altera o perfil de ajuste da espacialização.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Padrão",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Palco",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separação",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Mínimo",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiófilo",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Difundido",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Encore expandido",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "A espacialização não é compatível com o CAP. Por favor, desative o CAP para continuar.",
"settings.option.audio.dbspl.display": "Mostrar dB SPL",
"settings.option.audio.dbspl.description": "(Apenas para utilizadores avançados) Mostrar dB SPL em vez de dBFS no controlo de volume.",
"settings.option.audio.dbfs.calibration": "Calibração de 0 dBFS",
"settings.option.audio.dbfs.description": "Introduza o pico de SPL com ponderação Z quando o Cider está a 0 dBFS.",
"settings.header.visual": "Aparência",
"settings.header.visual.description": "Ajustar as definições visuais do Cider.",
"settings.option.visual.windowStyle": "Estilo da janela",
"settings.option.visual.windowBackgroundStyle": "Estilo do fundo da janela",
"settings.header.visual.windowBackgroundStyle.none": "Nenhum",
"settings.header.visual.windowBackgroundStyle.artwork": "Grafismo",
"settings.header.visual.windowBackgroundStyle.image": "Imagem",
"settings.option.visual.animatedArtwork": "Grafismo animado",
"settings.header.visual.animatedArtwork.always": "Sempre",
"settings.header.visual.animatedArtwork.limited": "Limitado a páginas e entradas especiais",
"settings.header.visual.animatedArtwork.disable": "Desativar em todo o lado",
"settings.option.visual.animatedArtworkQuality": "Qualidade dos grafismos animados",
"settings.header.visual.animatedArtworkQuality.low": "Baixa",
"settings.header.visual.animatedArtworkQuality.medium": "Média",
"settings.header.visual.animatedArtworkQuality.high": "Alta",
"settings.header.visual.animatedArtworkQuality.veryHigh": "Muito alta",
"settings.header.visual.animatedArtworkQuality.extreme": "Extrema",
"settings.option.visual.animatedWindowBackground": "Fundo da janela animado",
"settings.option.visual.hardwareAcceleration": "Aceleração de hardware",
"settings.option.visual.hardwareAcceleration.description": "Requer reinício",
"settings.header.visual.hardwareAcceleration.default": "Padrão",
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
"settings.option.visual.uiscale": "Escala da UI",
"settings.header.visual.theme": "Tema",
"settings.option.visual.theme.github.download": "Instalar a partir de um URL do GitHub",
"settings.option.visual.theme.github.openfolder": "Abrir pasta de temas",
"settings.option.visual.theme.github.explore": "Explorar temas do GitHub",
"settings.header.visual.theme.github.page": "Temas do GitHub",
"settings.option.visual.theme.github.install.confirm": "Tem a certeza de que pretende instalar {{ repo }}?",
"settings.prompt.visual.theme.github.URL": "Introduza o URL do tema que pretende instalar",
"settings.prompt.visual.theme.uninstallTheme": "Tem a certeza de que pretende desinstalar {{ theme }}?",
"settings.option.visual.theme.checkForUpdates": "Procurar por atualizações",
"settings.option.visual.theme.manageStyles": "Gerir estilos",
"settings.option.visual.theme.uninstall": "Desinstalar",
"settings.option.visual.theme.viewInfo": "Ver informação",
"settings.option.visual.theme.github.available": "Disponível",
"settings.option.visual.theme.github.applied": "Aplicado",
"settings.notyf.visual.theme.install.success": "Tema instalado com sucesso",
"settings.notyf.visual.theme.install.error": "A instalação do tema falhou",
"settings.header.visual.plugin": "Plug-in",
"settings.option.visual.plugin.github.download": "Instalar a partir de um URL do GitHub",
"settings.option.visual.plugin.github.explore": "Explorar plug-ins do GitHub",
"settings.header.visual.plugin.github.page": "Plug-ins do GitHub",
"settings.option.visual.plugin.github.install.confirm": "Tem a certeza de que pretende instalar {{ repo }}?",
"settings.prompt.visual.plugin.github.URL": "Introduza o URL do plug-in que pretende instalar",
"settings.prompt.visual.plugin.github.success": "Plug-in instalado com sucesso. Pressione OK para reiniciar o Cider",
"settings.notyf.visual.plugin.install.success": "Plug-in instalado com sucesso",
"settings.notyf.visual.plugin.install.error": "A instalação do plug-in falhou",
"settings.option.visual.theme.default": "Cider",
"settings.option.visual.theme.dark": "Escuro",
"settings.option.visual.showPersonalInfo": "Mostrar informação pessoal",
"settings.header.window": "Janela",
"settings.header.window.description": "Ajustar as definições da janela para o Cider.",
"settings.option.window.openOnStartup": "Abrir o Cider no arranque",
"settings.option.window.openOnStartup.hidden": "Abrir escondido",
"settings.option.window.useNativeTitleBar": "Usar barra de título nativa",
"settings.option.window.windowControlStyle": "Estilo de controlo da janela",
"settings.option.window.windowControlStyle.right": "Direita",
"settings.option.window.windowControlStyle.left": "Esquerda",
"settings.header.lyrics": "Letras",
"settings.header.lyrics.description": "Ajustar as definições de letras para o Cider.",
"settings.option.lyrics.enableMusixmatch": "Ativar letras do Musixmatch",
"settings.option.lyrics.enableMusixmatchKaraoke": "Ativar o modo Karaoke (apenas para o Musixmatch)",
"settings.option.lyrics.musixmatchPreferredLanguage": "Língua preferida para traduções do Musixmatch",
"settings.option.lyrics.enableYoutubeLyrics": "Ativar letras do Youtube para videoclipes",
"settings.option.lyrics.enableQQLyrics": "Ativar letras do QQ",
"settings.header.connectivity": "Conectividade",
"settings.header.connectivity.description": "Ajustar as definições de conectividade para o Cider.",
"settings.option.connectivity.playbackNotifications": "Notificações de reprodução",
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
"settings.option.connectivity.discordRPC.clientName": "Nome do cliente",
"settings.option.connectivity.discordRPC.clearOnPause": "Limpar o Discord Rich Presence ao colocar em pausa",
"settings.option.connectivity.discordRPC.hideButtons": "Esconder botões no Discord Rich Presence",
"settings.option.connectivity.discordRPC.hideTimestamp": "Esconder timestamp no Discord Rich Presence",
"settings.option.connectivity.discordRPC.detailsFormat": "Formato dos detalhes",
"settings.option.connectivity.discordRPC.stateFormat": "Formato do estado",
"settings.option.connectivity.discordRPC.reload": "Reiniciar o DiscordRPC",
"settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPC ligação restabelecida ao utilizador: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm atraso do scrobble (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Ativar Last.fm Now Playing",
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Remover artistas do título da música (Last.fm)",
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar música em loop (Last.fm)",
"settings.header.debug": "Debug",
"settings.option.debug.copy_log": "Copiar logs para a área de transferência",
"settings.option.debug.openAppData": "Abrir pasta do Cider",
"settings.header.experimental": "Experimental",
"settings.header.experimental.description": "Ajustar as definições experimentais para o Cider.",
"settings.option.experimental.reinstallwidevine": "Reinstalar WidevineCDM",
"settings.option.experimental.reinstallwidevine.confirm": "Tem a certeza de que pretende reinstalar o Widevine?",
"settings.option.experimental.unknownPlugin": "Fontes desconhecidas",
"settings.option.experimental.unknownPlugin.description": "Permitir a instalação de plug-ins de outros repositórios que não o repositório de plug-ins do Cider",
"settings.option.experimental.compactUI": "UI compacta",
"settings.option.window.close_button_hide": "Botão fechar oculta a aplicação",
"settings.option.experimental.inline_playlists": "Listas de reprodução e álbuns \"inline\"",
"settings.option.advanced.playlistTrackMapping": "Mapeamento de músicas de listas de reprodução",
"settings.option.advanced.playlistTrackMapping.description": "Ativa uma análise profunda das listas de reprodução para determinar que músicas estão em que listas de reprodução. O tempo de construção da cache das listas de reprodução pode aumentar significativamente.",
"settings.option.visual.transparent": "Moldura transparente",
"settings.option.visual.transparent.description": "Necessita de suporte do tema, requer reinício",
"settings.header.advanced": "Avançado",
"settings.header.connect": "Sincronização",
"settings.option.connect.link_account": "Ativar a sincronização com o Cider Connect",
"settings.option.connect.link_account.description": "Ligar a sua conta Discord ao Cider Connect permite-lhe armazenar dados de utilizador incluindo definições, EQ's, e eventualmente mais uma vez terminado (trabalho em curso).",
"spatial.notTurnedOn": "A espacialização de áudio está desativada. Para utilizar, por favor, ative-a primeiro.",
"spatial.spatialProperties": "Propriedades espaciais",
"spatial.width": "Largura",
"spatial.height": "Altura",
"spatial.depth": "Profundidade",
"spatial.gain": "Ganho",
"spatial.roomMaterials": "Materiais da sala",
"spatial.roomDimensions": "Dimensões da sala",
"spatial.roomPositions": "Posições na sala",
"spatial.setDimensions": "Definir dimensões",
"spatial.setPositions": "Definir posições",
"spatial.up": "Acima",
"spatial.front": "Frente",
"spatial.left": "Esquerda",
"spatial.right": "Direita",
"spatial.back": "Atrás",
"spatial.down": "Em baixo",
"spatial.listener": "Ouvinte",
"spatial.audioSource": "Fonte de áudio",
"settings.header.unfinished": "Inacabado",
"remote.web.title": "Cider Remote",
"remote.web.description": "Digitalize o código QR para emparelhar o seu telemóvel com esta instância do Cider",
"share.platform.twitter.tweet": "Ouça {{song}} na Apple Music.\n\n{{url}}\n\n#AppleMusic #Cider",
"share.platform.twitter": "Twitter",
"share.platform.facebook": "Facebook",
"share.platform.reddit": "Reddit",
"share.platform.telegram": "Telegram",
"share.platform.whatsapp": "WhatsApp",
"share.platform.messenger": "Messenger",
"share.platform.email": "Email",
"share.platform.songLink": "Copiar com song.link",
"share.platform.clipboard": "Copiar ligação",
"about.thanks": "Um grande obrigado à equipa da Cider Collective e a todos os nossos contribuidores."
}

View file

@ -2,7 +2,7 @@
"i18n.languageName": "English (US)",
"i18n.languageNameEnglish": "English (US)",
"i18n.category": "main",
"i18n.authors": "@maikirakiwi @kyw504100 @nosh118",
"i18n.authors": "@notmaikiwi @kyw504100 @nosh118 @cryptofyre",
"app.name": "Cider",
"date.format": "${m} ${d}, ${y}",
"dialog.cancel": "Cancel",
@ -153,6 +153,7 @@
},
"term.videos": "Videos",
"term.menu": "Menu",
"term.themeManaged": "Managed by a theme",
"term.check": "Check",
"term.aboutArtist": "About {{artistName}}",
"term.topResult": "Top Result",
@ -212,6 +213,12 @@
"podcast.episodes": "Episodes",
"podcast.playEpisode": "Play Episode",
"podcast.website": "Podcast Website",
"action.hideLibrary": "Hide Library",
"action.showLibrary": "Show Library",
"action.cut": "Cut",
"action.paste": "Paste",
"action.selectAll": "Select All",
"action.delete": "Delete",
"action.edit": "Edit",
"action.done": "Done",
"action.editTracklist": "Edit Tracklist",
@ -263,6 +270,7 @@
"action.tray.playpause": "Play/Pause",
"action.tray.next": "Next",
"action.tray.previous": "Previous",
"action.tray.listento": "Listen To:",
"action.update": "Update",
"action.install": "Install",
"action.copy": "Copy",
@ -366,6 +374,7 @@
"settings.header.audio": "Audio",
"settings.header.audio.description": "Adjust the audio settings for Cider.",
"settings.option.audio.volumeStep": "Volume Step",
"settings.option.audio.advanced": "Advanced Volume Control",
"settings.option.audio.maxVolume": "Max Volume",
"settings.option.audio.changePlaybackRate": "Change Playback Rate",
"settings.option.audio.playbackRate": "Playback Rate",
@ -398,20 +407,29 @@
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Realizes a different musical atmosphere modelled after the state of the art audio setups.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™ Mode",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Changes the mode of operation of the Atmosphere Realizer module.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Natural (Standard)",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Natural (Plus)",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Hōjicha Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Genmaicha Tapioca Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Rock Salt Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Uji Matcha Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jasmine Macchiato",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Moonlight Softcake",
"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.ciderPPE": "Cider Adrenaline Processor™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Enhances the perceived audio quality of 256 kbps AAC audio by using a real-time algorithm that takes advantage of both psychoacoustic models of human hearing and AAC encoding characteristics.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Enhances the perceived audio quality of AAC encoded audio by using a real-time algorithm that takes advantage of both psychoacoustic models of human hearing and AAC encoding characteristics.",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP is not compatible with Spatialization. Please disable Spatialization to continue.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAP Strength",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptive",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Legacy",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Aggressive",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalization",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience. (Does not work on user uploaded tracks)",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Managed by Audio Lab",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider Tuned Spatialization",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pre-tuned Spatializing Effect, disables the customizable settings of Audio Spatialization. Spatialization must be enabled as a prerequisite.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Pre-tuned Spatializing Effect, disables the customizable settings of Audio Spatialization.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider Spatialization Profile",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Changes the Tuning Profile of the Spatialization.",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standard",
@ -419,6 +437,9 @@
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separation",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minimal",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Diffused",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatialization is not compatible with CAP. Please disable CAP to continue.",
"settings.option.audio.dbspl.display": "dB SPL Display",
"settings.option.audio.dbspl.description": "(Advanced users only) Display dB SPL instead of dBFS on the volume slider.",
@ -500,6 +521,8 @@
"settings.option.connectivity.discordRPC.hideTimestamp": "Hide timestamp on Discord Rich Presence",
"settings.option.connectivity.discordRPC.detailsFormat": "Details Format",
"settings.option.connectivity.discordRPC.stateFormat": "State Format",
"settings.option.connectivity.discordRPC.reload": "Reload DiscordRPC",
"settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPC Reconnected to User: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble Delay (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing",
@ -557,5 +580,44 @@
"share.platform.email": "Email",
"share.platform.songLink": "Copy with song.link",
"share.platform.clipboard": "Copy Link",
"about.thanks": "Major thanks to the Cider Collective Team and all of our contributors."
"about.thanks": "Major thanks to the Cider Collective Team and all of our contributors.",
"oobe.yes": "Yes",
"oobe.no": "No",
"oobe.next": "Next",
"oobe.previous": "Previous",
"oobe.done": "Done",
"oobe.amupsell.title": "Before we start",
"oobe.amupsell.text": "Cider requires an active, paid Apple Music subscription\nCider will not work with Apple Music Voice Plan or some promotional trial subscriptions. If you already have a qualified Apple Music subscription click Next to continue.",
"oobe.amupsell.subscribeBtn": "Subscribe to Apple Music",
"oobe.amupsell.explainBtn": "Explain",
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
"oobe.amupsell.promoExplained": "Some promotional and non US Apple Music trial subscriptions do not have access to the required Apple Music Web Player API's needed for Cider to function. To verify if your active trial will work with Cider go to <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> log in and try to play some music. If it works, great! You're ready to use Cider, however if it does not consider subscribing to Apple Music here: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
"oobe.intro.title": "Welcome to Cider",
"oobe.intro.subtitle": "",
"oobe.intro.text": "Let's get a few things set up so you can use Cider, how you'd like. You can always change these settings later.",
"oobe.general.title": "General",
"oobe.general.subtitle": "",
"oobe.general.text": "",
"oobe.audio.title": "Audio",
"oobe.audio.subtitle": "",
"oobe.audio.text": "Cider features a custom tuned and designed audio stack that delivers a rich high quality audio experience.\nFeaturing Cider Adrenaline, Atmosphere Realizer, and Spatialized Audio.\nTo enable this functionality \"Advanced Audio Functionality\" must be enabled.\nEnabling Advanced Audio Functionality will give you access to these enhancements in the Cider Audio Labs, found in the app settings.",
"oobe.audio.advancedFunctionality": "",
"oobe.visual.title": "Visual",
"oobe.visual.subtitle": "",
"oobe.visual.text": "",
"oobe.visual.layout.text": "Cider features two window different layouts.\nMaverick is an iTunes like layout with the player at the top of the window.\nMojave is a new spin created by the Cider Collective.\n\nYou can change the layout any time in the settings.",
"oobe.visual.suggestingThemes": "Theming is a great way to personalize your experience. Here are a few we suggest: ",
"oobe.visual.suggestingThemes.subtext": "(These themes will be downloaded from GitHub)",
"oobe.visual.suggestingThemes.default": "Cider",
"oobe.visual.suggestingThemes.default.text": "The classic Cider theme.",
"oobe.visual.suggestingThemes.dark": "Dark",
"oobe.visual.suggestingThemes.dark.text": "Darkness.",
"oobe.visual.suggestingThemes.community1": "Groovy",
"oobe.visual.suggestingThemes.community1.text": "A WinUI influenced theme",
"oobe.visual.suggestingThemes.community2": "iTheme",
"oobe.visual.suggestingThemes.community2.text": "The classic big fruit layout.",
"oobe.visual.suggestingThemes.community3": "Dracula",
"oobe.visual.suggestingThemes.community3.text": "The iconic Dracula color scheme.",
"oobe.amsignin.title": ""
}

View file

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

View file

@ -2,7 +2,7 @@
"i18n.languageName": "繁體中文(香港)",
"i18n.languageNameEnglish": "Trad. Chinese (Hong Kong)",
"i18n.category": "main",
"i18n.authors": "@kyw504100 @maikirakiwi @BillKerman @jay900604",
"i18n.authors": "@kyw504100 @notmaikiwi @BillKerman @jay900604",
"app.name": "Cider",
"date.format": "${y} 年 ${m} 月 ${d} 日",
"dialog.cancel": "取消",
@ -387,7 +387,7 @@
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Genmaicha Tapioca Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Hōjicha Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500": "Moonlight Softcake",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Moonlight Softcake",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 數碼音訊增強處理™️",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "透過人類的聽力心理學模型和 AAC 編碼特色的即時算法,強化 AAC 音訊的感知音訊質素。",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "音訊增強處理不相容於空間音訊,請先停用空間音訊。",
@ -399,7 +399,7 @@
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "自動將歌曲播放音量調整至相同水平,建立更統一的聆聽體驗。",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "由音訊實驗室管理",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider 空間音訊效果",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "預先調整空間音訊效果,關閉空間音訊可自訂設定。但必須先開啟空間音訊才可以做設定。",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "預先調整空間音訊效果,關閉空間音訊可自訂設定。",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider 空間音訊配置檔案",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "變更空間音訊的配置檔案,需要重新啟動應用程式。",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minimal",

View file

@ -2,7 +2,7 @@
"i18n.languageName": "繁體中文(臺灣)",
"i18n.languageNameEnglish": "Trad. Chinese (Taiwan)",
"i18n.category": "main",
"i18n.authors": "@maikirakiwi @jay900604 @kyw504100 @BillKerman",
"i18n.authors": "@notmaikiwi @jay900604 @kyw504100 @BillKerman",
"app.name": "Cider",
"date.format": "${y}年${m}月${d}日",
"dialog.cancel": "取消",
@ -37,6 +37,7 @@
"term.podcasts": "Podcasts",
"term.playlists": "播放列表",
"term.playlist": "播放列表",
"term.charts": "圖表",
"term.newPlaylist": "新的播放列表",
"term.newPlaylistFolder": "新的播放列表檔案夾",
"term.createNewPlaylist": "新增播放列表",
@ -53,8 +54,9 @@
"term.repeat": "重複播放",
"term.enableShuffle": "開啟隨機播放",
"term.disableShuffle": "取消隨機播放",
"term.repeat": "開啟單曲循環",
"term.enableRepeatOne": "取消單曲循環",
"term.disableRepeat": "取消重複",
"term.enableRepeatOne": "開啟單曲循環",
"term.disableRepeatOne": "取消單曲循環",
"term.volume": "音量",
"term.mute": "靜音",
"term.unmute": "取消靜音",
@ -110,11 +112,11 @@
"term.clearAll": "清空",
"term.recentStations": "最近收聽的廣播",
"term.language": "語言",
"term.noLyrics": "沒有可用的歌詞",
"term.noLyrics": "沒有可用的歌詞/純音樂享受",
"term.copyright": "版權聲明",
"term.rightsReserved": "保留所有權利。",
"term.sponsor": "贊助我們",
"term.socials": "社群平台",
"term.socials": "追蹤我們",
"term.ciderTeam": "Cider 團隊",
"term.developer": "開發者",
"term.socialTeam": "公關團隊",
@ -145,10 +147,10 @@
"home.madeForYou": "為您推薦",
"home.friendsListeningTo": "朋友正在聆聽",
"home.followedArtists": "追蹤的藝人",
"error.appleMusicSubRequired": "需要訂閱 Apple Music 服務以使用 Cider",
"error.appleMusicSubRequired": "你需要擁有 Apple Music 訂閱,才能使用 Cider 軟體。",
"error.connectionError": "無法連線到 Apple Music。",
"error.noResults": "沒有結果",
"error.noResults.description": "嘗試新的搜尋項目。",
"error.noResults.description": "請嘗試透過搜尋功能尋找內容。",
"podcast.followOnCider": "在 Cider 上追蹤",
"podcast.followedOnCider": "已追蹤",
"podcast.subscribeOnItunes": "在 iTunes 上訂閱",
@ -159,6 +161,8 @@
"podcast.website": "Podcast 網站",
"action.edit": "編輯",
"action.done": "完成",
"action.hideLibrary": "隱藏側邊欄",
"action.showLibrary": "顯示側邊欄",
"action.editTracklist": "編輯歌曲清單",
"action.addToLibrary": "加入到資料庫",
"action.addToLibrary.success": "成功加入資料庫",
@ -261,7 +265,7 @@
"settings.header.audio.quality.standard": "高效率",
"settings.option.audio.seamlessTransition": "無間斷播放",
"settings.option.audio.enableAdvancedFunctionality": "進階音訊功能",
"settings.option.audio.enableAdvancedFunctionality.description": "開啟 AudioContext 將啟用類似音量平衡和等化器的進階設定。但這並不一定適合每部電腦,可能會發生音樂卡頓。",
"settings.option.audio.enableAdvancedFunctionality.description": "開啟進階音訊功能將提供包含音量平衡和等化器等進階設定。但這不一定適合每部電腦,可能會發生音樂卡頓。",
"settings.option.audio.audioLab": "Cider 音訊實驗室",
"settings.option.audio.audioLab.description": "包含由 Cider 開發團隊進行的各種音訊改善功能。",
"settings.warn.audioLab.withoutAF": "使用 Cider 音訊實驗室需要開啟進階音訊功能才能使用。",
@ -272,7 +276,7 @@
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "溫和",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "溫暖",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider 臨場音效™️",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "以業界頂尖的算法,實現擁有臨場感的音樂體驗。",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "以業界頂尖的算法,實現擁有臨場感的音樂聆聽體驗。",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider 臨場音效™️模式",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "更改臨場音效感的模式。",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "自然(標準)",
@ -285,9 +289,9 @@
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "增強",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音量平衡",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "自動將歌曲播放音量調整至相同位準,享受更舒適的聆聽體驗。",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "此功能由音訊實驗室管理",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "此功能現在由 Cider 音訊實驗室管理。",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider 空間音訊效果",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "預先調整空間音訊效果,關閉空間音訊可自訂設定。但必須先開啟空間音訊才可以做設定。",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "預先調整空間音訊效果,關閉空間音訊可自訂設定。",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider 空間音訊配置檔案",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "變更空間音訊的配置檔案,需要重新啟動應用程式。",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "標準",
@ -368,11 +372,13 @@
"settings.option.connectivity.discordRPC.hideTimestamp": "隱藏 Discord 動態的時間戳",
"settings.option.connectivity.discordRPC.detailsFormat": "詳細資訊格式",
"settings.option.connectivity.discordRPC.stateFormat": "狀態格式",
"settings.option.connectivity.discordRPC.reload": "重新載入 Discord 動態",
"settings.option.connectivity.discordRPC.reconnectedToUser": "Discord 動態重新連線到使用者: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.FM 音樂記錄",
"settings.option.connectivity.lastfmScrobble.delay": "Last.FM 歌曲追蹤延遲 (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "開啟 Last.FM 正在聆聽",
"settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除客串藝人 (Last.FM)",
"settings.option.connectivity.lastfmScrobble.filterLoop": "不記錄單曲循環 (Last.FM)",
"settings.option.connectivity.lastfmScrobble.removeFeatured": "從 Last.FM 的歌名中移除客串藝人",
"settings.option.connectivity.lastfmScrobble.filterLoop": "讓 Last.FM 不記錄單曲循環",
"settings.header.debug": "除錯",
"settings.option.debug.copy_log": "複製執行紀錄檔至剪貼簿",
"settings.option.debug.openAppData": "打開 Cider 資料夾",
@ -380,7 +386,7 @@
"settings.header.experimental.description": "調整 Cider 的實驗性功能",
"settings.option.experimental.reinstallwidevine": "重新安裝 WidevineCDM",
"settings.option.experimental.reinstallwidevine.confirm": "你確定要重新安裝 WidevineCDM 嗎?",
"settings.option.experimental.unknownPlugin": "未知來源",
"settings.option.experimental.unknownPlugin": "其他來源",
"settings.option.experimental.unknownPlugin.description": "允許從 Cider 來源以外的 repo 安裝套件",
"settings.option.experimental.compactUI": "使用緊密的介面設計",
"settings.option.window.close_button_hide": "關閉按鈕將 Cider 隱藏至系統列",
@ -392,7 +398,7 @@
"settings.header.advanced": "進階",
"settings.header.connect": "同步",
"settings.option.connect.link_account": "開啟與 Cider Connect 同步",
"settings.option.connect.link_account.description": "將您的 Discord 帳戶與 Cider Connect 連接後,你可以儲存使用者資料,包括設定、等化器,並最終在完成後儲存更多資料。(正在進行中",
"settings.option.connect.link_account.description": "將你的 Discord 帳戶與 Cider 連線後,你將可以儲存使用者資料,且包括設定、等化器以及更多資料。(該功能開發中...",
"spatial.notTurnedOn": "空間音訊目前是關閉狀態,請先開啟再使用。",
"spatial.spatialProperties": "空間音訊屬性設定",
"spatial.width": "寬度",

View file

@ -55,6 +55,9 @@ export class AppEvents {
app.exit()
}
// Try limiting JS memory to 350MB.
app.commandLine.appendSwitch('js-flags', '--max-old-space-size=350');
// Expose GC
app.commandLine.appendSwitch('js-flags', '--expose_gc')
@ -314,6 +317,8 @@ export class AppEvents {
{type: 'separator'},
/* For now only idea i dont know if posible to implement
this could be implemented in a plugin if you would like track info, it would be impractical to put listeners in this file. -Core
{
label: this.i18n['action.tray.listento'],
enabled: false,
@ -329,7 +334,7 @@ export class AppEvents {
*/
{
visible: (visible === false),
visible: !visible,
label: this.i18n['action.tray.playpause'],
click: () => {
utils.getWindow().webContents.executeJavaScript('MusicKitInterop.playPause()')
@ -337,7 +342,7 @@ export class AppEvents {
},
{
visible: (visible === false),
visible: !visible,
label: this.i18n['action.tray.next'],
click: () => {
utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`)
@ -345,14 +350,14 @@ export class AppEvents {
},
{
visible: (visible === false),
visible: !visible,
label: this.i18n['action.tray.previous'],
click: () => {
utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`)
}
},
{type: 'separator'},
{type: 'separator', visible: !visible},
{
label: (visible ? this.i18n['action.tray.minimize'] : `${this.i18n['action.tray.show']}`),

View file

@ -1,5 +1,5 @@
import {join} from "path";
import {app, BrowserWindow as bw, ipcMain, ShareMenu, shell} from "electron";
import {app, BrowserWindow as bw, ipcMain, ShareMenu, shell, screen} from "electron";
import * as windowStateKeeper from "electron-window-state";
import * as express from "express";
import * as getPort from "get-port";
@ -14,7 +14,7 @@ import {
statSync,
unlinkSync,
rmdirSync,
lstatSync
lstatSync,
} from "fs";
import {Stream} from "stream";
import {networkInterfaces} from "os";
@ -27,6 +27,9 @@ import {watch} from "chokidar";
import * as os from "os";
import wallpaper from "wallpaper";
import * as AdmZip from "adm-zip";
import * as path from 'path';
const { readdir } = require('fs').promises;
/**
* @file Creates the BrowserWindow
@ -41,6 +44,7 @@ export class BrowserWindow {
private audioStream: any = new Stream.PassThrough();
private headerSent: any = false;
private chromecastIP: any = [];
private localSongs: any = [];
private clientPort: number = 0;
private remotePort: number = 6942;
private EnvironmentVariables: object = {
@ -49,14 +53,17 @@ export class BrowserWindow {
dev: app.isPackaged,
osRelease: os.release(),
updatable: !process.windowsStore || !process.mas,
useV3: utils.getStoreValue('advanced.experiments').includes("ampv3"),
components: [
"pages/podcasts",
"pages/apple-account-settings",
"pages/library-songs",
"pages/library-albums",
"pages/library-artists",
"pages/library-recentlyadded",
"pages/browse",
"pages/groupings",
"pages/charts",
"pages/settings",
"pages/installed-themes",
"pages/listen_now",
@ -81,11 +88,11 @@ export class BrowserWindow {
"pages/zoo",
"pages/plugin-renderer",
"pages/keybinds",
"pages/oobe",
"components/mediaitem-artwork",
"components/artwork-material",
"components/menu-panel",
"components/sidebar-playlist",
"components/spatial-properties",
"components/audio-settings",
"components/plugin-menu",
"components/audio-controls",
@ -118,6 +125,11 @@ export class BrowserWindow {
"components/inline-collection-list",
],
appRoutes: [
{
page: "library-recentlyadded",
component: `<cider-recentlyadded></cider-recentlyadded>`,
condition: "page == 'library-recentlyadded'"
},
{
page: "plugin-renderer",
component: `<plugin-renderer></plugin-renderer>`,
@ -194,6 +206,11 @@ export class BrowserWindow {
component: `<cider-groupings :data="browsepage"></cider-groupings>`,
condition: `page == 'groupings'`,
onEnter: ``
},{
page: "charts",
component: `<cider-charts :data="browsepage"></cider-charts>`,
condition: `page == 'charts'`,
onEnter: ``
}, {
page: "listen_now",
component: `<cider-listen-now :data="listennow"></cider-listen-now>`,
@ -479,7 +496,7 @@ export class BrowserWindow {
const impulseExternals = join(utils.getPath("externals"), "/impulses/")
const impulseFile = join(impulseExternals, req.params.file)
if(existsSync(impulseFile)) {
res.sendFile(impulseFile)
res.sendFile(impulseFile)
}else{
res.sendFile(join(utils.getPath('srcPath'), "./renderer/audio/impulses/" + req.params.file))
}
@ -530,6 +547,14 @@ export class BrowserWindow {
res.send(`// Theme not found - ${userThemePath}`);
}
});
app.get("/ciderlocal/:songs", (req, res) => {
const audio = atob(req.params.songs.replace(/_/g, '/').replace(/-/g, '+'));
console.log('auss', audio)
let data = {data:
this.localSongs.filter((f: any) => audio.split(',').includes(f.id))};
res.send(data);
});
app.get("/themes/:theme/*", (req: { params: { theme: string, 0: string } }, res) => {
const theme = req.params.theme;
@ -634,7 +659,7 @@ export class BrowserWindow {
// intercept "https://js-cdn.music.apple.com/hls.js/2.141.1/hls.js/hls.js" and redirect to local file "./apple-hls.js" instead
BrowserWindow.win.webContents.session.webRequest.onBeforeRequest(
{
urls: ["https://*/*.js"],
urls: ["https://*/*"],
},
(
details: { url: string | string[] },
@ -644,7 +669,13 @@ export class BrowserWindow {
callback({
redirectURL: `http://localhost:${this.clientPort}/apple-hls.js`,
});
} else {
} else if (details.url.includes("ciderlocal")) {
let text = details.url.toString().includes('ids=') ? decodeURIComponent(details.url.toString()).split("?ids=")[1] : decodeURIComponent(details.url.toString().substring(details.url.toString().lastIndexOf('/') + 1));
console.log('localurl',text)
callback({
redirectURL: `http://localhost:${this.clientPort}/ciderlocal/${Buffer.from(text).toString('base64url')}`,
});
}else {
callback({
cancel: false,
});
@ -738,15 +769,28 @@ export class BrowserWindow {
return json;
})
ipcMain.on("get-wallpaper", async (event) => {
ipcMain.on("get-wallpaper", async (event, args) => {
const wpPath: string = await wallpaper.get();
// get the wallpaper and encode it to base64 then return
const wpBase64: string = await readFileSync(wpPath, 'base64')
// add the data:image properties
const wpData: string = `data:image/png;base64,${wpBase64}`
const Jimp = require("jimp")
const img = await Jimp.read(wpPath)
const blurAmount = args.blurAmount ?? 256
if(blurAmount) {
img.blur(blurAmount)
}
const screens = await screen.getAllDisplays()
const width = screens.reduce((a, b) => a + b.size.width, 0)
const height = screens.reduce((a, b) => a + b.size.height, 0)
img.cover(width, height, Jimp.HORIZONTAL_ALIGN_LEFT | Jimp.VERTICAL_ALIGN_MIDDLE)
const result = await img.getBase64Async(Jimp.MIME_PNG)
event.returnValue = {
path: wpPath,
data: wpData
data: result,
res: {
width: width,
height: height
}
};
})
@ -806,6 +850,7 @@ export class BrowserWindow {
})
ipcMain.handle("get-github-plugin", async (event, url) => {
await this.StopWatcher()
const returnVal = {
success: true,
theme: null,
@ -850,9 +895,11 @@ export class BrowserWindow {
returnVal.success = false;
}
BrowserWindow.win.webContents.send("plugin-installed", returnVal);
this.StartWatcher(utils.getPath('themes'));
});
ipcMain.handle("get-github-theme", async (event, url) => {
await this.StopWatcher()
const returnVal = {
success: true,
theme: null,
@ -897,6 +944,8 @@ export class BrowserWindow {
returnVal.success = false;
}
BrowserWindow.win.webContents.send("theme-installed", returnVal);
this.StartWatcher(utils.getPath('themes'));
BrowserWindow.win.webContents.send("theme-update", "")
});
ipcMain.on("get-themes", (event, _key) => {
@ -1132,6 +1181,104 @@ export class BrowserWindow {
`)
});
ipcMain.on("scanLibrary", async (event, folders) => {
async function getFiles(dir : any) {
const dirents = await readdir(dir, { withFileTypes: true });
const files = await Promise.all(dirents.map((dirent: any) => {
const res = path.resolve(dir, dirent.name);
return dirent.isDirectory() ? getFiles(res) : res;
}));
return Array.prototype.concat(...files);
}
if (folders == null || folders.length == null || folders.length == 0) folders = ["D:\\Music"]
console.log('folders', folders)
let files: any[] = []
for (var folder of folders){
// get files from the Music folder
files = files.concat(await getFiles(folder))
}
//console.log("cider.files", files2);
let supporttedformats = ["mp3", "aac", "webm", "flac", "m4a", "ogg", "wav", "opus"]
let audiofiles = files.filter(f => supporttedformats.includes(f.substring(f.lastIndexOf('.') + 1)));
// console.log("cider.files2", audiofiles, audiofiles.length);
let metadatalist = []
let numid = 0;
for (var audio of audiofiles) {
try{
const metadata = await mm.parseFile(audio);
if (metadata != null){
let form = {
"id": "ciderlocal" + numid,
"type": "podcast-episodes",
"href": audio,
"attributes": {
"artwork": {
"width": 3000,
"height": 3000,
"url": metadata.common.picture != undefined ? "data:image/png;base64,"+metadata.common.picture[0].data.toString('base64')+"" : "",
},
"topics": [],
"url": "",
"subscribable": true,
"mediaKind": "audio",
"genreNames": [
""
],
// "playParams": {
// "id": "ciderlocal" + numid,
// "kind": "podcast",
// "isLibrary": true,
// "reporting": false },
"trackNumber": metadata.common.track?.no ?? 0,
"discNumber": metadata.common.disk?.no ?? 0,
"name": metadata.common.title ?? audio.substring(audio.lastIndexOf('\\') + 1),
"albumName": metadata.common.album,
"artistName": metadata.common.artist,
"copyright": metadata.common.copyright ?? "",
"assetUrl": "file:///" +audio,
"contentAdvisory": "",
"releaseDateTime": "2022-05-13T00:23:00Z",
"durationInMilliseconds": Math.floor((metadata.format.duration?? 0) * 1000),
"offers": [
{
"kind": "get",
"type": "STDQ"
}
],
"contentRating": "clean"
}
};
numid += 1;
// let form = {"id": "/ciderlocal?" + audio,
// "type": "library-songs",
// "href": "/ciderlocal?" + audio,
// "artwork": {
// "url": metadata.common.picture != undefined ? "data:image/png;base64,"+metadata.common.picture[0].data.toString('base64')+"" : "",
// },
// "attributes":
// { "durationInMillis": Math.floor((metadata.format.duration?? 0) * 1000),
// "hasLyrics": false,
// "playParams": { "id": "/ciderlocal?" + audio, "kind": "song", "isLibrary": true, "reporting": false },
// "trackNumber": 0,
// "discNumber": 0,
// "genreNames": [""],
// "name": metadata.common.title,
// "albumName": metadata.common.album,
// "artistName": metadata.common.artist}}
metadatalist.push(form)}
} catch (e){}
}
// console.log('metadatalist', metadatalist);
this.localSongs = metadatalist;
BrowserWindow.win.webContents.send('getUpdatedLocalList', metadatalist);
}
)
ipcMain.on('writeWAV', (event, leftpcm, rightpcm, bufferlength) => {
function interleave16(leftChannel: any, rightChannel: any) {
@ -1489,4 +1636,3 @@ export class BrowserWindow {
console.log('remote broadcasted')
}
}

View file

@ -84,18 +84,22 @@ export class Store {
],
"webRemote": [
"CommandOrControl",
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift" : "Alt"),
"W"
],
"audioSettings": [
process.platform == "darwin" ? "Option" : "Shift",
"CommandOrControl",
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift": "Alt"),
"A"
],
"pluginMenu": [
process.platform == "darwin" ? "Option" : "Shift",
"CommandOrControl",
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift": "Alt"),
"P"
],
"castToDevices": [
process.platform == "darwin" ? "Option" : "Shift",
"CommandOrControl",
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift": "Alt"),
"C"
],
"settings": [
@ -202,7 +206,11 @@ export class Store {
},
"windowControlPosition": 0, // 0 default right
"nativeTitleBar": false,
"uiScale": 1.0
"uiScale": 1.0,
"windowColor": "#000000",
"customAccentColor": false,
"accentColor": "#fc3c44",
"purplePodcastPlaybackBar": false
},
"lyrics": {
"enable_mxm": false,

View file

@ -2,7 +2,7 @@ import * as fs from "fs";
import * as path from "path";
import {Store} from "./store";
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 {AppImageUpdater, NsisUpdater} from "electron-updater";
import * as log from "electron-log";
@ -54,8 +54,18 @@ export class utils {
if (language !== "en_US" && fs.existsSync(path.join(this.paths.i18nPath, `${language}.json`))) {
i18n = Object.assign(i18n, JSON.parse(fs.readFileSync(path.join(this.paths.i18nPath, `${language}.json`), "utf8")));
} else if (!fs.existsSync(path.join(this.paths.i18nPath, `${language}.json`))) {
fetch(`https://raw.githubusercontent.com/ciderapp/Cider/main/src/i18n/${language}.json`)
.then(res => res.json())
.then(res => {
if (res) {
i18n = Object.assign(i18n, res);
fs.writeFileSync(path.join(this.paths.i18nPath, `${language}.json`), JSON.stringify(res));
} else {
i18n = Object.assign(i18n, JSON.parse(fs.readFileSync(path.join(this.paths.i18nPath, `en_US.json`), "utf8")));
}
})
}
if (key) {
return i18n[key]
} else {
@ -114,7 +124,11 @@ export class utils {
* Gets the browser window
*/
static getWindow(): Electron.BrowserWindow {
return bw.win
if (bw.win) {
return bw.win
} else {
return BrowserWindow.getAllWindows()[0]
}
}
static loadPluginFrontend(path: string): void {

View file

@ -0,0 +1,67 @@
[
"pages/podcasts",
"pages/apple-account-settings",
"pages/library-songs",
"pages/library-albums",
"pages/library-artists",
"pages/browse",
"pages/groupings",
"pages/settings",
"pages/installed-themes",
"pages/listen_now",
"pages/radio",
"pages/home",
"pages/artist-feed",
"pages/cider-playlist",
"pages/playlist-inline",
"pages/recordLabel",
"pages/cider-multiroom",
"pages/collection-list",
"pages/apple-curator",
"pages/artist",
"pages/search",
"pages/about",
"pages/library-videos",
"pages/remote-pair",
"pages/themes-github",
"pages/plugins-github",
"pages/replay",
"pages/audiolabs",
"pages/zoo",
"pages/plugin-renderer",
"pages/keybinds",
"pages/oobe",
"components/mediaitem-artwork",
"components/artwork-material",
"components/menu-panel",
"components/sidebar-playlist",
"components/audio-settings",
"components/plugin-menu",
"components/audio-controls",
"components/audio-playbackrate",
"components/qrcode-modal",
"components/moreinfo-modal",
"components/equalizer",
"components/add-to-playlist",
"components/queue",
"components/mediaitem-scroller-horizontal",
"components/mediaitem-scroller-horizontal-large",
"components/mediaitem-scroller-horizontal-sp",
"components/mediaitem-scroller-horizontal-mvview",
"components/mediaitem-list-item",
"components/mediaitem-hrect",
"components/mediaitem-square",
"components/mediaitem-mvview",
"components/listennow-child",
"components/mediaitem-mvview-sp",
"components/animatedartwork-view",
"components/listitem-horizontal",
"components/lyrics-view",
"components/fullscreen",
"components/miniplayer",
"components/castmenu",
"components/airplay-modal",
"components/artist-chip",
"components/hello-world",
"components/inline-collection-list"
]

179
src/main/base/vrouting.json Normal file
View file

@ -0,0 +1,179 @@
[
{
"page": "plugin-renderer",
"component": "<plugin-renderer></plugin-renderer>",
"condition": "page == 'plugin-renderer'"
},
{
"page": "zoo",
"component": "<cider-zoo></cider-zoo>",
"condition": "page == 'zoo'"
},
{
"page": "podcasts",
"component": "<apple-podcasts></apple-podcasts>",
"condition": "page == 'podcasts'"
},
{
"page": "library-videos",
"component": "<cider-library-videos></cider-library-videos>",
"condition": "page == 'library-videos'"
},
{
"page": "apple-account-settings",
"component": "<apple-account-settings></apple-account-settings>",
"condition": "page == 'apple-account-settings'"
},
{
"page": "about",
"component": "<about-page></about-page>",
"condition": "page == 'about'"
},
{
"page": "cider-artist",
"component": "<cider-artist :data=\"artistPage.data\"></cider-artist>",
"condition": "page == 'artist-page' && artistPage.data.attributes"
},
{
"page": "collection-list",
"component": "<cider-collection-list :data=\"collectionList.response\" :type=\"collectionList.type\" :title=\"collectionList.title\"></cider-collection-list>",
"condition": "page == 'collection-list'"
},
{
"page": "home",
"component": "<cider-home></cider-home>",
"condition": "page == 'home'"
},
{
"page": "artist-feed",
"component": "<cider-artist-feed></cider-artist-feed>",
"condition": "page == 'artist-feed'"
},
{
"page": "playlist-inline",
"component": "<playlist-inline :data=\"showingPlaylist\"></playlist-inline>",
"condition": "modals.showPlaylist"
},
{
"page": "playlist_",
"component": "<cider-playlist :data=\"showingPlaylist\"></cider-playlist>",
"condition": "page.includes('playlist_')"
},
{
"page": "oobe",
"component": "<cider-oobe/>",
"condition": "page == 'oobe'"
},
{
"page": "album_",
"component": "<cider-playlist :data=\"showingPlaylist\"></cider-playlist>",
"condition": "page.includes('album_')"
},
{
"page": "recordLabel_",
"component": "<cider-recordlabel :data=\"showingPlaylist\"></cider-recordlabel>",
"condition": "page.includes('recordLabel_')"
},
{
"page": "multiroom",
"component": "<cider-multiroom :data=\"multiroom\"></cider-multiroom>",
"condition": "page.includes('multiroom')"
},
{
"page": "curator_",
"component": "<cider-recordlabel :data=\"showingPlaylist\"></cider-recordlabel>",
"condition": "page.includes('curator_')"
},
{
"page": "browsepage",
"component": "<cider-browse :data=\"browsepage\"></cider-browse>",
"condition": "page == 'browse'",
"onEnter": ""
},
{
"page": "groupings",
"component": "<cider-groupings :data=\"browsepage\"></cider-groupings>",
"condition": "page == 'groupings'",
"onEnter": ""
},{
"page": "charts",
"component": "<cider-charts :data=\"browsepage\"></cider-charts>",
"condition": "page == 'charts'",
"onEnter": ""
},
{
"page": "listen_now",
"component": "<cider-listen-now :data=\"listennow\"></cider-listen-now>",
"condition": "page == 'listen_now'",
"onEnter": ""
},
{
"page": "radio",
"component": "<cider-radio :data=\"radio\"></cider-radio>",
"condition": "page == 'radio'",
"onEnter": ""
},
{
"page": "settings",
"component": "<cider-settings></cider-settings>",
"condition": "page == 'settings'"
},
{
"page": "installed-themes",
"component": "<installed-themes></installed-themes>",
"condition": "page == 'installed-themes'"
},
{
"page": "search",
"component": "<cider-search :search=\"search\"></cider-search>",
"condition": "page == 'search'"
},
{
"page": "library-songs",
"component": "<cider-library-songs :data=\"library.songs\"></cider-library-songs>",
"condition": "page == 'library-songs'",
"onEnter": ""
},
{
"page": "library-albums",
"component": "<cider-library-albums :data=\"library.songs\"></cider-library-albums>",
"condition": "page == 'library-albums'",
"onEnter": ""
},
{
"page": "library-artists",
"component": "<cider-library-artists></cider-library-artists>",
"condition": "page == 'library-artists'",
"onEnter": ""
},
{
"page": "appleCurator",
"component": "<cider-applecurator :data=\"appleCurator\"></cider-applecurator>",
"condition": "page.includes('appleCurator')"
},
{
"page": "themes-github",
"component": "<themes-github></themes-github>",
"condition": "page == 'themes-github'"
},
{
"page": "plugins-github",
"component": "<plugins-github></plugins-github>",
"condition": "page == 'plugins-github'"
},
{
"page": "remote-pair",
"component": "<remote-pair></remote-pair>",
"condition": "page == 'remote-pair'"
},
{
"page": "audiolabs",
"component": "<audiolabs-page></audiolabs-page>",
"condition": "page == 'audiolabs'"
},
{
"page": "replay",
"component": "<replay-page></replay-page>",
"condition": "page == 'replay'"
}
]

View file

@ -70,6 +70,22 @@ export default class DiscordRPC {
})
}
})
ipcMain.on("reloadRPC", () => {
console.log(`[DiscordRPC][reload] Reloading DiscordRPC.`);
this._client.destroy()
this._client.endlessLogin({clientId: this._utils.getStoreValue("general.discordrpc.client") === "Cider" ? '911790844204437504' : '886578863147192350'})
.then(() => {
this.ready = true
this._utils.getWindow().webContents.send("rpcReloaded", this._client.user)
if (this._activityCache && this._activityCache.details && this._activityCache.state) {
console.info(`[DiscordRPC][reload] Restoring activity cache.`);
this._client.setActivity(this._activityCache)
}
})
.catch((e: any) => console.error(`[DiscordRPC][reload] ${e}`));
// this.connect(true)
})
}
/**
@ -112,7 +128,6 @@ export default class DiscordRPC {
if (!this._utils.getStoreValue("general.discordrpc.enabled")) {
return;
}
const clientId = this._utils.getStoreValue("general.discordrpc.client") === "Cider" ? '911790844204437504' : '886578863147192350';
// Create the client
this._client = new AutoClient({transport: "ipc"});
@ -128,7 +143,7 @@ export default class DiscordRPC {
})
// Login to Discord
this._client.endlessLogin({clientId: clientId})
this._client.endlessLogin({clientId: this._utils.getStoreValue("general.discordrpc.client") === "Cider" ? '911790844204437504' : '886578863147192350'})
.then(() => {
this.ready = true
})

View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 1024 1024" 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;">
<rect x="0" y="0" width="1024" height="1024" style="fill:rgb(110,110,110);"/>
<g transform="matrix(6.05996,0,0,6.05996,189.003,209)">
<path d="M93.161,0.071C59.66,-1.043 32.22,11.314 32.22,11.314L32.2,74.023C28.789,72.669 24.641,72.348 20.428,73.372C11.345,75.579 5.397,83.192 7.143,90.379C8.889,97.566 17.667,101.604 26.749,99.398C35.313,97.317 41.087,90.429 40.256,83.626L40.256,36.771C40.256,36.771 59.66,29.987 84.829,28.286L84.829,63.135C81.455,61.843 77.386,61.55 73.25,62.555C64.167,64.761 58.219,72.374 59.965,79.562C61.71,86.749 70.488,90.786 79.571,88.58C87.502,86.653 93.042,80.603 93.158,74.316L93.161,74.32L93.161,0.071Z" style="fill-opacity:0.16;fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

File diff suppressed because it is too large Load diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,294 +1,367 @@
var notyf = new Notyf();
const MusicKitObjects = {
LibraryPlaylist: function () {
this.id = ""
this.type = "library-playlist-folders"
this.href = ""
this.attributes = {
dateAdded: "",
name: ""
}
this.playlists = []
}
}
LibraryPlaylist: function () {
this.id = "";
this.type = "library-playlist-folders";
this.href = "";
this.attributes = {
dateAdded: "",
name: "",
};
this.playlists = [];
},
};
// limit an array to a certain number of items
Array.prototype.limit = function (n) {
return this.slice(0, n);
return this.slice(0, n);
};
Vue.component('animated-number', {
Vue.component("animated-number", {
template: "<div style='display: inline-block;'>{{ displayNumber }}</div>",
props: { number: { default: 0 } },
template: "<div style='display: inline-block;'>{{ displayNumber }}</div>",
props: { 'number': { default: 0 } },
data() {
return {
displayNumber: 0,
interval: false,
};
},
data() {
return {
displayNumber: 0,
interval: false
ready() {
this.displayNumber = this.number ? this.number : 0;
},
watch: {
number() {
clearInterval(this.interval);
if (this.number == this.displayNumber) {
return;
}
this.interval = window.setInterval(() => {
if (this.displayNumber != this.number) {
var change = (this.number - this.displayNumber) / 10;
change = change >= 0 ? Math.ceil(change) : Math.floor(change);
this.displayNumber = this.displayNumber + change;
}
}, 20);
},
},
});
ready() {
this.displayNumber = this.number ? this.number : 0;
Vue.component("sidebar-library-item", {
template: "#sidebar-library-item",
props: {
name: {
type: String,
required: true,
},
watch: {
number() {
clearInterval(this.interval);
if (this.number == this.displayNumber) {
return;
}
this.interval = window.setInterval(() => {
if (this.displayNumber != this.number) {
var change = (this.number - this.displayNumber) / 10;
change = change >= 0 ? Math.ceil(change) : Math.floor(change);
this.displayNumber = this.displayNumber + change;
}
}, 20);
}
page: {
type: String,
required: true,
},
svgIcon: {
type: String,
required: false,
default: "",
},
cdClick: {
type: Function,
required: false,
},
},
data: function () {
return {
app: app,
svgIconData: "",
};
},
async mounted() {
if (this.svgIcon) {
this.svgIconData = await this.app.getSvgIcon(this.svgIcon);
}
})
Vue.component('sidebar-library-item', {
template: '#sidebar-library-item',
props: {
name: {
type: String,
required: true
},
page: {
type: String,
required: true
},
svgIcon: {
type: String,
required: false,
default: ''
},
cdClick: {
type: Function,
required: false
}
},
data: function () {
return {
app: app,
svgIconData: ""
}
},
async mounted() {
if (this.svgIcon) {
this.svgIconData = await this.app.getSvgIcon(this.svgIcon)
}
},
methods: {}
},
methods: {},
});
function fallbackinitMusicKit() {
const request = new XMLHttpRequest();
const request = new XMLHttpRequest();
function loadAlternateKey() {
let parsedJson = JSON.parse(this.responseText)
MusicKit.configure({
developerToken: parsedJson.developerToken,
app: {
name: 'Apple Music',
build: '1978.4.1',
version: "1.0"
},
sourceType: 24,
suppressErrorDialog: true
})
setTimeout(() => {
app.init()
if (app.cfg.visual.window_background_style == "mica" && !app.isDev) {
app.spawnMica()
}
}, 1000)
}
function loadAlternateKey() {
let parsedJson = JSON.parse(this.responseText);
MusicKit.configure({
developerToken: parsedJson.developerToken,
app: {
name: "Apple Music",
build: "1978.4.1",
version: "1.0",
},
sourceType: 24,
suppressErrorDialog: true,
});
setTimeout(() => {
app.init();
if (app.cfg.visual.window_background_style == "mica" && !app.isDev) {
app.spawnMica();
}
}, 1000);
}
request.addEventListener("load", loadAlternateKey);
request.open("GET", "https://raw.githubusercontent.com/lujjjh/LitoMusic/main/token.json");
request.send();
request.addEventListener("load", loadAlternateKey);
request.open(
"GET",
"https://raw.githubusercontent.com/lujjjh/LitoMusic/main/token.json"
);
request.send();
}
document.addEventListener('musickitloaded', function () {
console.log('MusicKit loaded')
// MusicKit global is now defined
function initMusicKit() {
let parsedJson = JSON.parse(this.responseText)
MusicKit.configure({
developerToken: parsedJson.token,
app: {
name: 'Apple Music',
build: '1978.4.1',
version: "1.0"
},
sourceType: 24,
suppressErrorDialog: true
}).then(() => {
function waitForApp() {
if (typeof app.init !== "undefined") {
app.init()
if (app.cfg.visual.window_background_style == "mica" && !app.isDev) {
app.spawnMica()
}
}
else {
setTimeout(waitForApp, 250);
}
}
waitForApp()
})
}
function initMusicKit() {
const request = new XMLHttpRequest();
request.timeout = 5000;
request.addEventListener("load", initMusicKit);
request.onreadystatechange = function (aEvt) {
if (request.readyState == 4) {
if (request.status != 200)
fallbackinitMusicKit()
let parsedJson = JSON.parse(this.responseText);
MusicKit.configure({
developerToken: parsedJson.token,
app: {
name: "Apple Music",
build: "1978.4.1",
version: "1.0",
},
sourceType: 24,
suppressErrorDialog: true,
}).then(() => {
function waitForApp() {
if (typeof app.init !== "undefined") {
app.init();
if (app.cfg.visual.window_background_style == "mica" && !app.isDev) {
app.spawnMica();
}
};
request.open("GET", "https://api.cider.sh/v1/");
request.send();
} else {
setTimeout(waitForApp, 250);
}
}
waitForApp();
});
}
// check for widevine failure and reconfigure the instance.
window.addEventListener("drmUnsupported", function () {
initMusicKit()
});
function capiInit() {
const request = new XMLHttpRequest();
request.timeout = 5000;
request.addEventListener("load", initMusicKit);
request.onreadystatechange = function (aEvt) {
if (request.readyState == 4) {
if (request.status != 200) fallbackinitMusicKit();
}
};
request.open("GET", "https://api.cider.sh/v1/");
request.send();
}
document.addEventListener("musickitloaded", function () {
if (showOobe()) return;
console.log("MusicKit loaded");
// MusicKit global is now defined
capiInit()
});
if ('serviceWorker' in navigator) {
// Use the window load event to keep the page load performant
window.addEventListener('load', () => {
navigator.serviceWorker.register('sw.js?v=1');
});
window.addEventListener("drmUnsupported", function () {
initMusicKit();
});
if ("serviceWorker" in navigator) {
// Use the window load event to keep the page load performant
window.addEventListener("load", () => {
navigator.serviceWorker.register("sw.js?v=1");
});
}
const getBase64FromUrl = async (url) => {
const data = await fetch(url);
const blob = await data.blob();
return new Promise((resolve) => {
const reader = new FileReader();
reader.readAsDataURL(blob);
reader.onloadend = () => {
const base64data = reader.result;
resolve(base64data);
}
});
}
const data = await fetch(url);
const blob = await data.blob();
return new Promise((resolve) => {
const reader = new FileReader();
reader.readAsDataURL(blob);
reader.onloadend = () => {
const base64data = reader.result;
resolve(base64data);
};
});
};
function Clone(obj) {
return JSON.parse(JSON.stringify(obj));
return JSON.parse(JSON.stringify(obj));
}
function uuidv4() {
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
);
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c) =>
(
c ^
(crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))
).toString(16)
);
}
function xmlToJson(xml) {
// Create the return object
let obj = {};
// Create the return object
let obj = {};
if (xml.nodeType == 1) { // element
// do attributes
if (xml.attributes.length > 0) {
obj["@attributes"] = {};
for (var j = 0; j < xml.attributes.length; j++) {
let attribute = xml.attributes.item(j);
obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
}
}
} else if (xml.nodeType == 3) { // text
obj = xml.nodeValue;
if (xml.nodeType == 1) {
// element
// do attributes
if (xml.attributes.length > 0) {
obj["@attributes"] = {};
for (var j = 0; j < xml.attributes.length; j++) {
let attribute = xml.attributes.item(j);
obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
}
}
} else if (xml.nodeType == 3) {
// text
obj = xml.nodeValue;
}
// do children
if (xml.hasChildNodes()) {
for (var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName;
if (typeof (obj[nodeName]) == "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
if (typeof (obj[nodeName].push) == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(xmlToJson(item));
}
// do children
if (xml.hasChildNodes()) {
for (var i = 0; i < xml.childNodes.length; i++) {
var item = xml.childNodes.item(i);
var nodeName = item.nodeName;
if (typeof obj[nodeName] == "undefined") {
obj[nodeName] = xmlToJson(item);
} else {
if (typeof obj[nodeName].push == "undefined") {
var old = obj[nodeName];
obj[nodeName] = [];
obj[nodeName].push(old);
}
obj[nodeName].push(xmlToJson(item));
}
}
console.log(obj);
return obj;
};
}
console.log(obj);
return obj;
}
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
var checkIfScrollIsStatic = setInterval(() => {
try {
if (position === document.getElementsByClassName('lyric-body')[0].scrollTop) {
clearInterval(checkIfScrollIsStatic)
// do something
}
position = document.getElementsByClassName('lyric-body')[0].scrollTop
} catch (e) {
try {
if (
position === document.getElementsByClassName("lyric-body")[0].scrollTop
) {
clearInterval(checkIfScrollIsStatic);
// do something
}
position = document.getElementsByClassName("lyric-body")[0].scrollTop;
} catch (e) { }
}, 50);
// WebGPU Console Notification
async function webGPU() {
try {
const currentGPU = await navigator.gpu.requestAdapter()
console.log("WebGPU enabled on", currentGPU.name, "with feature ID", currentGPU.features.size)
} catch (e) {
console.log("WebGPU disabled / WebGPU initialization failed")
}
try {
const currentGPU = await navigator.gpu.requestAdapter();
console.log(
"WebGPU enabled on",
currentGPU.name,
"with feature ID",
currentGPU.features.size
);
} catch (e) {
console.log("WebGPU disabled / WebGPU initialization failed");
}
}
function isJson(item) {
item = typeof item !== "string"
? JSON.stringify(item)
: item;
try {
item = JSON.parse(item);
} catch (e) {
return false;
}
if (typeof item === "object" && item !== null) {
return true;
}
item = typeof item !== "string" ? JSON.stringify(item) : item;
try {
item = JSON.parse(item);
} catch (e) {
return false;
}
if (typeof item === "object" && item !== null) {
return true;
}
return false;
}
webGPU().then()
webGPU().then();
function showOobe() {
return false
if (localStorage.getItem("music.ampwebplay.media-user-token") && localStorage.getItem("seenOOBE")) {
return false
} else {
function waitForApp() {
if (typeof app.init !== "undefined") {
app.oobeInit();
} else {
setTimeout(waitForApp, 250);
}
}
waitForApp();
return true
}
}
let screenWidth = screen.width;
let screenHeight = screen.height;
window.onerror = function (error) {
console.log(error)
bootbox.alert("Error occurred: " + error)
};
document.addEventListener("DOMContentLoaded", async function () {
// app.oobeInit()
});
document.addEventListener(
"contextmenu",
function (e) {
if (
e.target.tagName.toLowerCase() == "textarea" ||
(e.target.tagName.toLowerCase() == "input" &&
e.target.type != "checkbox" &&
e.target.type != "radio" &&
e.target.disabled == false)
) {
e.preventDefault();
const menuPanel = {
items: {
cut: {
name: app.getLz("action.cut"),
action: function () {
document.execCommand("cut");
},
},
copy: {
name: app.getLz("action.copy"),
action: function () {
document.execCommand("copy");
},
},
paste: {
name: app.getLz("action.paste"),
action: function () {
document.execCommand("paste");
},
},
delete: {
name: app.getLz("action.delete"),
action: function () {
document.execCommand("delete");
},
},
selectAll: {
name: app.getLz("action.selectAll"),
action: function () {
document.execCommand("selectAll");
},
},
},
};
app.showMenuPanel(menuPanel, e);
}
},
false
);

View file

@ -23,6 +23,10 @@
padding: 14px;
background: var(--opaquePageBGColor);
font-size: 0.85em;
&.child {
background: rgb(0 0 0 / 15%);
}
}
.md-option-segment.md-option-segment_auto {

View file

@ -17,4 +17,5 @@
--ciderColor: @ciderColor;
--appOpacity: @appOpacity;
--transparencyRate: @transparencyRate;
--macOSChromeColor: rgb(14 14 14 / 32%);
}

View file

@ -6,7 +6,7 @@
@font-face {
font-family: "codicon";
font-display: block;
src: url("codicon.ttf") format("truetype");
src: url("./codicon.ttf?f06865699f1720ee6ca6e0a4aa084d76") format("truetype");
}
.codicon[class*='codicon-'] {
@ -43,6 +43,10 @@
opacity: 0.5;
}
.codicon-modifier-hidden {
opacity: 0;
}
/* custom speed & easing for loading icon */
.codicon-loading {
animation-duration: 1s !important;
@ -551,3 +555,7 @@
.codicon-arrow-circle-left:before { content: "\ebfd" }
.codicon-arrow-circle-right:before { content: "\ebfe" }
.codicon-arrow-circle-up:before { content: "\ebff" }
.codicon-layout-sidebar-right-off:before { content: "\ec00" }
.codicon-layout-panel-off:before { content: "\ec01" }
.codicon-layout-sidebar-left-off:before { content: "\ec02" }
.codicon-blank:before { content: "\ec03" }

Binary file not shown.

View file

@ -274,7 +274,7 @@
.song-name {
text-align : left;
font-size : 0.98em;
font-size : 0.8em;
font-weight : 500;
width : 100%;
-webkit-mask-image: linear-gradient(-90deg, transparent 0%, transparent 10%, black 20%);
@ -283,8 +283,12 @@
.song-artist,
.song-album {
font-size: 0.75em;
opacity : 0.8;
cursor : pointer;
opacity: 0.8;
cursor: pointer;
white-space: nowrap;
max-width: 360px;
-webkit-mask-image: linear-gradient(-90deg, transparent 0%, transparent 10%, black 20%);
width: 100%;
&:hover {
text-decoration: underline;

View file

@ -211,7 +211,6 @@
}
}
// Media Item Elements
.mediaitem-artwork {
@ -221,9 +220,6 @@
position: relative;
width: 100%;
height: 100%;
background-image: url("https://beta.music.apple.com/assets/product/MissingArtworkMusic.svg");
background-size: cover;
background-position: center;
.animatedartwork-view-box {
position: absolute;
@ -270,6 +266,9 @@
object-fit: cover;
image-rendering: -webkit-optimize-contrast;
pointer-events: none;
background-image: url("./assets/MissingArtwork.svg");
background-size: cover;
background-position: center;
}
&.no-shadow {
@ -289,6 +288,11 @@
}
}
#artworkLCD img {
image-rendering: auto;
}
/* queue item */
.cd-queue-item {
border-bottom: 0px solid rgb(200 200 200 / 10%);
@ -393,11 +397,26 @@
align-items: center;
border-radius: var(--mediaItemRadius);
position: relative;
&:hover{
.heart-icon{
.listitem-content {
width: 100%;
height: 60px;
display: flex;
flex: 0 0 auto;
flex-direction: row;
font-size: 14px;
justify-content: center-between;
align-items: center;
border-radius: var(--mediaItemRadius);
position: relative;
}
&:hover {
.heart-icon {
display: none;
}
}
.popular {
background-image: url(assets/star.svg);
background-repeat: no-repeat;
@ -411,7 +430,6 @@
.artwork {
height: 42px;
width: 42px;
border-radius: var(--mediaItemRadius);
object-fit: cover;
object-position: center;
flex: 0 0 auto;
@ -421,6 +439,11 @@
outline: none;
position: relative;
overflow: hidden;
border-radius: var(--mediaItemRadiusSmall);
.mediaitem-artwork {
border-radius: var(--mediaItemRadiusSmall);
}
.overlay-play {
background: rgba(0, 0, 0, 0.5);
@ -522,27 +545,35 @@
10% {
box-shadow: inset 0 -4px 0
}
20% {
box-shadow: inset 0 -10px 0
}
30% {
box-shadow: inset 0 -12px 0
}
40% {
box-shadow: inset 0 -8px 0
}
50% {
box-shadow: inset 0 -4px 0
}
60% {
box-shadow: inset 0 -6px 0
}
80% {
box-shadow: inset 0 -12px 0
}
90% {
box-shadow: inset 0 -6px 0
}
to {
box-shadow: inset 0 -2px 0
}
@ -927,6 +958,7 @@
/* mediaitem-square */
.cd-mediaitem-square {
--transitionDuration: .25s;
--scaleRate: 1.25;
--scaleRateArtwork: 1;
width: 200px;
@ -938,6 +970,7 @@
justify-content: center;
align-items: center;
border-radius: 6px;
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
.artwork-container {
position: relative;
@ -952,6 +985,8 @@
flex: 0 0 auto;
margin: 6px;
cursor: pointer;
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
.mediaitem-artwork {
box-shadow: unset;
}
@ -1024,15 +1059,33 @@
}
}
@media (min-width: 1600px) {
width: calc(200px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container>.artwork {
width: calc(190px * var(--scaleRateArtwork));
height: calc(190px * var(--scaleRateArtwork));
&:not(.mediaitem-card):not(.mediaitem-brick):not(.mediaitem-video):not(.noscale) {
@media (min-width: 1460px) {
--scaleRate: 1.1;
--scaleRateArtwork: 0.9;
width: calc(200px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(190px * var(--scaleRateArtwork));
height: calc(190px * var(--scaleRateArtwork));
}
}
@media (min-width: 1550px) {
--scaleRate: 1.25;
--scaleRateArtwork: 1;
width: calc(200px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(190px * var(--scaleRateArtwork));
height: calc(190px * var(--scaleRateArtwork));
}
}
}
.info-rect {
width: 90%;
height: 100%;
@ -1072,7 +1125,7 @@
margin: 2em;
border-radius: 10px;
>.codicon {
> .codicon {
font-size: 4em;
font-weight: bold;
opacity: 0.5;
@ -1080,8 +1133,6 @@
}
&.mediaitem-video {
--scaleRate: 1.25;
--scaleRateArtwork: 1.25;
height: 200px;
width: 240px;
@ -1090,12 +1141,29 @@
width: 212px;
}
@media (min-width: 1600px) {
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container>.artwork {
width: calc(212px * var(--scaleRateArtwork));
height: calc(120px * var(--scaleRateArtwork));
&:not(.noscale) {
@media (min-width: 1460px) {
--scaleRate: 1.1;
--scaleRateArtwork: 1.1;
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(220px * var(--scaleRateArtwork));
height: calc(123px * var(--scaleRateArtwork));
}
}
@media (min-width: 1550px) {
--scaleRate: 1.25;
--scaleRateArtwork: 1.25;
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(220px * var(--scaleRateArtwork));
height: calc(123px * var(--scaleRateArtwork));
}
}
}
}
@ -1108,6 +1176,32 @@
height: 123px;
width: 220px;
}
&:not(.noscale) {
@media (min-width: 1460px) {
--scaleRate: 1.1;
--scaleRateArtwork: 1.1;
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(220px * var(--scaleRateArtwork));
height: calc(123px * var(--scaleRateArtwork));
}
}
@media (min-width: 1550px) {
--scaleRate: 1.25;
--scaleRateArtwork: 1.25;
width: calc(240px * var(--scaleRate));
height: calc(200px * var(--scaleRate));
.artwork-container > .artwork {
width: calc(220px * var(--scaleRateArtwork));
height: calc(123px * var(--scaleRateArtwork));
}
}
}
}
&.mediaitem-small {
@ -1123,7 +1217,7 @@
&.mediaitem-card {
background: #ccc;
background: var(--spcolor);
height: 298px;
height: 302px;
width: 230px;
overflow: hidden;
position: relative;
@ -1136,7 +1230,7 @@
overflow: hidden;
border-radius: 0px;
margin: 0;
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear, filter 0.2s ease-in-out;
.mediaitem-artwork {
border-radius: 0px;
@ -1150,6 +1244,8 @@
padding: 10px 10px 14px;
position: relative;
width: 100%;
display: grid;
align-content: center;
&::before {
background: var(--bgartwork);
@ -1164,6 +1260,7 @@
z-index: 0;
opacity: 1;
filter: brightness(0.5) blur(50px) saturate(180%);
transition: filter 0.2s ease-in-out;
}
}
@ -1175,9 +1272,10 @@
font-size: 0.9em;
font-weight: 500;
z-index: 1;
&+ .subtitle {
& + .subtitle {
max-height: none !important;
margin-top: -0.5em;
// margin-top: -0.5em;
}
}
@ -1191,7 +1289,7 @@
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
max-height: 3.8em;
max-height: 4.8em;
z-index: 1;
}
@ -1207,14 +1305,34 @@
border-radius: inherit;
}
//@media (min-width: 1600px) {
// width: calc(230px * 1.25);
// height: calc(298px * 1.25);
// .artwork-container>.artwork {
// width: calc(230px * 1.25);
// height: calc(230px * 1.25);
// }
//}
&:hover {
.artwork{
filter: brightness(0.8);
}
.info-rect-card::before {
filter: brightness(0.3) blur(50px) saturate(180%);
}
}
&:not(.noscale) {
@media (min-width: 1460px) {
width: calc(230px * 1.1);
height: calc(298px * 1.1);
.artwork-container > .artwork {
width: calc(230px * 1.1);
height: calc(230px * 1.1);
}
}
@media (min-width: 1550px) {
width: calc(230px * 1.25);
height: calc(298px * 1.25);
.artwork-container > .artwork {
width: calc(230px * 1.25);
height: calc(230px * 1.25);
}
}
}
}
}
@ -1460,7 +1578,6 @@ input[type=checkbox][switch]:checked:active::before {
/* End Switch Checkbox */
.header-text {
margin: 0px;
}
@ -1580,10 +1697,31 @@ input[type=checkbox][switch]:checked:active::before {
background-repeat: no-repeat;
opacity: 0.70;
border-radius: 6px;
}
position: relative;
.playback-button:active {
transform: scale(0.95);
&:before {
content: "";
display: block;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--selected);
border-radius: inherit;
position: absolute;
opacity: 0;
z-index: -1;
transform: scale(0.5);
pointer-events: none;
transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
}
&:hover {
&:before {
transform: scale(1);
opacity: 1;
}
}
}
.playback-button--small {
@ -1599,22 +1737,47 @@ input[type=checkbox][switch]:checked:active::before {
border: 0px;
box-shadow: unset;
opacity: 0.70;
}
position: relative;
.playback-button:hover,
.playback-button--small:hover {
background-color: rgb(200 200 200 / 10%);
}
&:before {
content: "";
display: block;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: var(--selected);
border-radius: inherit;
position: absolute;
opacity: 0;
z-index: -1;
transform: scale(0.5);
pointer-events: none;
transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
}
.playback-button:active,
.playback-button--small:active {
transform: scale(0.9);
&:hover {
&:before {
transform: scale(1);
opacity: 1;
}
}
}
.playback-button--small.active {
background-color: rgb(200 200 200 / 25%);
}
.playback-button:hover,
.playback-button--small:hover {
// background-color: var(--selected);
}
.playback-button:active,
.playback-button--small:active {
background-color: var(--selected-click);
}
.playback-button--small.search {
background-image: url("./assets/search.svg");
}
@ -1655,6 +1818,18 @@ input[type=checkbox][switch]:checked:active::before {
background-position: center;
}
.playback-button.collapseLibrary {
font-family: "codicon";
font-size: 1em;
color: var(--textColor);
display: grid;
place-items: center;
span {
position: absolute;
}
}
.playback-button.pause {
background-image: url('./assets/cider-icons/pause.svg');
background-size: 38px;
@ -1678,11 +1853,14 @@ input[type=checkbox][switch]:checked:active::before {
background-size: 60%;
background-position: center;
}
.playback-button.disabled, .playback-button--small.disabled {
.playback-button.disabled,
.playback-button--small.disabled {
opacity: 0.25 !important;
pointer-events: none;
transform: none !important;
&:hover{
&:hover {
background-color: transparent !important;
transform: none !important;
}
@ -1694,10 +1872,11 @@ input[type=checkbox][switch]:checked:active::before {
justify-content: center;
align-items: center;
color: white;
>svg {
height:16px;
width:16px;
pointer-events: none;
> svg {
height: 16px;
width: 16px;
pointer-events: none;
}
}
}
@ -1907,6 +2086,7 @@ input[type=checkbox][switch]:checked:active::before {
border-radius: inherit;
}
}
.artist-chip__name {
pointer-events: none;
}
@ -1989,36 +2169,37 @@ input[type=checkbox][switch]:checked:active::before {
// fancy pills
.nav-pills {
position : relative;
position: relative;
.nav-link {
transition: transform .3s var(--appleEase);
position : relative;
position: relative;
&:after {
--dist: 1px;
content : "";
position : absolute;
top : var(--dist);
bottom : var(--dist);
left : var(--dist);
right : var(--dist);
content: "";
position: absolute;
top: var(--dist);
bottom: var(--dist);
left: var(--dist);
right: var(--dist);
// width : 100%;
// height : 100%;
background-color: transparent;
border-radius : 50px;
z-index : -1;
opacity : 0;
border-radius: 50px;
z-index: -1;
opacity: 0;
transition: background-color .5s var(--appleEase), opacity 0.25s var(--appleEase), border-radius .32s var(--appleEase);
}
&:hover {
outline : none;
transform : scale(1.1);
outline: none;
transform: scale(1.1);
// background: #eee;
background : transparent;
color : #333;
background: transparent;
color: #333;
&:after {
opacity: 1;
@ -2031,11 +2212,11 @@ input[type=checkbox][switch]:checked:active::before {
}
&.active {
outline : none;
transform : scale(1.1);
outline: none;
transform: scale(1.1);
// background: #eee;
background : transparent;
color : #333;
background: transparent;
color: #333;
font-weight: 600;
&:after {
@ -2049,24 +2230,24 @@ input[type=checkbox][switch]:checked:active::before {
&:hover {
.nav-link.active {
outline : none;
transform : scale(1.0);
outline: none;
transform: scale(1.0);
background: transparent;
color: #eee;
transform : scale(1.0);
transform: scale(1.0);
&:after {
background : rgb(200 200 200 / 15%);
opacity : 1;
background: rgb(200 200 200 / 15%);
opacity: 1;
transition: color 0s;
// border-radius: 5px;
--dist: 4px;
}
&:hover {
transform : scale(1.1);
z-index : 1;
color : #333;
transform: scale(1.1);
z-index: 1;
color: #333;
&:after {
background: #eee;
@ -2078,15 +2259,15 @@ input[type=checkbox][switch]:checked:active::before {
}
&:after {
content : '';
position : absolute;
top : 0;
left : 0;
bottom : 0;
right : 0;
background : rgb(200 200 200 / 10%);
border-radius : 50px;
z-index : 0;
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background: rgb(200 200 200 / 10%);
border-radius: 50px;
z-index: 0;
pointer-events: none;
}
}
@ -2095,6 +2276,7 @@ input[type=checkbox][switch]:checked:active::before {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
.grouping-btn {
padding: 16px;
appearance: none;
@ -2126,8 +2308,7 @@ input[type=checkbox][switch]:checked:active::before {
}
}
.app-sidebar-header
.search-input-container .search-hints-container {
.app-sidebar-header .search-input-container .search-hints-container {
top: 38px;
padding: 3px;
}
@ -2135,17 +2316,16 @@ input[type=checkbox][switch]:checked:active::before {
.content-inner {
&.library-page {
.heart-icon {
left: 7px;
left: 7px;
}
.cd-mediaitem-list-item {
padding-left: 25px;
}
}
&.library-artists-page {
.inner-container
.list-container
.podcasts-list {
.inner-container .list-container .podcasts-list {
background: rgba(27, 27, 27);
padding-top: 14px;
width: 272px;
@ -2153,9 +2333,10 @@ input[type=checkbox][switch]:checked:active::before {
.cd-mediaitem-list-item {
margin-left: 10px;
}
.cd-mediaitem-list-item:hover {
width: 96%;
}
}
}
}
}

View file

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

View file

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

View file

@ -13,5 +13,37 @@ body[platform="darwin"] {
&::before {
display: none;
}
.app-chrome {
background-color: var(--macOSChromeColor);
}
&.twopanel {
--chromeHeight1: 55px;
--chromeHeight: calc(var(--chromeHeight1) + var(--chromeHeight2));
.app-chrome .app-chrome-item.search {
margin-right: 12px;
}
.app-chrome .app-mainmenu {
width: 46px;
}
.app-chrome.chrome-bottom {
background-color: var(--macOSChromeColor);
}
}
}
#app-main {
background-color: transparent;
.app-navigation {
background: transparent;
}
#app-content {
background-color: var(--baseColor);
}
}
}

View file

@ -114,23 +114,35 @@
margin: 2em;
}
}
// Search Page
&.search-page {
.searchToggle {
float: right;
>button {
min-width: 120px;
}
}
.cd-mediaitem-square.mediaitem-brick {
width: 530px !important;
.artwork-container .artwork{
height:168px !important;
width:507px !important;
z-index: 1;
}
.title{
font-weight: bold;
justify-content: left;
font-size: 18px;
margin-top: -40px;
z-index: 5;
pointer-events: none;
}
width: 530px !important;
.artwork-container .artwork {
height : 168px !important;
width : 507px !important;
z-index: 1;
}
.title {
font-weight : bold;
justify-content: left;
font-size : 18px;
margin-top : -40px;
z-index : 5;
pointer-events : none;
}
}
}
@ -553,7 +565,7 @@
overflow-y : overlay;
height : 100%;
padding : 0px;
background-color: var(--color1);
background-color: var(--color3);
&.scrollbody {
.tabs {
@ -622,7 +634,7 @@
opacity : .7;
animation : playlistArtworkFadeIn 1s var(--appleEase);
.artworkMaterial>img {
.artworkMaterial img {
filter : brightness(100%) blur(80px) saturate(100%) contrast(1);
object-position: center;
object-fit : cover;
@ -665,13 +677,23 @@
}
.nameEdit {
font-weight : 700;
font-size : 1.6rem;
flex-shrink : unset;
background : transparent;
border : 0px;
color : inherit;
font-family : inherit;
font-weight: 700;
font-size : 1.6rem;
flex-shrink: unset;
background : transparent;
border : 0px;
color : inherit;
font-family: inherit;
}
.descriptionEdit {
font-size : 14px;
flex-shrink: unset;
background : transparent;
border : 0px;
color : inherit;
font-family: inherit;
width : 60vw;
}
.descriptionEdit {
@ -950,6 +972,10 @@
right : 28px;
}
&.animated .artist-header {
min-height: 500px;
}
.artist-header {
//background: linear-gradient(45deg, var(--keyColor), #0e0e0e);
color : white;
@ -965,6 +991,19 @@
// margin-top: -16px;
}
.artist-hero {
height:100%;
position: absolute;
top:0;
left:0;
right:0;
bottom:0;
.mediaitem-artwork {
border-radius: 0px;
}
}
.artworkContainer {
position : absolute;
@ -978,7 +1017,7 @@
opacity : .7;
animation : playlistArtworkFadeIn 1s var(--appleEase);
.artworkMaterial>img {
.artworkMaterial img {
filter : brightness(100%) blur(80px) saturate(100%) contrast(1);
object-position: center;
object-fit : cover;
@ -1001,6 +1040,7 @@
position : absolute;
overflow : hidden;
box-shadow: rgb(0 0 0 / 50%) 0 0 0 1000000px inset;
z-index: 1;
video {
overflow : hidden;
@ -1166,8 +1206,9 @@
&.addon {
background: rgb(86 86 86 / 20%);
}
&.applied {
background: var(--keyColor-disabled);
background : var(--keyColor-disabled);
pointer-events: none;
}
}
@ -1218,10 +1259,10 @@
}
.handle {
height: 100%;
display: flex;
height : 100%;
display : flex;
justify-content: center;
align-items: center;
align-items : center;
}
.list-group-item {
@ -1229,6 +1270,7 @@
&:hover {
cursor: grab;
}
&:active {
cursor: grabbing;
}
@ -1645,26 +1687,223 @@
}
}
.content-inner.cider-multiroom{
.content-inner.oobe {
position : absolute;
overflow : hidden;
top : 0;
left : 0;
bottom : 0;
right : 0;
display : grid;
place-items: center;
width : 100%;
background : #1e1e1e;
.oobe-view {
display : flex;
flex-direction : column;
justify-content: center;
align-items : center;
gap : 32px;
max-width : 1280px;
max-height : 720px;
align-self : center;
justify-self : center;
height : 100%;
width : 100%;
.oobe-header {
font-size : 3em;
text-shadow: var(--replayTextShadow);
font-weight: 600;
}
.oobe-body {
flex : 1;
width : 100%;
background : #ffffff0d;
border-radius: 20px;
padding : 3em;
overflow-y : scroll;
overflow-x : hidden;
@media screen and (max-width: 1161px) {
font-size: 13px;
}
&.text {
white-space: pre-wrap;
}
.blurb {
white-space: pre-wrap;
margin : 16px;
line-height: 1.5em;
}
&.visual {
padding: 1em;
.stylePicker {
border-radius: 10px;
overflow : hidden;
cursor : pointer;
transition : 0.25s all;
box-shadow : 0px 2px 6px rgba(0, 0, 0, 0.25);
width : 450px;
margin : 0 auto;
.visualPreview {
pointer-events: none;
transition : .25s all;
width : 100%;
}
.card-body {
padding : 0;
display : flex;
justify-content: center;
align-items : center;
}
.card-footer {
font-size : 1.25em;
font-weight: 500;
position : absolute;
bottom : 0;
left : 0;
width : 100%;
border : 0px;
text-shadow: 0px 2px 6px rgba(0, 0, 0, 0.25);
font-weight: bold;
}
&.style-active {
outline: 4px solid var(--keyColor);
}
&:hover {
transform : scale(1.10) translateZ(-1px) translateY(10px);
z-index : 1;
box-shadow: 0px 12px 16px rgb(0 0 0 / 25%);
}
@media screen and (max-height: 688px) {
width: 270px;
}
}
}
}
.oobe-footer {
display : flex;
flex-direction : row;
justify-content: center;
align-items : center;
padding : 16px;
.md-btn {
font-size : 18px;
min-width : 128px;
text-align: center;
}
}
}
.oobe-titlebar {
position : absolute;
top : 0;
left : 0;
height : 46px;
width : 100%;
align-items : center;
justify-content : right;
display : flex;
-webkit-app-region: drag;
.button-group {
-webkit-app-region: no-drag;
display : flex;
flex-direction : row;
width : 100px;
height : 100%;
justify-content : center;
align-items : center;
gap : 16px;
>button {
height : 32px;
width : 32px;
font-size : 16px;
border-radius : 0px;
border : 0;
appearance : none;
position : relative;
display : flex;
justify-content: center;
align-items : center;
border-radius : 100%;
&.close {
background-color: #fc3c44aa;
&:hover {
background-color: #fc3c44;
}
}
&.min {
background-color: rgb(200 200 200 / 5%);
&:hover {
background-color: rgb(200 200 200 / 10%);
}
}
&.close::before {
font-family: "codicon";
content : "";
color : white;
}
&.min::before {
font-family: "codicon";
content : "";
color : white;
}
}
}
}
}
.content-inner.cider-multiroom {
padding: 0px;
.detail{
.detail {
padding: 32px;
}
.header-desc{
font-size: 1em;
.header-desc {
font-size : 1em;
font-weight: 400;
}
.artworkContainer{
.artworkContainer {
height: 300px;
width : 100%;
img{
height: 100%;
width: 100%;
overflow: hidden;
img {
height : 100%;
width : 100%;
overflow : hidden;
object-fit: cover;
filter: unset;
&:last-child{
transform: unset;
filter : unset;
&:last-child {
transform: unset;
}
}
}

View file

@ -1,107 +1,91 @@
import { CiderCache } from "./cidercache.js"
import { CiderCache } from "./cidercache.js";
async function spawnMica() {
if (typeof window.micaSpawned !== "undefined") {
return
if (typeof window.micaSpawned !== "undefined") {
return;
} else {
window.micaSpawned = true;
}
const micaDiv = document.createElement("div");
const blurIterations = 6;
micaDiv.id = "micaEffect";
micaDiv.style.position = "fixed";
micaDiv.style.top = "0";
micaDiv.style.left = "0";
micaDiv.style.right = "0";
micaDiv.style.bottom = "0";
micaDiv.style.zIndex = -1;
let lastScreenX;
let lastScreenY;
let lastScreenWidth;
let lastScreenHeight;
let regen = true;
let imgSrc = await ipcRenderer.sendSync("get-wallpaper", {
blurAmount: 256
});
// let micaCache = await CiderCache.getCache("mica-cache");
// if (!micaCache) {
// micaCache = {
// path: "",
// data: "",
// };
// }
// if (micaCache.path == imgSrc.path) {
// regen = false;
// imgSrc = micaCache;
// }
let canvas = document.createElement("canvas");
let ctx = canvas.getContext("2d");
let img = new Image();
micaDiv.style.backgroundImage = `url(${imgSrc.data})`;
document.body.appendChild(micaDiv);
function onScreenMove(cb) {
function detectScreenMove() {
if (lastScreenY !== window.screenY || lastScreenX !== window.screenX) {
lastScreenY = window.screenY;
lastScreenX = window.screenX;
cb();
}
// window size change
if (
lastScreenWidth !== window.innerWidth ||
lastScreenHeight !== window.innerHeight
) {
lastScreenWidth = window.innerWidth;
lastScreenHeight = window.innerHeight;
cb();
}
if (true) {
requestAnimationFrame(detectScreenMove);
}
}
if (true) {
requestAnimationFrame(detectScreenMove);
}
}
onScreenMove(function () {
const screenHeight = window.screen.height;
const screenWidth = window.screen.width;
const windowHeight = window.innerHeight;
const windowWidth = window.innerWidth;
const ratio = windowWidth / windowHeight;
const x = window.screenX;
const y = window.screenY;
micaDiv.style.backgroundSize = `${screenWidth}px ${screenHeight}px`;
// micaDiv.style.backgroundPosition = `-${x}px -${y}px`;
if (x < 0) {
micaDiv.style.backgroundPosition = `${screenWidth + x}px -${y}px`;
} else {
window.micaSpawned = true
micaDiv.style.backgroundPosition = `-${x}px -${y}px`;
}
const micaDiv = document.createElement('div');
const blurIterations = 6
micaDiv.id = 'micaEffect';
micaDiv.style.position = "fixed"
micaDiv.style.top = "0"
micaDiv.style.left = "0"
micaDiv.style.right = "0"
micaDiv.style.bottom = "0"
micaDiv.style.zIndex = -1
let lastScreenX;
let lastScreenY;
let lastScreenWidth;
let lastScreenHeight;
let regen = true
let imgSrc = await ipcRenderer.sendSync("get-wallpaper")
let micaCache = await CiderCache.getCache("mica-cache")
if (!micaCache) {
micaCache = {
path: "",
data: ""
}
}
if (micaCache.path == imgSrc.path) {
regen = false
imgSrc = micaCache
}
let canvas = document.createElement('canvas');
let ctx = canvas.getContext('2d');
let img = new Image();
img.src = imgSrc.data;
img.onload = function () {
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
if (regen) {
for (let i = 0; i < blurIterations; i++) {
StackBlur.canvasRGB(canvas, 0, 0, img.width, img.height, 128);
}
micaCache.path = imgSrc.path
micaCache.data = canvas.toDataURL()
CiderCache.putCache("mica-cache", micaCache)
}
let imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
micaDiv.style.backgroundImage = `url(${micaCache.data})`;
document.body.appendChild(micaDiv);
// on animation finished set animation to unset
micaDiv.addEventListener('animationend', function () {
micaDiv.style.opacity = '1';
micaDiv.style.animation = 'unset';
})
}
function onScreenMove(cb) {
function detectScreenMove() {
if (lastScreenY !== window.screenY || lastScreenX !== window.screenX) {
lastScreenY = window.screenY;
lastScreenX = window.screenX;
cb();
}
// window size change
if (lastScreenWidth !== window.innerWidth || lastScreenHeight !== window.innerHeight) {
lastScreenWidth = window.innerWidth;
lastScreenHeight = window.innerHeight;
cb();
}
if (true) {
requestAnimationFrame(detectScreenMove);
}
}
if (true) {
requestAnimationFrame(detectScreenMove);
}
}
onScreenMove(function () {
const screenHeight = window.screen.height;
const screenWidth = window.screen.width;
const windowHeight = window.innerHeight;
const windowWidth = window.innerWidth;
const ratio = windowWidth / windowHeight;
const x = window.screenX;
const y = window.screenY;
micaDiv.style.backgroundSize = `${screenWidth}px ${screenHeight}px`;
// micaDiv.style.backgroundPosition = `-${x}px -${y}px`;
if (x < 0) {
micaDiv.style.backgroundPosition = `${screenWidth + x}px -${y}px`;
} else {
micaDiv.style.backgroundPosition = `-${x}px -${y}px`;
}
});
return true
});
return true;
}
export { spawnMica }
export { spawnMica };

View file

@ -26,6 +26,7 @@ const app = new Vue({
showHints: false,
results: {},
resultsSocial: {},
resultsLibrary: {},
limit: 10
},
fullscreenLyrics: false,
@ -116,6 +117,7 @@ const app = new Vue({
displayListing: [],
downloadState: 0 // 0 = not started, 1 = in progress, 2 = complete, 3 = empty library
},
localsongs: []
},
playlists: {
listing: [],
@ -177,9 +179,7 @@ const app = new Vue({
"artwork": { "url": "./assets/logocut.png" }
}
},
forceDirectives: {
},
forceDirectives: {},
menuOpened: false,
maximized: false,
drawerOpened: false,
@ -241,8 +241,8 @@ const app = new Vue({
},
moreinfodata: [],
notyf: notyf,
idleTimer : null,
idleState : false,
idleTimer: null,
idleState: false,
},
watch: {
cfg: {
@ -274,6 +274,31 @@ const app = new Vue({
}, false)
},
methods: {
setWindowHash(route = "") {
window.location.hash = `#${route}`;
},
async oobeInit() {
this.appMode = "oobe"
this.setLz(this.cfg.general.language)
this.setLzManual()
clearTimeout(this.hangtimer)
document.body.removeAttribute("loading")
ipcRenderer.invoke("renderer-ready", true)
document.querySelector("#LOADER").remove()
},
getAppStyle() {
let finalStyle = {}
if (this.cfg.visual.window_background_style === "color") {
finalStyle["background-color"] = this.cfg.visual.windowColor
}
if (this.cfg.visual.customAccentColor) {
finalStyle["--keyColor"] = this.cfg.visual.accentColor
finalStyle["--songProgressColor"] = this.cfg.visual.accentColor
} else if (this.cfg.visual.purplePodcastPlaybackBar && MusicKit.getInstance().nowPlayingItem?.type == "podcast-episodes") {
finalStyle["--songProgressColor"] = '#6929D0'
}
return finalStyle
},
setTimeout(func, time) {
return setTimeout(func, time);
},
@ -297,10 +322,11 @@ const app = new Vue({
}
},
formatVolumeTooltip() {
return 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) + '%'
},
mainMenuVisibility(val) {
if(this.chrome.sidebarCollapsed) {
mainMenuVisibility(val, isContextMenu) {
if (this.chrome.sidebarCollapsed && !isContextMenu) {
this.chrome.sidebarCollapsed = false
return
}
@ -334,7 +360,8 @@ const app = new Vue({
this.listennow.timestamp = 0;
this.browsepage.timestamp = 0;
this.radio.timestamp = 0;
} catch (e) { }
} catch (e) {
}
},
/**
* Grabs translation for localization.
@ -490,18 +517,20 @@ const app = new Vue({
})
},
goToGrouping(url = "https://music.apple.com/WebObjects/MZStore.woa/wa/viewGrouping?cc=us&id=34") {
const id = url.split("id=")[1];
window.location.hash = `#groupings/${id}`
if (url.includes('viewTop')) {
window.location.hash = `#charts/top`
} else {
const id = url.split("id=")[1];
window.location.hash = `#groupings/${id}`
}
},
navigateForward() {
history.forward()
},
getHTMLStyle() {
if (app.cfg.visual.uiScale != 1) {
document.querySelector("#app").style.zoom = app.cfg.visual.uiScale
} else {
document.querySelector("#app").style.zoom = ""
}
ipcRenderer.send("setScreenScale", app.cfg.visual.uiScale);
},
resetState() {
this.menuPanel.visible = false;
@ -617,7 +646,9 @@ const app = new Vue({
},
async init() {
let self = this
if (!localStorage.getItem("seenOOBE")) {
localStorage.setItem("seenOOBE", 1)
}
if (this.cfg.visual.styles.length != 0) {
await this.reloadStyles()
}
@ -694,9 +725,6 @@ const app = new Vue({
// Set mk.volume to -1 (setting to 0 wont work, so temp solution setting to -1)
this.mk.volume = -1;
}
// ipcRenderer.invoke('getStoreValue', 'audio.volume').then((value) => {
// self.mk.volume = value
// })
// load cached library
let librarySongs = await CiderCache.getCache("library-songs")
@ -809,13 +837,30 @@ const app = new Vue({
}
})
/**
* DiscordRPC Reload Return Event
* @author @coredev-uk
*/
ipcRenderer.on('rpcReloaded', (e, user) => {
if (user.username) {
app.notyf.success(app.stringTemplateParser(app.getLz("settings.option.connectivity.discordRPC.reconnectedToUser"), {
user: `${user.username}#${user.discriminator}`,
userid: user.id
}));
}
})
ipcRenderer.on('getUpdatedLocalList', (event, data) => {
console.log("cider-local", data);
this.library.localsongs = data;
})
ipcRenderer.on('SoundCheckTag', (event, tag) => {
// let replaygain = self.parseSCTagToRG(tag)
try {
if (app.mk.nowPlayingItem.type !== 'song') {
CiderAudio.audioNodes.gainNode.gain.value = 0.70794578438;
}
else {
} else {
let soundcheck = tag.split(" ")
let numbers = []
for (let item of soundcheck) {
@ -824,18 +869,23 @@ const app = new Vue({
}
numbers.shift()
let peak = Math.max(numbers[6], numbers[7]) / 32768.0
let gain = Math.pow(10, ((-1.3 - (Math.log10(peak) * 20)) / 20))// EBU R 128 Compliant
let gain = Math.pow(10, ((-1.7 - (Math.log10(peak) * 20)) / 20))// EBU R 128 Compliant
console.debug(`[Cider][MaikiwiSoundCheck] Peak Gain: '${(Math.log10(peak) * 20).toFixed(2)}' dB | Adjusting '${(Math.log10(gain) * 20).toFixed(2)}' dB`)
try {
//CiderAudio.audioNodes.gainNode.gain.value = (Math.min(Math.pow(10, (replaygain.gain / 20)), (1 / replaygain.peak)))
CiderAudio.audioNodes.gainNode.gain.value = gain
} catch (e) { }
} catch (e) {
}
}
} catch (e) {
try { ipcRenderer.send('SoundCheckTag', event, tag); }
catch (e) {
try {ipcRenderer.send('SoundCheckTag', event, tag);}
catch (e) {console.log("[Cider][MaikiwiSoundCheck] Error [Gave up after 3 consecutive attempts]: " + e)}
} catch (e) {
try {
ipcRenderer.send('SoundCheckTag', event, tag);
} catch (e) {
try {
ipcRenderer.send('SoundCheckTag', event, tag);
} catch (e) {
console.log("[Cider][MaikiwiSoundCheck] Error [Gave up after 3 consecutive attempts]: " + e)
}
}
} // brute force until it works
})
@ -864,42 +914,58 @@ const app = new Vue({
ipcRenderer.send('wsapi-updatePlaybackState', wsapi.getAttributes());
})
this.mk.addEventListener(MusicKit.Events.queueItemsDidChange, ()=>{
this.mk.addEventListener(MusicKit.Events.queueItemsDidChange, () => {
if (self.$refs.queue) {
setTimeout(()=>{
setTimeout(() => {
self.$refs.queue.updateQueue();
}, 100)
}
})
// 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) => {
if (self.$refs.queue) {
self.$refs.queue.updateQueue();
}
this.currentSongInfo = a
try {
if (app.mk.nowPlayingItem.flavor.includes("64")) {
if (localStorage.getItem("playingBitrate") !== "64") {
localStorage.setItem("playingBitrate", "64")
CiderAudio.hierarchical_loading();
}
}
else if (app.mk.nowPlayingItem.flavor.includes("256")) {
if (localStorage.getItem("playingBitrate") !== "256") {
if (app.cfg.advanced.AudioContext) {
try {
if (app.mk.nowPlayingItem.flavor.includes("64")) {
if (localStorage.getItem("playingBitrate") !== "64") {
localStorage.setItem("playingBitrate", "64")
CiderAudio.hierarchical_loading();
}
} else if (app.mk.nowPlayingItem.flavor.includes("256")) {
if (localStorage.getItem("playingBitrate") !== "256") {
localStorage.setItem("playingBitrate", "256")
CiderAudio.hierarchical_loading();
}
} else {
localStorage.setItem("playingBitrate", "256")
CiderAudio.hierarchical_loading();
}
}
else {
} catch (e) {
localStorage.setItem("playingBitrate", "256")
CiderAudio.hierarchical_loading();
}
} catch(e) {
localStorage.setItem("playingBitrate", "256")
CiderAudio.hierarchical_loading();
}
if (app.cfg.audio.normalization) {
// get unencrypted audio previews to get SoundCheck's normalization tag
try {
@ -960,7 +1026,7 @@ const app = new Vue({
}
setTimeout(() => {
let i = (document.querySelector('#apple-music-player')?.src ?? "")
if (i.endsWith(".m3u8") || i.endsWith(".m3u")){
if (i.endsWith(".m3u8") || i.endsWith(".m3u")) {
this._playRadioStream(i)
}
}, 1500)
@ -977,7 +1043,7 @@ const app = new Vue({
this.appRoute(window.location.hash)
}
if(this.page != "home") {
if (this.page != "home") {
this.resumeTabs()
}
this.mediaKeyFixes()
@ -988,7 +1054,7 @@ const app = new Vue({
this.$forceUpdate()
}, 500)
document.querySelector('#apple-music-video-player-controls').addEventListener('mousemove', () => {
this.showFoo('.music-player-info',2000);
this.showFoo('.music-player-info', 2000);
})
ipcRenderer.invoke("renderer-ready", true)
document.querySelector("#LOADER").remove()
@ -996,7 +1062,7 @@ const app = new Vue({
this.checkForThemeUpdates()
}
},
showFoo(querySelector,time) {
showFoo(querySelector, time) {
clearTimeout(this.idleTimer);
if (this.idleState == true) {
document.querySelector(querySelector).classList.remove("inactive");
@ -1019,7 +1085,11 @@ const app = new Vue({
.then(res => res.json())
.then(res => {
if (res[0].sha != theme.commit) {
const notify = notyf.open({ className: "notyf-info", type: "info", message: `[Themes] ${theme.name} has an update available.` })
const notify = notyf.open({
className: "notyf-info",
type: "info",
message: `[Themes] ${theme.name} has an update available.`
})
notify.on("click", () => {
app.appRoute("themes-github")
notyf.dismiss(notify)
@ -1118,9 +1188,20 @@ const app = new Vue({
},
getAppClasses() {
let classes = {}
if (this.cfg.advanced.experiments.includes('compactui')) {
classes.compact = true
switch (this.getThemeDirective('forceUI') ?? "none") {
case "compact":
classes.compact = true;
break;
case "standard":
classes.compact = false;
break;
default:
if (this.cfg.advanced.experiments.includes('compactui')) {
classes.compact = true;
}
break;
}
if (this.cfg.visual.window_background_style == "none") {
classes.simplebg = true
}
@ -1202,12 +1283,72 @@ const app = new Vue({
}
})
},
async syncFavorites() {
const notify = notyf.open({
className: "notyf-info",
type: "info",
message: `[${app.getLz('home.syncFavorites')}] ${app.getLz('home.syncFavorites.gettingArtists')}`
})
const results = await MusicKitTools.v3Continuous({
href: "/v1/me/library/artists", options: {
"include": ["catalog"],
"fields[artists]": ["inFavorites"]
}
})
let favs = []
// for each result
results.forEach(result => {
try {
if (result.relationships?.catalog?.data[0]?.attributes?.inFavorites) {
if(!favs.includes(result.relationships?.catalog?.data[0].id)) {
favs.push(result.relationships?.catalog?.data[0].id)
}
}
} catch (e) {
e = null
}
})
notyf.success(`[${app.getLz('home.syncFavorites')}] ${app.getLz('action.done')}`)
app.cfg.home.followedArtists = favs
return favs
},
async setArtistFavorite(id, val = true) {
if(val) {
if(!app.cfg.home.followedArtists.includes(id)) {
app.cfg.home.followedArtists.push(id)
}
await app.mk.api.v3.music(`/v1/me/favorites`, {
"art[url]": "f",
"ids[artists]": app.artistPage.data.id,
"l": app.mklang,
"platform": "web"
}, {
fetchOptions: {
method: "POST"
}
})
}else{
if(app.cfg.home.followedArtists.includes(id)) {
app.cfg.home.followedArtists.splice(app.cfg.home.followedArtists.indexOf(id), 1)
}
await app.mk.api.v3.music(`/v1/me/favorites`, {
"art[url]": "f",
"ids[artists]": app.artistPage.data.id,
"l": app.mklang,
"platform": "web"
}, {
fetchOptions: {
method: "DELETE"
}
})
}
},
async refreshPlaylists(localOnly = false, useCachedPlaylists = true) {
let self = this
let trackMap = this.cfg.advanced.playlistTrackMapping
let newListing = []
let trackMapping = {}
if (useCachedPlaylists) {
const cachedPlaylist = await CiderCache.getCache("library-playlists")
const cachedTrackMapping = await CiderCache.getCache("library-playlists-tracks")
@ -1235,7 +1376,7 @@ const app = new Vue({
async function deepScan(parent = "p.playlistsroot") {
console.debug(`scanning ${parent}`)
// const playlistData = await app.mk.api.v3.music(`/v1/me/library/playlist-folders/${parent}/children/`)
const playlistData = await MusicKitTools.v3Continuous({href: `/v1/me/library/playlist-folders/${parent}/children/`})
const playlistData = await MusicKitTools.v3Continuous({ href: `/v1/me/library/playlist-folders/${parent}/children/` })
console.log(playlistData)
await asyncForEach(playlistData, async (playlist) => {
playlist.parent = parent
@ -1267,10 +1408,12 @@ const app = new Vue({
}
})
}
} catch (e) { }
} catch (e) {
}
if (playlist.type == "library-playlist-folders") {
try {
await deepScan(playlist.id).catch(e => { })
await deepScan(playlist.id).catch(e => {
})
} catch (e) {
}
@ -1428,10 +1571,10 @@ const app = new Vue({
})
}
},
/**
/**
* @param {string} url, href for the initial request
* @memberof app
*/
*/
async showRoom(url) {
let self = this
const response = await this.mk.api.v3.music(url)
@ -1559,7 +1702,7 @@ const app = new Vue({
this.page = ""
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",
"extend": "artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero",
"extend": "centeredFullscreenBackground,artistBio,bornOrFormed,editorialArtwork,editorialVideo,isGroup,origin,hero",
"extend[playlists]": "trackCount",
"include[songs]": "albums",
"fields[albums]": "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialVideo,name,playParams,releaseDate,url,trackCount",
@ -1654,8 +1797,7 @@ const app = new Vue({
const mDisplay = m > 0 ? `${m} ${app.getLz("term.time.minute", { "count": m })}` : "";
return dDisplay + (dDisplay && hDisplay ? ", " : "") + hDisplay + (hDisplay && mDisplay ? ", " : "") + mDisplay;
}
else {
} else {
let returnTime = datetime.toISOString().substring(11, 19);
const timeGates = {
@ -1753,27 +1895,28 @@ const app = new Vue({
if (item.attributes.link.url.includes("viewMultiRoom")) {
const params = new Proxy(new URLSearchParams(item.attributes.link.url), {
get: (searchParams, prop) => searchParams.get(prop),
});
});
id = params.fcId
app.getTypeFromID("multiroom", id, false, {
platform: "web",
extend: "editorialArtwork,uber,lockupStyle"
}).then(()=> {
}).then(() => {
kind = "multiroom"
window.location.hash = `${kind}/${id}`
document.querySelector("#app-content").scrollTop = 0
})
return;
} else {
window.open(item.attributes.link.url)}
window.open(item.attributes.link.url)
}
}
} else if (kind == "multirooms"){
} else if (kind == "multirooms") {
app.getTypeFromID("multiroom", id, false, {
platform: "web",
extend: "editorialArtwork,uber,lockupStyle"
}).then(()=> {
}).then(() => {
kind = "multiroom"
window.location.hash = `${kind}/${id}`
document.querySelector("#app-content").scrollTop = 0
@ -1812,7 +1955,7 @@ const app = new Vue({
params["meta[albums:tracks]"] = 'popularity'
params["fields[albums]"] = "artistName,artistUrl,artwork,contentRating,editorialArtwork,editorialNotes,editorialVideo,name,playParams,releaseDate,url,copyright"
}
if (kind.includes("playlist") || kind.includes("album")){
if (kind.includes("playlist") || kind.includes("album")) {
app.page = (kind) + "_" + (id);
window.location.hash = `${kind}/${id}${isLibrary ? "/" + isLibrary : ''}`
app.getTypeFromID((kind), (id), (isLibrary), params);
@ -1847,33 +1990,40 @@ const app = new Vue({
}
},
isDisabled() {
if(!app.mk.nowPlayingItem || app.mk.nowPlayingItem.attributes.playParams.kind == 'radioStation') {
if (!app.mk.nowPlayingItem || app.mk.nowPlayingItem.attributes.playParams.kind == 'radioStation') {
return true;
}
return false;
},
isPrevDisabled() {
if(this.isDisabled() || (app.mk.queue._position == 0 && app.mk.currentPlaybackTime <= 2)) {
if (this.isDisabled() || (app.mk.queue._position == 0 && app.mk.currentPlaybackTime <= 2)) {
return true;
}
return false;
},
isNextDisabled() {
if(this.isDisabled() || app.mk.queue._position + 1 == app.mk.queue.length) {
if (this.isDisabled() || app.mk.queue._position + 1 == app.mk.queue.length) {
return true;
}
return false;
},
async getNowPlayingItemDetailed(target) {
let nowPlayingItem = JSON.parse(JSON.stringify(this.mk.nowPlayingItem))
if(nowPlayingItem.type === "radioStation" && app.mk.nowPlayingItem.id !== -1) {
nowPlayingItem.playParams = {kind: "songs"}
nowPlayingItem.attributes.playParams.catalogId = app.mk.nowPlayingItem.id
nowPlayingItem.attributes.playParams.id = app.mk.nowPlayingItem.id
nowPlayingItem.id = app.mk.nowPlayingItem.id
}
try {
let u = await app.mkapi(app.mk.nowPlayingItem.playParams.kind,
(app.mk.nowPlayingItem.songId == -1),
(app.mk.nowPlayingItem.songId != -1) ? app.mk.nowPlayingItem.songId : app.mk.nowPlayingItem["id"],
let u = await app.mkapi(nowPlayingItem.playParams.kind,
(nowPlayingItem.songId == -1),
(nowPlayingItem.songId != -1) ? nowPlayingItem.songId : nowPlayingItem["id"],
{ "include[songs]": "albums,artists", l: app.mklang });
app.searchAndNavigate(u.data.data[0], target)
} catch (e) {
app.searchAndNavigate(app.mk.nowPlayingItem, target)
app.searchAndNavigate(nowPlayingItem, target)
}
},
async searchAndNavigate(item, target) {
@ -1989,16 +2139,6 @@ const app = new Vue({
this.getArtistFromID(id)
//this.getTypeFromID("artist",id,isLibrary,query)
},
followArtistById(id, follow) {
if (follow && !this.followingArtist(id)) {
this.cfg.home.followedArtists.push(id)
} else {
let index = this.cfg.home.followedArtists.indexOf(id)
if (index > -1) {
this.cfg.home.followedArtists.splice(index, 1)
}
}
},
followingArtist(id) {
console.debug(`check for ${id}`)
return this.cfg.home.followedArtists.includes(id)
@ -2015,8 +2155,7 @@ const app = new Vue({
app.mk.setStationQueue({ artist: 'a-' + id }).then(() => {
app.mk.play()
})
}
else {
} else {
app.playMediaItemById((id), (kind), (isLibrary), item.attributes.url ?? '')
}
})
@ -2039,7 +2178,7 @@ const app = new Vue({
} finally {
if (kind == "appleCurator") {
app.appleCurator = a.data.data[0]
} else if (kind == "multiroom"){
} else if (kind == "multiroom") {
app.multiroom = a.data.data[0]
} else {
this.getPlaylistContinuous(a, true)
@ -2048,7 +2187,7 @@ const app = new Vue({
} finally {
if (kind == "appleCurator") {
app.appleCurator = a.data.data[0]
} else if (kind == "multiroom"){
} else if (kind == "multiroom") {
app.multiroom = a.data.data[0]
} else {
this.getPlaylistContinuous(a, true)
@ -2292,8 +2431,7 @@ const app = new Vue({
try {
if (method.includes(`multiroom`)) {
return await this.mk.api.v3.music(`v1/editorial/${app.mk.storefrontId}/${truemethod}/${term.toString()}`, params, params2)
}
else if (library) {
} else if (library) {
return await this.mk.api.v3.music(`v1/me/library/${truemethod}/${term.toString()}`, params, params2)
} else {
return await this.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/${truemethod}/${term.toString()}`, params, params2)
@ -2320,6 +2458,7 @@ const app = new Vue({
let library = []
let cacheId = "library-songs"
let downloaded = null;
this.$store.commit("resetRecentlyAdded")
if ((this.library.songs.downloadState == 2) && !force) {
return
}
@ -2642,7 +2781,7 @@ const app = new Vue({
"include[songs]": "artists",
"include[music-videos]": "artists",
"fields[albums]": ["artistName", "artistUrl", "artwork", "contentRating", "editorialArtwork", "editorialVideo", "name", "playParams", "releaseDate", "url"],
"fields[artists]": ["name", "url"],
"fields[artists]": ["name", "url", "artwork"],
"extend[stations]": ["airDate", "supportsAirTimeUpdates"],
"meta[stations]": "inflectionPoints",
types: "artists,albums,editorial-items,library-albums,library-playlists,music-movies,music-videos,playlists,stations,uploaded-audios,uploaded-videos,activities,apple-curators,curators,tv-shows,social-upsells",
@ -3042,7 +3181,8 @@ const app = new Vue({
} else { //4xx rejected
getToken(2, '', '', id, lang, '');
}
} catch (e) { }
} catch (e) {
}
}
req2.send();
}
@ -3100,8 +3240,7 @@ const app = new Vue({
translation: ''
});
app.lyrics = preLrc.reverse();
}
catch (e) {
} catch (e) {
app.lyrics = "";
}
};
@ -3143,6 +3282,7 @@ const app = new Vue({
function b64_to_utf8(str) {
return decodeURIComponent(escape(window.atob(str)));
}
const htmlDecode = (input) => {
const doc = new DOMParser().parseFromString(input, "text/html");
return doc.documentElement.textContent;
@ -3173,8 +3313,7 @@ const app = new Vue({
translation: ''
});
app.lyrics = preLrc.reverse();
}
catch (e) {
} catch (e) {
console.log(e)
app.loadNeteaseLyrics();
app.lyrics = "";
@ -3532,6 +3671,18 @@ const app = new Vue({
friendlyTypes(type) {
// use switch statement to return friendly name for media types "songs,artists,albums,playlists,music-videos,stations,apple-curators,curators"
switch (type) {
case "library-songs":
return app.getLz('term.songs')
break;
case "library-artists":
return app.getLz('term.artists')
break;
case "library-albums":
return app.getLz('term.albums')
break;
case "library-playlists":
return app.getLz('term.playlists')
break;
case "song":
return app.getLz('term.songs')
break;
@ -3614,6 +3765,13 @@ const app = new Vue({
results.data.results["meta"] = results.data.meta
self.search.resultsSocial = results.data.results
})
this.search.resultsLibrary = await app.mk.api.library.search(app.search.term, {
types: 'library-songs,library-albums,library-playlists,library-artists',
limit: 25,
offset: 0
})
},
async inLibrary(items = []) {
let types = []
@ -3690,7 +3848,7 @@ const app = new Vue({
},
getMediaItemArtwork(url, height = 64, width) {
if (typeof url == "undefined" || url == "") {
return "https://beta.music.apple.com/assets/product/MissingArtworkMusic.svg"
return "./assets/MissingArtwork.svg"
}
height = parseInt(height * window.devicePixelRatio)
if (width) {
@ -3766,6 +3924,9 @@ const app = new Vue({
if (app.mk.nowPlayingItem != null && app.mk.nowPlayingItem.attributes != null && app.mk.nowPlayingItem.attributes.artwork != null && app.mk.nowPlayingItem.attributes.artwork.url != null && app.mk.nowPlayingItem.attributes.artwork.url != '') {
this.currentArtUrlRaw = (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"] ?? '')
this.currentArtUrl = (this.mk["nowPlayingItem"]["attributes"]["artwork"]["url"] ?? '').replace('{w}', artworkSize).replace('{h}', artworkSize);
if (this.mk.nowPlayingItem._assets[0].artworkURL) {
this.currentArtUrl = this.mk.nowPlayingItem._assets[0].artworkURL
}
try {
document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);
} catch (e) {
@ -3776,6 +3937,9 @@ const app = new Vue({
if (data != null && data !== "" && data.attributes != null && data.attributes.artwork != null) {
this.currentArtUrlRaw = (data["attributes"]["artwork"]["url"] ?? '')
this.currentArtUrl = (data["attributes"]["artwork"]["url"] ?? '').replace('{w}', artworkSize).replace('{h}', artworkSize);
if (this.mk.nowPlayingItem._assets[0].artworkURL) {
this.currentArtUrl = this.mk.nowPlayingItem._assets[0].artworkURL
}
ipcRenderer.send('updateRPCImage', this.currentArtUrl ?? '');
try {
document.querySelector('.app-playback-controls .artwork').style.setProperty('--artwork', `url("${this.currentArtUrl}")`);
@ -3988,10 +4152,10 @@ const app = new Vue({
setAirPlayCodeUI() {
this.modals.airplayPW = true
},
sendAirPlaySuccess(){
sendAirPlaySuccess() {
notyf.success('Device paired successfully!');
},
sendAirPlayFailed(){
sendAirPlayFailed() {
notyf.error('Device paring failed!');
},
windowFocus(val) {
@ -4183,7 +4347,15 @@ const app = new Vue({
this.showMenuPanel(menus[useMenu], event)
try {
let result = await this.inLibrary([this.mk.nowPlayingItem])
// if its a radio station, then change the attributes to match a song
const nowPlayingItem = JSON.parse(JSON.stringify(this.mk.nowPlayingItem))
if(nowPlayingItem.type == "radioStation" && app.mk.nowPlayingItem.id != -1) {
nowPlayingItem.type = "song"
nowPlayingItem.attributes.playParams.catalogId = app.mk.nowPlayingItem.id
nowPlayingItem.attributes.playParams.id = app.mk.nowPlayingItem.id
nowPlayingItem.id = app.mk.nowPlayingItem.id
}
let result = await this.inLibrary([nowPlayingItem])
if (result[0].attributes.inLibrary) {
menus.normal.items.find(x => x.id == 'addToLibrary').hidden = true
menus.normal.items.find(x => x.id == 'removeFromLibrary').hidden = false
@ -4242,7 +4414,7 @@ const app = new Vue({
});
},
fullscreen(flag) {
this.fullscreenState = flag;
this.fullscreenState = flag;
if (flag) {
ipcRenderer.send('setFullScreen', true);
app.appMode = 'fullscreen';
@ -4257,7 +4429,7 @@ const app = new Vue({
app.appMode = 'player';
}
},
pip(){
pip() {
document.querySelector('video#apple-music-video-player').requestPictureInPicture()
// .then(pictureInPictureWindow => {
// pictureInPictureWindow.addEventListener("resize", () => {
@ -4438,16 +4610,19 @@ const app = new Vue({
_playRadioStream(e) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = process;
xhr.open("GET", e , true);
xhr.open("GET", e, true);
xhr.send();
let self = this
function process() {
if (xhr.readyState == 4) {
let sources = xhr.responseText.match(/^(?!#)(?!\s).*$/mg).filter(function(element){return (element);});
// Load first source
let src = sources[0];
app.mk._services.mediaItemPlayback._currentPlayer._playAssetURL(src, false)
}
if (xhr.readyState == 4) {
let sources = xhr.responseText.match(/^(?!#)(?!\s).*$/mg).filter(function (element) {
return (element);
});
// Load first source
let src = sources[0];
app.mk._services.mediaItemPlayback._currentPlayer._playAssetURL(src, false)
}
}
}
}

View file

@ -6,11 +6,24 @@ const store = new Vuex.Store({
// recentlyAdded: ipcRenderer.sendSync("get-library-recentlyAdded"),
// playlists: ipcRenderer.sendSync("get-library-playlists")
},
pageState: {
recentlyAdded: {
loaded: false,
nextUrl: null,
items: [],
size: "normal"
}
},
artwork: {
playerLCD: ""
}
},
mutations: {
resetRecentlyAdded(state) {
state.pageState.recentlyAdded.loaded = false;
state.pageState.recentlyAdded.nextUrl = null;
state.pageState.recentlyAdded.items = [];
},
setLCDArtwork(state, artwork) {
state.artwork.playerLCD = artwork
}

View file

@ -1,9 +1,8 @@
@import url("assets/fonts/Pretendard/pretendardvariable.css");
@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;300;400;500;700;900&display=swap');
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+HK:wght@100;300;400;500;700;900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100;300;400;500;700;900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap");
@import url("less/appvars.less");
@import url("less/bootstrap-vue.min.less");
@import url("less/ameframework.less");
@ -20,7 +19,9 @@
--mediaItemShadow-Shadow: 0 8px 40px rgb(0 0 0 / 0.55);
--mediaItemShadow-ShadowSubtle: 0 4px 14px rgb(0 0 0 / 10%);
--ciderShadow-Generic: var(--mediaItemShadow), 0 8px 40px rgb(0 0 0 / 0.55);
--mediaItemRadius: 6px;
--mediaItemRadius: 8px;
--mediaItemRadiusSmall: 6px;
--mediaItemRadiusMedium: 8px;
--mediaItemRadiusRound: 100%;
--panelRadius: 10px;
--contentInnerPadding: 16px;
@ -31,6 +32,7 @@
--selected-click: rgb(80 80 80 / 30%);
--hover: rgb(200 200 200 / 10%);
// --keyColor: #fa586a;
--keyColorDefault: @keyColor;
--keyColor: @keyColor;
--keyColor-rgb: 250, 88, 106;
--keyColor-rollover: #ff8a9c;
@ -66,7 +68,7 @@ body {
background-size: cover;
background-position: center;
background: #0000;
font-family: "Pretendard Variable", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
font-family: "Pretendard Variable", "Noto Sans JP", "Noto Sans KR", "Noto Sans TC", "Noto Sans SC", -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
transition: opacity .10s var(--appleEase);
}
@ -308,19 +310,19 @@ a.dropdown-item {
overflow: hidden;
pointer-events: none;
> img {
img {
position: absolute;
width: 200%;
opacity: 0.5;
filter: brightness(200%) blur(180px) saturate(280%) contrast(2);
}
> img:first-child {
img:first-child {
top: 0;
left: 0;
}
> img:last-child {
img:last-child {
bottom: 0;
right: 0;
transform: rotate(180deg);
@ -374,15 +376,14 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
}
#app-sidebar {
/* background-color: var(--color1); */
height: 100%;
width: var(--sidebarWidth);
display: flex;
flex-direction: column;
flex: 0 0 auto;
position: relative;
background : var(--sidebarColorMix);
max-width : var(--sidebarWidth);
background: linear-gradient(180deg, var(--baseColorMix) calc(var(--chromeHeight1) + 1px), var(--sidebarColorMix) calc(var(--chromeHeight1) + 1px));
max-width: var(--sidebarWidth);
padding-top: var(--chromeHeight1);
}
@ -449,13 +450,13 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
width: 100%;
padding: 6px;
border-radius: 6px;
border : 1px solid rgba(100, 100, 100, 0.35);
border-top : 1px solid rgba(100, 100, 100, 0.5);
border-bottom: 1px solid rgb(60 60 60 / 12%);
border: 1px solid rgba(100, 100, 100, 0.35);
border-top: 1px solid rgba(100, 100, 100, 0.5);
border-bottom: 1px solid rgb(60 60 60 / 62%);
font-family: inherit;
font-size: 14px;
background: rgba(100, 100, 100, 0.25);;
color: rgb(200 200 200);
background: #1e1e1e99;
color: #c8c8c8;
font-weight: 500;
padding-left: 32px;
position: relative;
@ -531,18 +532,15 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
&.collapseTab {
display:flex;
padding:0px;
padding:6px;
border:0;
>button {
appearance: none;
border:0px;
width: 100%;
position: relative;
padding: 12px;
padding-left: 32px;
padding-left: 40px;
text-align: left;
font-family: inherit;
background-color: var(--color2);
color: var(--textColor);
&:hover {
background-color: var(--selected);
}
@ -550,17 +548,17 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
background-color: var(--selected-click);
}
&:after {
content: '';
content: '';
display: flex;
justify-content: center;
align-items: center;
width: 32px;
width: 46px;
height: 100%;
position: absolute;
top: 0;
left: 0;
font-weight: bold;
font-size: 1.2em;
font-size: 1em;
font-family: "codicon";
}
}
@ -667,7 +665,9 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
#cmenu() {
.container {
position: absolute;
width: 100%;
left: 0px;
width: var(--sidebarWidth);
max-width: var(--sidebarWidth);
padding: 10px;
z-index: 1;
}
@ -1018,20 +1018,21 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
align-items: center;
-webkit-app-region: no-drag;
height: auto;
}
.app-chrome .app-chrome-item.generic {
width: 50px;
opacity: 0.70;
}
.app-chrome .app-chrome-item.volume {
width: 100px;
margin-right: 6px;
}
&.generic {
width: 50px;
opacity: 0.70;
}
.app-chrome .app-chrome-item.search {
margin-right: 6px;
&.volume {
width: 100px;
margin-right: 6px;
}
&.search {
margin-right: 6px;
}
}
.volume-button {
@ -1161,52 +1162,47 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
&-macos {
width: 100px;
}
}
.app-chrome .app-chrome-item > .window-controls > div {
height: 100%;
width: 32px;
}
.app-chrome .app-chrome-item > .window-controls > div:hover {
background: rgb(200 200 200 / 10%);
}
.app-chrome .app-chrome-item > .window-controls > div.close {
width: 100%;
height: 100%;
background-image: var(--gfx-closeBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
&:hover {
background-color: rgb(196, 43, 28)
> div {
height: 100%;
width: 32px;
&:hover {
background: rgb(200 200 200 / 10%);
}
&.close {
width: 100%;
height: 100%;
background-image: var(--gfx-closeBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
&:hover {
background-color: rgb(196, 43, 28)
}
}
&.minmax {
background-image: var(--gfx-maxBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
width: 100%;
height: 100%;
}
&.minmax.restore {
background-image: var(--gfx-restoreBtn);
}
&.minimize {
background-image: var(--gfx-minBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
width: 100%;
height: 100%;
}
}
}
.app-chrome .app-chrome-item > .window-controls > div.minmax {
background-image: var(--gfx-maxBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
width: 100%;
height: 100%;
}
.app-chrome .app-chrome-item > .window-controls > div.minmax.restore {
background-image: var(--gfx-restoreBtn);
}
.app-chrome .app-chrome-item > .window-controls > div.minimize {
background-image: var(--gfx-minBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
width: 100%;
height: 100%;
}
body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minimize {
display: none;
}
@ -1242,6 +1238,15 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl
}
.app-chrome .app-chrome-item > .app-playback-controls {
.info-rect{
mask-image: linear-gradient(-90deg, transparent 0%, black 10%, black 90%, transparent 100%);
-webkit-mask-image: linear-gradient(-90deg, transparent 3%, black 10%, black 90%, transparent 100%);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
width:100%;
}
.song-name {
font-weight: 600;
text-align: center;
@ -1409,7 +1414,7 @@ div[data-type="musicVideo"] .info-rect .title::before {
width: 12px;
height: 12px;
border-radius: 100%;
background: var(--keyColor);
background: var(--songProgressColor);
cursor: default;
transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
}
@ -1418,7 +1423,7 @@ div[data-type="musicVideo"] .info-rect .title::before {
width: 8px;
height: 8px;
border-radius: 100%;
background: var(--keyColor);
background: var(--songProgressColor);
cursor: default;
}
}
@ -1441,10 +1446,13 @@ div[data-type="musicVideo"] .info-rect .title::before {
background-position: center;
background-size: contain;
background-repeat: no-repeat;
border-radius: 4px;
border-radius: var(--mediaItemRadiusSmall);
flex: 0 0 auto;
margin: 6px;
image-rendering: -webkit-optimize-contrast;
.mediaitem-artwork {
border-radius: var(--mediaItemRadiusSmall);
}
}
.app-chrome .app-chrome-item > .app-playback-controls .actions {
@ -1515,7 +1523,7 @@ div[data-type="musicVideo"] .info-rect .title::before {
position: relative;
}
.app-chrome .app-chrome-item > .app-playback-controls > div > .song-artist-album {
.app-chrome .app-chrome-item > .app-playback-controls .song-artist-album {
font-weight: 400;
font-size: 12px;
text-align: center;
@ -1603,12 +1611,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
}
&::-webkit-slider-thumb:hover {
background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
background-image: radial-gradient(var(--songProgressColor) 2px, transparent 3px, transparent 10px);
transform: scale(1.2);
}
&::-webkit-slider-thumb:active {
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
background-image: radial-gradient(var(--songProgressColor) 3px, transparent 4px, transparent 10px);
transform: scale(1);
}
@ -1645,7 +1653,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
overflow-x: hidden;
display: flex;
flex-flow: column;
font-family: 'Inter', 'Noto Sans JP', 'Source Han Sans SC', 'Source Han Sans HK', 'Noto Sans SC', 'Noto Sans TC', 'Noto Sans HK', 'Noto Sans KR', 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 {
@ -1679,6 +1687,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.lyric-line.active .verse.verse-active {
opacity: 1;
transition: opacity 0.35s var(--appleEase);
}
.lyric-line:hover {
@ -1704,7 +1713,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
opacity: 1;
transform: scale(1);
/*background: var(--keyColor);*/
transition: transform 0.2s var(--appleEase);
transition: transform 0.2s var(--appleEase), opacity 0.35s var(--appleEase);
}
.lyric-line:not(.active) {
@ -1749,7 +1758,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
.lyrics-translation {
font-size: 1.6rem;
font-weight: 450;
font-family: 'Inter', 'Noto Sans JP', 'Noto Sans SC', 'Noto Sans TC', 'Noto Sans HK', 'Noto Sans KR', 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);
}
@ -2147,12 +2156,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
}
&::-webkit-slider-thumb:hover {
background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
background-image: radial-gradient(var(--songProgressColor) 2px, transparent 3px, transparent 10px);
transform: scale(1.2);
}
&::-webkit-slider-thumb:active {
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
background-image: radial-gradient(var(--songProgressColor) 3px, transparent 4px, transparent 10px);
transform: scale(1);
}
@ -2397,7 +2406,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
width: 12px;
height: 12px;
border-radius: 100%;
background: var(--keyColor);
background: var(--songProgressColor);
cursor: default;
transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
}
@ -2406,7 +2415,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
width: 8px;
height: 8px;
border-radius: 100%;
background: var(--keyColor);
background: var(--songProgressColor);
cursor: default;
}
}
@ -2535,12 +2544,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
}
&::-webkit-slider-thumb:hover {
background-image: radial-gradient(var(--keyColor) 2px, transparent 3px, transparent 10px);
background-image: radial-gradient(var(--songProgressColor) 2px, transparent 3px, transparent 10px);
transform: scale(1.2);
}
&::-webkit-slider-thumb:active {
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
background-image: radial-gradient(var(--songProgressColor) 3px, transparent 4px, transparent 10px);
transform: scale(1);
}
@ -2808,7 +2817,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
width: 12px;
height: 12px;
border-radius: 100%;
background: var(--keyColor);
background: var(--songProgressColor);
cursor: default;
transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
}
@ -2817,7 +2826,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
width: 8px;
height: 8px;
border-radius: 100%;
background: var(--keyColor);
background: var(--songProgressColor);
cursor: default;
}
}
@ -2955,6 +2964,16 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
transform: translateY(20px);
}
.fade-enter-active,
.fade-leave-active {
transition: opacity .15s var(--appleEase);
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
.modal-enter-active,
.modal-leave-active {
transition: opacity .1s var(--appleEase), transform .1s var(--appleEase);
@ -3453,22 +3472,7 @@ body.no-gpu {
}
.close-btn {
width: 50px;
height: 100%;
background-image: var(--gfx-closeBtn);
background-position: center;
background-repeat: no-repeat;
-webkit-app-region: no-drag;
appearance: none;
border: 0;
background-color: transparent;
position: absolute;
top: 0;
right: 0;
&:hover {
background-color: rgb(196, 43, 28)
}
.menu-panel.menu-header-text.close-btn
}
}

View file

@ -13,6 +13,32 @@ body {
}
}
.app-chrome:not(.chrome-bottom) {
backdrop-filter: unset;
background-color: var(--baseColor);
}
.menu-panel .menu-panel-body {
background: rgb(30 30 30);
}
.menu-panel .menu-panel-body .menu-option::before {
transition: unset!important;
}
#app.twopanel .app-chrome:not(.chrome-bottom) .app-chrome--center .top-nav-group .app-sidebar-item:before {
transition: unset!important;
}
.playback-button:before, .playback-button--small:before {
transition: unset!important;
}
.floating-header {
backdrop-filter: unset!important;
background: rgb(0 0 0 / 80%)!important;
}
.replaycard-enter-active,
.replaycard-leave-active {
transition: unset;

View file

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

View file

@ -1,4 +1,4 @@
<div id="app-content" @scroll.passive="setContentScrollPos" :scrollpos="chrome.contentScrollPosY" scrollaxis="y" :style="{'overflow': (chrome.contentAreaScrolling ? '' : 'hidden')}">
<div id="app-content" :scrollpos="chrome.contentScrollPosY" scrollaxis="y" :style="{'overflow': (chrome.contentAreaScrolling ? '' : 'hidden')}">
<div id="navigation-bar" v-if="getThemeDirective('appNavigation') == 'seperate'">
<button class="nav-item" @click="navigateBack()">
<%- include('../svg/chevron-left.svg') %>
@ -24,11 +24,6 @@
</template>
</transition>
<% } %>
<!-- Library - Recently Added -->
<transition :name="chrome.desiredPageTransition" v-on:enter="getLibraryAlbumsFull(null, 0); searchLibraryAlbums(0);">
<%- include('../pages/library-recentlyadded') %>');
</transition>
<!-- Library - Made For You -->
<transition :name="chrome.desiredPageTransition" v-on:enter="getMadeForYou()">
<template v-if="page == 'library-madeforyou'">

View file

@ -1,4 +1,129 @@
<div class="app-navigation" v-cloak>
<transition name="wpfade">
<div class="usermenu-container" v-if="chrome.menuOpened">
<div class="usermenu-body">
<button
class="app-sidebar-button"
style="width: 100%"
@click="appRoute('apple-account-settings')"
>
<img
class="sidebar-user-icon"
loading="lazy"
:src="getMediaItemArtwork(chrome.hideUserInfo ? './assets/logocut.png' : (chrome.userinfo.attributes['artwork'] ? chrome.userinfo.attributes['artwork']['url'] : ''), 26)"
/>
<div class="sidebar-user-text" v-if="!chrome.hideUserInfo">
<template v-if="chrome.userinfo.id || mk.isAuthorized">
<div class="fullname text-overflow-elipsis">
{{
chrome.userinfo != null &&
chrome.userinfo.attributes != null
? chrome.userinfo.attributes.name ?? ""
: ""
}}
</div>
<div class="handle-text text-overflow-elipsis">
{{
chrome.userinfo != null &&
chrome.userinfo.attributes != null
? chrome.userinfo.attributes.handle ?? ""
: ""
}}
</div>
</template>
<template v-else>
<div @click="mk.authorize()">
{{ $root.getLz("term.login") }}
</div>
</template>
</div>
<div class="sidebar-user-text" v-else>
{{ $root.getLz("app.name") }}
</div>
</button>
<!-- Use 20px SVG for usermenu icon -->
<button
class="usermenu-item"
v-if="cfg.general.privateEnabled"
@click="cfg.general.privateEnabled = false"
>
<span class="usermenu-item-icon">
<%- include("../svg/x.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.disablePrivateSession")
}}</span>
</button>
<button class="usermenu-item" @click="appRoute('remote-pair')">
<span class="usermenu-item-icon">
<%- include("../svg/smartphone.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("action.showWebRemoteQR")
}}</span>
</button>
<button
class="usermenu-item"
@click="cfg.advanced.AudioContext ? modals.castMenu = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"
>
<span class="usermenu-item-icon">
<%- include("../svg/cast.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.cast")
}}</span>
</button>
<button
class="usermenu-item"
@click="cfg.advanced.AudioContext ? modals.audioSettings = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"
>
<span class="usermenu-item-icon">
<%- include("../svg/headphones.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.audioSettings")
}}</span>
</button>
<button
class="usermenu-item"
v-if="pluginInstalled"
@click="modals.pluginMenu = true"
>
<span class="usermenu-item-icon">
<%- include("../svg/grid.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.plugin")
}}</span>
</button>
<button class="usermenu-item" @click="appRoute('about')">
<span class="usermenu-item-icon">
<%- include("../svg/info.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.about")
}}</span>
</button>
<button class="usermenu-item" @click="appRoute('settings')">
<span class="usermenu-item-icon">
<%- include("../svg/settings.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.settings")
}}</span>
</button>
<button class="usermenu-item" @click="unauthorize()">
<span class="usermenu-item-icon" style="right: 2.5px">
<%- include("../svg/log-out.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.logout")
}}</span>
</button>
</div>
</div>
</transition>
<transition name="sidebartransition">
<%- include("sidebar") %>
</transition>

View file

@ -10,10 +10,10 @@
<b-popover custom-class="mediainfo-popover" target="artworkLCD" triggers="hover" placement="right">
<div class="content">
<div class="shadow-artwork">
<mediaitem-artwork :url="currentArtUrl" :url="currentArtUrlRaw"></mediaitem-artwork>
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="popover-artwork">
<mediaitem-artwork :size="210" :url="currentArtUrlRaw"></mediaitem-artwork>
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="song-name">{{ mk.nowPlayingItem["attributes"]["name"] }}</div>
<div class="song-artist" @click="getNowPlayingItemDetailed(`artist`)">{{ mk.nowPlayingItem["attributes"]["artistName"] }}</div>
@ -60,13 +60,27 @@
</div>
</template>
<template v-else>
<div class="app-playback-controls">
<div class="artwork" id="artworkLCD" style="pointer-events: none;">
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="playback-info">
<div class="song-name">
</div>
</div>
</div>
</template>
</div>
</div>
<div class="app-chrome--center">
<div class="app-chrome-playback-duration-bottom">
<b-row>
<b-col sm="auto">{{ convertTime(getSongProgress()) }}</b-col>
<b-row v-if="mkReady()">
<b-col sm="auto" v-if="!mk.nowPlayingItem?.isLiveRadioStation">{{ convertTime(getSongProgress()) }}</b-col>
<b-col sm="auto" v-else>--:--</b-col>
<b-col>
<input type="range" step="0.01" min="0" :style="progressBarStyle()"
@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);"
:max="mk.currentPlaybackDuration" :value="getSongProgress()">
</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>
</div>
<div class="app-chrome-playback-controls">

View file

@ -1,217 +1,118 @@
<div
class="app-chrome"
:style="{'display': chrome.topChromeVisible ? '' : 'none'}"
>
<div class="app-chrome" :style="{'display': chrome.topChromeVisible ? '' : 'none'}">
<div class="app-chrome--left">
<div
class="app-chrome-item full-height"
v-if="chrome.windowControlPosition == 'left' && !chrome.nativeControls"
>
<div class="app-chrome-item full-height" v-if="chrome.windowControlPosition == 'left' && !chrome.nativeControls">
<div class="window-controls-macos">
<div class="close" @click="ipcRenderer.send('close')"></div>
<div class="minimize" @click="ipcRenderer.send('minimize')"></div>
<div
class="minmax restore"
v-if="chrome.maximized"
@click="ipcRenderer.send('maximize')"
></div>
<div class="minmax restore" v-if="chrome.maximized" @click="ipcRenderer.send('maximize')"></div>
<div class="minmax" v-else @click="ipcRenderer.send('maximize')"></div>
</div>
</div>
<div class="app-chrome-item full-height" v-else>
<button
class="app-mainmenu"
@blur="mainMenuVisibility(false)"
@click="mainMenuVisibility(true)"
:class="{active: chrome.menuOpened}"
:aria-label="$root.getLz('term.quickNav')"
></button>
<button class="app-mainmenu" @blur="mainMenuVisibility(false, true)" @click="mainMenuVisibility(true, false)"
@contextmenu="mainMenuVisibility(true, true)" :class="{active: chrome.menuOpened}"
:aria-label="$root.getLz('term.quickNav')"></button>
</div>
<template v-if="getThemeDirective('appNavigation') != 'seperate'">
<div
class="vdiv"
v-if="getThemeDirective('windowLayout') == 'twopanel'"
></div>
<div class="vdiv" v-if="getThemeDirective('windowLayout') == 'twopanel'"></div>
<div class="app-chrome-item">
<button
class="playback-button navigation"
@click="navigateBack()"
:title="$root.getLz('term.navigateBack')"
v-b-tooltip.hover
>
<button class="playback-button navigation" @click="navigateBack()" :title="$root.getLz('term.navigateBack')"
v-b-tooltip.hover>
<%- include('../svg/chevron-left.svg') %>
</button>
</div>
<div class="app-chrome-item">
<button
class="playback-button navigation"
@click="navigateForward()"
:title="$root.getLz('term.navigateForward')"
v-b-tooltip.hover
>
<button class="playback-button navigation" @click="navigateForward()"
:title="$root.getLz('term.navigateForward')" v-b-tooltip.hover>
<%- include('../svg/chevron-right.svg') %>
</button>
</div>
<div
class="vdiv display--large"
v-if="getThemeDirective('windowLayout') != 'twopanel'"
></div>
<div class="app-chrome-item" v-if="getThemeDirective('windowLayout') == 'twopanel'">
<button class="playback-button collapseLibrary" v-b-tooltip.hover
:title="chrome.sidebarCollapsed ? getLz('action.showLibrary') : getLz('action.hideLibrary')"
@click="chrome.sidebarCollapsed = !chrome.sidebarCollapsed">
<transition name="fade">
<span v-if="chrome.sidebarCollapsed"></span>
</transition>
<transition name="fade">
<span v-if="!chrome.sidebarCollapsed"></span>
</transition>
</button>
</div>
<div class="vdiv display--large" v-if="getThemeDirective('windowLayout') != 'twopanel'"></div>
</template>
<template v-if="getThemeDirective('windowLayout') != 'twopanel'">
<div class="app-chrome-item display--large">
<button
class="playback-button--small shuffle"
v-if="mk.shuffleMode == 0"
:class="isDisabled() && 'disabled'"
@click="mk.shuffleMode = 1"
:title="$root.getLz('term.enableShuffle')"
v-b-tooltip.hover
></button>
<button
class="playback-button--small shuffle active"
v-else
:class="isDisabled() && 'disabled'"
@click="mk.shuffleMode = 0"
:title="$root.getLz('term.disableShuffle')"
v-b-tooltip.hover
></button>
<button class="playback-button--small shuffle" v-if="mk.shuffleMode == 0" :class="isDisabled() && 'disabled'"
@click="mk.shuffleMode = 1" :title="$root.getLz('term.enableShuffle')" v-b-tooltip.hover></button>
<button class="playback-button--small shuffle active" v-else :class="isDisabled() && 'disabled'"
@click="mk.shuffleMode = 0" :title="$root.getLz('term.disableShuffle')" v-b-tooltip.hover></button>
</div>
<div class="app-chrome-item display--large">
<button
class="playback-button previous"
@click="prevButton()"
:class="isPrevDisabled() && 'disabled'"
:title="$root.getLz('term.previous')"
v-b-tooltip.hover
></button>
<button class="playback-button previous" @click="prevButton()" :class="isPrevDisabled() && 'disabled'"
:title="$root.getLz('term.previous')" v-b-tooltip.hover></button>
</div>
<div class="app-chrome-item display--large">
<button
class="playback-button stop"
@click="mk.stop()"
<button class="playback-button stop" @click="mk.stop()"
v-if="mk.isPlaying && mk.nowPlayingItem.attributes.playParams.kind == 'radioStation'"
:title="$root.getLz('term.stop')"
v-b-tooltip.hover
></button>
<button
class="playback-button pause"
@click="mk.pause()"
v-else-if="mk.isPlaying"
:title="$root.getLz('term.pause')"
v-b-tooltip.hover
></button>
<button
class="playback-button play"
@click="mk.play()"
v-else
:title="$root.getLz('term.play')"
v-b-tooltip.hover
></button>
:title="$root.getLz('term.stop')" v-b-tooltip.hover></button>
<button class="playback-button pause" @click="mk.pause()" v-else-if="mk.isPlaying"
:title="$root.getLz('term.pause')" v-b-tooltip.hover></button>
<button class="playback-button play" @click="mk.play()" v-else :title="$root.getLz('term.play')"
v-b-tooltip.hover></button>
</div>
<div class="app-chrome-item display--large">
<button
class="playback-button next"
@click="skipToNextItem()"
:class="isNextDisabled() && 'disabled'"
:title="$root.getLz('term.next')"
v-b-tooltip.hover
></button>
<button class="playback-button next" @click="skipToNextItem()" :class="isNextDisabled() && 'disabled'"
:title="$root.getLz('term.next')" v-b-tooltip.hover></button>
</div>
<div class="app-chrome-item display--large">
<button
class="playback-button--small repeat"
v-if="mk.repeatMode == 0"
:class="isDisabled() && 'disabled'"
@click="mk.repeatMode = 1"
:title="$root.getLz('term.enableRepeatOne')"
v-b-tooltip.hover
></button>
<button
class="playback-button--small repeat repeatOne"
@click="mk.repeatMode = 2"
:class="isDisabled() && 'disabled'"
v-else-if="mk.repeatMode == 1"
:title="$root.getLz('term.disableRepeatOne')"
v-b-tooltip.hover
></button>
<button
class="playback-button--small repeat active"
@click="mk.repeatMode = 0"
:class="isDisabled() && 'disabled'"
v-else-if="mk.repeatMode == 2"
:title="$root.getLz('term.disableRepeat')"
v-b-tooltip.hover
></button>
<button class="playback-button--small repeat" v-if="mk.repeatMode == 0" :class="isDisabled() && 'disabled'"
@click="mk.repeatMode = 1" :title="$root.getLz('term.enableRepeatOne')" v-b-tooltip.hover></button>
<button class="playback-button--small repeat repeatOne" @click="mk.repeatMode = 2"
:class="isDisabled() && 'disabled'" v-else-if="mk.repeatMode == 1"
:title="$root.getLz('term.disableRepeatOne')" v-b-tooltip.hover></button>
<button class="playback-button--small repeat active" @click="mk.repeatMode = 0"
:class="isDisabled() && 'disabled'" v-else-if="mk.repeatMode == 2" :title="$root.getLz('term.disableRepeat')"
v-b-tooltip.hover></button>
</div>
</template>
</div>
<div class="app-chrome--center">
<div
class="app-chrome-item playback-controls"
v-if="getThemeDirective('windowLayout') != 'twopanel'"
>
<div class="app-chrome-item playback-controls" v-if="getThemeDirective('windowLayout') != 'twopanel'">
<template v-if="mkReady()">
<div
class="app-playback-controls"
@mouseover="chrome.progresshover = true"
@mouseleave="chrome.progresshover = false"
@contextmenu="nowPlayingContextMenu"
>
<div class="app-playback-controls" @mouseover="chrome.progresshover = true"
@mouseleave="chrome.progresshover = false" @contextmenu="nowPlayingContextMenu">
<div class="artwork" id="artworkLCD">
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<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="shadow-artwork">
<mediaitem-artwork
:url="currentArtUrl"
:url="currentArtUrlRaw"
></mediaitem-artwork>
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="popover-artwork">
<mediaitem-artwork
:size="210"
:url="currentArtUrlRaw"
></mediaitem-artwork>
<mediaitem-artwork :size="210" :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="song-name">
{{ mk.nowPlayingItem["attributes"]["name"] }}
</div>
<div
class="song-artist"
@click="getNowPlayingItemDetailed(`artist`)"
>
<div class="song-artist" @click="getNowPlayingItemDetailed(`artist`)">
{{ mk.nowPlayingItem["attributes"]["artistName"] }}
</div>
<div
class="song-album"
@click="getNowPlayingItemDetailed(`album`)"
>
<div class="song-album" @click="getNowPlayingItemDetailed(`album`)">
{{
mk.nowPlayingItem["attributes"]["albumName"]
? mk.nowPlayingItem["attributes"]["albumName"]
: ""
mk.nowPlayingItem["attributes"]["albumName"]
? mk.nowPlayingItem["attributes"]["albumName"]
: ""
}}
</div>
<hr />
<div class="btn-group" style="width: 100%">
<button
class="md-btn md-btn-small"
style="width: 100%"
@click="drawer.open = false; miniPlayer(true)"
>
<button class="md-btn md-btn-small" style="width: 100%" @click="drawer.open = false; miniPlayer(true)">
{{ $root.getLz("term.miniplayer") }}
</button>
<button
class="md-btn md-btn-small"
style="width: 100%"
@click="drawer.open = false; fullscreen(true)"
>
<button class="md-btn md-btn-small" style="width: 100%" @click="drawer.open = false; fullscreen(true)">
{{ $root.getLz("term.fullscreenView") }}
</button>
</div>
@ -219,183 +120,121 @@
</b-popover>
<div class="playback-info">
<div class="chrome-icon-container">
<div
class="audio-type private-icon"
v-if="cfg.general.privateEnabled === true"
></div>
<div
class="audio-type ppe-icon"
v-if="cfg.audio.maikiwiAudio.ciderPPE === true"
></div>
<div class="audio-type private-icon" v-if="cfg.general.privateEnabled === true"></div>
<div class="audio-type ppe-icon" v-if="cfg.audio.maikiwiAudio.ciderPPE === true"></div>
</div>
<div
class="song-name"
:class="[isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-name') ? 'marquee' : '']"
>
{{ mk.nowPlayingItem["attributes"]["name"] }}
<div
class="explicit-icon"
v-if="mk.nowPlayingItem['attributes']['contentRating'] == 'explicit'"
style="display: inline-block"
></div>
</div>
<div class="song-artist-album">
<div
class="song-artist-album-content"
:class="[isElementOverflowing('#app-main > .app-chrome .app-chrome-item > .app-playback-controls > div >.song-artist-album > .song-artist-album-content') ? 'marquee' : '']"
style="
<div class="info-rect">
<div class="song-name"
:class="[isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-name') ? 'marquee' : '']">
{{ mk.nowPlayingItem["attributes"]["name"] }}
<div class="explicit-icon" v-if="mk.nowPlayingItem['attributes']['contentRating'] == 'explicit'"
style="display: inline-block"></div>
</div>
<div class="song-artist-album">
<div class="song-artist-album-content"
:class="[isElementOverflowing('#app-main > .app-chrome .app-chrome-item > .app-playback-controls > div >.song-artist-album > .song-artist-album-content') ? 'marquee' : '']"
style="
display: inline-block;
-webkit-box-orient: horizontal;
white-space: nowrap;
"
>
<div
class="item-navigate song-artist"
style="display: inline-block"
@click="getNowPlayingItemDetailed(`artist`)"
>
{{ mk.nowPlayingItem["attributes"]["artistName"] }}
</div>
<div
class="song-artist item-navigate"
style="display: inline-block"
@click="getNowPlayingItemDetailed('album')"
v-if="mk.nowPlayingItem['attributes']['albumName'] != ''"
>
<div class="separator" style="display: inline-block">
{{ "—" }}
">
<div class="item-navigate song-artist" style="display: inline-block"
@click="getNowPlayingItemDetailed(`artist`)">
{{ mk.nowPlayingItem["attributes"]["artistName"] }}
</div>
{{
<div class="song-artist item-navigate" style="display: inline-block"
@click="getNowPlayingItemDetailed('album')"
v-if="mk.nowPlayingItem['attributes']['albumName'] != ''">
<div class="separator" style="display: inline-block">
{{ "—" }}
</div>
{{
mk.nowPlayingItem["attributes"]["albumName"]
? mk.nowPlayingItem["attributes"]["albumName"]
: ""
}}
? mk.nowPlayingItem["attributes"]["albumName"]
: ""
}}
</div>
</div>
</div>
</div>
<div class="song-progress">
<div
class="song-duration"
style="justify-content: space-between; height: 1px"
:style="[chrome.progresshover ? {'display': 'flex'} : {'display' : 'none'} ]"
>
<div class="song-duration" style="justify-content: space-between; height: 1px"
:style="[chrome.progresshover ? {'display': 'flex'} : {'display' : 'none'} ]">
<p style="width: auto">{{ convertTime(getSongProgress()) }}</p>
<p style="width: auto">
{{ convertTime(mk.currentPlaybackDuration) }}
</p>
</div>
<input
type="range"
step="0.01"
min="0"
:style="progressBarStyle()"
<input type="range" step="0.01" min="0" :style="progressBarStyle()"
@input="playerLCD.desiredDuration = $event.target.value;playerLCD.userInteraction = true"
@mouseup="mk.seekToTime($event.target.value);setTimeout(()=>{playerLCD.desiredDuration = 0;playerLCD.userInteraction = false}, 1000);"
@touchend="mk.seekToTime($event.target.value);setTimeout(()=>{playerLCD.desiredDuration = 0;playerLCD.userInteraction = false}, 1000);"
:max="mk.currentPlaybackDuration"
:value="getSongProgress()"
/>
:max="mk.currentPlaybackDuration" :value="getSongProgress()" />
</div>
</div>
<template v-if="mk.nowPlayingItem['attributes']['playParams']">
<div class="actions">
<button
class="lcdMenu"
@click="nowPlayingContextMenu"
:title="$root.getLz('term.more')"
v-b-tooltip.hover
>
<button class="lcdMenu" @click="nowPlayingContextMenu" :title="$root.getLz('term.more')"
v-b-tooltip.hover>
<div class="svg-icon"></div>
</button>
</div>
</template>
</div>
</template>
<template v-else>
<div class="app-playback-controls">
<div class="artwork" id="artworkLCD" style="pointer-events: none;">
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
</div>
<div class="playback-info">
<div class="info-rect">
</div>
</div>
</div>
</template>
</div>
<div class="app-chrome-item" v-else>
<div class="top-nav-group">
<sidebar-library-item
:name="$root.getLz('home.title')"
svg-icon="./assets/feather/home.svg"
page="home"
>
<sidebar-library-item :name="$root.getLz('home.title')" svg-icon="./assets/feather/home.svg" page="home">
</sidebar-library-item>
<sidebar-library-item
:name="$root.getLz('term.listenNow')"
svg-icon="./assets/feather/play-circle.svg"
page="listen_now"
></sidebar-library-item>
<sidebar-library-item
:name="$root.getLz('term.browse')"
svg-icon="./assets/feather/globe.svg"
page="browse"
>
<sidebar-library-item :name="$root.getLz('term.listenNow')" svg-icon="./assets/feather/play-circle.svg"
page="listen_now"></sidebar-library-item>
<sidebar-library-item :name="$root.getLz('term.browse')" svg-icon="./assets/feather/globe.svg" page="browse">
</sidebar-library-item>
<sidebar-library-item :name="$root.getLz('term.radio')" svg-icon="./assets/feather/radio.svg" page="radio">
</sidebar-library-item>
<sidebar-library-item
:name="$root.getLz('term.radio')"
svg-icon="./assets/feather/radio.svg"
page="radio"
></sidebar-library-item>
</div>
</div>
</div>
<div class="app-chrome--right">
<template v-if="getThemeDirective('windowLayout') != 'twopanel'">
<div class="app-chrome-item volume display--large">
<button
class="volume-button--small volume"
@click="muteButtonPressed()"
<button class="volume-button--small volume" @click="muteButtonPressed()"
:class="{'active': this.cfg.audio.volume == 0}"
:title="cfg.audio.muted ? $root.getLz('term.unmute') : $root.getLz('term.mute')"
v-b-tooltip.hover
></button>
<input
type="range"
@wheel="volumeWheel"
:step="cfg.audio.volumeStep"
min="0"
:max="cfg.audio.maxVolume"
v-model="mk.volume"
v-if="typeof mk.volume != 'undefined'"
@change="checkMuteChange()"
v-b-tooltip.hover
:title="formatVolumeTooltip()"
/>
:title="cfg.audio.muted ? $root.getLz('term.unmute') : $root.getLz('term.mute')" v-b-tooltip.hover></button>
<input type="range" @wheel="volumeWheel" :step="cfg.audio.volumeStep" min="0" :max="cfg.audio.maxVolume"
v-model="mk.volume" v-if="typeof mk.volume != 'undefined'" @change="checkMuteChange()" v-b-tooltip.hover
:title="formatVolumeTooltip()" />
</div>
<div class="app-chrome-item generic">
<button
class="playback-button--small cast"
:title="$root.getLz('term.cast')"
<button class="playback-button--small cast" :title="$root.getLz('term.cast')"
@click="cfg.advanced.AudioContext ? modals.castMenu = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"
v-b-tooltip.hover
></button>
v-b-tooltip.hover></button>
</div>
<div class="app-chrome-item generic">
<button
class="playback-button--small queue"
:title="$root.getLz('term.queue')"
v-b-tooltip.hover
:class="{'active': drawer.panel == 'queue'}"
@click="invokeDrawer('queue')"
></button>
<button class="playback-button--small queue" :title="$root.getLz('term.queue')" v-b-tooltip.hover
:class="{'active': drawer.panel == 'queue'}" @click="invokeDrawer('queue')"></button>
</div>
<div class="app-chrome-item generic">
<template v-if="lyrics && lyrics != [] && lyrics.length > 0">
<button
class="playback-button--small lyrics"
:title="$root.getLz('term.lyrics')"
v-b-tooltip.hover
:class="{'active': drawer.panel == 'lyrics'}"
@click="invokeDrawer('lyrics')"
></button>
<button class="playback-button--small lyrics" :title="$root.getLz('term.lyrics')" v-b-tooltip.hover
:class="{'active': drawer.panel == 'lyrics'}" @click="invokeDrawer('lyrics')"></button>
</template>
<template v-else>
<button
class="playback-button--small lyrics"
:style="{'opacity': 0.3, 'pointer-events': 'none'}"
></button>
<button class="playback-button--small lyrics" :style="{'opacity': 0.3, 'pointer-events': 'none'}"></button>
</template>
</div>
</template>
@ -403,31 +242,16 @@
<div class="app-chrome-item search">
<div class="search-input-container">
<div class="search-input--icon"></div>
<input
type="search"
spellcheck="false"
@click="showSearch()"
@focus="search.showHints = true"
<input type="search" spellcheck="false" @click="showSearch()" @focus="search.showHints = true"
@blur="setTimeout(()=>{search.showHints = false}, 300)"
v-on:keyup.enter="searchQuery();search.showHints = false"
@change="showSearch();"
@input="getSearchHints()"
:placeholder="$root.getLz('term.search') + '...'"
v-model="search.term"
ref="searchInput"
class="search-input"
/>
v-on:keyup.enter="searchQuery();search.showHints = false" @change="showSearch();" @input="getSearchHints()"
:placeholder="$root.getLz('term.search') + '...'" v-model="search.term" ref="searchInput"
class="search-input" />
<div
class="search-hints-container"
v-if="search.showHints && search.hints.length != 0"
>
<div class="search-hints-container" v-if="search.showHints && search.hints.length != 0">
<div class="search-hints">
<button
class="search-hint text-overflow-elipsis"
v-for="hint in search.hints"
@click="search.term = hint;search.showHints = false;searchQuery(hint)"
>
<button class="search-hint text-overflow-elipsis" v-for="hint in search.hints"
@click="search.term = hint;search.showHints = false;searchQuery(hint)">
{{ hint }}
</button>
</div>
@ -435,32 +259,18 @@
</div>
</div>
</template>
<div
class="app-chrome-item full-height"
id="window-controls-container"
v-if="chrome.windowControlPosition == 'right' && !chrome.nativeControls"
>
<div class="app-chrome-item full-height" id="window-controls-container"
v-if="chrome.windowControlPosition == 'right' && !chrome.nativeControls">
<div class="window-controls">
<div class="minimize" @click="ipcRenderer.send('minimize')"></div>
<div
class="minmax restore"
v-if="chrome.maximized"
@click="ipcRenderer.send('maximize')"
></div>
<div class="minmax restore" v-if="chrome.maximized" @click="ipcRenderer.send('maximize')"></div>
<div class="minmax" v-else @click="ipcRenderer.send('maximize')"></div>
<div class="close" @click="ipcRenderer.send('close')"></div>
</div>
</div>
<div
class="app-chrome-item full-height"
v-else-if="platform != 'darwin' && !chrome.nativeControls"
>
<button
class="app-mainmenu"
@blur="mainMenuVisibility(false)"
@click="mainMenuVisibility(true)"
:class="{active: chrome.menuOpened}"
></button>
<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)"
@contextmenu="mainMenuVisibility(true, true)" :class="{active: chrome.menuOpened}"></button>
</div>
</div>
</div>
</div>

View file

@ -13,9 +13,6 @@
<transition name="modal">
<add-to-playlist :playlists="playlists.listing" v-if="modals.addToPlaylist"></add-to-playlist>
</transition>
<transition name="modal">
<spatial-properties v-if="modals.spatialProperties"></spatial-properties>
</transition>
<transition name="modal">
<audio-controls v-if="modals.audioControls"></audio-controls>
</transition>

View file

@ -183,136 +183,6 @@
</sidebar-playlist>
</template>
</div>
<transition name="wpfade">
<div class="usermenu-container" v-if="chrome.menuOpened">
<div class="usermenu-body">
<button
class="app-sidebar-button"
style="width: 100%"
@click="appRoute('apple-account-settings')"
>
<img
class="sidebar-user-icon"
loading="lazy"
:src="getMediaItemArtwork(chrome.hideUserInfo ? 'http://localhost:9000/assets/logocut.png' : (chrome.userinfo.attributes['artwork'] ? chrome.userinfo.attributes['artwork']['url'] : ''), 26)"
/>
<div class="sidebar-user-text" v-if="!chrome.hideUserInfo">
<template v-if="chrome.userinfo.id || mk.isAuthorized">
<div class="fullname text-overflow-elipsis">
{{
chrome.userinfo != null &&
chrome.userinfo.attributes != null
? chrome.userinfo.attributes.name ?? ""
: ""
}}
</div>
<div class="handle-text text-overflow-elipsis">
{{
chrome.userinfo != null &&
chrome.userinfo.attributes != null
? chrome.userinfo.attributes.handle ?? ""
: ""
}}
</div>
</template>
<template v-else>
<div @click="mk.authorize()">
{{ $root.getLz("term.login") }}
</div>
</template>
</div>
<div class="sidebar-user-text" v-else>
{{ $root.getLz("app.name") }}
</div>
</button>
<!-- Use 20px SVG for usermenu icon -->
<button
class="usermenu-item"
v-if="cfg.general.privateEnabled"
@click="cfg.general.privateEnabled = false"
>
<span class="usermenu-item-icon">
<%- include("../svg/x.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.disablePrivateSession")
}}</span>
</button>
<button class="usermenu-item" @click="appRoute('remote-pair')">
<span class="usermenu-item-icon">
<%- include("../svg/smartphone.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("action.showWebRemoteQR")
}}</span>
</button>
<button
class="usermenu-item"
@click="cfg.advanced.AudioContext ? modals.castMenu = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"
>
<span class="usermenu-item-icon">
<%- include("../svg/cast.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.cast")
}}</span>
</button>
<button
class="usermenu-item"
@click="cfg.advanced.AudioContext ? modals.audioSettings = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"
>
<span class="usermenu-item-icon">
<%- include("../svg/headphones.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.audioSettings")
}}</span>
</button>
<button
class="usermenu-item"
v-if="pluginInstalled"
@click="modals.pluginMenu = true"
>
<span class="usermenu-item-icon">
<%- include("../svg/grid.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.plugin")
}}</span>
</button>
<button class="usermenu-item" @click="appRoute('about')">
<span class="usermenu-item-icon">
<%- include("../svg/info.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.about")
}}</span>
</button>
<button class="usermenu-item" @click="appRoute('settings')">
<span class="usermenu-item-icon">
<%- include("../svg/settings.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.settings")
}}</span>
</button>
<button class="usermenu-item" @click="unauthorize()">
<span class="usermenu-item-icon" style="right: 2.5px">
<%- include("../svg/log-out.svg") %>
</span>
<span class="usermenu-item-name">{{
$root.getLz("term.logout")
}}</span>
</button>
</div>
</div>
</transition>
<div class="app-sidebar-footer collapseTab" v-if="cfg.advanced.experiments.includes('collapseSidebar')">
<button @click="chrome.sidebarCollapsed = !chrome.sidebarCollapsed">
Collapse
</button>
</div>
<div class="app-sidebar-footer display--small app-sidebar-footer--controls">
<div
class="app-playback-controls"
@ -326,6 +196,7 @@
v-if="mk.shuffleMode == 0"
@click="mk.shuffleMode = 1"
:title="$root.getLz('term.enableShuffle')"
:class="$root.isDisabled() && 'disabled'"
v-b-tooltip.hover.righttop
></button>
<button
@ -333,6 +204,7 @@
v-else
@click="mk.shuffleMode = 0"
:title="$root.getLz('term.disableShuffle')"
:class="$root.isDisabled() && 'disabled'"
v-b-tooltip.hover.righttop
></button>
</div>
@ -340,31 +212,26 @@
<button
class="playback-button previous"
@click="prevButton()"
:class="$root.isPrevDisabled() && 'disabled'"
:title="$root.getLz('term.previous')"
v-b-tooltip.hover
></button>
</div>
<div class="app-chrome-item">
<button
class="playback-button pause"
@click="mk.pause()"
v-if="mk.isPlaying"
:title="$root.getLz('term.pause')"
v-b-tooltip.hover
></button>
<button
class="playback-button play"
@click="mk.play()"
v-else
:title="$root.getLz('term.play')"
v-b-tooltip.hover
></button>
<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>
<button class="playback-button play" @click="$root.mk.play()" v-else :title="$root.getLz('term.play')"
v-b-tooltip.hover></button>
</div>
<div class="app-chrome-item">
<button
class="playback-button next"
@click="skipToNextItem()"
:title="$root.getLz('term.next')"
:class="$root.isNextDisabled() && 'disabled'"
v-b-tooltip.hover
></button>
</div>
@ -373,6 +240,7 @@
class="playback-button--small repeat"
v-if="mk.repeatMode == 0"
@click="mk.repeatMode = 1"
:class="$root.isDisabled() && 'disabled'"
:title="$root.getLz('term.enableRepeatOne')"
v-b-tooltip.hover
></button>
@ -381,6 +249,7 @@
@click="mk.repeatMode = 2"
v-else-if="mk.repeatMode == 1"
:title="$root.getLz('term.disableRepeatOne')"
:class="$root.isDisabled() && 'disabled'"
v-b-tooltip.hover
></button>
<button
@ -388,6 +257,7 @@
@click="mk.repeatMode = 0"
v-else-if="mk.repeatMode == 2"
:title="$root.getLz('term.disableRepeat')"
:class="$root.isDisabled() && 'disabled'"
v-b-tooltip.hover
></button>
</div>

View file

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

View file

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

Some files were not shown because too many files have changed in this diff Show more