get real. (#1321)
* test * fix multiroom * attempt for fix rare cast bug * changes for local files: read below * added pouchdb-node * moved all logic for local files to src/main/providers/local * added new local library section on sidebar * removed dupe * added caching headers * fix * add path menu to settings-window * fix mxm for local * some test * some fix * clear this * clear log * add playlist folder class * sometest * fix * Auto focus search bar * use object instead of array for albums (#1219) * feat: 🌐 Update French language (#1218) * add pagination for library songs * Add 'go to' page * Make playlist search icon use hero color * Merge pull request #1 from vapormusic/patch-1 dont populate out-of-display doms * both infinite and paging * Add color to search button background * Add shadow to follow button * im dumb sorry * Add brightness effect of search button * add some delay to scroll v-observe-visibility * some multiroom fixes * somefixes * [Audio] Fix VBass & Added COCS * [Audio] COCS revision * some fix * fix m1 mac * fix m1 build * some fix regarding audiocontext * [Audio] Fix #1207 (discussions) Eliminates audio stuttering even when AudioContext is enabled. Make lyrics account for the extra latency introduced by Audio Lab. * idk what I did * apparently this no worki * should default to 0 * expose bitrate of localfiles * [Audio] Added CAP & Normalization behavior for local files * smh musickit * Expose more local files metadata + fix norm error * pokemon gotta catch them all * maikiwi is a clown confirmed * pokemon gotta catch them all v2 * pokemon gotta catch them all v5 * Update zh_TW.json (#1229) Fix errors, update zh-TW translation. * Change No Lyrics Message in Full Screen Player (#1210) * Modify term.noLyrics text in 5 files * Minor change in 3 files * Colorize sponsor buttons in about page Co-authored-by: ctaetcsh <48845980+ctaetcsh@users.noreply.github.com> * max size of more info panel dynamic * Add twitter social button for some developers in about page (#1232) * Big Chungus Window settings (#1230) * Initial Changes * I suposse this is the last * cryptofyre * Documentation * Revert "Big Chungus Window settings (#1230)" (#1233) This reverts commite133b2c38b
. * test * Just changed it and gonna leave for debugging * reimpe133b2c
, adjustments for macOS * resolve #1 * copied files * readded strings to en_US * adjustments to settings sidebar collapse * add multiplex * Update version.sh * Update style.css * dont break pls thx * swag * I forgot that (#1239) * Update zh_TW.json (#1236) Update TW language. * Update zh_CN.json (#1240) * because I can * Fix cider team buttons in about page * Update style.less * Float right looks better * support custom port via optional CIDER_PORT var * Scan Local Files now 46 times faster * Update .gitignore * cleanups * remove console time (1s/1600 tracks) * fix m1 * sometest * Update build-macos.yml * Fix absolutely unacceptable punctuation error (#1249) * ok * pray * revert mxm back to local * Update zh_CN.json (#1242) * Update de_DE.json (#1246) * Musixmatch fix (thx plank ily) * whoops * yes * whoops v2 * bump to e18.3.5 * don't give the lyric api id if local files * Update afterPack.js * ukie * Update afterPack.js * Update afterPack.js * how the fuck did this not throw an error * fix stupid svg smh * new mediaitem scaling method * added Maximum Element Scale * mediaitem square artwork res now adapts to window size * will not affect high dpi * fix now playing artwork * fix album genre names before: gets genre from 1st track now: gets genre from album data * clamped element scale to 1.5x * added caching for auth * adjustment to artist page * changed to v-show for list item vis * Bring back mxm lyrics (Fully tested) * fix mmx translation * fix settings view * remove useless args & nonexistent funcs * fix div hell * fixed missing end tag for local playlist * fix divs * Fix cider list * the amount of brain cells that I have lost because of mxm trans * WIP language filter * it was fun while it lasted, goodbye MXM languages * MXM changes * 4am code moments * move logic * fix lyrics translation & allow other lang * default store.ts mxm trans to be disabled * this is why you dont code at 4am * and this is why you should test your code before pushing * added Romanized langs to mxm trans * love how previous MXM changes are in vain till now * stop. uploading. this. * NEVER. CODE. AT. FOUR. AYE. EM. AGAIN. * test * Revert "test" This reverts commit256d06bbcc
. * did a funny * did another funny * yes * add prime symbol to apostrophe * Don't do anything if res != 200 * Recursive Folder Search in Cider Utils * 4am code moment * fix function (force recompile utils) * did a funny there * I need sleep * Update zh_CN.json (#1265) This is a big work * Update zh_TW.json (#1260) Update TW language. * performant logging is enabled by default * test getting rid of lyriccurrenttime * set timeout can go away now * boops forgot this * mxm moms * mxm moms * Revert "mxm moms" This reverts commit51fc09280e
. * README download link fix * Update vueapp.js * Fix settings menu (#1271) * remove unused pages * profile page (for search for now) * lol * updated recordLabel with i18n and root usage * Local Lossless Icon and more - add Cider-profile boilerplate - add local lossless icon -add hover for PPE and lossless Co-authored-by: Core <coredev-uk@users.noreply.github.com> * no coding at 4am * fix units for local lossless badge * fix units for local lossless badge * remove CAP icon for local files, cuz unsupported * mpris overhaul * Fix seeking in mpris * changed am section on sidebar to v-show allowing css manipulation * added class for css * new effect when entering fullscreen lyrics * fixes text wrapping on tab text * added is-album * linux is cooollll * Lyrics API migration * Update musickit to use api mirror by default * add div for app-playback-buttons * Add spatialization icon (#1276) * Add spatialization icon * that never happened * add checkmode func to webremote * whoops sorry * Updated config.yml * mogus * fix string matching * may Maikiwi bless your CI * MKV3 red * Go touch grass; * this was so unreadable lmao * add logic for showing spatialization icon * add space in lossless icon * Remove dead fallback token, add error log if capi call fails (#1289) I tested and the fallback key you are using is dead. 401s. Unusable. * Fix #1282 * Fix #1237 * fix default CAP * someone played with translation code * lmao yaz why * stop polluting my logs you lil POST * I18n (#1293) * Update es_ES * I18N * idk this only breaking now * added framework for c2 parity * fixes * Fix volume bar on miniplayer (#1297) * Update stale-issues.yml * removed loading bar, testing without hlscider * overwrite restriction * allow listennow "more like" nav to work * garbage gone * fix for primary-content linking * Update README.md Add QQ group info * Revert back to music metadata * gimp v2 * remove local files as experiment * just to be safe * world is now a better place * meltdown avoided * meltdown avoided * Revert "meltdown avoided" This reverts commit38e6f1b7fa
. * Revert "meltdown avoided" This reverts commit54cc6656d6
. * Revert "world is now a better place" This reverts commitc019bf9c63
. * remove quasar * add some shiz (#1313) * Update ru_RU.json keeping russian lang actual * ok * Add gradient to lyric-footer * *Commit en español Ñ (#1304) * i hate my life (#1307) * world is now a better place * meltdown avoided * meltdown avoided * stylize new listen now childs * full scale artwork, finally * dynamic width for search categories * hd all album work * Update afterPack.js * force hq quality * oops * attempt to fix * misc cleanup * why what * what was i thinking * fix duplicated text in listen now childs * Paginate/infinite scroll for albums, playlists (#1234) * Infinite scroll, pagination to album, playlists * move pagination below tracks * Make page size configurable * remove renderer * Mitigate songs / album slow app issue. * add ratings, library change to web remote (#1285) * Add compact artist header option (#1308) * Support compact artist header (optional) * Add required term Co-authored-by: h0ckerman <35598335+h0ckerman@users.noreply.github.com> Co-authored-by: vapormusic <vietanhfat@gmail.com> Co-authored-by: Monochromish <chillygamer7@gmail.com> Co-authored-by: Gabriel Davila <56521591+mefsaal@users.noreply.github.com> Co-authored-by: Core <64542347+coredev-uk@users.noreply.github.com> Co-authored-by: Maikiwi <stella@mai.kiwi> Co-authored-by: yazninja <yazlesean@gmail.com> Co-authored-by: booploops <49113086+booploops@users.noreply.github.com> Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Co-authored-by: Pedro Galhardo <pgalhardo@icloud.com> * obama (#1314) * Update ru_RU.json keeping russian lang actual * ok * Add gradient to lyric-footer * *Commit en español Ñ (#1304) * i hate my life (#1307) * world is now a better place * meltdown avoided * meltdown avoided * stylize new listen now childs * full scale artwork, finally * dynamic width for search categories * hd all album work * Update afterPack.js * force hq quality * oops * attempt to fix * misc cleanup * why what * what was i thinking * fix duplicated text in listen now childs * Paginate/infinite scroll for albums, playlists (#1234) * Infinite scroll, pagination to album, playlists * move pagination below tracks * Make page size configurable * remove renderer * Mitigate songs / album slow app issue. * add ratings, library change to web remote (#1285) * Add compact artist header option (#1308) * Support compact artist header (optional) * Add required term * improve pagination styling Co-authored-by: h0ckerman <35598335+h0ckerman@users.noreply.github.com> Co-authored-by: vapormusic <vietanhfat@gmail.com> Co-authored-by: Monochromish <chillygamer7@gmail.com> Co-authored-by: Gabriel Davila <56521591+mefsaal@users.noreply.github.com> Co-authored-by: Core <64542347+coredev-uk@users.noreply.github.com> Co-authored-by: Maikiwi <stella@mai.kiwi> Co-authored-by: yazninja <yazlesean@gmail.com> Co-authored-by: booploops <49113086+booploops@users.noreply.github.com> Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Co-authored-by: Pedro Galhardo <pgalhardo@icloud.com> Co-authored-by: yazninja <71800112+yazninja@users.noreply.github.com> * obama episode 2. (#1317) * Update ru_RU.json keeping russian lang actual * ok * Add gradient to lyric-footer * *Commit en español Ñ (#1304) * i hate my life (#1307) * world is now a better place * meltdown avoided * meltdown avoided * stylize new listen now childs * full scale artwork, finally * dynamic width for search categories * hd all album work * Update afterPack.js * force hq quality * oops * attempt to fix * misc cleanup * why what * what was i thinking * fix duplicated text in listen now childs * Paginate/infinite scroll for albums, playlists (#1234) * Infinite scroll, pagination to album, playlists * move pagination below tracks * Make page size configurable * remove renderer * Mitigate songs / album slow app issue. * add ratings, library change to web remote (#1285) * Add compact artist header option (#1308) * Support compact artist header (optional) * Add required term * improve pagination styling * Disable Fullscreen view when artist/album name is clicked. (#1315) * Disable Fullscreen view when artist/album name is clicked. idk why this change didn't exist * Seperate dash from album name * Replace `$root.showSearch()` with `app.appRoute('search')` `$root.showSearch()` prevents going back to previous page from sidebar. * Fix Anim (#1316) Co-authored-by: h0ckerman <35598335+h0ckerman@users.noreply.github.com> Co-authored-by: vapormusic <vietanhfat@gmail.com> Co-authored-by: Monochromish <chillygamer7@gmail.com> Co-authored-by: Gabriel Davila <56521591+mefsaal@users.noreply.github.com> Co-authored-by: Core <64542347+coredev-uk@users.noreply.github.com> Co-authored-by: Maikiwi <stella@mai.kiwi> Co-authored-by: yazninja <yazlesean@gmail.com> Co-authored-by: booploops <49113086+booploops@users.noreply.github.com> Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Co-authored-by: Pedro Galhardo <pgalhardo@icloud.com> Co-authored-by: Monochromish <79590499+Monochromish@users.noreply.github.com> * re add that i guess. github is fucked. * aa (#1320) * Update ru_RU.json keeping russian lang actual * ok * Add gradient to lyric-footer * *Commit en español Ñ (#1304) * i hate my life (#1307) * world is now a better place * meltdown avoided * meltdown avoided * stylize new listen now childs * full scale artwork, finally * dynamic width for search categories * hd all album work * Update afterPack.js * force hq quality * oops * attempt to fix * misc cleanup * why what * what was i thinking * fix duplicated text in listen now childs * Paginate/infinite scroll for albums, playlists (#1234) * Infinite scroll, pagination to album, playlists * move pagination below tracks * Make page size configurable * remove renderer * Mitigate songs / album slow app issue. * add ratings, library change to web remote (#1285) * Add compact artist header option (#1308) * Support compact artist header (optional) * Add required term * improve pagination styling * Disable Fullscreen view when artist/album name is clicked. (#1315) * Disable Fullscreen view when artist/album name is clicked. idk why this change didn't exist * Seperate dash from album name * Replace `$root.showSearch()` with `app.appRoute('search')` `$root.showSearch()` prevents going back to previous page from sidebar. * Fix Anim (#1316) * make tracks tab active (#1318) * welp that wasn't it. * Thnks (#1319) * Thnks * i need sleep Co-authored-by: h0ckerman <35598335+h0ckerman@users.noreply.github.com> Co-authored-by: vapormusic <vietanhfat@gmail.com> Co-authored-by: Monochromish <chillygamer7@gmail.com> Co-authored-by: Gabriel Davila <56521591+mefsaal@users.noreply.github.com> Co-authored-by: Core <64542347+coredev-uk@users.noreply.github.com> Co-authored-by: Maikiwi <stella@mai.kiwi> Co-authored-by: yazninja <yazlesean@gmail.com> Co-authored-by: booploops <49113086+booploops@users.noreply.github.com> Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Co-authored-by: Pedro Galhardo <pgalhardo@icloud.com> Co-authored-by: Monochromish <79590499+Monochromish@users.noreply.github.com> Co-authored-by: vapormusic <vietanhfat@gmail.com> Co-authored-by: booploops <49113086+booploops@users.noreply.github.com> Co-authored-by: yazninja <yazlesean@gmail.com> Co-authored-by: Pedro Galhardo <pedromgalhardo@tecnico.ulisboa.pt> Co-authored-by: Kendall Garner <17521368+kgarner7@users.noreply.github.com> Co-authored-by: Erwan <24718500+ErwanGit@users.noreply.github.com> Co-authored-by: Monochromish <chillygamer7@gmail.com> Co-authored-by: maikirakiwi <stella@mai.kiwi> Co-authored-by: yazninja <71800112+yazninja@users.noreply.github.com> Co-authored-by: 宥叡 <46503943+jay900604@users.noreply.github.com> Co-authored-by: Nathan Ritchie <48845980+ctaetcsh@users.noreply.github.com> Co-authored-by: Monochromish <79590499+Monochromish@users.noreply.github.com> Co-authored-by: Gabriel Davila <56521591+mefsaal@users.noreply.github.com> Co-authored-by: Core <64542347+coredev-uk@users.noreply.github.com> Co-authored-by: 椎名アヤネ <53814845+sakura0224@users.noreply.github.com> Co-authored-by: Jonathan Fenske <929220+jfenske89@users.noreply.github.com> Co-authored-by: UnbreakCode <unbreakcode@gmail.com> Co-authored-by: SoNothing <git@sonothing.com> Co-authored-by: Core <coredev-uk@users.noreply.github.com> Co-authored-by: Amaru8 <52407090+Amaru8@users.noreply.github.com> Co-authored-by: rlaphoenix <pragma.exe@gmail.com> Co-authored-by: h0ckerman <35598335+h0ckerman@users.noreply.github.com> Co-authored-by: Pedro Galhardo <pgalhardo@icloud.com>
|
@ -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:
|
||||
|
@ -36,6 +30,9 @@ jobs:
|
|||
key: yarn-packages-{{ checksum "cider.lock" }}
|
||||
paths:
|
||||
- ~/.cache/yarn
|
||||
- run:
|
||||
name: Clear Yarn Cache
|
||||
command: yarn cache clean
|
||||
- run:
|
||||
name: TypeScript Compile
|
||||
command: yarn build
|
||||
|
@ -60,9 +57,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 +83,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 +108,6 @@ jobs:
|
|||
sudo dpkg --add-architecture i386
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y wine32
|
||||
# - run:
|
||||
# name: Fix Versioning and Add Channel
|
||||
# command: yarn circle:script
|
||||
- run:
|
||||
name: Generate Builds (Winget)
|
||||
command: yarn electron-builder --win -c winget.json -p never
|
||||
|
@ -156,15 +144,13 @@ jobs:
|
|||
mv ~/Cider/dist/*.blockmap ~/Cider/dist/artifacts
|
||||
- store_artifacts:
|
||||
path: ~/Cider/dist/artifacts
|
||||
# - run:
|
||||
# name: Fix Versioning and Add Channel
|
||||
# command: yarn circle:script
|
||||
- run:
|
||||
name: Update Version Number of App
|
||||
command: sudo chmod +x resources/version.sh && ./resources/version.sh || true
|
||||
- run:
|
||||
name: Publish Release
|
||||
command: |
|
||||
echo "Creating release for Cider v${APP_VERSION} on the ${CIRCLE_BRANCH} branch."
|
||||
gh release create "v${APP_VERSION}" --title "Cider Version ${APP_VERSION} (${CIRCLE_BRANCH})" --generate-notes -R ciderapp/cider-releases ~/Cider/dist/artifacts/*.deb ~/Cider/dist/artifacts/*.AppImage ~/Cider/dist/artifacts/*.snap ~/Cider/dist/artifacts/*.exe ~/Cider/dist/artifacts/*.yml ~/Cider/dist/artifacts/*.blockmap
|
||||
|
||||
# Orchestrate our job run sequence
|
||||
|
|
4
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -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
|
||||
|
|
3
.github/workflows/build-macos.yml
vendored
|
@ -94,6 +94,9 @@ jobs:
|
|||
yarn install
|
||||
cp resources/verror-types node_modules/@types/verror/index.d.ts
|
||||
cp resources/macPackager.js node_modules/app-builder-lib/out/macPackager.js
|
||||
rm -r node_modules/pouchdb-node/node_modules/leveldown
|
||||
rm -r node_modules/pouchdb-adapter-leveldb/node_modules/leveldown
|
||||
rm -r /node_modules/leveldown/node_modules/node-gyp-build || true
|
||||
yarn dist:universalNotWorking -p never
|
||||
# - name: Perform CodeQL Analysis
|
||||
# uses: github/codeql-action/analyze@v1
|
||||
|
|
2
.github/workflows/stale-issues.yml
vendored
|
@ -18,3 +18,5 @@ jobs:
|
|||
days-before-close: 7
|
||||
stale-issue-label: "stale"
|
||||
stale-pr-label: "stale"
|
||||
exempt-all-assignees: true
|
||||
exempt-issue-labels: 'more-info,work-in-progress,accessibility-feature,help-wanted'
|
||||
|
|
3
.gitignore
vendored
|
@ -3,6 +3,7 @@ dist
|
|||
build
|
||||
.flatpak*
|
||||
yarn-cache
|
||||
src/renderer/style.css
|
||||
|
||||
# Misc
|
||||
.idea
|
||||
|
@ -328,3 +329,5 @@ savedconfig/cider-config.json
|
|||
savedconfig/config.json
|
||||
savedconfig/session.json
|
||||
savedconfig/window-state.json
|
||||
src/main/base/sample.json
|
||||
|
||||
|
|
|
@ -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 |
12
README.md
|
@ -10,6 +10,7 @@
|
|||
<a target="_blank" href="https://opencollective.com/ciderapp"><img src="https://img.shields.io/opencollective/all/ciderapp?color=%237FADF2&label=Backers%20and%20Sponsors&logo=opencollective" alt="Open Collective"/></a>
|
||||
<a target="_blank" href="https://github.com/sponsors/ciderapp"><img src="https://img.shields.io/github/sponsors/ciderapp?color=C96198&label=GitHub%20Sponsors&logo=GitHub" alt="GitHub Sponsor"/></a>
|
||||
<br>
|
||||
<a target="_blank" href="https://jq.qq.com/?_wv=1027&k=2VP4cdyo"><img src="https://img.shields.io/badge/QQ-531185058-red" alt="QQ群"/></a>
|
||||
<a target="_blank" href="https://discord.gg/applemusic"><img src="https://img.shields.io/discord/843954443845238864?label=Discord&color=5865F2&logo=discord&logoColor=white&style=flat" alt="Discord"/></a>
|
||||
<a target="_blank" href="https://twitter.com/UseCider"><img src="https://img.shields.io/twitter/follow/UseCider?label=Twitter&color=%231DA1F2&logo=twitter&style=flat" alt="Twitter"/></a>
|
||||
<a target="_blank" href="https://reddit.com/r/applemusicelectron"><img src="https://custom-icon-badges.herokuapp.com/reddit/subreddit-subscribers/applemusicelectron?label=Reddit&color=FF5700&logo=redditnew" alt="Reddit"/></a>
|
||||
|
@ -18,13 +19,14 @@
|
|||
</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)
|
||||
* [**View The Releases**](https://github.com/ciderapp/cider-releases/releases/latest)
|
||||
|
||||
### Install Sources
|
||||
[](https://github.com/ciderapp/cider/releases/latest)
|
||||
[](https://github.com/ciderapp/cider-releases/releases/latest)
|
||||
|
||||
[](https://www.microsoft.com/store/apps/9P21XJ9D9G66)
|
||||
|
||||
|
@ -44,8 +46,8 @@
|
|||
-->
|
||||
[](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
|
||||
[](https://app.circleci.com/insights/github/ciderapp/Cider/workflows/build_and_release/overview?branch=main&reporting-window=last-30-days&insights-snapshot=true)
|
||||
|
||||
### Credits
|
||||

|
||||
|
|
4939
cider.lock
24
package.json
|
@ -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",
|
||||
|
@ -14,7 +14,8 @@
|
|||
"homepage": "https://cider.sh/",
|
||||
"buildResources": "resources",
|
||||
"scripts": {
|
||||
"build": "tsc",
|
||||
"build": "tsc && yarn compile-less",
|
||||
"compile-less": "lessc ./src/renderer/style.less ./src/renderer/style.css",
|
||||
"watch": "tsc --watch",
|
||||
"start": "run-script-os",
|
||||
"start:win32": "yarn build && set ELECTRON_ENABLE_LOGGING=true && electron ./build/index.js --enable-accelerated-mjpeg-decode --enable-accelerated-video --disable-gpu-driver-bug-workarounds --ignore-gpu-blacklist --enable-native-gpu-memory-buffers",
|
||||
|
@ -39,8 +40,10 @@
|
|||
"dependencies": {
|
||||
"@sentry/electron": "^3.0.7",
|
||||
"@sentry/integrations": "^6.19.6",
|
||||
"@types/pouchdb": "^6.4.0",
|
||||
"@types/pouchdb-node": "^6.1.4",
|
||||
"adm-zip": "0.4.10",
|
||||
"airtunes2": "git+https://github.com/ciderapp/node_airtunes2",
|
||||
"airtunes2": "git+https://github.com/ciderapp/node_airtunes2.git",
|
||||
"castv2-client": "^1.2.0",
|
||||
"chokidar": "^3.5.3",
|
||||
"discord-auto-rpc": "^1.0.16",
|
||||
|
@ -57,16 +60,22 @@
|
|||
"jimp": "^0.16.1",
|
||||
"jsonc": "^2.0.0",
|
||||
"lastfmapi": "^0.1.1",
|
||||
"level": "^8.0.0",
|
||||
"leveldown": "^6.1.1",
|
||||
"mdns-js": "git+https://github.com/ciderapp/node-mdns-js.git",
|
||||
"mpris-service": "^2.1.2",
|
||||
"music-metadata": "^7.12.3",
|
||||
"music-metadata": "^7.12.4",
|
||||
"node-gyp": "^9.0.0",
|
||||
"node-ssdp": "^4.0.1",
|
||||
"pouchdb-adapter-leveldb": "^7.3.0",
|
||||
"pouchdb-node": "^7.3.0",
|
||||
"pouchdb-upsert": "^2.2.0",
|
||||
"qrcode": "^1.5.0",
|
||||
"react": "^18.0.0",
|
||||
"react-dom": "^18.0.0",
|
||||
"run-script-os": "^1.1.6",
|
||||
"source-map-support": "^0.5.21",
|
||||
"ts-md5": "^1.2.11",
|
||||
"v8-compile-cache": "^2.3.0",
|
||||
"wallpaper": "5.0.1",
|
||||
"ws": "^8.5.0",
|
||||
|
@ -79,10 +88,11 @@
|
|||
"@types/express": "^4.17.13",
|
||||
"@types/qrcode-terminal": "^0.12.0",
|
||||
"@types/ws": "^8.5.3",
|
||||
"electron": "git+https://github.com/castlabs/electron-releases.git#19-x-y",
|
||||
"electron": "git+https://github.com/castlabs/electron-releases.git#18-x-y",
|
||||
"electron-builder": "^23.0.3",
|
||||
"electron-builder-notarize-pkg": "^1.2.0",
|
||||
"electron-webpack": "^2.8.2",
|
||||
"less": "^4.1.3",
|
||||
"musickit-typescript": "^1.2.4",
|
||||
"typescript": "^4.6.4",
|
||||
"vue-devtools": "^5.1.4",
|
||||
|
@ -111,9 +121,9 @@
|
|||
}
|
||||
],
|
||||
"build": {
|
||||
"electronVersion": "19.0.3",
|
||||
"electronVersion": "19.0.8",
|
||||
"electronDownload": {
|
||||
"version": "19.0.3+wvcus",
|
||||
"version": "20.0.0-beta.11+wvcus",
|
||||
"mirror": "https://github.com/castlabs/electron-releases/releases/download/v"
|
||||
},
|
||||
"appId": "cider",
|
||||
|
|
|
@ -14,7 +14,7 @@ exports.default = function(context) {
|
|||
// console.log('Castlabs-evs update complete')
|
||||
|
||||
// xcode 13
|
||||
if (fs.existsSync('dist/mac-universal--x64') && fs.existsSync('dist/mac-universal--arm64'))
|
||||
if (fs.existsSync('dist/mac-universal--x64') && fs.existsSync('dist/mac-universal--arm64') && fs.existsSync('dist/mac-universal--x64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib'))
|
||||
execSync("cp 'dist/mac-universal--x64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib' 'dist/mac-universal--arm64/Cider.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Resources/MainMenu.nib/keyedobjects-101300.nib'",{stdio: 'inherit'})
|
||||
|
||||
// console.log('VMP signing start')
|
||||
|
@ -24,9 +24,7 @@ exports.default = function(context) {
|
|||
// execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac',{stdio: 'inherit'})
|
||||
// if (fs.existsSync('dist/mac-arm64'))
|
||||
// execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac-arm64 -z',{stdio: 'inherit'})
|
||||
// if (fs.existsSync('dist/mac-x64'))
|
||||
// execSync('python3 -m castlabs_evs.vmp -n sign-pkg dist/mac-x64',{stdio: 'inherit'})
|
||||
|
||||
|
||||
// console.log('VMP signing complete')
|
||||
|
||||
}
|
||||
}
|
||||
|
|
93
resources/icons/icon.svg
Normal file
|
@ -0,0 +1,93 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="svg316"
|
||||
width="1000"
|
||||
height="1000"
|
||||
viewBox="0 0 1000 1000"
|
||||
sodipodi:docname="atreus.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs320">
|
||||
<inkscape:path-effect
|
||||
effect="bspline"
|
||||
id="path-effect21501"
|
||||
is_visible="true"
|
||||
lpeversion="1"
|
||||
weight="33.333333"
|
||||
steps="2"
|
||||
helper_size="0"
|
||||
apply_no_weight="true"
|
||||
apply_with_weight="true"
|
||||
only_selected="false" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect21497"
|
||||
is_visible="true"
|
||||
lpeversion="1" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect21277"
|
||||
is_visible="true"
|
||||
lpeversion="1" />
|
||||
<inkscape:path-effect
|
||||
effect="spiro"
|
||||
id="path-effect21273"
|
||||
is_visible="true"
|
||||
lpeversion="1" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="namedview318"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="true"
|
||||
inkscape:zoom="1"
|
||||
inkscape:cx="471.5"
|
||||
inkscape:cy="396.5"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1044"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g322" />
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g322">
|
||||
<path
|
||||
style="display:inline;opacity:1;fill:#ff2654;fill-opacity:1;fill-rule:nonzero;stroke-width:0.7;stroke-dasharray:none"
|
||||
d="M 43.442873,500 C 44.729355,381.57807 94.612705,264.40544 179.08104,181.39635 263.54937,98.387264 381.57364,50.553165 500,51.331533 617.43261,52.10337 733.85918,100.6317 817.07592,183.49296 900.29266,266.35423 949.31889,382.57178 950.59458,500 951.88811,619.07066 904.01174,737.93437 820.54876,822.86626 737.08578,907.79814 619.07511,957.74081 500,958.52344 379.93115,959.3126 260.30587,910.07147 175.5853,824.98577 90.86473,739.90007 42.138548,620.06436 43.442873,500 Z"
|
||||
id="path21271"
|
||||
inkscape:path-effect="#path-effect21273"
|
||||
inkscape:original-d="M 43.442873,500 C -108.74384,347.15785 347.81529,200.88869 500,51.331533 652.18471,-98.225623 800.39739,350.44484 950.59458,500 1100.7918,649.55516 650.19919,805.68329 500,958.52344 349.80081,1111.3636 195.62958,652.84215 43.442873,500 Z" />
|
||||
<path
|
||||
style="display:inline;opacity:1;fill:#161616;fill-opacity:1;fill-rule:nonzero;stroke-width:7;stroke-dasharray:none"
|
||||
d="M 810.53125,500 C 809.3521,419.22061 775.44998,339.38827 718.14176,282.4456 660.83353,225.50293 580.78531,192.11226 500,191.45312 418.36315,190.78703 336.94829,223.58389 278.56844,280.65237 220.18858,337.72085 185.55094,418.36913 184.35937,500 183.14556,583.1542 216.70905,666.27439 275.32351,725.26964 333.93798,784.2649 416.83971,818.36602 500,817.6875 582.30875,817.01593 663.82438,782.31258 721.36031,723.45004 778.89624,664.5875 811.73263,582.30273 810.53125,500 Z"
|
||||
id="path21495"
|
||||
inkscape:path-effect="#path-effect21497"
|
||||
inkscape:original-d="M 810.53125,500 C 914.04066,394.10317 603.51142,294.30308 500,191.45312 396.48858,88.603166 289.57392,397.15204 184.35937,500 79.144833,602.84796 394.78746,711.79267 500,817.6875 605.21254,923.58233 707.02183,605.89683 810.53125,500 Z" />
|
||||
<path
|
||||
style="display:inline;opacity:1;fill:#ff2654;fill-opacity:1;fill-rule:nonzero;stroke-width:7;stroke-dasharray:none"
|
||||
d="M 759.34429,500 C 758.19835,432.60151 729.83099,366.05221 681.99531,318.55888 634.15963,271.06554 567.40514,243.17636 500,242.53125 431.75952,241.87814 363.66577,269.1855 314.77936,316.80177 265.89296,364.41804 236.80347,431.76626 235.64333,500 234.45795,569.71803 262.50003,639.47618 311.6155,688.97042 360.73098,738.46466 430.27509,767.04231 500,766.375 568.88957,765.71568 637.07217,736.5466 685.12903,687.18319 733.18589,637.81977 760.51546,568.88277 759.34429,500 Z"
|
||||
id="path21275"
|
||||
inkscape:path-effect="#path-effect21277"
|
||||
inkscape:original-d="M 759.34429,500 C 845.79139,411.20733 586.4491,328.35517 500,242.53125 413.5509,156.70733 323.76322,414.17808 235.64333,500 147.52345,585.82192 411.88211,677.58433 500,766.375 588.11789,855.16566 672.8972,588.79267 759.34429,500 Z" />
|
||||
<path
|
||||
style="display:inline;opacity:1;fill:#161616;fill-opacity:1;fill-rule:nonzero;stroke-width:7;stroke-dasharray:none"
|
||||
d="m 425.88442,448.01182 c -0.0883,28.34345 0.0296,84.32273 0.31267,112.73951 0.2831,28.41677 0.73019,29.26962 1.17791,30.12367 0,0 1.625,2.25 1.625,2.25 0,0 2.0625,1 2.0625,1 0,0 6.1875,0.625 6.1875,0.625 48.08333,-27.91667 96.16698,-55.83352 120.646,-70.22927 24.47902,-14.39575 25.354,-15.27073 25.9164,-16.08294 0.56241,-0.81221 0.8124,-1.56219 0.91669,-2.43698 0.10429,-0.87479 0.0626,-1.87477 -0.16633,-2.89553 -0.22895,-1.02076 -0.64561,-2.0624 -1.16617,-2.87503 -0.52057,-0.81263 -1.14556,-1.39595 -1.66634,-1.83354 -0.52079,-0.43759 -0.93744,-0.72924 -24.80769,-14.62209 -23.87026,-13.89285 -71.19225,-41.38567 -95.50189,-55.36818 -24.30965,-13.98252 -25.60599,-14.45391 -26.90262,-14.51314 -1.29664,-0.0592 -2.59298,0.29431 -3.74228,0.82467 -1.1493,0.53036 -2.15101,1.23745 -2.82884,1.85636 -0.67782,0.61891 -1.03137,1.14923 -1.35549,1.76809 -0.32412,0.61886 -0.61874,1.32595 -0.70702,29.6694 z"
|
||||
id="path21499"
|
||||
inkscape:path-effect="#path-effect21501"
|
||||
inkscape:original-d="m 425.67828,420.37498 c 0.11885,55.98029 0.2367,111.95957 0.35355,167.93786 0.44873,0.85507 1.34317,2.56216 1.34317,2.56216 0,0 1.625,2.25 1.625,2.25 0,0 2.0625,1 2.0625,1 0,0 6.1875,0.625 6.1875,0.625 0,0 96.16767,-55.83233 144.25,-83.75 0.87602,-0.87402 1.751,-1.749 2.625,-2.625 0.251,-0.74902 0.501,-1.499 0.75,-2.25 -0.0407,-0.99902 -0.0823,-1.999 -0.125,-3 -0.41568,-1.04069 -0.83233,-2.08233 -1.25,-3.125 -0.62401,-0.58235 -1.249,-1.16567 -1.875,-1.75 -0.41568,-0.29067 -0.83233,-0.58233 -1.25,-0.875 -47.32288,-27.49292 -94.64487,-54.98573 -141.9688,-82.4801 -1.29539,-0.47041 -2.59172,-0.94181 -3.88908,-1.41421 -1.29539,0.35456 -2.59173,0.70811 -3.88909,1.06066 -1.00076,0.70812 -2.00247,1.41521 -3.00521,2.12132 -0.35256,0.53134 -0.7061,1.06166 -1.06066,1.59099 -0.29363,0.70812 -0.58825,1.41521 -0.88388,2.12132 z" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 6.5 KiB |
|
@ -3,13 +3,17 @@
|
|||
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")
|
||||
NEW_VERSION=${CURRENT_VERSION/0/$COMMITSINCESTABLE}
|
||||
if [[ $COMMITSINCESTABLE -gt 0 ]]
|
||||
then
|
||||
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 0"
|
||||
echo "Version unchanged, commits since stable is ${COMMITSINCESTABLE}"
|
||||
fi
|
||||
|
||||
echo "export APP_VERSION=$(node -p -e 'require("./package.json").version')" >> $BASH_ENV
|
||||
echo "export APP_VERSION=$(node -p -e 'require("./package.json").version')" >>$BASH_ENV
|
||||
|
|
|
@ -423,10 +423,10 @@ Update 24/05/2022 20:30 UTC
|
|||
|
||||
Update 24/05/2022 21:15 UTC
|
||||
|
||||
* `settings.option.general.updateCider`: Deleted for all language files
|
||||
* `settings.option.general.updateCider.branch`: Deleted for all language files
|
||||
* `settings.option.general.updateCider`: Deleted for all language files
|
||||
* `settings.option.general.updateCider.branch`: Deleted for all language files
|
||||
* `settings.option.general.updateCider.branch.description`: Deleted for all language files
|
||||
* `settings.option.general.updateCider.branch.main`: Deleted for all language files
|
||||
* `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
|
||||
|
||||
|
@ -442,4 +442,86 @@ Update 30/5/2022 05:35 UTC
|
|||
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`
|
||||
* `settings.option.connectivity.discordRPC.reconnectedToUser`: Added to `en_US`
|
||||
|
||||
Update 04/06/2022 03:00 UTC
|
||||
|
||||
* `term.cast`: Added to `en_US`
|
||||
* `term.playpause`: Added to `en_US`
|
||||
* `term.reload`: Added to `en_US`
|
||||
* `term.toggleprivate`: Added to `en_US`
|
||||
* `term.webremote`: Added to `en_US`
|
||||
* `term.cast2`: Added to `en_US`
|
||||
* `term.quit`: Added to `en_US`
|
||||
* `menubar.options.zoom`: Added to `en_US`
|
||||
* `term.zoomin`: Added to `en_US`
|
||||
* `term.zoomout`: Added to `en_US`
|
||||
* `term.zoomreset`: Added to `en_US`
|
||||
* `term.fullscreen`: Added to `en_US`
|
||||
* `settings.option.general.keybindings.library`: Added to `en_US`
|
||||
* `settings.option.general.keybindings.session`: Added to `en_US`
|
||||
* `settings.option.general.keybindings.control`: Added to `en_US`
|
||||
* `settings.option.general.keybindings.interface`: Added to `en_US`
|
||||
* `settings.option.general.keybindings.advanced`: Added to `en_US`
|
||||
|
||||
* `action.tray.quit`: Deleted for all language files
|
||||
* `action.tray.playpause`: Deleted for all language files
|
||||
* `action.tray.next`: Deleted for all language files
|
||||
* `action.tray.previous`: Deleted for all language files
|
||||
* `menubar.options.about`: Deleted for all language files
|
||||
* `menubar.options.settings`: Deleted for all language files
|
||||
* `menubar.options.quit`: Deleted for all language files
|
||||
* `menubar.options.toggleprivate`: Deleted for all language files
|
||||
* `menubar.options.webremote`: Deleted for all language files
|
||||
* `menubar.options.audio`: Deleted for all language files
|
||||
* `menubar.options.next`: Deleted for all language files
|
||||
* `menubar.options.previous`: Deleted for all language files
|
||||
* `menubar.options.browse`: Deleted for all language files
|
||||
* `menubar.options.artists`: Deleted for all language files
|
||||
* `menubar.options.search`: Deleted for all language files
|
||||
* `menubar.options.albums`: Deleted for all language files
|
||||
* `menubar.options.cast`: Deleted for all language files
|
||||
* `menubar.options.accountsettings`: Deleted for all language files
|
||||
* `menubar.options.discord`: Deleted for all language files
|
||||
* `menubar.options.github`: Deleted for all language files,
|
||||
* `menubar.options.listennow`: Deleted for all language files
|
||||
* `menubar.options.recentlyAdded`: Deleted for all language files
|
||||
* `menubar.options.songs`: Deleted for all language files
|
||||
* `settings.option.general.keybindings.open`: Deleted for all language files
|
||||
* `menubar.options.playpause`: Deleted for all language files
|
||||
Update 10/06/2022 20:00 UTC
|
||||
|
||||
* `settings.option.visual.purplePodcastPlaybackBar`: Added to `en_US`
|
||||
|
||||
Update 14/06/2022 14:10 UTC
|
||||
|
||||
* `term.themeManaged`: Added to `en_US`
|
||||
|
||||
Update 15/06/2022 20:00 UTC
|
||||
|
||||
* `settings.notyf.connectivity.lastfmScrobble.connectError`: Added to `en_US`
|
||||
* `settings.notyf.connectivity.lastfmScrobble.connectSuccess`: Added to `en_US`
|
||||
* `settings.notyf.connectivity.lastfmScrobble.connecting`: Added to `en_US`
|
||||
|
||||
Update 19/06/2022 12:00 UTC
|
||||
|
||||
* `settings.option.connectivity.lastfmScrobble.filterLoop.description`: Added to `en_US`
|
||||
|
||||
Update 21/06/2022 20:39 UTC
|
||||
|
||||
* `term.showSearch`: Added to `en_US`
|
||||
* `term.hideSearch`: Added to `en_US`
|
||||
|
||||
Update 23/06/2022 04:00 UTC
|
||||
|
||||
* `settings.option.connectivity.lastfmScrobble.filterTypes`: Added to `en_US`
|
||||
|
||||
|
||||
Update 03/07/2022 20:00 UTC
|
||||
|
||||
* `term.plugins`: Added to `en_US`
|
||||
* `settings.header.visual.styles`: Added to `en_US`
|
||||
|
||||
Update 25/07/2022 00:22 UTC
|
||||
|
||||
* `settings.option.visual.compactArtistHeader`: Added to `en_US`
|
||||
|
|
|
@ -386,5 +386,18 @@
|
|||
"term.track": {
|
||||
"one": "Titel",
|
||||
"other": "Titel"
|
||||
}
|
||||
},
|
||||
"settings.option.visual.customAccentColor": "Benutzerdefinierte Akzentfarbe",
|
||||
"settings.option.visual.accentColor": "Akzentfarbe",
|
||||
"settings.option.visual.purplePodcastPlaybackBar": "Lila Wiedergabeleiste für Podcasts",
|
||||
"settings.option.visual.windowColor": "Fenstertönung Farbe",
|
||||
"action.cut": "Ausschneiden",
|
||||
"action.paste": "Einfügen",
|
||||
"action.selectAll": "Alles auswählen",
|
||||
"action.delete": "Löschen",
|
||||
"home.syncFavorites": "Sync Favoriten",
|
||||
"term.quit" : "Beenden",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "Verhindert, dass geloopte Titel gescrobbelt oder in der (Hört Gerade)-Liste auf Last.fm angezeigt werden",
|
||||
"settings.option.connectivity.lastfmScrobble.filterTypes": "Medientypen filtern (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.manualToken": "Last.fm-Token manuell eingeben"
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
"term.logout": "Wogout",
|
||||
"term.login": "Wog In",
|
||||
"term.quickNav": "Quick Nyav",
|
||||
"term.cast": "Cast",
|
||||
"term.about": "About",
|
||||
"term.privateSession": "Pwivate Session",
|
||||
"term.disablePrivateSession": "Disabwe Pwivate Session",
|
||||
|
@ -42,6 +41,7 @@
|
|||
"term.artists": "Awtists",
|
||||
"term.podcasts": "Podcasts",
|
||||
"term.playlists": "Pwaywists",
|
||||
"term.charts": "Chawts",
|
||||
"term.playlist": "Pwaywist",
|
||||
"term.newPlaylist": "Nyew Pwaywist",
|
||||
"term.newPlaylistFolder": "Nyew Pwaywist Fowdew",
|
||||
|
@ -51,6 +51,7 @@
|
|||
"term.navigateBack": "Nyavigate back",
|
||||
"term.navigateForward": "Nyavigate fowwawd",
|
||||
"term.play": "Pway",
|
||||
"term.playpause": "Pway/Pause",
|
||||
"term.pause": "Pause",
|
||||
"term.stop": "Stop",
|
||||
"term.previous": "Pwevious",
|
||||
|
@ -135,7 +136,7 @@
|
|||
"term.amLive": "Appwe Music Wive",
|
||||
"term.language": "Wanguage",
|
||||
"term.funLanguages": "Fun",
|
||||
"term.noLyrics": "Woading... / Wywics nyot found./ Instwumentaw.",
|
||||
"term.noLyrics": ">w< Sowwy Wowwy.. N-Nyo Wywics Avaiwabwe",
|
||||
"term.copyright": "Copywight",
|
||||
"term.rightsReserved": "Aww Wights Wesewved.",
|
||||
"term.sponsor": "Sponsow this pwoject",
|
||||
|
@ -153,6 +154,7 @@
|
|||
},
|
||||
"term.videos": "Videos",
|
||||
"term.menu": "Menyu",
|
||||
"term.themeManaged": "Manyaged by a theme",
|
||||
"term.check": "Check",
|
||||
"term.aboutArtist": "About {{artistName}}",
|
||||
"term.topResult": "Top Wesuwt",
|
||||
|
@ -192,6 +194,16 @@
|
|||
"term.confirmLogout": "Awe you suwe you want to wogout?",
|
||||
"term.creditDesignedBy": "Designyed by ${authorUsername}",
|
||||
"term.discNumber": "Disc ${discNumber}",
|
||||
"term.reload": "Wewoad Cidew ?",
|
||||
"term.toggleprivate": "Toggwe Pwivate Session",
|
||||
"term.webremote": "Web Wemote",
|
||||
"term.cast": "Cast",
|
||||
"term.cast2": "Cast to Devices",
|
||||
"term.quit": "Quit",
|
||||
"term.zoomin": "Zoom In",
|
||||
"term.zoomout": "Zoom Out",
|
||||
"term.zoomreset": "Weset Zoom",
|
||||
"term.fullscreen": "Fuwwscween",
|
||||
"home.title": "Home",
|
||||
"home.recentlyPlayed": "Wecentwy Pwayed",
|
||||
"home.recentlyAdded": "Wecentwy Added",
|
||||
|
@ -264,11 +276,7 @@
|
|||
"action.export": "Expowt",
|
||||
"action.showAlbum": "Show Compwete Awbum",
|
||||
"action.tray.minimize": "Minyimize to Tway",
|
||||
"action.tray.quit": "Quit",
|
||||
"action.tray.show": "Show Cidew",
|
||||
"action.tray.playpause": "Pway/Pause",
|
||||
"action.tray.next": "Nyext",
|
||||
"action.tray.previous": "Pwevious",
|
||||
"action.tray.listento": "Wisten To:",
|
||||
"action.update": "Update",
|
||||
"action.install": "Instaww",
|
||||
|
@ -288,45 +296,26 @@
|
|||
"action.createNew": "Cweate Nyew...",
|
||||
"action.openArtworkInBrowser": "Open awtwowk in bwowsew",
|
||||
"action.scrollToTop": "Scwoww to top",
|
||||
"menubar.options.about": "About",
|
||||
"menubar.options.settings": "Settings",
|
||||
"menubar.options.quit": "Quit Cidew",
|
||||
"menubar.options.view": "View ",
|
||||
"menubar.options.view": "View",
|
||||
"menubar.options.reload": "Wewoad",
|
||||
"menubar.options.forcereload": "Fowce Wewoad",
|
||||
"menubar.options.toggledevtools": "Toggwe Devewopew Toows",
|
||||
"menubar.options.window": "Window",
|
||||
"menubar.options.minimize": "Minyimize",
|
||||
"menubar.options.toggleprivate": "Toggwe Pwivate Session",
|
||||
"menubar.options.webremote": "Web Wemote",
|
||||
"menubar.options.audio": "Audio Settings",
|
||||
"menubar.options.plugins": "Pwu-gins Menyu",
|
||||
"menubar.options.controls": "Contwows",
|
||||
"menubar.options.next": "Nyext",
|
||||
"menubar.options.playpause": "Pway/Pause",
|
||||
"menubar.options.previous": "Pwevious",
|
||||
"menubar.options.volumeup": "Vowume Up",
|
||||
"menubar.options.volumedown": "Vowume Down",
|
||||
"menubar.options.browse": "Bwowse",
|
||||
"menubar.options.artists": "Awtists",
|
||||
"menubar.options.search": "Seawch",
|
||||
"menubar.options.albums": "Awbums",
|
||||
"menubar.options.cast": "Cast To Devices",
|
||||
"menubar.options.account": "Account",
|
||||
"menubar.options.accountsettings": "Account Settings",
|
||||
"menubar.options.signout": "Sign Out",
|
||||
"menubar.options.support": "Suppowt",
|
||||
"menubar.options.discord": "Discowd",
|
||||
"menubar.options.github": "GitHub Wiki",
|
||||
"menubar.options.report": "Wepowt a...",
|
||||
"menubar.options.bug": "Bug",
|
||||
"menubar.options.feature": "Featuwe Wequest",
|
||||
"menubar.options.trans": "Twanswation Wepowt/Wequest",
|
||||
"menubar.options.license": "View Wicense",
|
||||
"menubar.options.conf": "Open Configuwation Fiwe in Editow",
|
||||
"menubar.options.listennow": "Wisten Nyow",
|
||||
"menubar.options.recentlyAdded": "Wecentwy Added",
|
||||
"menubar.options.songs": "Songs",
|
||||
"menubar.options.zoom": "Zoom",
|
||||
"settings.header.general": "Genyewaw",
|
||||
"settings.header.general.description": "Adjust the genyewaw settings fow Cidew.",
|
||||
"settings.option.general.language": "Wanguage",
|
||||
|
@ -346,11 +335,15 @@
|
|||
"settings.option.general.customizeSidebar": "Customize Sidebaw Items",
|
||||
"settings.option.general.customizeSidebar.customize": "Customize",
|
||||
"settings.option.general.keybindings": "Keybindings",
|
||||
"settings.option.general.keybindings.library": "Wibwawy",
|
||||
"settings.option.general.keybindings.session": "Session",
|
||||
"settings.option.general.keybindings.control": "Contwows",
|
||||
"settings.option.general.keybindings.interface": "Intewface",
|
||||
"settings.option.general.keybindings.advanced": "Advanced",
|
||||
"settings.option.general.keybindings.pressCombination": "Pwess a combinyation of two keys to update keybind.",
|
||||
"settings.option.general.keybindings.pressEscape": "Pwess Escape key to go back.",
|
||||
"settings.notyf.general.keybindings.update.success": "Keybind updated successfuwwy",
|
||||
"settings.prompt.general.keybindings.update.success": "Keybind updated successfuwwy. Pwess OK to wewaunch Cidew",
|
||||
"settings.option.general.keybindings.open": "Open",
|
||||
"settings.option.general.themeUpdateNotification": "Automaticawwy check fow theme updates",
|
||||
"settings.option.general.showLovedTracksInline": "Show wuvd twacks inwinye",
|
||||
"settings.description.search": "Seawch",
|
||||
|
|
|
@ -103,7 +103,7 @@
|
|||
"term.recentStations": "recent pisses",
|
||||
"term.language": "piss around the world",
|
||||
"term.funLanguages": "piss languages",
|
||||
"term.noLyrics": "piss…",
|
||||
"term.noLyrics": "out of piss...",
|
||||
"term.copyright": "copypiss",
|
||||
"term.rightsReserved": "all piss reserved.",
|
||||
"term.sponsor": "piss on Cider",
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
"term.logout": "Logout",
|
||||
"term.login": "Log In",
|
||||
"term.quickNav": "Quick Nav",
|
||||
"term.cast": "Cast",
|
||||
"term.about": "About",
|
||||
"term.privateSession": "Private Session",
|
||||
"term.disablePrivateSession": "Disable Private Session",
|
||||
|
@ -32,6 +31,12 @@
|
|||
"term.miniplayer": "MiniPlayer",
|
||||
"term.history": "History",
|
||||
"term.search": "Search",
|
||||
"term.scroll": "Scroll Mode",
|
||||
"term.scroll.infinite": "Infinite",
|
||||
"term.scroll.paged": "${songsPerPage} per page",
|
||||
"term.live": "LIVE",
|
||||
"term.showSearch": "Show search bar",
|
||||
"term.hideSearch": "Hide search bar",
|
||||
"term.library": "Library",
|
||||
"term.listenNow": "Listen Now",
|
||||
"term.browse": "Browse",
|
||||
|
@ -52,6 +57,7 @@
|
|||
"term.navigateBack": "Navigate back",
|
||||
"term.navigateForward": "Navigate forward",
|
||||
"term.play": "Play",
|
||||
"term.playpause": "Play/Pause",
|
||||
"term.pause": "Pause",
|
||||
"term.stop": "Stop",
|
||||
"term.previous": "Previous",
|
||||
|
@ -136,7 +142,7 @@
|
|||
"term.amLive": "Apple Music Live",
|
||||
"term.language": "Language",
|
||||
"term.funLanguages": "Fun",
|
||||
"term.noLyrics": "Loading... / Lyrics not found./ Instrumental.",
|
||||
"term.noLyrics": "Instrumental Track / No Lyrics.",
|
||||
"term.copyright": "Copyright",
|
||||
"term.rightsReserved": "All Rights Reserved.",
|
||||
"term.sponsor": "Sponsor this project",
|
||||
|
@ -154,6 +160,7 @@
|
|||
},
|
||||
"term.videos": "Videos",
|
||||
"term.menu": "Menu",
|
||||
"term.themeManaged": "Managed by a theme",
|
||||
"term.check": "Check",
|
||||
"term.aboutArtist": "About {{artistName}}",
|
||||
"term.topResult": "Top Result",
|
||||
|
@ -177,8 +184,9 @@
|
|||
"term.top": "Top",
|
||||
"term.version": "Version",
|
||||
"term.noVideos": "No videos found.",
|
||||
"term.plugin": "Plug-in",
|
||||
"term.pluginMenu": "Plug-in Menu",
|
||||
"term.plugins": "Plugins",
|
||||
"term.plugin": "Plugin",
|
||||
"term.pluginMenu": "Plugins Menu",
|
||||
"term.pluginMenu.none": "No interactive plugins",
|
||||
"term.replay": "Replay",
|
||||
"term.uniqueAlbums": "Unique Albums",
|
||||
|
@ -193,6 +201,22 @@
|
|||
"term.confirmLogout": "Are you sure you want to logout?",
|
||||
"term.creditDesignedBy": "Designed by ${authorUsername}",
|
||||
"term.discNumber": "Disc ${discNumber}",
|
||||
"term.reload" : "Reload Cider?",
|
||||
"term.toggleprivate" : "Toggle Private Session",
|
||||
"term.webremote" : "Web Remote",
|
||||
"term.cast" : "Cast",
|
||||
"term.cast2" : "Cast to Devices",
|
||||
"term.quit" : "Quit",
|
||||
"term.zoomin" : "Zoom In",
|
||||
"term.zoomout" : "Zoom Out",
|
||||
"term.zoomreset" : "Reset Zoom",
|
||||
"term.fullscreen" : "Fullscreen",
|
||||
"term.nowPlaying": "Now Playing",
|
||||
"home.syncFavorites": "Sync Favorites",
|
||||
"home.syncFavorites.gettingArtists": "Getting Favorited Artists...",
|
||||
"action.favorite": "Favorite",
|
||||
"action.removeFavorite": "Remove Favorite",
|
||||
"action.refresh": "Refresh",
|
||||
"home.title": "Home",
|
||||
"home.recentlyPlayed": "Recently Played",
|
||||
"home.recentlyAdded": "Recently Added",
|
||||
|
@ -213,8 +237,6 @@
|
|||
"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",
|
||||
|
@ -223,6 +245,7 @@
|
|||
"action.delete": "Delete",
|
||||
"action.edit": "Edit",
|
||||
"action.done": "Done",
|
||||
"action.submit": "Submit",
|
||||
"action.editTracklist": "Edit Tracklist",
|
||||
"action.addToLibrary": "Add to Library",
|
||||
"action.addToLibrary.success": "Added to Library",
|
||||
|
@ -267,11 +290,7 @@
|
|||
"action.export": "Export",
|
||||
"action.showAlbum": "Show Complete Album",
|
||||
"action.tray.minimize": "Minimize to Tray",
|
||||
"action.tray.quit": "Quit",
|
||||
"action.tray.show": "Show Cider",
|
||||
"action.tray.playpause": "Play/Pause",
|
||||
"action.tray.next": "Next",
|
||||
"action.tray.previous": "Previous",
|
||||
"action.tray.listento": "Listen To:",
|
||||
"action.update": "Update",
|
||||
"action.install": "Install",
|
||||
|
@ -291,45 +310,26 @@
|
|||
"action.createNew": "Create New...",
|
||||
"action.openArtworkInBrowser": "Open artwork in browser",
|
||||
"action.scrollToTop": "Scroll to top",
|
||||
"menubar.options.about": "About",
|
||||
"menubar.options.settings": "Settings",
|
||||
"menubar.options.quit": "Quit Cider",
|
||||
"menubar.options.view": "View ",
|
||||
"menubar.options.view": "View",
|
||||
"menubar.options.reload": "Reload",
|
||||
"menubar.options.forcereload": "Force Reload",
|
||||
"menubar.options.toggledevtools": "Toggle Developer Tools",
|
||||
"menubar.options.window": "Window",
|
||||
"menubar.options.minimize": "Minimize",
|
||||
"menubar.options.toggleprivate": "Toggle Private Session",
|
||||
"menubar.options.webremote": "Web Remote",
|
||||
"menubar.options.audio": "Audio Settings",
|
||||
"menubar.options.plugins": "Plu-gins Menu",
|
||||
"menubar.options.controls": "Controls",
|
||||
"menubar.options.next": "Next",
|
||||
"menubar.options.playpause": "Play/Pause",
|
||||
"menubar.options.previous": "Previous",
|
||||
"menubar.options.volumeup": "Volume Up",
|
||||
"menubar.options.volumedown": "Volume Down",
|
||||
"menubar.options.browse": "Browse",
|
||||
"menubar.options.artists": "Artists",
|
||||
"menubar.options.search": "Search",
|
||||
"menubar.options.albums": "Albums",
|
||||
"menubar.options.cast": "Cast To Devices",
|
||||
"menubar.options.account": "Account",
|
||||
"menubar.options.accountsettings": "Account Settings",
|
||||
"menubar.options.signout": "Sign Out",
|
||||
"menubar.options.support": "Support",
|
||||
"menubar.options.discord": "Discord",
|
||||
"menubar.options.github": "GitHub Wiki",
|
||||
"menubar.options.report": "Report a...",
|
||||
"menubar.options.bug": "Bug",
|
||||
"menubar.options.feature": "Feature Request",
|
||||
"menubar.options.trans": "Translation Report/Request",
|
||||
"menubar.options.license": "View License",
|
||||
"menubar.options.conf": "Open Configuration File in Editor",
|
||||
"menubar.options.listennow": "Listen Now",
|
||||
"menubar.options.recentlyAdded": "Recently Added",
|
||||
"menubar.options.songs": "Songs",
|
||||
"menubar.options.zoom": "Zoom",
|
||||
"settings.header.general": "General",
|
||||
"settings.header.general.description": "Adjust the general settings for Cider.",
|
||||
"settings.option.general.language": "Language",
|
||||
|
@ -349,13 +349,19 @@
|
|||
"settings.option.general.customizeSidebar": "Customize Sidebar Items",
|
||||
"settings.option.general.customizeSidebar.customize": "Customize",
|
||||
"settings.option.general.keybindings": "Keybindings",
|
||||
"settings.option.general.keybindings.library": "Library",
|
||||
"settings.option.general.keybindings.session": "Session",
|
||||
"settings.option.general.keybindings.control": "Controls",
|
||||
"settings.option.general.keybindings.interface": "Interface",
|
||||
"settings.option.general.keybindings.advanced": "Advanced",
|
||||
"settings.option.general.keybindings.pressCombination": "Press a combination of two keys to update keybind.",
|
||||
"settings.option.general.keybindings.pressEscape": "Press Escape key to go back.",
|
||||
"settings.notyf.general.keybindings.update.success": "Keybind updated successfully",
|
||||
"settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider",
|
||||
"settings.option.general.keybindings.open": "Open",
|
||||
"settings.option.general.themeUpdateNotification": "Automatically check for theme updates",
|
||||
"settings.option.general.showLovedTracksInline": "Show loved tracks inline",
|
||||
"settings.option.general.pagination": "Items to show per page",
|
||||
"settings.options.general.pagination.description": "This determines how many songs/albums to show initially for infinite scrolling, or how many songs/albums to show for a single page",
|
||||
"settings.description.search": "Search",
|
||||
"settings.description.albums": "Library Albums",
|
||||
"settings.description.artists": "Library Artists",
|
||||
|
@ -416,9 +422,9 @@
|
|||
"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.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.",
|
||||
|
@ -452,14 +458,10 @@
|
|||
"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.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",
|
||||
|
@ -485,6 +487,7 @@
|
|||
"settings.prompt.visual.theme.github.URL": "Enter the URL of the theme you want to install",
|
||||
"settings.prompt.visual.theme.uninstallTheme": "Are you sure you want to uninstall {{ theme }}?",
|
||||
"settings.option.visual.theme.checkForUpdates": "Check for updates",
|
||||
"settings.header.visual.styles": "Styles",
|
||||
"settings.option.visual.theme.manageStyles": "Manage Styles",
|
||||
"settings.option.visual.theme.uninstall": "Uninstall",
|
||||
"settings.option.visual.theme.viewInfo": "View Info",
|
||||
|
@ -536,6 +539,12 @@
|
|||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "Prevent looped tracks from being scrobbled or displayed in the Now Playing list on Last.fm.",
|
||||
"settings.option.connectivity.lastfmScrobble.filterTypes": "Filter Media Types (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.manualToken": "Enter Last.fm Token Manually",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.fm Connection Timed Out",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.fm Connection Successful",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connecting": "Connecting to Last.fm...",
|
||||
"settings.header.debug": "Debug",
|
||||
"settings.option.debug.copy_log": "Copy logs to clipboard",
|
||||
"settings.option.debug.openAppData": "Open Cider Folder",
|
||||
|
@ -547,11 +556,18 @@
|
|||
"settings.option.experimental.unknownPlugin.description": "Allow installation of plugins from repos other than the Cider Plugin Repository",
|
||||
"settings.option.experimental.compactUI": "Compact UI",
|
||||
"settings.option.window.close_button_hide": "Close Button Should Hide the Application",
|
||||
"settings.option.window.maxElementScale": "Maximum Element Scale",
|
||||
"settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
|
||||
"settings.option.advanced.playlistTrackMapping": "Playlist Track Mapping",
|
||||
"settings.option.advanced.playlistTrackMapping.description": "Enables deep scanning of playlists to determine which tracks are in which playlists. Playlist cache build times can increase significantly.",
|
||||
"settings.option.visual.transparent": "Transparent frame",
|
||||
"settings.option.visual.transparent.description": "needs Theme Support, requires relaunch",
|
||||
"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.compactArtistHeader": "Compact Artist Header",
|
||||
"settings.option.visual.windowColor": "Window Tint Color",
|
||||
"settings.header.visual.windowBackgroundStyle.color": "Color Tint",
|
||||
"settings.header.advanced": "Advanced",
|
||||
"settings.header.connect": "Sync",
|
||||
"settings.option.connect.link_account": "Enable Sync with Cider Connect",
|
||||
|
@ -628,4 +644,4 @@
|
|||
"oobe.visual.suggestingThemes.community3": "Dracula",
|
||||
"oobe.visual.suggestingThemes.community3.text": "The iconic Dracula color scheme.",
|
||||
"oobe.amsignin.title": ""
|
||||
}
|
||||
}
|
|
@ -22,7 +22,6 @@
|
|||
"term.logout": "Cerrar Sesión",
|
||||
"term.login": "Iniciar Sesión",
|
||||
"term.quickNav": "Navegación rápida",
|
||||
"term.cast": "Transmitir",
|
||||
"term.about": "Acerca de",
|
||||
"term.privateSession": "Sesión Privada",
|
||||
"term.disablePrivateSession": "Deshabilitar Sesión Privada",
|
||||
|
@ -32,16 +31,23 @@
|
|||
"term.miniplayer": "Mini-Reproductor",
|
||||
"term.history": "Historial",
|
||||
"term.search": "Buscar",
|
||||
"term.scroll": "Modo de Desplazamiento",
|
||||
"term.scroll.infinite": "Infinito",
|
||||
"term.scroll.paged": "${songsPerPage} por Página",
|
||||
"term.live": "LIVE",
|
||||
"term.showSearch": "Mostrar Barra de Búsqueda",
|
||||
"term.hideSearch": "Ocultar Barra de Búsqueda",
|
||||
"term.library": "Biblioteca",
|
||||
"term.listenNow": "Escuchar Ahora",
|
||||
"term.browse": "Explorar",
|
||||
"term.radio": "Radio",
|
||||
"term.recentlyAdded": "Agregadas Recientemente",
|
||||
"term.recentlyAdded": "Agregado Recientemente",
|
||||
"term.songs": "Canciones",
|
||||
"term.albums": "Álbumes",
|
||||
"term.artists": "Artistas",
|
||||
"term.podcasts": "Podcasts",
|
||||
"term.playlists": "Listas de Reproducción",
|
||||
"term.charts": "Tarjetas",
|
||||
"term.playlist": "Lista de Reproducción",
|
||||
"term.newPlaylist": "Nueva Lista de Reproducción",
|
||||
"term.newPlaylistFolder": "Nueva Carpeta de Listas de Reproducción",
|
||||
|
@ -51,7 +57,9 @@
|
|||
"term.navigateBack": "Navegar Hacia Atrás",
|
||||
"term.navigateForward": "Navegar Hacia Adelante",
|
||||
"term.play": "Reproducir",
|
||||
"term.playpause": "Reproducir/Pausar",
|
||||
"term.pause": "Pausar",
|
||||
"term.stop": "Detener",
|
||||
"term.previous": "Anterior",
|
||||
"term.next": "Siguiente",
|
||||
"term.shuffle": "Aleatorio",
|
||||
|
@ -60,7 +68,7 @@
|
|||
"term.repeat": "Repetir",
|
||||
"term.enableRepeatOne": "Habilitar Repetir Uno",
|
||||
"term.disableRepeatOne": "Deshabilitar Repetir Uno",
|
||||
"term.disableRepeat": "Deshabilitar Repetición",
|
||||
"term.disableRepeat": "Deshabilitar Repetir",
|
||||
"term.volume": "Volumen",
|
||||
"term.mute": "Silenciar",
|
||||
"term.unmute": "De-silenciar",
|
||||
|
@ -94,7 +102,7 @@
|
|||
"term.connecting": "Conectando",
|
||||
"term.disconnect": "Desconectar",
|
||||
"term.authed": "Autenticado",
|
||||
"term.confirm": "¿Confirma?",
|
||||
"term.confirm": "¿ Confirma ?",
|
||||
"term.more": "Más",
|
||||
"term.less": "Menos",
|
||||
"term.showMore": "Mostrar Más",
|
||||
|
@ -124,12 +132,14 @@
|
|||
"one": "Segundo",
|
||||
"other": "Segundos"
|
||||
},
|
||||
"term.fullscreenView": "Vista de Pantalla Completa",
|
||||
"term.fullscreenView": "Pantalla Completa",
|
||||
"term.defaultView": "Vista Predeterminada",
|
||||
"term.audioSettings": "Configuración de Audio",
|
||||
"term.audioControls": "Configuración volumen",
|
||||
"term.clearAll": "Borrar todo",
|
||||
"term.recentStations": "Estaciones Recientes",
|
||||
"term.personalStations": "Estaciones Personales",
|
||||
"term.amLive": "Apple Music Live",
|
||||
"term.language": "Idioma",
|
||||
"term.funLanguages": "Idiomas Fun (Parodias)",
|
||||
"term.noLyrics": "Cargando... / Letras no encontradas./ Instrumental.",
|
||||
|
@ -150,6 +160,7 @@
|
|||
},
|
||||
"term.videos": "Videos",
|
||||
"term.menu": "Menú",
|
||||
"term.themeManaged": "Administrado por un Tema",
|
||||
"term.check": "Comprobar",
|
||||
"term.aboutArtist": "Acerca de {{artistName}}",
|
||||
"term.topResult": "Mejor Resultado",
|
||||
|
@ -173,10 +184,11 @@
|
|||
"term.top": "Top",
|
||||
"term.version": "Versión",
|
||||
"term.noVideos": "No hay Videos Disponibles.",
|
||||
"term.plugin": "Plug-in",
|
||||
"term.pluginMenu": "Plug-in Menú",
|
||||
"term.plugins": "Plugins",
|
||||
"term.plugin": "Plugin",
|
||||
"term.pluginMenu": "Plugins Menú",
|
||||
"term.pluginMenu.none": "Sin Plugins Interactivos",
|
||||
"term.replay": "Repetir",
|
||||
"term.replay": "Replay",
|
||||
"term.uniqueAlbums": "Álbumes Únicos",
|
||||
"term.uniqueArtists": "Artistas Únicos",
|
||||
"term.uniqueSongs": "Canciones Únicas",
|
||||
|
@ -189,11 +201,27 @@
|
|||
"term.confirmLogout": "¿Estás seguro de que quieres cerrar sesión?",
|
||||
"term.creditDesignedBy": "Diseñado por ${authorUsername}",
|
||||
"term.discNumber": "Disco ${discNumber}",
|
||||
"term.reload" : "¿ Recargar Cider ?",
|
||||
"term.toggleprivate" : "Cambiar a Sesión Privada",
|
||||
"term.webremote" : "Web Remoto",
|
||||
"term.cast" : "Transmitir",
|
||||
"term.cast2" : "Transmitir a los Dispositivos",
|
||||
"term.quit" : "Salir",
|
||||
"term.zoomin" : "Acercar",
|
||||
"term.zoomout" : "Alejar",
|
||||
"term.zoomreset" : "Restablecer",
|
||||
"term.fullscreen" : "Pantalla Completa",
|
||||
"term.nowPlaying": "Reproduciendo Ahora",
|
||||
"home.syncFavorites": "Sincronizar Favoritos",
|
||||
"home.syncFavorites.gettingArtists": "Consiguiendo Artistas Favoritos...",
|
||||
"action.favorite": "Favorito",
|
||||
"action.removeFavorite": "Eliminar Favorito",
|
||||
"action.refresh": "Actualizar",
|
||||
"home.title": "Principal",
|
||||
"home.recentlyPlayed": "Escuchado Recientemente",
|
||||
"home.recentlyAdded": "Agregado Recientemente",
|
||||
"home.artistsFeed": "Tu Feed de artistas",
|
||||
"home.artistsFeed.noArtist": "Sigue a algunos Artistas para ver sus últimos Lanzamientos",
|
||||
"home.artistsFeed.noArtist": "Sigue a algunos Artistas para ver sus Últimos Lanzamientos",
|
||||
"home.madeForYou": "Hecho para Ti",
|
||||
"home.friendsListeningTo": "Amigos Escuchando",
|
||||
"home.followedArtists": "Artistas Seguidos",
|
||||
|
@ -209,20 +237,27 @@
|
|||
"podcast.episodes": "Episodios",
|
||||
"podcast.playEpisode": "Reproducir Episodio",
|
||||
"podcast.website": "Sitio web de Podcasts",
|
||||
"action.hideLibrary": "Ocultar biblioteca",
|
||||
"action.showLibrary": "Mostrar biblioteca",
|
||||
"action.cut": "Cortar",
|
||||
"action.paste": "Pegar",
|
||||
"action.selectAll": "Seleccionar Todo",
|
||||
"action.delete": "Borrar",
|
||||
"action.edit": "Editar",
|
||||
"action.done": "Hecho",
|
||||
"action.editTracklist": "Edit Tracklist",
|
||||
"action.submit": "Enviar",
|
||||
"action.editTracklist": "Editar Lista de Canciones",
|
||||
"action.addToLibrary": "Agregar a la Biblioteca",
|
||||
"action.addToLibrary.success": "Agregado a la Biblioteca",
|
||||
"action.addToLibrary.error": "Error al agregar a la Biblioteca",
|
||||
"action.removeFromLibrary": "Eliminar de la Biblioteca",
|
||||
"action.removeFromLibrary.success": "Eliminado de la Biblioteca",
|
||||
"action.addToQueue": "Añadir a la cola",
|
||||
"action.addToQueue.success": "Agregado a la cola",
|
||||
"action.addToQueue.error": "Error al agregar a la cola",
|
||||
"action.removeFromQueue": "Eliminar de la cola",
|
||||
"action.removeFromQueue.success": "Eliminado de la cola",
|
||||
"action.removeFromQueue.error": "Error al eliminar de la cola",
|
||||
"action.addToQueue": "Agregar a la Cola",
|
||||
"action.addToQueue.success": "Agregado a la Cola",
|
||||
"action.addToQueue.error": "Error al Agregar a la Cola",
|
||||
"action.removeFromQueue": "Eliminar de la Cola",
|
||||
"action.removeFromQueue.success": "Eliminado de la Cola",
|
||||
"action.removeFromQueue.error": "Error al Eliminar de la Cola",
|
||||
"action.createPlaylist": "Crear una nueva lista de reproducción",
|
||||
"action.addToPlaylist": "Agregar a lista de reproducción",
|
||||
"action.removeFromPlaylist": "Eliminar de la lista de reproducción",
|
||||
|
@ -233,14 +268,14 @@
|
|||
"action.unfollow": "Dejar de Seguir",
|
||||
"action.unfollow.success": "Dejando de Seguir",
|
||||
"action.unfollow.error": "Error al dejar de Seguir",
|
||||
"action.playNext": "Reproducir siguiente",
|
||||
"action.playLater": "Reproducir más tarde",
|
||||
"action.playNext": "Reproducir Siguiente",
|
||||
"action.playLater": "Reproducir Más Tarde",
|
||||
"action.startRadio": "Iniciar Radio",
|
||||
"action.goToArtist": "Ir al artista",
|
||||
"action.goToAlbum": "Ir al álbum",
|
||||
"action.showInPlaylist": "Mostrar en lista de reproducción",
|
||||
"action.goToArtist": "Ir al Artista",
|
||||
"action.goToAlbum": "Ir al Álbum",
|
||||
"action.showInPlaylist": "Mostrar en Lista de Reproducción",
|
||||
"action.showInAppleMusic": "Mostrar en Apple Music",
|
||||
"action.moveToTop": "Mover fuera de la carpeta",
|
||||
"action.moveToTop": "Mover fuera de la Carpeta",
|
||||
"action.share": "Compartir",
|
||||
"action.rename": "Renombrar",
|
||||
"action.love": "Me Gusta",
|
||||
|
@ -248,15 +283,15 @@
|
|||
"action.dislike": "Recomendar menos este contenido",
|
||||
"action.undoDislike": "Recomendar mas este contenido",
|
||||
"action.showWebRemoteQR": "Web Remoto",
|
||||
"action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} pistas siguientes",
|
||||
"action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} pistas mas tarde",
|
||||
"action.removeTracks": "Eliminar ${self.selectedItems.length} pistas de la cola",
|
||||
"action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} Canciones Siguientes",
|
||||
"action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} Canciones mas tarde",
|
||||
"action.removeTracks": "Eliminar ${self.selectedItems.length} Canciones de la Cola",
|
||||
"action.import": "Importar",
|
||||
"action.export": "Exportar",
|
||||
"action.showAlbum": "Mostrar Álbum Completo",
|
||||
"action.tray.minimize": "Minimizar a la bandeja",
|
||||
"action.tray.quit": "Salir",
|
||||
"action.tray.show": "Mostrar Cider",
|
||||
"action.tray.listento": "Escuchando a:",
|
||||
"action.update": "Actualizar",
|
||||
"action.install": "Instalar",
|
||||
"action.copy": "Copiar",
|
||||
|
@ -264,7 +299,7 @@
|
|||
"action.deletepreset": "Borrar Preset",
|
||||
"action.open": "Abrir",
|
||||
"action.close": "Cerrar",
|
||||
"action.relaunch.confirm": "¿Quieres reiniciar Cider?",
|
||||
"action.relaunch.confirm": "¿ Quieres reiniciar Cider ?",
|
||||
"action.cast.chromecast": "Chromecast",
|
||||
"action.cast.todevices": "Transmitir a los Dispositivos",
|
||||
"action.cast.stop": "Dejar de transmitir a todos los Dispositivos",
|
||||
|
@ -273,47 +308,28 @@
|
|||
"action.cast.scan": "Escanear",
|
||||
"action.cast.scanning": "Escaneando...",
|
||||
"action.createNew": "Crear Nuevo...",
|
||||
"action.openArtworkInBrowser": "Abrir Ilustración en el navegador",
|
||||
"action.openArtworkInBrowser": "Abrir Ilustración en el Navegador",
|
||||
"action.scrollToTop": "Ir al inicio",
|
||||
"menubar.options.about": "Acerca de",
|
||||
"menubar.options.settings": "Ajustes",
|
||||
"menubar.options.quit": "Salir",
|
||||
"menubar.options.view": "Ver",
|
||||
"menubar.options.reload": "Recargar",
|
||||
"menubar.options.forcereload": "Forzar Recarga",
|
||||
"menubar.options.toggledevtools": "Herramientas de Desarrollo",
|
||||
"menubar.options.window": "Ventana",
|
||||
"menubar.options.minimize": "Minimizar",
|
||||
"menubar.options.toggleprivate": "Cambiar Sesión Privada",
|
||||
"menubar.options.webremote": "Web Remoto",
|
||||
"menubar.options.audio": "Configuraciones de Audio",
|
||||
"menubar.options.plugins": "Menu de Plu-gins",
|
||||
"menubar.options.plugins": "Menú de Plugins",
|
||||
"menubar.options.controls": "Controles",
|
||||
"menubar.options.next": "Siguiente",
|
||||
"menubar.options.playpause": "Reproducir/Pausar",
|
||||
"menubar.options.previous": "Anterior",
|
||||
"menubar.options.volumeup": "Subir Volumen",
|
||||
"menubar.options.volumedown": "Bajar Volumen",
|
||||
"menubar.options.browse": "Explorar",
|
||||
"menubar.options.artists": "Artistas",
|
||||
"menubar.options.search": "Buscar",
|
||||
"menubar.options.albums": "Álbumes",
|
||||
"menubar.options.cast": "Transmitir a Dispositivos",
|
||||
"menubar.options.account": "Cuenta",
|
||||
"menubar.options.accountsettings": "Ajustes de Cuenta",
|
||||
"menubar.options.signout": "Cerrar Sesión",
|
||||
"menubar.options.support": "Soporte",
|
||||
"menubar.options.discord": "Discord",
|
||||
"menubar.options.github": "GitHub Wiki",
|
||||
"menubar.options.report": "Reportar a...",
|
||||
"menubar.options.bug": "Bug",
|
||||
"menubar.options.feature": "Solicitud de características",
|
||||
"menubar.options.trans": "Solicitud de Informe/Traducción",
|
||||
"menubar.options.license": "Ver licencia",
|
||||
"menubar.options.conf": "Abrir archivo de configuración en el editor",
|
||||
"menubar.options.listennow": "Escuchar Ahora",
|
||||
"menubar.options.recentlyAdded": "Agregadas Recientemente",
|
||||
"menubar.options.songs": "Canciones",
|
||||
"menubar.options.zoom": "Zoom",
|
||||
"settings.header.general": "General",
|
||||
"settings.header.general.description": "Ajuste la configuración general de Cider.",
|
||||
"settings.option.general.language": "Idioma",
|
||||
|
@ -333,11 +349,17 @@
|
|||
"settings.option.general.customizeSidebar": "Personalizar elementos de la barra lateral",
|
||||
"settings.option.general.customizeSidebar.customize": "Personalizar",
|
||||
"settings.option.general.keybindings": "Combinaciones de Teclas",
|
||||
"settings.option.general.keybindings.library": "Biblioteca",
|
||||
"settings.option.general.keybindings.session": "Sesión",
|
||||
"settings.option.general.keybindings.control": "Controles",
|
||||
"settings.option.general.keybindings.interface": "Interfaz",
|
||||
"settings.option.general.keybindings.advanced": "Avanzado",
|
||||
"settings.option.general.keybindings.pressCombination": "Presione una combinación de dos teclas para actualizar la combinación de teclas.",
|
||||
"settings.option.general.keybindings.pressEscape": "Pulse la tecla Escape para volver.",
|
||||
"settings.notyf.general.keybindings.update.success": "Combinación de teclas actualizada correctamente",
|
||||
"settings.prompt.general.keybindings.update.success": "La combinación de teclas se actualizó correctamente. Pulsa OK para reiniciar Cider",
|
||||
"settings.option.general.keybindings.open": "Abrir",
|
||||
"settings.option.general.themeUpdateNotification": "Buscar actualizaciones de temas automáticamente",
|
||||
"settings.option.general.showLovedTracksInline": "Mostrar pistas favoritas en la línea",
|
||||
"settings.description.search": "Buscar",
|
||||
"settings.description.albums": "Álbumes de la biblioteca",
|
||||
"settings.description.artists": "Artistas de la biblioteca",
|
||||
|
@ -356,8 +378,9 @@
|
|||
"settings.notyf.updateCider.update-downloaded": "La actualización se ha descargado, Reinicie para aplicarla",
|
||||
"settings.notyf.updateCider.update-timeout": "Tiempo de espera agotado para actualizar Cider",
|
||||
"settings.header.audio": "Audio",
|
||||
"settings.header.audio.description": "Ajuste la Configuración de Audio para Cider.",
|
||||
"settings.option.audio.volumeStep": "Paso de Volumen",
|
||||
"settings.header.audio.description": "Ajuste la configuración de audio para Cider.",
|
||||
"settings.option.audio.volumeStep": "Pasos de Volumen",
|
||||
"settings.option.audio.advanced": "Control de Volumen Avanzado",
|
||||
"settings.option.audio.maxVolume": "Volumen Máximo",
|
||||
"settings.option.audio.changePlaybackRate": "Cambiar la Velocidad de Reproducción",
|
||||
"settings.option.audio.playbackRate": "Velocidad de Reproducción",
|
||||
|
@ -373,48 +396,63 @@
|
|||
"settings.header.audio.quality.standard.description": "64 kbps",
|
||||
"settings.option.audio.seamlessTransition": "Transición de audio sin interrupciones",
|
||||
"settings.option.audio.enableAdvancedFunctionality": "Habilitar funcionalidad avanzada",
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como normalización de audio, ecualizadores y visualizadores; sin embargo, en algunos sistemas esto puede causar interrupciones en las pistas de audio.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider cree que su PC no puede manejar estas funciones. ¿Estás seguro de que quieres continuar?",
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como Normalización de Audio, Ecualizadores y Visualizadores. Sin embargo, en algunos sistemas esto puede causar interrupciones en las pistas de audio.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider cree que su PC no puede manejar estas funciones. ¿ Estás seguro de que quieres continuar ?",
|
||||
"settings.option.audio.audioLab": "Cider Audio Lab",
|
||||
"settings.option.audio.audioLab.description": "Una variedad de efectos de audio desarrollados internamente para Cider.",
|
||||
"settings.option.audio.audioLab.description": "Una variedad de efectos de Audio desarrollados internamente para Cider.",
|
||||
"settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California",
|
||||
"settings.warn.audioLab.withoutAF": "Se requiere AudioContext (funcionalidad avanzada) para habilitar Laboratorio de audio de Cider.",
|
||||
"settings.warn.enableAdvancedFunctionality": "AudioContext (funcionalidad avanzada) es necesaria para habilitar esta característica.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calidez analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula la calidez analógica inspirada en el Korg Nutube 6P1",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidad de calidez analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Cambia la intensidad del procesamiento del módulo de Calidez analógica",
|
||||
"settings.warn.audioLab.withoutAF": "Se requiere AudioContext (funcionalidad avanzada) para habilitar Cider Audio Lab.",
|
||||
"settings.warn.enableAdvancedFunctionality": "AudioContext (funcionalidad avanzada) es necesaria para Habilitar esta Característica.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calidez Analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula la Calidez Analógica inspirada en el Korg Nutube 6P1",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidad de Calidez Analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Cambia la intensidad del procesamiento del módulo de Calidez Analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Suave",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Calido",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™️",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Realiza una Atmósfera musical diferente modelada a partir de las configuraciones de audio de última generación.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™️ Mode",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Cambia el modo de funcionamiento del módulo Atmosphere Realizer.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Natural (Estándar)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Natural (Plus)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Té De Espuma de Queso Hōjicha",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Té con Leche de Tapioca Genmaicha",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Té De Espuma De Queso Con Sal de Roca",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Té con Leche Uji Matcha",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jazmín Macchiato",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Té de leche de Hokkaido",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Pastel Suave de Luz de Luna",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Leche Creme Brûlée de Azúcar Morena",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis de Cerezas",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Abrazo de Calidez",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Mejora la calidad de audio percibida del audio AAC de 256 kbps mediante el uso de un algoritmo en tiempo real que aprovecha los modelos psicoacústicos de la audición humana y las características de codificación AAC.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Mejora la calidad de audio percibida del codificador de audio en AAC mediante el uso de un algoritmo en 'Tiempo Real' que aprovecha los modelos psicoacústicos de la audición humana y las características de codificación de AAC.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP no es compatible con la Espacialización. Desactive la Espacialización para continuar.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Intensidad de CAP",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Fuerza de CAP",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Cambia la intensidad del procesamiento realizado en el audio. (Agresivo puede producir resultados no deseados)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Estándar",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptativo",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Legacy",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresivo",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalización de audio",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza el volumen máximo de pistas individuales para crear una experiencia auditiva más uniforme. (No funciona en las pistas cargadas por el usuario)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza el volumen máximo de las Canciones individuales para crear una experiencia auditiva más uniforme. (No funciona en las Canciones cargadas por el usuario)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Gestionado por AudioLab",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Espacialización Sintonizada de Cider",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efecto de preajuste de espacialización, deshabilita la configuración personalizable de la espacialización de audio. La espacialización debe estar habilitada como requisito previo.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Espacialización ajustada de Cider",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efecto de Preajuste de espacialización, desactiva la configuración personalizable de espacialización de audio.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Perfil de espacialización de Cider",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Cambia el Perfil de Ajuste de Espacialización.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Estándar",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Cambia el Perfil de Ajuste de la Espacialización.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Estandar",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Estudio de Sonido",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separación",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Mínimo",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "La Espacialización no es compatible con CAP. Deshabilite CAP para continuar.",
|
||||
"settings.option.audio.dbspl.display": "Visualización dB SPL",
|
||||
"settings.option.audio.dbspl.description": "(Solo usuarios avanzados) Muestra 'dB SPL' en lugar de 'dBFS' en el control deslizante de volumen.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiófilo",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Difuso",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "La espacialización no es compatible con CAP. Deshabilite CAP para continuar.",
|
||||
"settings.option.audio.dbspl.display": "Visualización de dB SPL",
|
||||
"settings.option.audio.dbspl.description": "(Solo para usuarios avanzados) Muestra dB SPL en lugar de dBFS en el control deslizante de Volumen.",
|
||||
"settings.option.audio.dbfs.calibration": "Calibración de 0 dBFS",
|
||||
"settings.option.audio.dbfs.description": "Ingrese el pico 'dB SPL con Ponderación-Z' cuando Cider esté en 0 dBFS.",
|
||||
"settings.option.audio.dbfs.description": "Ingrese el Pico de dB SPL con 'Ponderación Z' cuando Cider esté en 0 dBFS.",
|
||||
"settings.header.visual": "Visual",
|
||||
"settings.header.visual.description": "Ajuste la configuración visual de Cider.",
|
||||
"settings.option.visual.windowStyle": "Estilo de Ventana",
|
||||
|
@ -432,7 +470,7 @@
|
|||
"settings.header.visual.animatedArtworkQuality.high": "Alto",
|
||||
"settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto",
|
||||
"settings.header.visual.animatedArtworkQuality.extreme": "Extremo",
|
||||
"settings.option.visual.animatedWindowBackground": "Fondo de ventana animado",
|
||||
"settings.option.visual.animatedWindowBackground": "Fondo de Ventana Animado",
|
||||
"settings.option.visual.hardwareAcceleration": "Aceleración de Hardware",
|
||||
"settings.option.visual.hardwareAcceleration.description": "Requiere reinicio",
|
||||
"settings.header.visual.hardwareAcceleration.default": "Por defecto",
|
||||
|
@ -443,10 +481,11 @@
|
|||
"settings.option.visual.theme.github.openfolder": "Abrir Carpeta de Temas",
|
||||
"settings.option.visual.theme.github.explore": "Explorar Temas de GitHub",
|
||||
"settings.header.visual.theme.github.page": "Temas de GitHub",
|
||||
"settings.option.visual.theme.github.install.confirm": "¿Está seguro de que desea instalar {{ repo }}?",
|
||||
"settings.option.visual.theme.github.install.confirm": "¿ Está seguro de que desea instalar {{ repo }} ?",
|
||||
"settings.prompt.visual.theme.github.URL": "Introduce la URL del tema que quieres instalar",
|
||||
"settings.prompt.visual.theme.uninstallTheme": "¿Estas seguro que lo quieres desinstalar {{ theme }}?",
|
||||
"settings.prompt.visual.theme.uninstallTheme": "¿ Estas seguro que lo quieres desinstalar {{ theme }} ?",
|
||||
"settings.option.visual.theme.checkForUpdates": "Buscar actualizaciones",
|
||||
"settings.header.visual.styles": "Estilos",
|
||||
"settings.option.visual.theme.manageStyles": "Gestionar Estilos",
|
||||
"settings.option.visual.theme.uninstall": "Desinstalar",
|
||||
"settings.option.visual.theme.viewInfo": "Ver Información",
|
||||
|
@ -491,11 +530,19 @@
|
|||
"settings.option.connectivity.discordRPC.hideTimestamp": "Ocultar Marca de Tiempo en Discord Rich Presence",
|
||||
"settings.option.connectivity.discordRPC.detailsFormat": "Formato de los detalles",
|
||||
"settings.option.connectivity.discordRPC.stateFormat": "Formato de Estado",
|
||||
"settings.option.connectivity.discordRPC.reload": "Recargar Discord RPC",
|
||||
"settings.option.connectivity.discordRPC.reconnectedToUser": "Discord RPC reconectando al usuario: {{user}} ({{userid}})",
|
||||
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm Retraso de Scrobble (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Activar Last.fm Now Playing",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Eliminar artistas destacados del título de la canción (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar pista en bucle (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "Evite que las pistas en bucle se scrobblen o se muestren en la lista Now Playing en Last.fm.",
|
||||
"settings.option.connectivity.lastfmScrobble.filterTypes": "Tipos de Filtros de Medios (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.manualToken": "Ingrese el token de Last.fm Manualmente",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.fm Tiempo de Conexión agotado",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.fm Conexión exitosa",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connecting": "Conectando a Last.fm...",
|
||||
"settings.header.debug": "Debug",
|
||||
"settings.option.debug.copy_log": "Copiar Logs al portapapeles",
|
||||
"settings.option.debug.openAppData": "Abrir carpeta de Cider",
|
||||
|
@ -507,11 +554,17 @@
|
|||
"settings.option.experimental.unknownPlugin.description": "Permitir la instalación de Plugins desde otros repos que no sean el repositorio de Plugins de Cider",
|
||||
"settings.option.experimental.compactUI": "UI Compacto",
|
||||
"settings.option.window.close_button_hide": "El botón Cerrar oculta la aplicación",
|
||||
"settings.option.window.maxElementScale": "Escala Máxima de Elementos",
|
||||
"settings.option.experimental.inline_playlists": "Álbumes y listas de reproducción en línea",
|
||||
"settings.option.advanced.playlistTrackMapping": "Mapeo de pistas de listas de reproducción",
|
||||
"settings.option.advanced.playlistTrackMapping.description": "Habilita el escaneo profundo de las listas de reproducción para determinar qué pistas están en qué listas de reproducción. Los tiempos de creación de la caché de la lista de reproducción pueden aumentar significativamente.",
|
||||
"settings.option.visual.transparent": "Marco transparente",
|
||||
"settings.option.visual.transparent.description": "Necesita compatibilidad con temas, requiere reiniciar",
|
||||
"settings.option.visual.customAccentColor": "Color de Acento Personalizado",
|
||||
"settings.option.visual.accentColor": "Color de Acento",
|
||||
"settings.option.visual.purplePodcastPlaybackBar": "Barra de Reproducción Morada para Podcasts",
|
||||
"settings.option.visual.windowColor": "Color de Tinte de Ventana",
|
||||
"settings.header.visual.windowBackgroundStyle.color": "Matiz de Color",
|
||||
"settings.header.advanced": "Avanzado",
|
||||
"settings.header.connect": "Conectar",
|
||||
"settings.option.connect.link_account": "Habilitar sincronización con Cider Connect",
|
||||
|
@ -546,7 +599,46 @@
|
|||
"share.platform.whatsapp": "WhatsApp",
|
||||
"share.platform.messenger": "Messenger",
|
||||
"share.platform.email": "Email",
|
||||
"share.platform.songLink": "Copy with song.link",
|
||||
"share.platform.songLink": "Copiar con song.link",
|
||||
"share.platform.clipboard": "Copiar link",
|
||||
"about.thanks": "Muchas gracias al equipo de Cider Collective y a Todos nuestros colaboradores."
|
||||
"about.thanks": "Muchas gracias al equipo de Cider Collective y a Todos nuestros colaboradores.",
|
||||
"oobe.yes": "Sí",
|
||||
"oobe.no": "No",
|
||||
"oobe.next": "Siguiente",
|
||||
"oobe.previous": "Anterior",
|
||||
"oobe.done": "Hecho",
|
||||
"oobe.amupsell.title": "Antes de Empezar",
|
||||
"oobe.amupsell.text": "Cider Requiere una Suscripción paga Activa a Apple Music\nCider NO funcionará con Apple Music Voice Plan ni con algunas suscripciones de prueba promocionales. Si ya tiene una suscripción calificada de Apple Music, haga click en Siguiente para continuar.",
|
||||
"oobe.amupsell.subscribeBtn": "Suscríbete a Apple Music",
|
||||
"oobe.amupsell.explainBtn": "Explique",
|
||||
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
|
||||
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
|
||||
"oobe.amupsell.promoExplained": "Algunas suscripciones de Apple Music promocionales y de prueba fuera de EE.UU. no tienen acceso a las API del reproductor web de Apple Music necesarias para que Cider funcione. Para verificar si su versión de prueba activa funcionará con Cider, vaya a <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> inicie sesión e intente reproducir música. Si funciona, ¡genial! Está listo para usar Cider, sin embargo, si no considera suscribirse a Apple Music aquí: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
|
||||
"oobe.intro.title": "Bienvenido a Cider",
|
||||
"oobe.intro.subtitle": "",
|
||||
"oobe.intro.text": "Configuremos algunas cosas para que puedas usar Cider como quieras. Siempre puede cambiar esta configuración más tarde.",
|
||||
"oobe.general.title": "General",
|
||||
"oobe.general.subtitle": "",
|
||||
"oobe.general.text": "",
|
||||
"oobe.audio.title": "Audio",
|
||||
"oobe.audio.subtitle": "",
|
||||
"oobe.audio.text": "Cider cuenta con una pila de audio diseñada y afinada a medida que brinda una experiencia de audio rica y de alta calidad.\nCon Cider Adrenaline, Atmosphere Realizer y Spatialized Audio.\nPara habilitar esta funcionalidad, \"Funcionalidad de audio avanzada\" debe estar habilitada.\nHabilitar audio avanzado La funcionalidad le dará acceso a estas mejoras en Cider Audio Labs, que se encuentra en la configuración de la aplicación.",
|
||||
"oobe.audio.advancedFunctionality": "",
|
||||
"oobe.visual.title": "Visual",
|
||||
"oobe.visual.subtitle": "",
|
||||
"oobe.visual.text": "",
|
||||
"oobe.visual.layout.text": "Cider presenta dos diseños de ventana diferentes.\nMaverick es un diseño similar a iTunes con el reproductor en la parte superior de la ventana.\nMojave es un nuevo giro creado por Cider Collective.\n\nPuedes cambiar el diseño en cualquier momento en la configuración.",
|
||||
"oobe.visual.suggestingThemes": "La tematización es una excelente forma de personalizar tu experiencia. Aquí hay algunos que sugerimos: ",
|
||||
"oobe.visual.suggestingThemes.subtext": "(Estos temas se descargarán de GitHub)",
|
||||
"oobe.visual.suggestingThemes.default": "Cider",
|
||||
"oobe.visual.suggestingThemes.default.text": "El clásico tema de Cider.",
|
||||
"oobe.visual.suggestingThemes.dark": "Oscuro",
|
||||
"oobe.visual.suggestingThemes.dark.text": "Oscurisimo",
|
||||
"oobe.visual.suggestingThemes.community1": "Groovy",
|
||||
"oobe.visual.suggestingThemes.community1.text": "Un tema influenciado por WinUI",
|
||||
"oobe.visual.suggestingThemes.community2": "iTheme",
|
||||
"oobe.visual.suggestingThemes.community2.text": " El clásico diseño de frutas grandes.",
|
||||
"oobe.visual.suggestingThemes.community3": "Dracula",
|
||||
"oobe.visual.suggestingThemes.community3.text": "El icónico esquema de color de Drácula.",
|
||||
"oobe.amsignin.title": ""
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
"notification.updatingLibrarySongs": "Actualizando Canciones de la Biblioteca...",
|
||||
"notification.updatingLibraryAlbums": "Actualizando Álbumes de la Biblioteca...",
|
||||
"notification.updatingLibraryArtists": "Actualizando Artistas de la Biblioteca...",
|
||||
"term.variables": "Variables",
|
||||
"term.appleInc": "Apple Inc.",
|
||||
"term.appleMusic": "Apple Music",
|
||||
"term.applePodcasts": "Apple Podcasts",
|
||||
|
@ -20,37 +21,54 @@
|
|||
"term.accountSettings": "Configuración de la Cuenta",
|
||||
"term.logout": "Cerrar Sesión",
|
||||
"term.login": "Iniciar Sesión",
|
||||
"term.cast": "Transmitir",
|
||||
"term.quickNav": "Navegación rápida",
|
||||
"term.about": "Acerca de",
|
||||
"term.privateSession": "Sesión Privada",
|
||||
"term.disablePrivateSession": "deshabilitar Sesión Privada",
|
||||
"term.disablePrivateSession": "Deshabilitar Sesión Privada",
|
||||
"term.queue": "Cola",
|
||||
"term.autoplay": "Reproducción Automática",
|
||||
"term.lyrics": "Letras",
|
||||
"term.miniplayer": "Mini Reproductor",
|
||||
"term.miniplayer": "Mini-Reproductor",
|
||||
"term.history": "Historial",
|
||||
"term.search": "Buscar",
|
||||
"term.scroll": "Modo de Desplazamiento",
|
||||
"term.scroll.infinite": "Infinito",
|
||||
"term.scroll.paged": "${songsPerPage} por Página",
|
||||
"term.live": "LIVE",
|
||||
"term.showSearch": "Mostrar Barra de Búsqueda",
|
||||
"term.hideSearch": "Ocultar Barra de Búsqueda",
|
||||
"term.library": "Biblioteca",
|
||||
"term.listenNow": "Escuchar Ahora",
|
||||
"term.browse": "Explorar",
|
||||
"term.radio": "Radio",
|
||||
"term.recentlyAdded": "Agregadas Recientemente",
|
||||
"term.recentlyAdded": "Agregado Recientemente",
|
||||
"term.songs": "Canciones",
|
||||
"term.albums": "Álbumes",
|
||||
"term.artists": "Artistas",
|
||||
"term.podcasts": "Podcasts",
|
||||
"term.playlists": "Listas de Reproducción",
|
||||
"term.charts": "Tarjetas",
|
||||
"term.playlist": "Lista de Reproducción",
|
||||
"term.newPlaylist": "Nueva Lista de Reproducción",
|
||||
"term.newPlaylistFolder": "Nueva Carpeta de Listas de Reproducción",
|
||||
"term.createNewPlaylist": "Crear Nueva Lista de Reproducción",
|
||||
"term.createNewPlaylistFolder": "Crear Nueva Carpeta de Listas de Reproducción",
|
||||
"term.deletePlaylist": "Estas Seguro de Querer Eliminar esta Lista de Reproducción",
|
||||
"term.deletePlaylist": "¿Estas Seguro de Querer Eliminar esta Lista de Reproducción?",
|
||||
"term.navigateBack": "Navegar Hacia Atrás",
|
||||
"term.navigateForward": "Navegar Hacia Adelante",
|
||||
"term.play": "Reproducir",
|
||||
"term.playpause": "Reproducir/Pausar",
|
||||
"term.pause": "Pausar",
|
||||
"term.stop": "Detener",
|
||||
"term.previous": "Anterior",
|
||||
"term.next": "Siguiente",
|
||||
"term.shuffle": "Aleatorio",
|
||||
"term.enableShuffle": "Habilitar Reproducción Aleatoria",
|
||||
"term.disableShuffle": "Desactivar Reproducción Aleatoria",
|
||||
"term.repeat": "Repetir",
|
||||
"term.enableRepeatOne": "Habilitar Repetir Uno",
|
||||
"term.disableRepeatOne": "Deshabilitar Repetir Uno",
|
||||
"term.disableRepeat": "Deshabilitar Repetir",
|
||||
"term.volume": "Volumen",
|
||||
"term.mute": "Silenciar",
|
||||
"term.unmute": "De-silenciar",
|
||||
|
@ -72,6 +90,7 @@
|
|||
"term.viewAs": "Ver como",
|
||||
"term.viewAs.coverArt": "Portada",
|
||||
"term.viewAs.list": "Lista",
|
||||
"term.dynamic": "Dinámico",
|
||||
"term.size": "Tamaño",
|
||||
"term.size.normal": "Normal",
|
||||
"term.size.compact": "Compacto",
|
||||
|
@ -88,7 +107,7 @@
|
|||
"term.less": "Menos",
|
||||
"term.showMore": "Mostrar Más",
|
||||
"term.showLess": "Mostrar Menos",
|
||||
"term.topSongs": "Canciones Principales",
|
||||
"term.topSongs": "Mejores canciones",
|
||||
"term.latestReleases": "Últimos Lanzamientos",
|
||||
"term.time.added": "Agregado",
|
||||
"term.time.released": "Publicado",
|
||||
|
@ -113,12 +132,14 @@
|
|||
"one": "Segundo",
|
||||
"other": "Segundos"
|
||||
},
|
||||
"term.fullscreenView": "Vista de Pantalla Completa",
|
||||
"term.fullscreenView": "Pantalla Completa",
|
||||
"term.defaultView": "Vista Predeterminada",
|
||||
"term.audioSettings": "Configuración de Audio",
|
||||
"term.audioControls": "Configuración volumen",
|
||||
"term.clearAll": "Borrar todo",
|
||||
"term.recentStations": "Estaciones Recientes",
|
||||
"term.personalStations": "Estaciones Personales",
|
||||
"term.amLive": "Apple Music Live",
|
||||
"term.language": "Idioma",
|
||||
"term.funLanguages": "Idiomas Fun (Parodias)",
|
||||
"term.noLyrics": "Cargando... / Letras no encontradas./ Instrumental.",
|
||||
|
@ -130,7 +151,7 @@
|
|||
"term.socialTeam": "Equipo Social",
|
||||
"term.socials": "Redes Sociales",
|
||||
"term.contributors": "Contribuidores",
|
||||
"term.equalizer": "Equalizador",
|
||||
"term.equalizer": "Ecualizador",
|
||||
"term.reset": "Reiniciar",
|
||||
"term.tracks": "Pistas",
|
||||
"term.track": {
|
||||
|
@ -139,124 +160,176 @@
|
|||
},
|
||||
"term.videos": "Videos",
|
||||
"term.menu": "Menú",
|
||||
"term.themeManaged": "Administrado por un Tema",
|
||||
"term.check": "Comprobar",
|
||||
"term.aboutArtist": "Acerca de {{artistName}}",
|
||||
"term.topResult": "Mejor resultado",
|
||||
"term.sharedPlaylists": "Listas de reproducción compartidas",
|
||||
"term.topResult": "Mejor Resultado",
|
||||
"term.sharedPlaylists": "Listas de Reproducción Compartidas",
|
||||
"term.people": "Personas",
|
||||
"term.newpreset.name": "Nuevo nombre de preajuste de ecualizador",
|
||||
"term.addedpreset": "Preajuste agregado",
|
||||
"term.deletepreset.warn": "¿Estas seguro de que quieres eliminar este preajuste?",
|
||||
"term.deletedpreset": "Preajuste eliminado",
|
||||
"term.defaultPresets": "Preajustes predeterminados",
|
||||
"term.userPresets": "Preajustes de usuario",
|
||||
"term.newpreset.name": "Nuevo nombre de Preset de Ecualizador",
|
||||
"term.addedpreset": "Preset Agregado",
|
||||
"term.deletepreset.warn": "¿Estas seguro de que quieres eliminar este Preset?",
|
||||
"term.deletedpreset": "Preset Eliminado",
|
||||
"term.defaultPresets": "Preset Predeterminados",
|
||||
"term.userPresets": "Preset de Usuario",
|
||||
"term.requestError": "Hubo un problema con la solicitud.",
|
||||
"term.song.link.generate": "Obtener URL de la Canción compartida...",
|
||||
"term.musicVideos": "Videos de Música",
|
||||
"term.musicVideos": "Videos Musicales",
|
||||
"term.stations": "Estaciones",
|
||||
"term.curators": "Curadores",
|
||||
"term.appleCurators": "Curadores de Apple",
|
||||
"term.radioShows": "Programas de Radio",
|
||||
"term.recordLabels": "Etiquetas discográficas",
|
||||
"term.recordLabels": "Etiquetas Discográficas",
|
||||
"term.videoExtras": "Extras de Video",
|
||||
"term.top": "Top",
|
||||
"term.version": "Version",
|
||||
"term.noVideos": "No hay videos disponibles.",
|
||||
"term.plugin": "Plug-in",
|
||||
"term.pluginMenu": "Plug-in Menu",
|
||||
"term.pluginMenu.none": "Sin plugins interactivos",
|
||||
"term.replay": "Repetir",
|
||||
"term.uniqueAlbums": "Álbumes únicos",
|
||||
"term.uniqueArtists": "Artistas únicos",
|
||||
"term.uniqueSongs": "Canciones únicas",
|
||||
"term.topArtists": "Artistas Principales",
|
||||
"term.listenedTo": "Escuchado:",
|
||||
"term.version": "Versión",
|
||||
"term.noVideos": "No hay Videos Disponibles.",
|
||||
"term.plugins": "Plugins",
|
||||
"term.plugin": "Plugin",
|
||||
"term.pluginMenu": "Plugins Menú",
|
||||
"term.pluginMenu.none": "Sin Plugins Interactivos",
|
||||
"term.replay": "Replay",
|
||||
"term.uniqueAlbums": "Álbumes Únicos",
|
||||
"term.uniqueArtists": "Artistas Únicos",
|
||||
"term.uniqueSongs": "Canciones Únicas",
|
||||
"term.topArtists": "Mejores Artistas",
|
||||
"term.listenedTo": "Escuchando a:",
|
||||
"term.times": "Veces",
|
||||
"term.topAlbums": "Mejores álbumes",
|
||||
"term.topAlbums": "Mejores Álbumes",
|
||||
"term.plays": "Reproducciones",
|
||||
"term.topGenres": "Mejores Géneros",
|
||||
"term.confirmLogout": "¿Estás seguro de que quieres cerrar sesión?",
|
||||
"term.creditDesignedBy": "Diseñado por ${authorUsername}",
|
||||
"term.discNumber": "Disco ${discNumber}",
|
||||
"home.title": "Hogar",
|
||||
"term.reload" : "¿ Recargar Cider ?",
|
||||
"term.toggleprivate" : "Cambiar a Sesión Privada",
|
||||
"term.webremote" : "Web Remoto",
|
||||
"term.cast" : "Transmitir",
|
||||
"term.cast2" : "Transmitir a los Dispositivos",
|
||||
"term.quit" : "Salir",
|
||||
"term.zoomin" : "Acercar",
|
||||
"term.zoomout" : "Alejar",
|
||||
"term.zoomreset" : "Restablecer",
|
||||
"term.fullscreen" : "Pantalla Completa",
|
||||
"term.nowPlaying": "Reproduciendo Ahora",
|
||||
"home.syncFavorites": "Sincronizar Favoritos",
|
||||
"home.syncFavorites.gettingArtists": "Consiguiendo Artistas Favoritos...",
|
||||
"action.favorite": "Favorito",
|
||||
"action.removeFavorite": "Eliminar Favorito",
|
||||
"action.refresh": "Actualizar",
|
||||
"home.title": "Inicio",
|
||||
"home.recentlyPlayed": "Escuchado Recientemente",
|
||||
"home.recentlyAdded": "Agregado Recientemente",
|
||||
"home.artistsFeed": "Tu feed de artistas",
|
||||
"home.artistsFeed.noArtist": "Sigue a algunos artistas para ver sus últimos lanzamientos",
|
||||
"home.madeForYou": "Hecho para ti",
|
||||
"home.friendsListeningTo": "Amigos escuchando",
|
||||
"home.followedArtists": "Artistas seguidos",
|
||||
"error.appleMusicSubRequired": "Apple Music requiere una suscripción.",
|
||||
"home.artistsFeed": "Tu Feed de artistas",
|
||||
"home.artistsFeed.noArtist": "Sigue a algunos Artistas para ver sus Últimos Lanzamientos",
|
||||
"home.madeForYou": "Hecho para Ti",
|
||||
"home.friendsListeningTo": "Amigos Escuchando",
|
||||
"home.followedArtists": "Artistas Seguidos",
|
||||
"error.appleMusicSubRequired": "Apple Music Requiere una Suscripción.",
|
||||
"error.connectionError": "Hubo un problema al conectarse a Apple Music.",
|
||||
"error.noResults": "No hay resultados.",
|
||||
"error.noResults.description": "Prueba una nueva búsqueda",
|
||||
"error.noResults": "No hay Resultados.",
|
||||
"error.noResults.description": "Prueba una Nueva Búsqueda",
|
||||
"podcast.followOnCider": "Sigue en Cider",
|
||||
"podcast.followedOnCider": "Siguiendo en Cider",
|
||||
"podcast.subscribeOnItunes": "Suscríbete en iTunes",
|
||||
"podcast.subscribedOnItunes": "Suscrito en iTunes",
|
||||
"podcast.itunesStore": "Tienda de iTunes",
|
||||
"podcast.episodes": "Episodios",
|
||||
"podcast.playEpisode": "Reproducir episodio",
|
||||
"podcast.website": "Sitio web de podcasts",
|
||||
"action.addToLibrary": "Agregar a la biblioteca",
|
||||
"action.addToLibrary.success": "Agregado a la biblioteca",
|
||||
"action.addToLibrary.error": "Error al agregar a la biblioteca",
|
||||
"action.removeFromLibrary": "Eliminar de la biblioteca",
|
||||
"action.removeFromLibrary.success": "Eliminado de la biblioteca",
|
||||
"action.addToQueue": "Añadir a la cola",
|
||||
"action.addToQueue.success": "Agregado a la cola",
|
||||
"action.addToQueue.error": "Error al agregar a la cola",
|
||||
"action.removeFromQueue": "Eliminar de la cola",
|
||||
"action.removeFromQueue.success": "Eliminado de la cola",
|
||||
"action.removeFromQueue.error": "Error al eliminar de la cola",
|
||||
"podcast.playEpisode": "Reproducir Episodio",
|
||||
"podcast.website": "Sitio web de Podcasts",
|
||||
"action.hideLibrary": "Ocultar biblioteca",
|
||||
"action.showLibrary": "Mostrar biblioteca",
|
||||
"action.cut": "Cortar",
|
||||
"action.paste": "Pegar",
|
||||
"action.selectAll": "Seleccionar Todo",
|
||||
"action.delete": "Borrar",
|
||||
"action.edit": "Editar",
|
||||
"action.done": "Hecho",
|
||||
"action.submit": "Enviar",
|
||||
"action.editTracklist": "Editar Lista de Canciones",
|
||||
"action.addToLibrary": "Agregar a la Biblioteca",
|
||||
"action.addToLibrary.success": "Agregado a la Biblioteca",
|
||||
"action.addToLibrary.error": "Error al agregar a la Biblioteca",
|
||||
"action.removeFromLibrary": "Eliminar de la Biblioteca",
|
||||
"action.removeFromLibrary.success": "Eliminado de la Biblioteca",
|
||||
"action.addToQueue": "Agregar a la Cola",
|
||||
"action.addToQueue.success": "Agregado a la Cola",
|
||||
"action.addToQueue.error": "Error al Agregar a la Cola",
|
||||
"action.removeFromQueue": "Eliminar de la Cola",
|
||||
"action.removeFromQueue.success": "Eliminado de la Cola",
|
||||
"action.removeFromQueue.error": "Error al Eliminar de la Cola",
|
||||
"action.createPlaylist": "Crear una nueva lista de reproducción",
|
||||
"action.addToPlaylist": "Agregar a lista de reproducción",
|
||||
"action.removeFromPlaylist": "Eliminar de la lista de reproducción",
|
||||
"action.addToFavorites": "Agregar a favoritos",
|
||||
"action.addToFavorites": "Agregar a Favoritos",
|
||||
"action.follow": "Seguir",
|
||||
"action.follow.success": "Siguiendo",
|
||||
"action.follow.error": "Error al seguir",
|
||||
"action.unfollow": "Dejar de seguir",
|
||||
"action.unfollow.success": "Dejando de seguir",
|
||||
"action.unfollow.error": "Error al dejar de seguir",
|
||||
"action.playNext": "Reproducir siguiente",
|
||||
"action.playLater": "Reproducir más tarde",
|
||||
"action.follow.error": "Error al Seguir",
|
||||
"action.unfollow": "Dejar de Seguir",
|
||||
"action.unfollow.success": "Dejando de Seguir",
|
||||
"action.unfollow.error": "Error al dejar de Seguir",
|
||||
"action.playNext": "Reproducir Siguiente",
|
||||
"action.playLater": "Reproducir Más Tarde",
|
||||
"action.startRadio": "Iniciar Radio",
|
||||
"action.goToArtist": "Ir al artista",
|
||||
"action.goToAlbum": "Ir al álbum",
|
||||
"action.showInPlaylist": "Mostrar en lista de reproducción",
|
||||
"action.goToArtist": "Ir al Artista",
|
||||
"action.goToAlbum": "Ir al Álbum",
|
||||
"action.showInPlaylist": "Mostrar en Lista de Reproducción",
|
||||
"action.showInAppleMusic": "Mostrar en Apple Music",
|
||||
"action.moveToTop": "Mover fuera de la carpeta",
|
||||
"action.moveToTop": "Mover fuera de la Carpeta",
|
||||
"action.share": "Compartir",
|
||||
"action.rename": "Renombrar",
|
||||
"action.love": "Love",
|
||||
"action.unlove": "Unlove",
|
||||
"action.dislike": "Dislike",
|
||||
"action.undoDislike": "Undo dislike",
|
||||
"action.showWebRemoteQR": "Web Remota",
|
||||
"action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} pistas siguientes",
|
||||
"action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} pistas mas tarde",
|
||||
"action.removeTracks": "Eliminar ${self.selectedItems.length} pistas de la cola",
|
||||
"action.love": "Me Gusta",
|
||||
"action.unlove": "No Me Gusta",
|
||||
"action.dislike": "Recomendar menos este contenido",
|
||||
"action.undoDislike": "Recomendar mas este contenido",
|
||||
"action.showWebRemoteQR": "Web Remoto",
|
||||
"action.playTracksNext": "Reproducir ${app.selectedMediaItems.length} Pistas Siguientes",
|
||||
"action.playTracksLater": "Reproducir ${app.selectedMediaItems.length} Pistas mas tarde",
|
||||
"action.removeTracks": "Eliminar ${self.selectedItems.length} Pistas de la Cola",
|
||||
"action.import": "Importar",
|
||||
"action.export": "Exportar",
|
||||
"action.showAlbum": "Mostrar Album Completo",
|
||||
"action.showAlbum": "Mostrar Álbum Completo",
|
||||
"action.tray.minimize": "Minimizar a la bandeja",
|
||||
"action.tray.quit": "Abandonar",
|
||||
"action.tray.show": "Mostrar Cider",
|
||||
"action.tray.listento": "Escuchando a:",
|
||||
"action.update": "Actualizar",
|
||||
"action.install": "Instalar",
|
||||
"action.copy": "Copiar",
|
||||
"action.newpreset": "Nuevo preset...",
|
||||
"action.newpreset": "Nuevo Preset...",
|
||||
"action.deletepreset": "Borrar Preset",
|
||||
"action.open": "Abrir",
|
||||
"action.relaunch.confirm": "¿Quieres reabrir Cider?",
|
||||
"action.close": "Cerrar",
|
||||
"action.relaunch.confirm": "¿ Quieres reiniciar Cider ?",
|
||||
"action.cast.chromecast": "Chromecast",
|
||||
"action.cast.todevices": "Transmitir a los dispositivos",
|
||||
"action.cast.stop": "Dejar de transmitir a todos los dispositivos",
|
||||
"action.cast.todevices": "Transmitir a los Dispositivos",
|
||||
"action.cast.stop": "Dejar de transmitir a todos los Dispositivos",
|
||||
"action.cast.airplay": "AirPlay",
|
||||
"action.cast.airplay.underdevelopment": "AirPlay todavía está en desarrollo",
|
||||
"action.cast.scan": "Escanear",
|
||||
"action.cast.scanning": "Escaneando...",
|
||||
"action.createNew": "Crear Nuevo...",
|
||||
"action.openArtworkInBrowser": "Abrir Ilustración en el Navegador",
|
||||
"action.scrollToTop": "Ir al inicio",
|
||||
"menubar.options.view": "Ver",
|
||||
"menubar.options.reload": "Recargar",
|
||||
"menubar.options.forcereload": "Forzar Recarga",
|
||||
"menubar.options.toggledevtools": "Herramientas de Desarrollo",
|
||||
"menubar.options.window": "Ventana",
|
||||
"menubar.options.minimize": "Minimizar",
|
||||
"menubar.options.plugins": "Menú de Plugins",
|
||||
"menubar.options.controls": "Controles",
|
||||
"menubar.options.volumeup": "Subir Volumen",
|
||||
"menubar.options.volumedown": "Bajar Volumen",
|
||||
"menubar.options.account": "Cuenta",
|
||||
"menubar.options.signout": "Cerrar Sesión",
|
||||
"menubar.options.support": "Soporte",
|
||||
"menubar.options.report": "Reportar a...",
|
||||
"menubar.options.bug": "Bug",
|
||||
"menubar.options.feature": "Solicitud de características",
|
||||
"menubar.options.trans": "Solicitud de Informe/Traducción",
|
||||
"menubar.options.license": "Ver licencia",
|
||||
"menubar.options.conf": "Abrir archivo de configuración en el editor",
|
||||
"menubar.options.zoom": "Zoom",
|
||||
"settings.header.general": "General",
|
||||
"settings.header.general.description": "Ajuste la configuración general de Cider.",
|
||||
"settings.option.general.language": "Idioma",
|
||||
|
@ -266,18 +339,52 @@
|
|||
"settings.option.general.resumebehavior.locally.description": "Cider reanudará su última sesión en esta PC.",
|
||||
"settings.option.general.resumebehavior.history": "Histórico",
|
||||
"settings.option.general.resumebehavior.history.description": "Cider pondrá en cola la última canción de su historial general de Apple Music, en todos sus dispositivos.",
|
||||
"settings.option.general.resumetabs": "Abrir pestaña al iniciar",
|
||||
"settings.option.general.resumetabs.description": "Puede elegir qué pestaña desea abrir cuando inicie Cider.",
|
||||
"settings.option.general.resumetabs.dynamic": "Dinámico",
|
||||
"settings.option.general.resumetabs.dynamic.description": "Cider abrirá la pestaña que utilizó por última vez.",
|
||||
"settings.option.general.language.main": "Idiomas",
|
||||
"settings.option.general.language.fun": "Idiomas Fun (Parodias)",
|
||||
"settings.option.general.language.unsorted": "Sin Clasificar",
|
||||
"settings.option.general.customizeSidebar": "Personalizar elementos de la barra lateral",
|
||||
"settings.option.general.customizeSidebar.customize": "Personalizar",
|
||||
"settings.option.general.keybindings": "Combinaciones de Teclas",
|
||||
"settings.option.general.keybindings.library": "Biblioteca",
|
||||
"settings.option.general.keybindings.session": "Sesión",
|
||||
"settings.option.general.keybindings.control": "Controles",
|
||||
"settings.option.general.keybindings.interface": "Interfaz",
|
||||
"settings.option.general.keybindings.advanced": "Avanzado",
|
||||
"settings.option.general.keybindings.pressCombination": "Presione una combinación de dos teclas para actualizar la combinación de teclas.",
|
||||
"settings.option.general.keybindings.pressEscape": "Pulse la tecla Escape para volver.",
|
||||
"settings.notyf.general.keybindings.update.success": "Combinación de teclas actualizada correctamente",
|
||||
"settings.prompt.general.keybindings.update.success": "La combinación de teclas se actualizó correctamente. Pulsa OK para reiniciar Cider",
|
||||
"settings.option.general.themeUpdateNotification": "Buscar actualizaciones de temas automáticamente",
|
||||
"settings.option.general.showLovedTracksInline": "Mostrar pistas favoritas en la línea",
|
||||
"settings.description.search": "Buscar",
|
||||
"settings.description.albums": "Álbumes de la biblioteca",
|
||||
"settings.description.artists": "Artistas de la biblioteca",
|
||||
"settings.description.browse": "Navegar",
|
||||
"settings.description.private": "Cambiar a Sesión Privada",
|
||||
"settings.description.remote": "Web Remoto",
|
||||
"settings.description.audio": "Configuraciones de Audio",
|
||||
"settings.description.plugins": "Menú de Plugins",
|
||||
"settings.description.cast": "Transmitir a los Dispositivos",
|
||||
"settings.description.settings": "Configuraciones",
|
||||
"settings.description.developer": "Herramientas para Desarrolladores",
|
||||
"settings.description.listnow": "Escuchar Ahora",
|
||||
"settings.description.recentAdd": "Agregadas Recientemente",
|
||||
"settings.description.songs": "Canciones",
|
||||
"settings.notyf.updateCider.update-not-available": "No hay actualizaciones disponibles",
|
||||
"settings.notyf.updateCider.update-downloaded": "La actualización se ha descargado, reinicie para aplicarla",
|
||||
"settings.notyf.updateCider.update-downloaded": "La actualización se ha descargado, Reinicie para aplicarla",
|
||||
"settings.notyf.updateCider.update-timeout": "Tiempo de espera agotado para actualizar Cider",
|
||||
"settings.header.audio": "Audio",
|
||||
"settings.header.audio.description": "Ajuste la configuración de audio para Cider.",
|
||||
"settings.option.audio.volumeStep": "Paso de Volumen",
|
||||
"settings.option.audio.volumeStep": "Pasos de Volumen",
|
||||
"settings.option.audio.advanced": "Control de Volumen Avanzado",
|
||||
"settings.option.audio.maxVolume": "Volumen Máximo",
|
||||
"settings.option.audio.changePlaybackRate": "Cambiar la Velocidad de Reproducción",
|
||||
"settings.option.audio.playbackRate": "Velocidad de Reproducción",
|
||||
"settings.option.audio.playbackRate.change": "Cambiar",
|
||||
"settings.option.audio.quality": "Calidad de Audio",
|
||||
"settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
|
||||
"settings.header.audio.quality.hireslossless.description": "arriba de 24-bit/192 kHz",
|
||||
|
@ -289,40 +396,69 @@
|
|||
"settings.header.audio.quality.standard.description": "64 kbps",
|
||||
"settings.option.audio.seamlessTransition": "Transición de audio sin interrupciones",
|
||||
"settings.option.audio.enableAdvancedFunctionality": "Habilitar funcionalidad avanzada",
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como normalización de audio, ecualizadores y visualizadores; sin embargo, en algunos sistemas esto puede causar interrupciones en las pistas de audio.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider cree que su PC no puede manejar estas funciones. ¿Estás seguro de que quieres continuar?",
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "Habilitar la funcionalidad de AudioContext permitirá funciones de audio extendidas como Normalización de Audio, Ecualizadores y Visualizadores. Sin embargo, en algunos sistemas esto puede causar interrupciones en las pistas de audio.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider cree que su PC no puede manejar estas funciones. ¿ Estás seguro de que quieres continuar ?",
|
||||
"settings.option.audio.audioLab": "Cider Audio Lab",
|
||||
"settings.option.audio.audioLab.description": "Una variedad de efectos de audio desarrollados internamente para Cider.",
|
||||
"settings.warn.audioLab.withoutAF": "Se requiere AudioContext (funcionalidad avanzada) para habilitar Laboratorio de audio de Cider.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calidez analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula la calidez analógica inspirada en el Korg Nutube 6P1",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidad de calidez analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Cambia la intensidad del procesamiento del módulo de Calidez analógica",
|
||||
"settings.option.audio.audioLab.description": "Una variedad de efectos de Audio desarrollados internamente para Cider.",
|
||||
"settings.option.audio.audioLab.subheader": "Designed by Cider Acoustic Technologies in California",
|
||||
"settings.warn.audioLab.withoutAF": "Se requiere AudioContext (funcionalidad avanzada) para habilitar Cider Audio Lab.",
|
||||
"settings.warn.enableAdvancedFunctionality": "AudioContext (funcionalidad avanzada) es necesaria para Habilitar esta Característica.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Calidez Analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Simula la Calidez Analógica inspirada en el Korg Nutube 6P1",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Intensidad de Calidez Analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Cambia la intensidad del procesamiento del módulo de Calidez Analógica",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Suave",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Calido",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™️",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Realiza una Atmósfera musical diferente modelada a partir de las configuraciones de audio de última generación.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™️ Mode",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Cambia el modo de funcionamiento del módulo Atmosphere Realizer.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Té De Espuma de Queso Hōjicha",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Té con Leche de Tapioca Genmaicha",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Té De Espuma De Queso Con Sal de Roca",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Té con Leche Uji Matcha",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jazmín Macchiato",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Té de leche de Hokkaido",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Pastel Suave de Luz de Luna",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Leche Creme Brûlée de Azúcar Morena",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis de Cerezas",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Abrazo de Calidez",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Mejora la calidad de audio percibida del audio AAC de 256 kbps mediante el uso de un algoritmo en tiempo real que aprovecha los modelos psicoacústicos de la audición humana y las características de codificación AAC.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP no es compatible con la espacialización. Desactive la espacialización para continuar.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Intensidad de CAP",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Mejora la calidad de audio percibida del codificador de audio en AAC mediante el uso de un algoritmo en 'Tiempo Real' que aprovecha los modelos psicoacústicos de la audición humana y las características de codificación de AAC.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP no es compatible con la Espacialización. Desactive la Espacialización para continuar.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Fuerza de CAP",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Cambia la intensidad del procesamiento realizado en el audio. (Agresivo puede producir resultados no deseados)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Estándar",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptativo",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Legacy",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresivo",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalización de audio",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza el volumen máximo de pistas individuales para crear una experiencia auditiva más uniforme. (No funciona en las pistas cargadas por el usuario)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza el volumen máximo de las Canciones individuales para crear una experiencia auditiva más uniforme. (No funciona en las Canciones cargadas por el usuario)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Gestionado por AudioLab",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider Tuned Spatialization",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efecto de preajuste de espacialización, deshabilita la configuración personalizable de la espacialización de audio. La espacialización debe estar habilitada como requisito previo.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Espacialización ajustada de Cider",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "Efecto de Preajuste de espacialización, desactiva la configuración personalizable de espacialización de audio.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Perfil de espacialización de Cider",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Cambia el Perfil de Ajuste de Espacialización.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Estándar",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Cambia el Perfil de Ajuste de la Espacialización.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Estandar",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Estudio de Sonido",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separación",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Mínimo",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiófilo",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Difuso",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "La espacialización no es compatible con CAP. Deshabilite CAP para continuar.",
|
||||
"settings.option.audio.dbspl.display": "Visualización de dB SPL",
|
||||
"settings.option.audio.dbspl.description": "(Solo para usuarios avanzados) Muestra dB SPL en lugar de dBFS en el control deslizante de Volumen.",
|
||||
"settings.option.audio.dbfs.calibration": "Calibración de 0 dBFS",
|
||||
"settings.option.audio.dbfs.description": "Ingrese el Pico de dB SPL con 'Ponderación Z' cuando Cider esté en 0 dBFS.",
|
||||
"settings.header.visual": "Visual",
|
||||
"settings.header.visual.description": "Ajuste la configuración visual de Cider.",
|
||||
"settings.option.visual.windowStyle": "Estilo de ventana",
|
||||
"settings.option.visual.windowBackgroundStyle": "Estilo de fondo de ventana",
|
||||
"settings.option.visual.windowStyle": "Estilo de Ventana",
|
||||
"settings.option.visual.windowBackgroundStyle": "Estilo de Fondo de Ventana",
|
||||
"settings.header.visual.windowBackgroundStyle.none": "Ninguno",
|
||||
"settings.header.visual.windowBackgroundStyle.artwork": "ilustracion",
|
||||
"settings.header.visual.windowBackgroundStyle.artwork": "ilustración",
|
||||
"settings.header.visual.windowBackgroundStyle.image": "Imagen",
|
||||
"settings.option.visual.animatedArtwork": "Ilustración Animada",
|
||||
"settings.header.visual.animatedArtwork.always": "Siempre",
|
||||
|
@ -334,19 +470,29 @@
|
|||
"settings.header.visual.animatedArtworkQuality.high": "Alto",
|
||||
"settings.header.visual.animatedArtworkQuality.veryHigh": "Muy alto",
|
||||
"settings.header.visual.animatedArtworkQuality.extreme": "Extremo",
|
||||
"settings.option.visual.animatedWindowBackground": "Fondo de ventana animado",
|
||||
"settings.option.visual.hardwareAcceleration": "Aceleracion de hardware",
|
||||
"settings.option.visual.animatedWindowBackground": "Fondo de Ventana Animado",
|
||||
"settings.option.visual.hardwareAcceleration": "Aceleración de Hardware",
|
||||
"settings.option.visual.hardwareAcceleration.description": "Requiere reinicio",
|
||||
"settings.header.visual.hardwareAcceleration.default": "Por defecto",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
||||
"settings.option.visual.uiscale": "Escalado de IU",
|
||||
"settings.header.visual.theme": "Tema",
|
||||
"settings.option.visual.theme.github.download": "Instalar desde la URL de GitHub",
|
||||
"settings.option.visual.theme.github.explore": "Explorar temas de GitHub",
|
||||
"settings.option.visual.theme.github.openfolder": "Abrir Carpeta de Temas",
|
||||
"settings.option.visual.theme.github.explore": "Explorar Temas de GitHub",
|
||||
"settings.header.visual.theme.github.page": "Temas de GitHub",
|
||||
"settings.option.visual.theme.github.install.confirm": "¿Está seguro de que desea instalar {{ repo }}?",
|
||||
"settings.prompt.visual.theme.github.URL": "Ingrese la URL del tema que desea instalar",
|
||||
"settings.notyf.visual.theme.install.success": "Tema instalado correctamente",
|
||||
"settings.notyf.visual.theme.install.error": "La instalación del tema falló",
|
||||
"settings.option.visual.theme.github.install.confirm": "¿ Está seguro de que desea instalar {{ repo }} ?",
|
||||
"settings.prompt.visual.theme.github.URL": "Introduce la URL del tema que quieres instalar",
|
||||
"settings.prompt.visual.theme.uninstallTheme": "¿ Estas seguro que lo quieres desinstalar {{ theme }} ?",
|
||||
"settings.option.visual.theme.checkForUpdates": "Buscar actualizaciones",
|
||||
"settings.header.visual.styles": "Estilos",
|
||||
"settings.option.visual.theme.manageStyles": "Gestionar Estilos",
|
||||
"settings.option.visual.theme.uninstall": "Desinstalar",
|
||||
"settings.option.visual.theme.viewInfo": "Ver Información",
|
||||
"settings.option.visual.theme.github.available": "Disponible",
|
||||
"settings.option.visual.theme.github.applied": "Aplicado",
|
||||
"settings.notyf.visual.theme.install.success": "Tema Instalado Correctamente",
|
||||
"settings.notyf.visual.theme.install.error": "La Instalación del Tema Falló",
|
||||
"settings.header.visual.plugin": "Plugin",
|
||||
"settings.option.visual.plugin.github.download": "Instalar desde la URL de GitHub",
|
||||
"settings.option.visual.plugin.github.explore": "Explorar Plugins de GitHub",
|
||||
|
@ -355,7 +501,7 @@
|
|||
"settings.prompt.visual.plugin.github.URL": "Ingrese la URL del tema que desea instalar",
|
||||
"settings.prompt.visual.plugin.github.success": "El Plugin instalado correctamente, Presione OK para reiniciar Cider",
|
||||
"settings.notyf.visual.plugin.install.success": "El Plugin instalado correctamente",
|
||||
"settings.notyf.visual.plugin.install.error": "La instalación del Plugin falló",
|
||||
"settings.notyf.visual.plugin.install.error": "La instalación del Plugin Falló",
|
||||
"settings.option.visual.theme.default": "Cider",
|
||||
"settings.option.visual.theme.dark": "Oscuro",
|
||||
"settings.option.visual.showPersonalInfo": "Mostrar información personal",
|
||||
|
@ -364,7 +510,7 @@
|
|||
"settings.option.window.openOnStartup": "Abrir Cider al Iniciar",
|
||||
"settings.option.window.openOnStartup.hidden": "Abrir oculto",
|
||||
"settings.option.window.useNativeTitleBar": "Usar barra de título nativa",
|
||||
"settings.option.window.windowControlStyle": "Estilo de control de ventanaEstilo de control de ventana",
|
||||
"settings.option.window.windowControlStyle": "Estilo de control de ventana",
|
||||
"settings.option.window.windowControlStyle.right": "Derecha",
|
||||
"settings.option.window.windowControlStyle.left": "Izquierda",
|
||||
"settings.header.lyrics": "Letras",
|
||||
|
@ -373,17 +519,30 @@
|
|||
"settings.option.lyrics.enableMusixmatchKaraoke": "Habilitar el modo Karaoke (solo Musixmatch)",
|
||||
"settings.option.lyrics.musixmatchPreferredLanguage": "Idioma preferido de traducción de Musixmatch",
|
||||
"settings.option.lyrics.enableYoutubeLyrics": "Habilitar letras de YouTube para videos musicales",
|
||||
"settings.option.lyrics.enableQQLyrics": "Habilitar letras de QQ",
|
||||
"settings.header.connectivity": "Conectividad",
|
||||
"settings.header.connectivity.description": "Ajuste la configuración de conectividad para Cider.",
|
||||
"settings.option.connectivity.playbackNotifications": "Notificaciones de Reproducción",
|
||||
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
|
||||
"settings.option.connectivity.playbackNotifications": "Notificaciones de reproducción",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "Borrar Discord Rich Presence en Pausa",
|
||||
"settings.option.connectivity.discordRPC.clientName": "Nombre del Cliente",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "Borrar Discord Rich Presence en pausa",
|
||||
"settings.option.connectivity.discordRPC.hideButtons": "Ocultar botones en Discord Rich Presence",
|
||||
"settings.option.connectivity.discordRPC.hideTimestamp": "Ocultar Marca de Tiempo en Discord Rich Presence",
|
||||
"settings.option.connectivity.discordRPC.detailsFormat": "Formato de los detalles",
|
||||
"settings.option.connectivity.discordRPC.stateFormat": "Formato de Estado",
|
||||
"settings.option.connectivity.discordRPC.reload": "Recargar Discord RPC",
|
||||
"settings.option.connectivity.discordRPC.reconnectedToUser": "Discord RPC reconectando al usuario: {{user}} ({{userid}})",
|
||||
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm Retraso de Scrobble (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Activar Last.fm Now Playing",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Eliminar artistas destacados del título de la canción (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar pista en bucle (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "Evite que las pistas en bucle se scrobblen o se muestren en la lista Now Playing en Last.fm.",
|
||||
"settings.option.connectivity.lastfmScrobble.filterTypes": "Tipos de Filtros de Medios (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.manualToken": "Ingrese el token de Last.fm Manualmente",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.fm Tiempo de Conexión agotado",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.fm Conexión exitosa",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connecting": "Conectando a Last.fm...",
|
||||
"settings.header.debug": "Debug",
|
||||
"settings.option.debug.copy_log": "Copiar Logs al portapapeles",
|
||||
"settings.option.debug.openAppData": "Abrir carpeta de Cider",
|
||||
|
@ -393,16 +552,25 @@
|
|||
"settings.option.experimental.reinstallwidevine.confirm": "¿Estás seguro de que quieres reinstalar Widevine?",
|
||||
"settings.option.experimental.unknownPlugin": "Fuentes desconocidas",
|
||||
"settings.option.experimental.unknownPlugin.description": "Permitir la instalación de Plugins desde otros repos que no sean el repositorio de Plugins de Cider",
|
||||
"settings.option.experimental.compactUI": "UI compacta",
|
||||
"settings.option.experimental.compactUI": "UI Compacto",
|
||||
"settings.option.window.close_button_hide": "El botón Cerrar oculta la aplicación",
|
||||
"settings.option.window.maxElementScale": "Escala Máxima de Elementos",
|
||||
"settings.option.experimental.inline_playlists": "Álbumes y listas de reproducción en línea",
|
||||
"settings.option.advanced.playlistTrackMapping": "Mapeo de pistas de listas de reproducción",
|
||||
"settings.option.advanced.playlistTrackMapping.description": "Habilita el escaneo profundo de las listas de reproducción para determinar qué pistas están en qué listas de reproducción. Los tiempos de creación de la caché de la lista de reproducción pueden aumentar significativamente.",
|
||||
"settings.option.visual.transparent": "Marco transparente",
|
||||
"settings.option.visual.transparent.description": "Necesita compatibilidad con temas, requiere reiniciar",
|
||||
"settings.option.visual.customAccentColor": "Color de Acento Personalizado",
|
||||
"settings.option.visual.accentColor": "Color de Acento",
|
||||
"settings.option.visual.purplePodcastPlaybackBar": "Barra de Reproducción Morada para Podcasts",
|
||||
"settings.option.visual.windowColor": "Color de Tinte de Ventana",
|
||||
"settings.header.visual.windowBackgroundStyle.color": "Matiz de Color",
|
||||
"settings.header.advanced": "Avanzado",
|
||||
"spatial.notTurnedOn": "La espacialización de audio está deshabilitada. Para usar, habilítelo primero.",
|
||||
"spatial.spatialProperties": "Propiedades de Espacializacion",
|
||||
"settings.header.connect": "Conectar",
|
||||
"settings.option.connect.link_account": "Habilitar sincronización con Cider Connect",
|
||||
"settings.option.connect.link_account.description": "Vincular su cuenta de Discord con Cider Connect le permite almacenar datos de usuario que incluyen configuraciones, ecualizadores y eventualmente más, una vez que haya terminado. (Trabajo en progreso)",
|
||||
"spatial.notTurnedOn": "La Espacialización de audio está deshabilitada. Para usar, habilítelo primero.",
|
||||
"spatial.spatialProperties": "Propiedades de Espacialización",
|
||||
"spatial.width": "Ancho",
|
||||
"spatial.height": "Alto",
|
||||
"spatial.depth": "Profundidad",
|
||||
|
@ -431,7 +599,46 @@
|
|||
"share.platform.whatsapp": "WhatsApp",
|
||||
"share.platform.messenger": "Messenger",
|
||||
"share.platform.email": "Email",
|
||||
"share.platform.songLink": "Copy with song.link",
|
||||
"share.platform.songLink": "Copiar con song.link",
|
||||
"share.platform.clipboard": "Copiar link",
|
||||
"about.thanks": "Muchas gracias al equipo de Cider Collective y a todos nuestros colaboradores."
|
||||
"about.thanks": "Muchas gracias al equipo de Cider Collective y a Todos nuestros colaboradores.",
|
||||
"oobe.yes": "Sí",
|
||||
"oobe.no": "No",
|
||||
"oobe.next": "Siguiente",
|
||||
"oobe.previous": "Anterior",
|
||||
"oobe.done": "Hecho",
|
||||
"oobe.amupsell.title": "Antes de Empezar",
|
||||
"oobe.amupsell.text": "Cider Requiere una Suscripción paga Activa a Apple Music\nCider NO funcionará con Apple Music Voice Plan ni con algunas suscripciones de prueba promocionales. Si ya tiene una suscripción calificada de Apple Music, haga click en Siguiente para continuar.",
|
||||
"oobe.amupsell.subscribeBtn": "Suscríbete a Apple Music",
|
||||
"oobe.amupsell.explainBtn": "Explique",
|
||||
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
|
||||
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
|
||||
"oobe.amupsell.promoExplained": "Algunas suscripciones de Apple Music promocionales y de prueba fuera de EE.UU. no tienen acceso a las API del reproductor web de Apple Music necesarias para que Cider funcione. Para verificar si su versión de prueba activa funcionará con Cider, vaya a <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> inicie sesión e intente reproducir música. Si funciona, ¡genial! Está listo para usar Cider, sin embargo, si no considera suscribirse a Apple Music aquí: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
|
||||
"oobe.intro.title": "Bienvenido a Cider",
|
||||
"oobe.intro.subtitle": "",
|
||||
"oobe.intro.text": "Configuremos algunas cosas para que puedas usar Cider como quieras. Siempre puede cambiar esta configuración más tarde.",
|
||||
"oobe.general.title": "General",
|
||||
"oobe.general.subtitle": "",
|
||||
"oobe.general.text": "",
|
||||
"oobe.audio.title": "Audio",
|
||||
"oobe.audio.subtitle": "",
|
||||
"oobe.audio.text": "Cider cuenta con una pila de audio diseñada y afinada a medida que brinda una experiencia de audio rica y de alta calidad.\nCon Cider Adrenaline, Atmosphere Realizer y Spatialized Audio.\nPara habilitar esta funcionalidad, \"Funcionalidad de audio avanzada\" debe estar habilitada.\nHabilitar audio avanzado La funcionalidad le dará acceso a estas mejoras en Cider Audio Labs, que se encuentra en la configuración de la aplicación.",
|
||||
"oobe.audio.advancedFunctionality": "",
|
||||
"oobe.visual.title": "Visual",
|
||||
"oobe.visual.subtitle": "",
|
||||
"oobe.visual.text": "",
|
||||
"oobe.visual.layout.text": "Cider presenta dos diseños de ventana diferentes.\nMaverick es un diseño similar a iTunes con el reproductor en la parte superior de la ventana.\nMojave es un nuevo giro creado por Cider Collective.\n\nPuedes cambiar el diseño en cualquier momento en la configuración.",
|
||||
"oobe.visual.suggestingThemes": "La tematización es una excelente forma de personalizar tu experiencia. Aquí hay algunos que sugerimos: ",
|
||||
"oobe.visual.suggestingThemes.subtext": "(Estos temas se descargarán de GitHub)",
|
||||
"oobe.visual.suggestingThemes.default": "Cider",
|
||||
"oobe.visual.suggestingThemes.default.text": "El clásico tema de Cider.",
|
||||
"oobe.visual.suggestingThemes.dark": "Oscuro",
|
||||
"oobe.visual.suggestingThemes.dark.text": "Oscurisimo",
|
||||
"oobe.visual.suggestingThemes.community1": "Groovy",
|
||||
"oobe.visual.suggestingThemes.community1.text": "Un tema influenciado por WinUI",
|
||||
"oobe.visual.suggestingThemes.community2": "iTheme",
|
||||
"oobe.visual.suggestingThemes.community2.text": " El clásico diseño de frutas grandes.",
|
||||
"oobe.visual.suggestingThemes.community3": "Dracula",
|
||||
"oobe.visual.suggestingThemes.community3.text": "El icónico esquema de color de Drácula.",
|
||||
"oobe.amsignin.title": ""
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
"term.logout": "Déconnexion",
|
||||
"term.login": "Connexion",
|
||||
"term.quickNav": "Navigation rapide",
|
||||
"term.cast": "Diffuser",
|
||||
"term.about": "À propos",
|
||||
"term.privateSession": "Session privée",
|
||||
"term.disablePrivateSession": "Désactiver la session privée",
|
||||
|
@ -33,7 +32,7 @@
|
|||
"term.history": "Historique",
|
||||
"term.search": "Recherche",
|
||||
"term.library": "Bibliothèque",
|
||||
"term.listenNow": "Écoutez maintenant",
|
||||
"term.listenNow": "Écouter",
|
||||
"term.browse": "Explorer",
|
||||
"term.radio": "Radio",
|
||||
"term.recentlyAdded": "Ajouté récemment",
|
||||
|
@ -42,6 +41,7 @@
|
|||
"term.artists": "Artistes",
|
||||
"term.podcasts": "Podcasts",
|
||||
"term.playlists": "Playlists",
|
||||
"term.charts": "Classements",
|
||||
"term.playlist": "Playlist",
|
||||
"term.newPlaylist": "Nouvelle Playlist",
|
||||
"term.newPlaylistFolder": "Nouveau dossier de playlist",
|
||||
|
@ -51,7 +51,9 @@
|
|||
"term.navigateBack": "Naviguer en arrière",
|
||||
"term.navigateForward": "Naviguer en avant",
|
||||
"term.play": "Lecture",
|
||||
"term.playpause": "Lecture/Pause",
|
||||
"term.pause": "Pause",
|
||||
"term.stop": "Stop",
|
||||
"term.previous": "Précédent",
|
||||
"term.next": "Suivant",
|
||||
"term.shuffle": "Aléatoire",
|
||||
|
@ -130,6 +132,8 @@
|
|||
"term.audioControls": "Contrôles du volume",
|
||||
"term.clearAll": "Tout effacer",
|
||||
"term.recentStations": "Stations récentes",
|
||||
"term.personalStations": "Stations personnelles",
|
||||
"term.amLive": "Apple Music Live",
|
||||
"term.language": "Langue",
|
||||
"term.funLanguages": "Amusant",
|
||||
"term.noLyrics": "Chargement... / Paroles non trouvé./ Instrumental.",
|
||||
|
@ -150,6 +154,7 @@
|
|||
},
|
||||
"term.videos": "Vidéos",
|
||||
"term.menu": "Menu",
|
||||
"term.themeManaged": "Géré par un thème",
|
||||
"term.check": "Vérifier",
|
||||
"term.aboutArtist": "À propos de {{artistName}}",
|
||||
"term.topResult": "Meilleurs résultats",
|
||||
|
@ -174,7 +179,7 @@
|
|||
"term.version": "Version",
|
||||
"term.noVideos": "Aucune vidéo trouvée.",
|
||||
"term.plugin": "Plugin",
|
||||
"term.pluginMenu": "Plug-in Menu",
|
||||
"term.pluginMenu": "Menu des plugins",
|
||||
"term.pluginMenu.none": "Aucun plugin interactif",
|
||||
"term.replay": "Replay",
|
||||
"term.uniqueAlbums": "Albums uniques",
|
||||
|
@ -189,6 +194,16 @@
|
|||
"term.confirmLogout": "Êtes-vous sûr de vouloir vous déconnecter ?",
|
||||
"term.creditDesignedBy": "Conçu par ${authorUsername}",
|
||||
"term.discNumber": "Disque ${discNumber}",
|
||||
"term.reload": "Recharger Cider ?",
|
||||
"term.toggleprivate": "Activer/désactiver la session privée",
|
||||
"term.webremote": "Télécommande Web",
|
||||
"term.cast": "Diffuser",
|
||||
"term.cast2": "Diffuser sur des appareils",
|
||||
"term.quit": "Quitter",
|
||||
"term.zoomin": "Zoom avant",
|
||||
"term.zoomout": "Zoom Out",
|
||||
"term.zoomreset": "Zoom arrière",
|
||||
"term.fullscreen": "Plein écran",
|
||||
"home.title": "Accueil",
|
||||
"home.recentlyPlayed": "Joué récemment",
|
||||
"home.recentlyAdded": "Ajouté récemment",
|
||||
|
@ -209,9 +224,16 @@
|
|||
"podcast.episodes": "Épisodes",
|
||||
"podcast.playEpisode": "Lire l'épisode",
|
||||
"podcast.website": "Site du podcast",
|
||||
"action.hideLibrary": "Cacher la bibliothèque",
|
||||
"action.showLibrary": "Afficher la bibliothèque",
|
||||
"action.cut": "Couper",
|
||||
"action.paste": "Coller",
|
||||
"action.selectAll": "Tout sélectionner",
|
||||
"action.delete": "Supprimer",
|
||||
"action.edit": "Modifier",
|
||||
"action.done": "Terminé",
|
||||
"action.editTracklist": "Edit Tracklist",
|
||||
"action.submit": "Soumettre",
|
||||
"action.editTracklist": "Modifier la liste de morceaux",
|
||||
"action.addToLibrary": "Ajouter à la bibliothèque",
|
||||
"action.addToLibrary.success": "Ajouté à la bibliothèque",
|
||||
"action.addToLibrary.error": "Erreur lors de l'ajout à la bibliothèque",
|
||||
|
@ -275,45 +297,26 @@
|
|||
"action.createNew": "Créer un nouveau...",
|
||||
"action.openArtworkInBrowser": "Ouvrir la pochette d'album dans le navigateur",
|
||||
"action.scrollToTop": "Défiler vers le haut",
|
||||
"menubar.options.about": "À propos",
|
||||
"menubar.options.settings": "Paramètres",
|
||||
"menubar.options.quit": "Quitter Cider",
|
||||
"menubar.options.view": "Afficher ",
|
||||
"menubar.options.reload": "Recharger",
|
||||
"menubar.options.forcereload": "Rechargement forcé",
|
||||
"menubar.options.toggledevtools": "Activer les outils de développement",
|
||||
"menubar.options.window": "Fenêtre",
|
||||
"menubar.options.minimize": "Minimiser",
|
||||
"menubar.options.toggleprivate": "Activer la session privée",
|
||||
"menubar.options.webremote": "Télécommande Web",
|
||||
"menubar.options.audio": "Paramètres audio",
|
||||
"menubar.options.plugins": "Menu des plugins",
|
||||
"menubar.options.controls": "Contrôles",
|
||||
"menubar.options.next": "Suivant",
|
||||
"menubar.options.playpause": "Lecture/Pause",
|
||||
"menubar.options.previous": "Précédent",
|
||||
"menubar.options.volumeup": "Augmenter le volume",
|
||||
"menubar.options.volumedown": "Réduire le volume",
|
||||
"menubar.options.browse": "Parcourir",
|
||||
"menubar.options.artists": "Artistes",
|
||||
"menubar.options.search": "Search",
|
||||
"menubar.options.albums": "Albums",
|
||||
"menubar.options.cast": "Diffuser sur des appareils",
|
||||
"menubar.options.account": "Compte",
|
||||
"menubar.options.accountsettings": "Paramètres du compte",
|
||||
"menubar.options.signout": "Se déconnecter",
|
||||
"menubar.options.support": "Support",
|
||||
"menubar.options.discord": "Discord",
|
||||
"menubar.options.github": "Documentation GitHub",
|
||||
"menubar.options.report": "Remonter un(e)...",
|
||||
"menubar.options.bug": "Bug",
|
||||
"menubar.options.feature": "Demande de fonctionnalité",
|
||||
"menubar.options.trans": "Erreur/Demande de traduction",
|
||||
"menubar.options.license": "Voir la license",
|
||||
"menubar.options.conf": "Ouvrir le fichier de configuration dans l'éditeur",
|
||||
"menubar.options.listennow": "Écoutez maintenant",
|
||||
"menubar.options.recentlyAdded": "Ajouté récemment",
|
||||
"menubar.options.songs": "Musiques",
|
||||
"menubar.options.zoom": "Zoom",
|
||||
"settings.header.general": "Général",
|
||||
"settings.header.general.description": "Ajuster les paramètres généraux de Cider.",
|
||||
"settings.option.general.language": "Langue",
|
||||
|
@ -333,11 +336,15 @@
|
|||
"settings.option.general.customizeSidebar": "Personnaliser les éléments de la barre latérale",
|
||||
"settings.option.general.customizeSidebar.customize": "Personnalisez",
|
||||
"settings.option.general.keybindings": "Raccourcis clavier",
|
||||
"settings.option.general.keybindings.library": "Bibliothèque",
|
||||
"settings.option.general.keybindings.session": "Session",
|
||||
"settings.option.general.keybindings.control": "Contrôles",
|
||||
"settings.option.general.keybindings.interface": "Interface",
|
||||
"settings.option.general.keybindings.advanced": "Avancé",
|
||||
"settings.option.general.keybindings.pressCombination": "Appuyez sur une combinaison de deux touches pour mettre à jour la combinaison de touches.",
|
||||
"settings.option.general.keybindings.pressEscape": "Appuyez sur la touche Échap pour revenir en arrière.",
|
||||
"settings.notyf.general.keybindings.update.success": "Le raccourci clavier a bien été mis à jour",
|
||||
"settings.prompt.general.keybindings.update.success": "Le raccourci clavier a bien été mis à jour. Appuyez sur OK pour relancer Cider",
|
||||
"settings.option.general.keybindings.open": "Ouvrir",
|
||||
"settings.option.general.themeUpdateNotification": "Vérifier automatiquement les mises à jour des thèmes",
|
||||
"settings.option.general.showLovedTracksInline": "Afficher les pistes aimées en ligne",
|
||||
"settings.description.search": "Rechercher",
|
||||
|
@ -360,6 +367,7 @@
|
|||
"settings.header.audio": "Audio",
|
||||
"settings.header.audio.description": "Ajuster les paramètres audio de Cider.",
|
||||
"settings.option.audio.volumeStep": "Étape du volume",
|
||||
"settings.option.audio.advanced": "Contrôle avancé du volume",
|
||||
"settings.option.audio.maxVolume": "Volume maximum",
|
||||
"settings.option.audio.changePlaybackRate": "Changer la vitesse de lecture",
|
||||
"settings.option.audio.playbackRate": "Vitesse de lecture",
|
||||
|
@ -394,12 +402,21 @@
|
|||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Changes the mode of operation of the Atmosphere Realizer module.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Naturelle (Standard)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Naturelle (Plus)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Fromage au sel de roche et thé mousseux",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Thé au lait Uji Matcha",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Macchiato au jasmin",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Thé au lait Hokkaido",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Gâteau au clair de lune",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Lait crème brûlée au sucre brun",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Chaleur des câlins",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Moteur de traitement psycho-acoustique Cider",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Améliore la qualité audio perçue de l'audio AAC 256 kbps en utilisant un algorithme en temps réel qui tire parti à la fois des modèles psychoacoustiques de l'audition humaine et des caractéristiques de codage AAC.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "Le moteur de traitement psycho-acoustique n'est pas compatible avec la spatialisation. Veuillez désactiver la spatialisation pour continuer.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Force du moteur de traitement psycho-acoustique",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Modifie l'intensité du traitement effectué sur l'audio. (Un traitement agressif peut donner des résultats indésirables).",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standard",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptive",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Ancien",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agressive",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisation du son",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalise le volume maximal des pistes individuelles pour créer une expérience d'écoute plus uniforme.",
|
||||
|
@ -413,6 +430,9 @@
|
|||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Séparation",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minimale",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Diffusé",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Encore élargi",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "La spatialisation n'est pas compatible avec le moteur de traitement psycho-acoustique. Veuillez le désactiver pour continuer.",
|
||||
"settings.option.audio.dbspl.display": "Affichage dB SPL",
|
||||
"settings.option.audio.dbspl.description": "(Utilisateurs avancés uniquement) Affichez dB SPL au lieu de dBFS sur le curseur de volume.",
|
||||
|
@ -494,11 +514,19 @@
|
|||
"settings.option.connectivity.discordRPC.hideTimestamp": "Cacher le temps restant sur le Discord Rich Presence",
|
||||
"settings.option.connectivity.discordRPC.detailsFormat": "Format des détails",
|
||||
"settings.option.connectivity.discordRPC.stateFormat": "Format de l'état",
|
||||
"settings.option.connectivity.discordRPC.reload": "Recharger DiscordRPC",
|
||||
"settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPC Reconnecté à l'utilisateur: {{user}} ({{userid}})",
|
||||
"settings.option.connectivity.lastfmScrobble": "Scrobble LastFM",
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "Délai de Scrobble LastFM (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Activer la lecture en cours sur LastFM",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Supprimer les artistes en vedette du titre de la chanson (LastFM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrer les titres en boucle (LastFM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "Empêcher les pistes en boucle d'être scrobbulées ou affichées dans la liste En cours de lecture sur Last.fm.",
|
||||
"settings.option.connectivity.lastfmScrobble.filterTypes": "Types de médias filtrés (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.manualToken": "Entrer manuellement le jeton Last.fm",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.fm Connection échouée",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.fm Connection réussie",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connecting": "Connexion à Last.fm...",
|
||||
"settings.header.debug": "Débogage",
|
||||
"settings.option.debug.copy_log": "Copier les logs dans le presse-papiers",
|
||||
"settings.option.debug.openAppData": "Ouvrir le dossier de Cider",
|
||||
|
@ -551,5 +579,44 @@
|
|||
"share.platform.email": "Email",
|
||||
"share.platform.songLink": "Copier avec song.link",
|
||||
"share.platform.clipboard": "Copier le lien",
|
||||
"about.thanks": "Un grand merci à l'équipe de la Cider Collective et à tous nos contributeurs."
|
||||
"about.thanks": "Un grand merci à l'équipe de la Cider Collective et à tous nos contributeurs.",
|
||||
"oobe.yes": "Oui",
|
||||
"oobe.no": "Non",
|
||||
"oobe.next": "Suivant",
|
||||
"oobe.previous": "Précédent",
|
||||
"oobe.done": "Terminé",
|
||||
"oobe.amupsell.title": "Avant de commencer",
|
||||
"oobe.amupsell.text": "Cider nécessite un abonnement Apple Music actif et payant.\nCider ne fonctionne pas avec l'offre Apple Music Voice ou certains abonnements d'essai promotionnels. Si vous avez déjà un abonnement Apple Music qualifié, cliquez sur Suivant pour continuer.",
|
||||
"oobe.amupsell.subscribeBtn": "S'abonner à Apple Music",
|
||||
"oobe.amupsell.explainBtn": "Expliquer",
|
||||
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
|
||||
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
|
||||
"oobe.amupsell.promoExplained": "Certains abonnements d'essai Apple Music promotionnels et non américains n'ont pas accès aux API du lecteur web Apple Music nécessaires au fonctionnement de Cider. Pour vérifier si votre version d'essai active fonctionnera avec Cider, rendez-vous à l'adresse suivante <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> connectez-vous et essayez de jouer de la musique. Si cela fonctionne, tant mieux ! Vous êtes prêt à utiliser Cider, mais si ce n'est pas le cas, abonnez-vous à Apple Music ici : <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
|
||||
"oobe.intro.title": "Bienvenue sur Cider",
|
||||
"oobe.intro.subtitle": "",
|
||||
"oobe.intro.text": "Nous allons mettre en place quelques éléments pour que vous puissiez utiliser Cider comme vous le souhaitez. Vous pourrez toujours modifier ces paramètres plus tard.",
|
||||
"oobe.general.title": "Général",
|
||||
"oobe.general.subtitle": "",
|
||||
"oobe.general.text": "",
|
||||
"oobe.audio.title": "Audio",
|
||||
"oobe.audio.subtitle": "",
|
||||
"oobe.audio.text": "Cider dispose d'une pile audio personnalisée et conçue pour offrir une expérience audio riche et de haute qualité.\nIl comprend le moteur de traitement psycho-acoustique Cider, le réalisateur d'atmosphère et la spatialisation de l'audio.\nPour activer cette fonctionnalité, la fonction \"Fonctionnalité audio avancée\" doit être activée.\nL'activation de la fonctionnalité audio avancée vous donnera accès à ces améliorations dans les laboratoires audio de Cider, qui se trouvent dans les paramètres de l'application.",
|
||||
"oobe.audio.advancedFunctionality": "",
|
||||
"oobe.visual.title": "Visuel",
|
||||
"oobe.visual.subtitle": "",
|
||||
"oobe.visual.text": "",
|
||||
"oobe.visual.layout.text": "Cider présente deux agencements de fenêtres différents.\nMaverick est une mise en page semblable à celle d'iTunes, avec le lecteur en haut de la fenêtre.\nMojave est une nouvelle agencement créé par la Cider Collective.\n\nVous pouvez modifier la mise en page à tout moment dans les paramètres.",
|
||||
"oobe.visual.suggestingThemes": "Les thèmes sont un excellent moyen de personnaliser votre expérience. En voici quelques-uns que nous vous suggérons : ",
|
||||
"oobe.visual.suggestingThemes.subtext": "(Ces thèmes seront téléchargés à partir de GitHub)",
|
||||
"oobe.visual.suggestingThemes.default": "Cider",
|
||||
"oobe.visual.suggestingThemes.default.text": "Le thème classique de Cider.",
|
||||
"oobe.visual.suggestingThemes.dark": "Sombre",
|
||||
"oobe.visual.suggestingThemes.dark.text": "L'obscurité.",
|
||||
"oobe.visual.suggestingThemes.community1": "Groovy",
|
||||
"oobe.visual.suggestingThemes.community1.text": "Un thème influencé par WinUI",
|
||||
"oobe.visual.suggestingThemes.community2": "iTheme",
|
||||
"oobe.visual.suggestingThemes.community2.text": "La disposition classique des gros fruits.",
|
||||
"oobe.visual.suggestingThemes.community3": "Dracula",
|
||||
"oobe.visual.suggestingThemes.community3.text": "L'emblématique combinaison de couleurs de Dracula.",
|
||||
"oobe.amsignin.title": ""
|
||||
}
|
||||
|
|
|
@ -101,7 +101,7 @@
|
|||
"term.recentStations": "Recent Stations",
|
||||
"term.language": "Language",
|
||||
"term.funLanguages": "Fun",
|
||||
"term.noLyrics": "Loading... / Lyrics not found./ Instrumental.",
|
||||
"term.noLyrics": "Instrumental Track / No Lyrics.",
|
||||
"term.copyright": "Copyright",
|
||||
"term.rightsReserved": "All Rights Reserved.",
|
||||
"term.sponsor": "Sponsor this project",
|
||||
|
|
|
@ -154,6 +154,7 @@
|
|||
},
|
||||
"term.videos": "Videók",
|
||||
"term.menu": "Menü",
|
||||
"term.themeManaged": "Egy téma kezeli a beállítást",
|
||||
"term.check": "Ellenőrzés",
|
||||
"term.aboutArtist": "{{artistName}}-ról/ről",
|
||||
"term.topResult": "Legjobb találatok",
|
||||
|
@ -250,7 +251,7 @@
|
|||
"action.goToAlbum": "Album megjelenítése",
|
||||
"action.showInPlaylist": "Lejátszási lista megjelenítése",
|
||||
"action.showInAppleMusic": "Megjelenítés az Apple Musicban",
|
||||
"action.moveToTop": "Mozgatás legfelülre",
|
||||
"action.moveToTop": "Kivétel a mappákból",
|
||||
"action.share": "Megosztás",
|
||||
"action.rename": "Átnevezés",
|
||||
"action.love": "Szeretem",
|
||||
|
@ -441,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ó",
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
"notification.updatingLibrarySongs": "Memperbarui Pustaka lagu...",
|
||||
"notification.updatingLibraryAlbums": "Memperbarui Pustaka album...",
|
||||
"notification.updatingLibraryArtists": "Memperbarui Pustaka artis...",
|
||||
"term.variables": "Variabel",
|
||||
"term.appleInc": "Apple Inc.",
|
||||
"term.appleMusic": "Apple Music",
|
||||
"term.applePodcasts": "Apple Podcasts",
|
||||
|
@ -20,9 +21,12 @@
|
|||
"term.accountSettings": "Pengaturan Akun",
|
||||
"term.logout": "Keluar",
|
||||
"term.login": "Masuk",
|
||||
"term.quickNav": "Navigasi Cepat",
|
||||
"term.about": "Tentang",
|
||||
"term.privateSession": "Sesi Pribadi",
|
||||
"term.disablePrivateSession": "Matikan Mode Pribadi",
|
||||
"term.queue": "Antrian",
|
||||
"term.autoplay": "Pemutar Otomatis",
|
||||
"term.lyrics": "Lirik",
|
||||
"term.miniplayer": "Pemutar Kecil",
|
||||
"term.history": "Riwayat",
|
||||
|
@ -37,18 +41,28 @@
|
|||
"term.artists": "Artis",
|
||||
"term.podcasts": "Podcasts",
|
||||
"term.playlists": "Playlist",
|
||||
"term.charts": "Tangga Lagu",
|
||||
"term.playlist": "Playlist",
|
||||
"term.newPlaylist": "Playlist Baru",
|
||||
"term.newPlaylistFolder": "Folder Playlist Baru",
|
||||
"term.createNewPlaylist": "Buat Playlist Baru",
|
||||
"term.createNewPlaylistFolder": "Buat Folder Playlist Baru",
|
||||
"term.deletePlaylist": "Yakin ingin menghapus playlist ini?",
|
||||
"term.navigateBack": "Navigasi kembali",
|
||||
"term.navigateForward": "Navigasi kedepan",
|
||||
"term.play": "Mainkan",
|
||||
"term.playpause": "Mainkan/Jeda",
|
||||
"term.pause": "Jeda",
|
||||
"term.stop": "Berhenti",
|
||||
"term.previous": "Sebelumnya",
|
||||
"term.next": "Selanjutnya",
|
||||
"term.shuffle": "Acak",
|
||||
"term.enableShuffle": "Nyalakan pemutaran acak",
|
||||
"term.disableShuffle": "Matikan pemutaran acak",
|
||||
"term.repeat": "Ulangi",
|
||||
"term.enableRepeatOne": "Aktifkan ulangi sekali",
|
||||
"term.disableRepeatOne": "Matikan ulangi sekali",
|
||||
"term.disableRepeat": "Matikan ulangi",
|
||||
"term.volume": "Volume",
|
||||
"term.mute": "Bisu",
|
||||
"term.unmute": "Bunyikan",
|
||||
|
@ -70,6 +84,7 @@
|
|||
"term.viewAs": "Lihat Sebagai",
|
||||
"term.viewAs.coverArt": "Cover Art",
|
||||
"term.viewAs.list": "Daftar",
|
||||
"term.dynamic": "Dinamis",
|
||||
"term.size": "Ukuran",
|
||||
"term.size.normal": "Normal",
|
||||
"term.size.compact": "Kompak",
|
||||
|
@ -117,6 +132,9 @@
|
|||
"term.audioControls": "Kontrol Volume",
|
||||
"term.clearAll": "Bersihkan Semua",
|
||||
"term.recentStations": "Stasiun Terbaru",
|
||||
"term.personalStations": "Stasiun Pribadi",
|
||||
"term.amLive": "Apple Music Live",
|
||||
"term.live": "LIVE",
|
||||
"term.language": "Bahasa",
|
||||
"term.funLanguages": "Senang-senang",
|
||||
"term.noLyrics": "Memuat... / Lirik tidak ditermukan./ Instrumental.",
|
||||
|
@ -137,6 +155,7 @@
|
|||
},
|
||||
"term.videos": "Video",
|
||||
"term.menu": "Menu",
|
||||
"term.themeManaged": "Diatur oleh tema",
|
||||
"term.check": "Cek",
|
||||
"term.aboutArtist": "Tentang {{artistName}}",
|
||||
"term.topResult": "Hasil Teratas",
|
||||
|
@ -175,6 +194,19 @@
|
|||
"term.topGenres": "Genre Teratas",
|
||||
"term.confirmLogout": "Apakah Anda yakin ingin keluar??",
|
||||
"term.creditDesignedBy": "Dirancang oleh ${authorUsername}",
|
||||
"term.discNumber": "Kaset ${discNumber}",
|
||||
"term.reload" : "Muat ulang Cider?",
|
||||
"term.toggleprivate" : "Nyalakan Sesi Pribadi",
|
||||
"term.webremote" : "Remot Web",
|
||||
"term.cast" : "Transmisi",
|
||||
"term.cast2" : "Transmisikan ke Perangkat",
|
||||
"term.quit" : "Keluar",
|
||||
"term.zoomin" : "Perbesar",
|
||||
"term.zoomout" : "Perkecil",
|
||||
"term.zoomreset" : "Atur Ulang",
|
||||
"term.fullscreen" : "Layar Penuh",
|
||||
"home.syncFavorites": "Sinkronkan Favorit",
|
||||
"home.syncFavorites.gettingArtists": "Mendapatkan artis favorit",
|
||||
"home.title": "Beranda",
|
||||
"home.recentlyPlayed": "Baru Dimainkan",
|
||||
"home.recentlyAdded": "Baru Ditambahkan",
|
||||
|
@ -187,14 +219,25 @@
|
|||
"error.connectionError": "Terjadi masalah saat menyambungkan ke Apple Music.",
|
||||
"error.noResults": "Tidak ada hasil.",
|
||||
"error.noResults.description": "Coba pencarian baru.",
|
||||
"podcast.followOnCider": "Ikuti Di Cider",
|
||||
"podcast.followedOnCider": "Mengikuti Di Cider",
|
||||
"podcast.subscribeOnItunes": "Langganan Di iTunes",
|
||||
"podcast.subscribedOnItunes": "Berlangganan Di iTunes",
|
||||
"podcast.followOnCider": "Ikuti di Cider",
|
||||
"podcast.followedOnCider": "Mengikuti di Cider",
|
||||
"podcast.subscribeOnItunes": "Langganan di iTunes",
|
||||
"podcast.subscribedOnItunes": "Telah Berlangganan di iTunes",
|
||||
"podcast.itunesStore": "iTunes Store",
|
||||
"podcast.episodes": "Episode",
|
||||
"podcast.playEpisode": "Mainkan Episode",
|
||||
"podcast.website": "Website Podcast",
|
||||
"action.favorite": "Favorit",
|
||||
"action.removeFavorite": "Hapus Favorit",
|
||||
"action.hideLibrary": "Sembunyikan Pustaka",
|
||||
"action.showLibrary": "Tampilkan Pustaka",
|
||||
"action.cut": "Cut",
|
||||
"action.paste": "Paste",
|
||||
"action.selectAll": "Pilih Semua",
|
||||
"action.delete": "Hapus",
|
||||
"action.edit": "Ubah",
|
||||
"action.done": "Selesai",
|
||||
"action.editTracklist": "Edit Daftar Lagu",
|
||||
"action.addToLibrary": "Tambahkan ke Pustaka",
|
||||
"action.addToLibrary.success": "Ditambahkan ke Pustaka",
|
||||
"action.addToLibrary.error": "Terjadi Kesalahan Saat Menambahkan Pustaka",
|
||||
|
@ -240,12 +283,45 @@
|
|||
"action.tray.minimize": "Sembunyikan ke Tray",
|
||||
"action.tray.quit": "Keluar",
|
||||
"action.update": "Perbarui",
|
||||
"action.tray.listento": "Dengarkan:",
|
||||
"action.install": "Pasang",
|
||||
"action.copy": "Salin",
|
||||
"action.newpreset": "Preset Baru...",
|
||||
"action.deletepreset": "Hapus Preset",
|
||||
"action.open": "Buka",
|
||||
"action.close": "Close",
|
||||
"action.relaunch.confirm": "Apakah Anda ingin memulai ulang Cider?",
|
||||
"action.cast.chromecast": "Chromecast",
|
||||
"action.cast.todevices": "Transmisi ke Perangkat",
|
||||
"action.cast.stop": "Stop transmisi ke semua perangkat",
|
||||
"action.cast.airplay": "AirPlay",
|
||||
"action.cast.airplay.underdevelopment": "AirPlay masih dalam tahap pengembangan",
|
||||
"action.cast.scan": "Pindai",
|
||||
"action.cast.scanning": "Pindai...",
|
||||
"action.createNew": "Buat Baru...",
|
||||
"action.openArtworkInBrowser": "Buka artwork di browser",
|
||||
"action.scrollToTop": "Gulir ke atas",
|
||||
"action.refresh": "Muat ulang",
|
||||
"menubar.options.view": "Tampilan",
|
||||
"menubar.options.reload": "Muat Ulang",
|
||||
"menubar.options.forcereload": "Paksa Muat Ulang",
|
||||
"menubar.options.toggledevtools": "Aktfikan Alat Developer",
|
||||
"menubar.options.window": "Jendela",
|
||||
"menubar.options.minimize": "Perkecil",
|
||||
"menubar.options.plugins": "Menu Plu-gins",
|
||||
"menubar.options.controls": "Kontrol",
|
||||
"menubar.options.volumeup": "Keraskan Volume",
|
||||
"menubar.options.volumedown": "Kecilkan Volume",
|
||||
"menubar.options.account": "Akun",
|
||||
"menubar.options.signout": "Keluar",
|
||||
"menubar.options.support": "Bantuan",
|
||||
"menubar.options.report": "Laporkan...",
|
||||
"menubar.options.bug": "Bug",
|
||||
"menubar.options.feature": "Permintaan Fitur",
|
||||
"menubar.options.trans": "Laporkan/Minta Terjemahan",
|
||||
"menubar.options.license": "Lihat Lisensi",
|
||||
"menubar.options.conf": "Bukan File Konfigurasi pada Editor",
|
||||
"menubar.options.zoom": "Zoom",
|
||||
"settings.header.general": "Umum",
|
||||
"settings.header.general.description": "Sesuaikan pengaturan umum untuk Cider.",
|
||||
"settings.option.general.language": "Bahasa",
|
||||
|
@ -254,17 +330,53 @@
|
|||
"settings.option.general.resumebehavior.locally": "Lokal",
|
||||
"settings.option.general.resumebehavior.locally.description": "Cider akan melanjutkan sesi terakhir Anda di perangkat ini.",
|
||||
"settings.option.general.resumebehavior.history": "Riwayat",
|
||||
"settings.option.general.resumebehavior.history.description": "Cider akan menambahkan lagu terakhir dari keseluruhan riwayat Apple Music Anda ke dalam antrian di seluruh perangkat.",
|
||||
"settings.option.general.resumebehavior.history.description": "Cider akan melanjutkan lagu terakhir dari riwayat Apple Music di seluruh perangkat Anda.",
|
||||
"settings.option.general.resumetabs" : "Buka Tab ketika Diluncurkan",
|
||||
"settings.option.general.resumetabs.description" : "Anda dapat memilih tab apa yang akan dibuka ketika Anda membuka Cider.",
|
||||
"settings.option.general.resumetabs.dynamic" : "Dinamis",
|
||||
"settings.option.general.resumetabs.dynamic.description" : "Cider akan membuka tab yang terakhir digunakan",
|
||||
"settings.option.general.language.main": "Bahasa",
|
||||
"settings.option.general.language.fun": "Bahasa Candaan",
|
||||
"settings.option.general.language.unsorted": "Tidak disortir",
|
||||
"settings.option.general.customizeSidebar": "Sesuaikan Item Sidebar",
|
||||
"settings.option.general.customizeSidebar.customize": "Sesuaikan",
|
||||
"settings.option.general.keybindings": "Kombinasi Keyboard",
|
||||
"settings.option.general.keybindings.library": "Pustaka",
|
||||
"settings.option.general.keybindings.session": "Sesi",
|
||||
"settings.option.general.keybindings.control": "Kontrol",
|
||||
"settings.option.general.keybindings.interface": "Tampilan",
|
||||
"settings.option.general.keybindings.advanced": "Lebih Lanjut",
|
||||
"settings.option.general.keybindings.pressCombination": "Tekan kombinasi dua tombol untuk memperbarui",
|
||||
"settings.option.general.keybindings.pressEscape": "Tekan ESC untuk kembali",
|
||||
"settings.notyf.general.keybindings.update.success": "Kombinasi Keyboard telah diperbarui",
|
||||
"settings.prompt.general.keybindings.update.success": "Kombinasi keyboard telah diperbarui",
|
||||
"settings.option.general.themeUpdateNotification": "Perbarui tema secara otomatis",
|
||||
"settings.option.general.showLovedTracksInline": "Tampilkan lagu yang di-love sejajar",
|
||||
"settings.description.search": "Cari",
|
||||
"settings.description.albums": "Pustaka Album",
|
||||
"settings.description.artists": "Pustaka Artis",
|
||||
"settings.description.browse": "Jelajahi",
|
||||
"settings.description.private": "Nyalakan Sesi Pribadi",
|
||||
"settings.description.remote": "Remote Web",
|
||||
"settings.description.audio": "Peraturan Audio",
|
||||
"settings.description.plugins": "Menu Plugins",
|
||||
"settings.description.cast": "Transmisikan ke Perangkat",
|
||||
"settings.description.settings": "Pengaturan",
|
||||
"settings.description.developer": "Alat Developer",
|
||||
"settings.description.listnow": "Dengarkan Sekarang",
|
||||
"settings.description.recentAdd": "Baru Ditambahkan",
|
||||
"settings.description.songs": "Lagu",
|
||||
"settings.notyf.updateCider.update-not-available": "Tidak ada pembaruan tersedia",
|
||||
"settings.notyf.updateCider.update-downloaded": "Pembaruan sudah didownload, mulai ulang untuk menginstall pembaruan",
|
||||
"settings.notyf.updateCider.update-timeout": "Waktu pembaruan habis",
|
||||
"settings.header.audio": "Audio",
|
||||
"settings.header.audio.description": "Sesuaikan pengaturan audio untuk Cider.",
|
||||
"settings.option.audio.volumeStep": "Jangkah Volume",
|
||||
"settings.option.audio.advanced": "Kontrol Volume Lanjut",
|
||||
"settings.option.audio.maxVolume": "Volume Maksimal",
|
||||
"settings.option.audio.changePlaybackRate": "Ubah Tingkat Pemutaran",
|
||||
"settings.option.audio.playbackRate": "Tingkat Pemutaran",
|
||||
"settings.option.audio.playbackRate.change": "Ganti",
|
||||
"settings.option.audio.quality": "Kualitas Audio",
|
||||
"settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
|
||||
"settings.header.audio.quality.hireslossless.description": "sampai dari 24-bit/192 kHz",
|
||||
|
@ -277,20 +389,41 @@
|
|||
"settings.option.audio.seamlessTransition": "Transisi Audio Mulus",
|
||||
"settings.option.audio.enableAdvancedFunctionality": "Aktifkan Fungsi Lanjutan",
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "Mengaktifkan fungsionalitas AudioContext memungkinkan fitur audio lanjutan seperti Normalisasi Audio, Equalizer dan Visualizer. Namun pada beberapa perangkat dapat menyebabkan tersendatnya audio.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider memperkirakan bahwa PC Anda tidak dapat menggunakan fitur ini. Apakah Anda yakin ingin melanjutkan?",
|
||||
"settings.option.audio.audioLab": "Lab Audio Cider",
|
||||
"settings.option.audio.audioLab.description": "Macam-macam efek audio yang dikembangkan sendiri untuk Cider.",
|
||||
"settings.option.audio.audioLab.subheader": "Dibuat oleh Cider Acoustic Technologies di California",
|
||||
"settings.warn.audioLab.withoutAF": "AudioContext (Fungsi Lanjutan) perlu diaktifkan untuk menggunakan Lab Audio Cider.",
|
||||
"settings.warn.enableAdvancedFunctionality": "AudioContext (Advanced Functionality) dibutuhkan untuk menyalakan fitur ini.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Analog Warmth",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Mensimulasikan kehangatan analog yang dimodelkan setelah Korg Nutube 6P1",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Analog Warmth intensity",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Mengubah intensitas pemrosesan modul Analog Warmth.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Halus",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Hangat",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™️",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Membuat atmosfir musik yang berbeda setelah penyesuaian audio tingkat modern dan terbaru",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™️ Mode",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Ubah mode operasi dari modul 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.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": "Meningkatkan kualitas audio AAC secara 'realtime' dengan algoritma yang memanfaatkan model psychoacoustic manusia dan karakteristik encoding AAC",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP tidak cocok dengan Spatialisasi. Matikan Spasialisasi untuk menggunakan.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Kekuatan CAP",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Mengubah kekuatan pemrosesan yang dilakukan pada audio. (Agresif dapat menghasilkan hasil yang tidak diinginkan)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standar",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptif",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Legacy",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresif",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisasi Audio",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Menormalkan puncak volume untuk masing-masing lagu demi menciptakan pengalaman mendengarkan yang lebih seragam.",
|
||||
|
@ -300,14 +433,30 @@
|
|||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Profil Spasialisasi Cider",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Mengubah Profil Tuning Spasialisasi. (Memerlukan Restart Aplikasi)",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standar",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Soundstage",
|
||||
"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 tidak cocok dengan CAP. Matikan CAP untuk menggunakan.",
|
||||
"settings.option.audio.dbspl.display": "dB SPL Display",
|
||||
"settings.option.audio.dbspl.description": "(Untuk pengguna ahli) Tampilkan dB SPL daripada dBFS pada penggeser volume.",
|
||||
"settings.option.audio.dbfs.calibration": "0 dBFS Calibration",
|
||||
"settings.option.audio.dbfs.description": "Masukkan puncak Z-weighted dB SPL saat Cider berada pada 0 dBFS.",
|
||||
"settings.header.visual": "Visual",
|
||||
"settings.header.visual.description": "Sesuaikan pengaturan visual untuk Cider.",
|
||||
"settings.option.visual.windowStyle": "Gaya Jendela",
|
||||
"settings.option.visual.customAccentColor": "Warna Pilihan",
|
||||
"settings.option.visual.accentColor": "Warna",
|
||||
"settings.option.visual.purplePodcastPlaybackBar": "Bilah Pemutaran Ungu untuk Podcast",
|
||||
"settings.option.visual.windowColor": "Warna Jendela",
|
||||
"settings.option.visual.windowBackgroundStyle": "Gaya Latar Belakang Jendela",
|
||||
"settings.header.visual.windowBackgroundStyle.none": "Tidak Ada",
|
||||
"settings.header.visual.windowBackgroundStyle.artwork": "Artwork",
|
||||
"settings.header.visual.windowBackgroundStyle.image": "Gambar",
|
||||
"settings.header.visual.windowBackgroundStyle.color": "Warna-warna",
|
||||
"settings.option.visual.animatedArtwork": "Artwork Bergerak",
|
||||
"settings.header.visual.animatedArtwork.always": "Selalu",
|
||||
"settings.header.visual.animatedArtwork.limited": "Terbatas untuk halaman dan entri khusus",
|
||||
|
@ -323,12 +472,21 @@
|
|||
"settings.option.visual.hardwareAcceleration.description": "Membutuhkan dibuka ulang",
|
||||
"settings.header.visual.hardwareAcceleration.default": "Default",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
||||
"settings.option.visual.uiscale": "Skala UI",
|
||||
"settings.header.visual.theme": "Tema",
|
||||
"settings.option.visual.theme.github.download": "Pasang dari URL GitHub",
|
||||
"settings.option.visual.theme.github.openfolder": "Buka Folder Tema",
|
||||
"settings.option.visual.theme.github.explore": "Jelajahi Tema di GitHub",
|
||||
"settings.header.visual.theme.github.page": "Tema dari GitHub",
|
||||
"settings.option.visual.theme.github.install.confirm": "Apakah anda yakin untuk memasang {{ repo }}?",
|
||||
"settings.prompt.visual.theme.github.URL": "Masukan URL tema yang ingin Anda pasang",
|
||||
"settings.prompt.visual.theme.uninstallTheme": "Apakah Anda yakin untuk untuk mencopot {{ theme }}?",
|
||||
"settings.option.visual.theme.checkForUpdates": "Cek Pembaruan",
|
||||
"settings.option.visual.theme.manageStyles": "Kelola Gaya",
|
||||
"settings.option.visual.theme.uninstall": "Copot",
|
||||
"settings.option.visual.theme.viewInfo": "Lihat Info",
|
||||
"settings.option.visual.theme.github.available": "Tersedia",
|
||||
"settings.option.visual.theme.github.applied": "Diterapkan",
|
||||
"settings.notyf.visual.theme.install.success": "Tema berhasil dipasang",
|
||||
"settings.notyf.visual.theme.install.error": "Pemasangan tema gagal",
|
||||
"settings.header.visual.plugin": "Plugin",
|
||||
|
@ -347,17 +505,29 @@
|
|||
"settings.header.window.description": "Atur pengaturan jendela pada Cider.",
|
||||
"settings.option.window.openOnStartup": "Buka Cider Ketika Perangkat Dinyalakan",
|
||||
"settings.option.window.openOnStartup.hidden": "Buka dalam mode tersembunyi",
|
||||
"settings.option.window.useNativeTitleBar": "Gunakan Title Bar Native",
|
||||
"settings.option.window.windowControlStyle": "Pengontrol Style Jendela",
|
||||
"settings.option.window.windowControlStyle.right": "Kanan",
|
||||
"settings.option.window.windowControlStyle.left": "Kiri",
|
||||
"settings.header.lyrics": "Lirik",
|
||||
"settings.header.lyrics.description": "Sesuaikan pengaturan lirik untuk Cider.",
|
||||
"settings.option.lyrics.enableMusixmatch": "Aktifkan Lirik Musixmatch",
|
||||
"settings.option.lyrics.enableMusixmatchKaraoke": "Aktifkan Mode Karaoke (khusus Musixmatch)",
|
||||
"settings.option.lyrics.musixmatchPreferredLanguage": "Bahasa Terjemahan Musixmatch",
|
||||
"settings.option.lyrics.enableYoutubeLyrics": "Aktifkan Lirik Youtube untuk Video Musik",
|
||||
"settings.option.lyrics.enableQQLyrics": "Aktifkan QQ Lyrics",
|
||||
"settings.header.connectivity": "Konektivitas",
|
||||
"settings.header.connectivity.description": "Sesuaikan pengaturan konektivitas untuk Cider.",
|
||||
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
|
||||
"settings.option.connectivity.playbackNotifications": "Pemberitahuan Pemutaran",
|
||||
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
|
||||
"settings.option.connectivity.discordRPC.clientName": "Nama Client",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "Sembunyikan Discord Rich Presence Saat Dijeda",
|
||||
"settings.option.connectivity.discordRPC.hideButtons": "Sembunyikan tombol pada Discord Rich Presence",
|
||||
"settings.option.connectivity.discordRPC.hideTimestamp": "Sembunyikan tanda waktu pada Discord Rich Presence",
|
||||
"settings.option.connectivity.discordRPC.detailsFormat": "Format Detail",
|
||||
"settings.option.connectivity.discordRPC.stateFormat": "Format State",
|
||||
"settings.option.connectivity.discordRPC.reload": "Muat Ulang DiscordRPC",
|
||||
"settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPC terhubung ke pengguna: {{user}} ({{userid}})",
|
||||
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "Delay Last.fm Scrobble (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Aktifkan Last.fm Now Playing",
|
||||
|
@ -368,6 +538,8 @@
|
|||
"settings.option.debug.openAppData": "Buka Folder Cider",
|
||||
"settings.header.experimental": "Eksperimental",
|
||||
"settings.header.experimental.description": "Sesuaikan pengaturan eksperimental untuk Cider.",
|
||||
"settings.option.experimental.reinstallwidevine": "Pasang Ulang WidevineCDM",
|
||||
"settings.option.experimental.reinstallwidevine.confirm": "Apakah Anda yakin untuk memasang ulang Widevine?",
|
||||
"settings.option.experimental.unknownPlugin": "Sumber Tidak Diketahui",
|
||||
"settings.option.experimental.unknownPlugin.description": "Izinkan pemasangan plugin dari repo selain Cider Plugin Repository",
|
||||
"settings.option.experimental.compactUI": "UI Kompak",
|
||||
|
@ -377,6 +549,10 @@
|
|||
"settings.option.advanced.playlistTrackMapping.description": "Mengaktifkan pemindaian daftar putar yang mendalam untuk menentukan trek mana yang ada di daftar putar. Waktu pembuatan cache daftar putar dapat meningkat secara signifikan.",
|
||||
"settings.option.visual.transparent": "Frame transparan",
|
||||
"settings.option.visual.transparent.description": "membutuhkan tema yang mendukung, membutuhkan dibuka ulang",
|
||||
"settings.header.advanced": "Lanjutan",
|
||||
"settings.header.connect": "Sinkron",
|
||||
"settings.option.connect.link_account": "Sikronisasikan dengan Cider Connect",
|
||||
"settings.option.connect.link_account.description": "Menghubungkan akun Discord Anda dengan Cider Connect memungkinkan Anda untuk menyimpan data pengguna termasuk Pengaturan, EQ, dan lebih banyak lagi setelah selesai. (Pekerjaan Dalam Proses)",
|
||||
"spatial.notTurnedOn": "Spasialisasi Audio dinonaktifkan. Untuk menggunakan, aktifkan terlebih dahulu.",
|
||||
"spatial.spatialProperties": "Spatial Properties",
|
||||
"spatial.width": "Lebar",
|
||||
|
@ -399,5 +575,54 @@
|
|||
"settings.header.unfinished": "Belum Diselesaikan",
|
||||
"remote.web.title": "Remote Cider",
|
||||
"remote.web.description": "Pindai kode QR untuk memasangkan ponsel Anda dengan Cider.",
|
||||
"about.thanks": "Terima kasih yang sebesar-besarnya kepada Cider Collective Team dan semua kontributor kami."
|
||||
"share.platform.twitter.tweet": "Dengarkan {{song}} di 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": "Salin dengan song.link",
|
||||
"share.platform.clipboard": "Salin Link",
|
||||
"about.thanks": "Terima kasih yang sebesar-besarnya kepada Cider Collective Team dan semua kontributor kami.",
|
||||
"oobe.yes": "Ya",
|
||||
"oobe.no": "Tidak",
|
||||
"oobe.next": "Berikutnya",
|
||||
"oobe.previous": "Sebelumnya",
|
||||
"oobe.done": "Selesai",
|
||||
"oobe.amupsell.title": "Sebelum kita mulai",
|
||||
"oobe.amupsell.text": "Cider memerlukan langganan Apple Music yang aktif\nCider tidak akan berfungsi dengan Apple Music Voice Plan atau beberapa langganan uji coba promosi. Jika Anda sudah berlangganan Apple Music yang memenuhi syarat, klik Berikutnya untuk melanjutkan.",
|
||||
"oobe.amupsell.subscribeBtn": "Berlangganan Apple Music",
|
||||
"oobe.amupsell.explainBtn": "Jelaskan",
|
||||
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
|
||||
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
|
||||
"oobe.amupsell.promoExplained": "Beberapa promosi uji coba Apple Music dan akun non AS tidak memiliki akses ke Apple Music Web Player API yang diperlukan agar Cider berfungsi. Untuk memverifikasi apakah uji coba aktif Anda akan berfungsi dengan Cider, buka <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> masuk dan coba putar musik. Jika berhasil, bagus! Anda siap menggunakan Cider, namun jika tidak mempertimbangkan untuk berlangganan Apple Music di sini: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
|
||||
"oobe.intro.title": "Selamat Datang di Cider",
|
||||
"oobe.intro.subtitle": "",
|
||||
"oobe.intro.text": "Mari kita siapkan beberapa hal agar Anda dapat menggunakan Cider sesuai keinginan Anda. Anda selalu dapat mengubah setelan ini nanti.",
|
||||
"oobe.general.title": "Umum",
|
||||
"oobe.general.subtitle": "",
|
||||
"oobe.general.text": "",
|
||||
"oobe.audio.title": "Audio",
|
||||
"oobe.audio.subtitle": "",
|
||||
"oobe.audio.text": "Cider menghadirkan tumpukan audio yang disesuaikan dan dirancang khusus. Serta menghadirkan pengalaman audio berkualitas tinggi yang baik.\nDengan fitur seperti Cider Adrenaline, Atmosphere Realizer, dan Spatialized Audio.\nUntuk mengaktifkan fungsi ini \"Pengaturan Audio Tingkat Lanjut\" harus dinyalakan.\nMengaktifkan Pengaturan Audio Tingkat Lanjut akan memberi Anda akses ke peningkatan ini di Lab Audio Cider, yang ditemukan di pengaturan aplikasi",
|
||||
"oobe.audio.advancedFunctionality": "",
|
||||
"oobe.visual.title": "Visual",
|
||||
"oobe.visual.subtitle": "",
|
||||
"oobe.visual.text": "",
|
||||
"oobe.visual.layout.text": "Cider menampilkan dua jendela tata letak yang berbeda.\nMaverick adalah tata letak seperti iTunes dengan pemutar di bagian atas jendela.\nMojave adalah putaran baru yang dibuat oleh tim Cider Collective.\n\nAnda dapat mengubah tata letak kapan saja di setelan.",
|
||||
"oobe.visual.suggestingThemes": "Tema adalah cara terbaik untuk mempersonalisasi pengalaman Anda. Berikut adalah beberapa yang kami sarankan:",
|
||||
"oobe.visual.suggestingThemes.subtext": "(Tema-tema ini akan diunduh dari GitHub)",
|
||||
"oobe.visual.suggestingThemes.default": "Cider",
|
||||
"oobe.visual.suggestingThemes.default.text": "Tema classic Cider.",
|
||||
"oobe.visual.suggestingThemes.dark": "Gelap",
|
||||
"oobe.visual.suggestingThemes.dark.text": "Kegelapan.",
|
||||
"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": ""
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"i18n.languageName": "日本語",
|
||||
"i18n.languageNameEnglish": "Japanese",
|
||||
"i18n.category": "main",
|
||||
"i18n.authors": "@notmaikiwi @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",
|
||||
|
@ -358,17 +442,27 @@
|
|||
"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": "アーティストページのみ表示",
|
||||
|
@ -392,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": "プラグイン",
|
||||
|
@ -428,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を有効化する",
|
||||
|
@ -487,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": ""
|
||||
}
|
||||
|
|
1170
src/i18n/pt_PT.json
|
@ -10,6 +10,7 @@
|
|||
"notification.updatingLibrarySongs": "Обновление медиатеки песен...",
|
||||
"notification.updatingLibraryAlbums": "Обновление медиатеки альбомов...",
|
||||
"notification.updatingLibraryArtists": "Обновление медиатеки артистов...",
|
||||
"term.variables": "Переменные",
|
||||
"term.appleInc": "Apple Inc.",
|
||||
"term.appleMusic": "Apple Music",
|
||||
"term.applePodcasts": "Подкасты Apple",
|
||||
|
@ -18,17 +19,24 @@
|
|||
"term.discord": "Discord",
|
||||
"term.learnMore": "Узнать больше",
|
||||
"term.accountSettings": "Настройки аккаунта",
|
||||
"term.logout": "Выйти",
|
||||
"term.logout": "Выйти из аккаунта",
|
||||
"term.login": "Войти",
|
||||
"term.cast": "Транслировать",
|
||||
"term.quickNav": "Быстрая навигация",
|
||||
"term.about": "О Cider",
|
||||
"term.privateSession": "Частная сессия",
|
||||
"term.disablePrivateSession": "Выключить частную сессию",
|
||||
"term.queue": "Очередь",
|
||||
"term.autoplay": "Автовоспроизведение",
|
||||
"term.lyrics": "Текст",
|
||||
"term.miniplayer": "Мини-проигрыватель",
|
||||
"term.history": "История",
|
||||
"term.search": "Поиск",
|
||||
"term.scroll": "Прокрутка",
|
||||
"term.scroll.infinite": "Бесконечная",
|
||||
"term.scroll.paged": "${songsPerPage} на страницу",
|
||||
"term.live": "LIVE",
|
||||
"term.showSearch": "Показать панель поиска",
|
||||
"term.hideSearch": "Скрыть панель поиска",
|
||||
"term.library": "Медиатека",
|
||||
"term.listenNow": "Слушайте сейчас",
|
||||
"term.browse": "Обзор",
|
||||
|
@ -39,18 +47,28 @@
|
|||
"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.playpause": "Воспроизвести/Пауза",
|
||||
"term.pause": "Пауза",
|
||||
"term.stop": "Остановить",
|
||||
"term.previous": "Предыдущий",
|
||||
"term.next": "Следующий",
|
||||
"term.shuffle": "Перемешать",
|
||||
"term.enableShuffle": "Перемешать",
|
||||
"term.disableShuffle": "Перемешать",
|
||||
"term.repeat": "Повторять",
|
||||
"term.enableRepeatOne": "Включить повтор одной композиции",
|
||||
"term.disableRepeatOne": "Выключить повтор одной композиции",
|
||||
"term.disableRepeat": "Выключить повторение",
|
||||
"term.volume": "Громкость",
|
||||
"term.mute": "Заглушить",
|
||||
"term.unmute": "Включить звук",
|
||||
|
@ -72,6 +90,7 @@
|
|||
"term.viewAs": "Показывать",
|
||||
"term.viewAs.coverArt": "Обложки",
|
||||
"term.viewAs.list": "Список",
|
||||
"term.dynamic": "Динамический",
|
||||
"term.size": "Размер",
|
||||
"term.size.normal": "Обычный",
|
||||
"term.size.compact": "Компактный",
|
||||
|
@ -113,12 +132,14 @@
|
|||
"few": "секунды",
|
||||
"other": "секунд"
|
||||
},
|
||||
"term.fullscreenView": "Полноэкранное отображение",
|
||||
"term.fullscreenView": "Полноэкранный режим",
|
||||
"term.defaultView": "Стандартное отображение",
|
||||
"term.audioSettings": "Настройки звука",
|
||||
"term.audioControls": "Настройка громкости",
|
||||
"term.clearAll": "Очистить",
|
||||
"term.recentStations": "Вы недавно слушали",
|
||||
"term.personalStations": "Персональные станции",
|
||||
"term.amLive": "Apple Music Live",
|
||||
"term.language": "Язык",
|
||||
"term.funLanguages": "Забавные",
|
||||
"term.noLyrics": "Текст песни не найден.",
|
||||
|
@ -139,6 +160,7 @@
|
|||
},
|
||||
"term.videos": "Видео",
|
||||
"term.menu": "Меню",
|
||||
"term.themeManaged": "Управляется темой",
|
||||
"term.check": "Проверить",
|
||||
"term.aboutArtist": "О {{artistName}}",
|
||||
"term.topResult": "Топ результатов",
|
||||
|
@ -162,7 +184,8 @@
|
|||
"term.top": "Top",
|
||||
"term.version": "Версия",
|
||||
"term.noVideos": "Видео не найдено.",
|
||||
"term.plugin": "Плагины",
|
||||
"term.plugins": "Плагины",
|
||||
"term.plugin": "Плагин",
|
||||
"term.pluginMenu": "Меню плагинов",
|
||||
"term.pluginMenu.none": "Нет плагинов",
|
||||
"term.replay": "Мой год",
|
||||
|
@ -186,6 +209,22 @@
|
|||
"term.confirmLogout": "Вы уверены, что хотите выйти?",
|
||||
"term.creditDesignedBy": "Разработано ${authorUsername}",
|
||||
"term.discNumber": "Диск ${discNumber}",
|
||||
"term.reload" : "Перезагрузить Cider?",
|
||||
"term.toggleprivate" : "Переключить частную сессию",
|
||||
"term.webremote" : "Web Remote",
|
||||
"term.cast" : "Транслировать",
|
||||
"term.cast2" : "Трансляция на устройства",
|
||||
"term.quit" : "Выход",
|
||||
"term.zoomin" : "Приблизить",
|
||||
"term.zoomout" : "Отдалить",
|
||||
"term.zoomreset" : "Сбросить масштаб",
|
||||
"term.fullscreen" : "Полный экран",
|
||||
"term.nowPlaying": "Сейчас играет",
|
||||
"home.syncFavorites": "Синхронизировать",
|
||||
"home.syncFavorites.gettingArtists": "Получение отслеживаемых исполнителей...",
|
||||
"action.favorite": "Отслеживать",
|
||||
"action.removeFavorite": "Перестать отслеживать",
|
||||
"action.refresh": "Обновить",
|
||||
"home.title": "Главная",
|
||||
"home.recentlyPlayed": "Недавно прослушанные",
|
||||
"home.recentlyAdded": "Недавно добавленные",
|
||||
|
@ -206,6 +245,16 @@
|
|||
"podcast.episodes": "Выпуски радиошоу",
|
||||
"podcast.playEpisode": "Воспроизвести",
|
||||
"podcast.website": "Веб-сайт",
|
||||
"action.hideLibrary": "Скрыть библиотеку",
|
||||
"action.showLibrary": "Показать библиотеку",
|
||||
"action.cut": "Вырезать",
|
||||
"action.paste": "Вставить",
|
||||
"action.selectAll": "Выбрать всё",
|
||||
"action.delete": "Удалить",
|
||||
"action.edit": "Изменить",
|
||||
"action.done": "Готово",
|
||||
"action.submit": "Подтвердить",
|
||||
"action.editTracklist": "Редактировать треклист",
|
||||
"action.addToLibrary": "Добавить в медиатеку",
|
||||
"action.addToLibrary.success": "Добавлено в медиатеку",
|
||||
"action.addToLibrary.error": "Ошибка Добавления в медиатику",
|
||||
|
@ -241,7 +290,7 @@
|
|||
"action.unlove": "Больше не нравится",
|
||||
"action.dislike": "Меньше подобных рекомендаций",
|
||||
"action.undoDislike": "Вернуть подобные рекомендации",
|
||||
"action.showWebRemoteQR": "Веб-интерфейс",
|
||||
"action.showWebRemoteQR": "Web Remote",
|
||||
"action.playTracksNext": "Воспроизвести ${app.selectedMediaItems.length} песен следующими",
|
||||
"action.playTracksLater": "Воспроизвести ${app.selectedMediaItems.length} песен позже",
|
||||
"action.removeTracks": "Удалить ${self.selectedItems.length} песен из очереди",
|
||||
|
@ -249,13 +298,15 @@
|
|||
"action.export": "Экспорт",
|
||||
"action.showAlbum": "Показать весь альбом",
|
||||
"action.tray.minimize": "Свернуть в трей",
|
||||
"action.tray.quit": "Выйти",
|
||||
"action.tray.show": "Показать Cider",
|
||||
"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": "Транслировать на устройства",
|
||||
|
@ -266,6 +317,27 @@
|
|||
"action.cast.scanning": "Поиск...",
|
||||
"action.createNew": "Создать новый...",
|
||||
"action.openArtworkInBrowser": "Открыть обложку в браузере",
|
||||
"action.scrollToTop": "Scroll to top",
|
||||
"menubar.options.view": "View",
|
||||
"menubar.options.reload": "Перезагрузить",
|
||||
"menubar.options.forcereload": "Жесткая перезагрузка",
|
||||
"menubar.options.toggledevtools": "Toggle Developer Tools",
|
||||
"menubar.options.window": "Window",
|
||||
"menubar.options.minimize": "Minimize",
|
||||
"menubar.options.plugins": "Меню плагинов",
|
||||
"menubar.options.controls": "Управление",
|
||||
"menubar.options.volumeup": "Громче",
|
||||
"menubar.options.volumedown": "Тише",
|
||||
"menubar.options.account": "Аккаунт",
|
||||
"menubar.options.signout": "Выйти из аккаунта",
|
||||
"menubar.options.support": "Поддержать",
|
||||
"menubar.options.report": "Сообщить о...",
|
||||
"menubar.options.bug": "Баг",
|
||||
"menubar.options.feature": "Feature Request",
|
||||
"menubar.options.trans": "Translation Report/Request",
|
||||
"menubar.options.license": "Просмотреть лицензию",
|
||||
"menubar.options.conf": "Открыть файл конфигурации в редакторе",
|
||||
"menubar.options.zoom": "Zoom",
|
||||
"settings.header.general": "Общие",
|
||||
"settings.header.general.description": "Настройка общих параметров Cider.",
|
||||
"settings.option.general.language": "Язык",
|
||||
|
@ -275,18 +347,52 @@
|
|||
"settings.option.general.resumebehavior.locally.description": "Cider возобновит ваш последний сеанс на этом компьютере.",
|
||||
"settings.option.general.resumebehavior.history": "История",
|
||||
"settings.option.general.resumebehavior.history.description": "Cider поставит в очередь последнюю песню из вашей общей истории Apple Music на разных устройствах.",
|
||||
"settings.option.general.resumetabs" : "Раздел при запуске",
|
||||
"settings.option.general.resumetabs.description" : "Вы можете выбрать, какой раздел будет открыться при запуске Cider.",
|
||||
"settings.option.general.resumetabs.dynamic" : "Динамически",
|
||||
"settings.option.general.resumetabs.dynamic.description" : "Cider откроет последний использованный раздел.",
|
||||
"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.library": "Библиотека",
|
||||
"settings.option.general.keybindings.session": "Сессия",
|
||||
"settings.option.general.keybindings.control": "Элементы управления",
|
||||
"settings.option.general.keybindings.interface": "Интерфейс",
|
||||
"settings.option.general.keybindings.advanced": "Расширенные",
|
||||
"settings.option.general.keybindings.pressCombination": "Нажмите комбинацию двух клавиш, чтобы обновить привязку клавиш.",
|
||||
"settings.option.general.keybindings.pressEscape": "Нажмите клавишу Escape, чтобы вернуться.",
|
||||
"settings.notyf.general.keybindings.update.success": "Комбинация клавиш успешно обновлена",
|
||||
"settings.prompt.general.keybindings.update.success": "Комбинация клавиш успешно обновлена. Нажмите OK, чтобы перезапустить Cider",
|
||||
"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": "Web 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.volumeStep": "Шаг громкости",
|
||||
"settings.option.audio.advanced": "Расширенные настройки громкости",
|
||||
"settings.option.audio.maxVolume": "Максимальная громкость",
|
||||
"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": "ALAC до 24 бит/192 кГц",
|
||||
|
@ -295,27 +401,46 @@
|
|||
"settings.header.audio.quality.high": "Высокое качество",
|
||||
"settings.header.audio.quality.high.description": "AAC 256 кб/с",
|
||||
"settings.header.audio.quality.standard": "Высокая эффективность",
|
||||
"settings.header.audio.quality.standard.description": "НЕ-ААС для экономии трафика(64 кб/с)",
|
||||
"settings.header.audio.quality.standard.description": "64 кб/с",
|
||||
"settings.option.audio.seamlessTransition": "Плавный переход между песнями",
|
||||
"settings.option.audio.enableAdvancedFunctionality": "Включить расширенный функционал",
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "Включение функции AudioContext позволит использовать расширенные функции звука, такие как нормализация звука, эквалайзеры и визуализаторы, однако в некоторых системах это может вызвать заикание звука.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider считает, что ваш компьютер не справится с этими функциями. Вы уверены что хотите продолжить?",
|
||||
"settings.option.audio.audioLab": "Cider Audio Lab",
|
||||
"settings.option.audio.audioLab.description": "Ассортимент звуковых обработок собственной разработки для Cider.",
|
||||
"settings.option.audio.audioLab.subheader": "Разработано Cider Acoustic Technologies в Калифорнии",
|
||||
"settings.warn.audioLab.withoutAF": "AudioContext (Расширенный функционал) требуется для включения Cider Audio Laboratory.",
|
||||
"settings.warn.enableAdvancedFunctionality": "Для включения этой функции требуется AudioContext (расширенный функционал).",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Аналоговое звучание",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Имитирует аналоговое звучание по образцу Korg Nutube 6P1",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Интенсивность аналогового звучания",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Изменяет интенсивность Аналогового звучания.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Обычная",
|
||||
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Сильнее",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™️",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Реализует другую музыкальную атмосферу, созданную по образцу современных аудиосистем.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Режим работы Cider Atmosphere Realizer™️",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Изменяет режим работы 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.Z8500A": "Moonlight Softcake",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Brown Sugar Creme Brûlée Milk",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis aux Cerises",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Cuddle Warmth",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Улучшает воспринимаемое качество звука AAC 256 кбит/с за счет использования алгоритма реального времени, использующего как психоакустические модели человеческого слуха, так и характеристики кодирования AAC.",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP не совместим с пространственным звучанием. Пожалуйста, отключите пространственное звучание, чтобы продолжить.",
|
||||
"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": "Legacy",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Агрессивный",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Нормализация звука",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Нормализует пиковую громкость для отдельных треков, чтобы создать более однородное впечатление от прослушивания.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Управляется Audio Lab",
|
||||
|
@ -324,8 +449,18 @@
|
|||
"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": "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": "Encore",
|
||||
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
|
||||
"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": "Введите пиковый Z-взвешенный уровень звукового давления в дБ, когда Cider находится на уровне 0 дБ полной шкалы.",
|
||||
"settings.header.visual": "Внешний вид",
|
||||
"settings.header.visual.description": "Настройка внешнего вида Cider.",
|
||||
"settings.option.visual.windowStyle": "Стиль окна",
|
||||
|
@ -351,10 +486,19 @@
|
|||
"settings.option.visual.uiscale": "Размер интерфейса",
|
||||
"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": "Введите URL темы, которую хотите установить",
|
||||
"settings.prompt.visual.theme.uninstallTheme": "Вы уверены, что хотите удалить {{ theme }}?",
|
||||
"settings.option.visual.theme.checkForUpdates": "Проверить наличие обновлений",
|
||||
"settings.header.visual.styles": "Стили",
|
||||
"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": "Плагин",
|
||||
|
@ -383,17 +527,30 @@
|
|||
"settings.option.lyrics.enableMusixmatchKaraoke": "Включить режим караоке (только с Musixmatch)",
|
||||
"settings.option.lyrics.musixmatchPreferredLanguage": "Предпочтительный язык перевода Musixmatch",
|
||||
"settings.option.lyrics.enableYoutubeLyrics": "Включить Youtube Lyrics для музыкальных клипов",
|
||||
"settings.option.lyrics.enableQQLyrics": "Получать текст песен из QQ Lyrics",
|
||||
"settings.header.connectivity": "Прочее",
|
||||
"settings.header.connectivity.description": "Настройка прочих параметров Cider.",
|
||||
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
|
||||
"settings.option.connectivity.playbackNotifications": "Уведомления о воспроизведении",
|
||||
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
|
||||
"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 cкробблинг",
|
||||
"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.filterLoop.description": "Предотвращение скробблинга или отображения зацикленных треков в списке «Сейчас исполняется» на Last.fm.",
|
||||
"settings.option.connectivity.lastfmScrobble.filterTypes": "Фильтровать медиа типы (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.manualToken": "Ввести токен Last.fm вручную",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.fm Время соединения истекло",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.fm Соединение успешно",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connecting": "Подключение к Last.fm...",
|
||||
"settings.header.debug": "Debug",
|
||||
"settings.option.debug.copy_log": "Копировать логи в буфер обмена",
|
||||
"settings.option.debug.openAppData": "Открыть папку Cider",
|
||||
|
@ -405,12 +562,21 @@
|
|||
"settings.option.experimental.unknownPlugin.description": "Разрешить установку плагинов из репозиториев, отличных от репозитория плагинов Cider",
|
||||
"settings.option.experimental.compactUI": "Компактный интерфейс",
|
||||
"settings.option.window.close_button_hide": "Кнопка «Закрыть» скрывает приложение",
|
||||
"settings.option.window.maxElementScale": "Максимальный масштаб элемента",
|
||||
"settings.option.experimental.inline_playlists": "Встроенные плейлисты и альбомы",
|
||||
"settings.option.advanced.playlistTrackMapping": "Сканирование песен в плейлистах",
|
||||
"settings.option.advanced.playlistTrackMapping.description": "Включает глубокое сканирование плейлистов, чтобы определить, какие треки находятся в каких плейлистах. Время сборки кеша плейлиста может значительно увеличиться.",
|
||||
"settings.option.visual.transparent": "Прозрачность",
|
||||
"settings.option.visual.transparent.description": "Прозрачность окна (требуется поддержка Тем, требуется перезапуск)",
|
||||
"settings.option.visual.customAccentColor": "Пользовательский основной цвет",
|
||||
"settings.option.visual.accentColor": "Основной цвет",
|
||||
"settings.option.visual.purplePodcastPlaybackBar": "Фиолетовая полоса воспроизведения для подкастов",
|
||||
"settings.option.visual.windowColor": "Цветовой оттенок",
|
||||
"settings.header.visual.windowBackgroundStyle.color": "Цвет",
|
||||
"settings.header.advanced": "Расширенные",
|
||||
"settings.header.connect": "Sync",
|
||||
"settings.option.connect.link_account": "Enable Sync with Cider Connect",
|
||||
"settings.option.connect.link_account.description": "Linking your Discord account with Cider Connect allows you to store userdata including Settings, EQ's, and eventually more once finished. (Work In Progress)",
|
||||
"spatial.notTurnedOn": "Пространственное аудио отключено. Чтобы использовать, сначала включите его.",
|
||||
"spatial.spatialProperties": "Настройка пространственного аудио",
|
||||
"spatial.width": "Ширина",
|
||||
|
@ -443,5 +609,44 @@
|
|||
"share.platform.email": "Email",
|
||||
"share.platform.songLink": "Скопировать с song.link",
|
||||
"share.platform.clipboard": "Скопировать ссылку",
|
||||
"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 за пределами США не имеют доступа к необходимым API-интерфейсам Apple Music Web Player, необходимым для работы Cider. Чтобы проверить, будет ли ваша действующая пробная версия работать с 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 используется специально настроенный и разработанный звуковой стек, который обеспечивает богатое высококачественное звучание.\nВключая Cider Adrenaline, Atmosphere Realizer и Spatialized Audio.\nДля включения этой функции необходимо включить \"Расширенные функции звука\".\nВключение расширенного звука Функциональность даст вам доступ к этим улучшениям в Cider Audio Labs, которые можно найти в настройках приложения.",
|
||||
"oobe.audio.advancedFunctionality": "",
|
||||
"oobe.visual.title": "Visual",
|
||||
"oobe.visual.subtitle": "",
|
||||
"oobe.visual.text": "",
|
||||
"oobe.visual.layout.text": "В Cider есть два разных макета окна.\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": "Darkness.",
|
||||
"oobe.visual.suggestingThemes.community1": "Groovy",
|
||||
"oobe.visual.suggestingThemes.community1.text": "Тема под влиянием WinUI",
|
||||
"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": "Культовая цветовая гамма Дракулы.",
|
||||
"oobe.amsignin.title": ""
|
||||
}
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
"term.logout": "Logout",
|
||||
"term.login": "Log In",
|
||||
"term.quickNav": "Quick Nav",
|
||||
"term.cast": "Cast",
|
||||
"term.about": "About",
|
||||
"term.privateSession": "Private Session",
|
||||
"term.disablePrivateSession": "Disable Private Session",
|
||||
|
@ -32,6 +31,12 @@
|
|||
"term.miniplayer": "MiniPlayer",
|
||||
"term.history": "History",
|
||||
"term.search": "Search",
|
||||
"term.scroll": "Scroll Mode",
|
||||
"term.scroll.infinite": "Infinite",
|
||||
"term.scroll.paged": "${songsPerPage} per page",
|
||||
"term.live": "LIVE",
|
||||
"term.showSearch": "Show search bar",
|
||||
"term.hideSearch": "Hide search bar",
|
||||
"term.library": "Library",
|
||||
"term.listenNow": "Listen Now",
|
||||
"term.browse": "Browse",
|
||||
|
@ -42,6 +47,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",
|
||||
|
@ -51,6 +57,7 @@
|
|||
"term.navigateBack": "Navigate back",
|
||||
"term.navigateForward": "Navigate forward",
|
||||
"term.play": "Play",
|
||||
"term.playpause": "Play/Pause",
|
||||
"term.pause": "Pause",
|
||||
"term.stop": "Stop",
|
||||
"term.previous": "Previous",
|
||||
|
@ -135,7 +142,7 @@
|
|||
"term.amLive": "Apple Music Live",
|
||||
"term.language": "Language",
|
||||
"term.funLanguages": "Fun",
|
||||
"term.noLyrics": "Loading... / Lyrics not found./ Instrumental.",
|
||||
"term.noLyrics": "Instrumental Track / No Lyrics.",
|
||||
"term.copyright": "Copyright",
|
||||
"term.rightsReserved": "All Rights Reserved.",
|
||||
"term.sponsor": "Sponsor this project",
|
||||
|
@ -153,6 +160,7 @@
|
|||
},
|
||||
"term.videos": "Videos",
|
||||
"term.menu": "Menu",
|
||||
"term.themeManaged": "Managed by a theme",
|
||||
"term.check": "Check",
|
||||
"term.aboutArtist": "About {{artistName}}",
|
||||
"term.topResult": "Top Result",
|
||||
|
@ -176,8 +184,9 @@
|
|||
"term.top": "Top",
|
||||
"term.version": "Version",
|
||||
"term.noVideos": "No videos found.",
|
||||
"term.plugin": "Plug-in",
|
||||
"term.pluginMenu": "Plug-in Menu",
|
||||
"term.plugins": "Plugins",
|
||||
"term.plugin": "Plugin",
|
||||
"term.pluginMenu": "Plugins Menu",
|
||||
"term.pluginMenu.none": "No interactive plugins",
|
||||
"term.replay": "Replay",
|
||||
"term.uniqueAlbums": "Unique Albums",
|
||||
|
@ -192,6 +201,22 @@
|
|||
"term.confirmLogout": "Are you sure you want to logout?",
|
||||
"term.creditDesignedBy": "Designed by ${authorUsername}",
|
||||
"term.discNumber": "Disc ${discNumber}",
|
||||
"term.reload" : "Reload Cider?",
|
||||
"term.toggleprivate" : "Toggle Private Session",
|
||||
"term.webremote" : "Web Remote",
|
||||
"term.cast" : "Cast",
|
||||
"term.cast2" : "Cast to Devices",
|
||||
"term.quit" : "Quit",
|
||||
"term.zoomin" : "Zoom In",
|
||||
"term.zoomout" : "Zoom Out",
|
||||
"term.zoomreset" : "Reset Zoom",
|
||||
"term.fullscreen" : "Fullscreen",
|
||||
"term.nowPlaying": "Now Playing",
|
||||
"home.syncFavorites": "Sync Favorites",
|
||||
"home.syncFavorites.gettingArtists": "Getting Favorited Artists...",
|
||||
"action.favorite": "Favorite",
|
||||
"action.removeFavorite": "Remove Favorite",
|
||||
"action.refresh": "Refresh",
|
||||
"home.title": "Home",
|
||||
"home.recentlyPlayed": "Recently Played",
|
||||
"home.recentlyAdded": "Recently Added",
|
||||
|
@ -220,6 +245,7 @@
|
|||
"action.delete": "Delete",
|
||||
"action.edit": "Edit",
|
||||
"action.done": "Done",
|
||||
"action.submit": "Submit",
|
||||
"action.editTracklist": "Edit Tracklist",
|
||||
"action.addToLibrary": "Add to Library",
|
||||
"action.addToLibrary.success": "Added to Library",
|
||||
|
@ -264,11 +290,7 @@
|
|||
"action.export": "Export",
|
||||
"action.showAlbum": "Show Complete Album",
|
||||
"action.tray.minimize": "Minimize to Tray",
|
||||
"action.tray.quit": "Quit",
|
||||
"action.tray.show": "Show Cider",
|
||||
"action.tray.playpause": "Play/Pause",
|
||||
"action.tray.next": "Next",
|
||||
"action.tray.previous": "Previous",
|
||||
"action.tray.listento": "Listen To:",
|
||||
"action.update": "Update",
|
||||
"action.install": "Install",
|
||||
|
@ -288,45 +310,26 @@
|
|||
"action.createNew": "Create New...",
|
||||
"action.openArtworkInBrowser": "Open artwork in browser",
|
||||
"action.scrollToTop": "Scroll to top",
|
||||
"menubar.options.about": "About",
|
||||
"menubar.options.settings": "Settings",
|
||||
"menubar.options.quit": "Quit Cider",
|
||||
"menubar.options.view": "View ",
|
||||
"menubar.options.view": "View",
|
||||
"menubar.options.reload": "Reload",
|
||||
"menubar.options.forcereload": "Force Reload",
|
||||
"menubar.options.toggledevtools": "Toggle Developer Tools",
|
||||
"menubar.options.window": "Window",
|
||||
"menubar.options.minimize": "Minimize",
|
||||
"menubar.options.toggleprivate": "Toggle Private Session",
|
||||
"menubar.options.webremote": "Web Remote",
|
||||
"menubar.options.audio": "Audio Settings",
|
||||
"menubar.options.plugins": "Plu-gins Menu",
|
||||
"menubar.options.controls": "Controls",
|
||||
"menubar.options.next": "Next",
|
||||
"menubar.options.playpause": "Play/Pause",
|
||||
"menubar.options.previous": "Previous",
|
||||
"menubar.options.volumeup": "Volume Up",
|
||||
"menubar.options.volumedown": "Volume Down",
|
||||
"menubar.options.browse": "Browse",
|
||||
"menubar.options.artists": "Artists",
|
||||
"menubar.options.search": "Search",
|
||||
"menubar.options.albums": "Albums",
|
||||
"menubar.options.cast": "Cast To Devices",
|
||||
"menubar.options.account": "Account",
|
||||
"menubar.options.accountsettings": "Account Settings",
|
||||
"menubar.options.signout": "Sign Out",
|
||||
"menubar.options.support": "Support",
|
||||
"menubar.options.discord": "Discord",
|
||||
"menubar.options.github": "GitHub Wiki",
|
||||
"menubar.options.report": "Report a...",
|
||||
"menubar.options.bug": "Bug",
|
||||
"menubar.options.feature": "Feature Request",
|
||||
"menubar.options.trans": "Translation Report/Request",
|
||||
"menubar.options.license": "View License",
|
||||
"menubar.options.conf": "Open Configuration File in Editor",
|
||||
"menubar.options.listennow": "Listen Now",
|
||||
"menubar.options.recentlyAdded": "Recently Added",
|
||||
"menubar.options.songs": "Songs",
|
||||
"menubar.options.zoom": "Zoom",
|
||||
"settings.header.general": "General",
|
||||
"settings.header.general.description": "Adjust the general settings for Cider.",
|
||||
"settings.option.general.language": "Language",
|
||||
|
@ -346,11 +349,15 @@
|
|||
"settings.option.general.customizeSidebar": "Customize Sidebar Items",
|
||||
"settings.option.general.customizeSidebar.customize": "Customize",
|
||||
"settings.option.general.keybindings": "Keybindings",
|
||||
"settings.option.general.keybindings.library": "Library",
|
||||
"settings.option.general.keybindings.session": "Session",
|
||||
"settings.option.general.keybindings.control": "Controls",
|
||||
"settings.option.general.keybindings.interface": "Interface",
|
||||
"settings.option.general.keybindings.advanced": "Advanced",
|
||||
"settings.option.general.keybindings.pressCombination": "Press a combination of two keys to update keybind.",
|
||||
"settings.option.general.keybindings.pressEscape": "Press Escape key to go back.",
|
||||
"settings.notyf.general.keybindings.update.success": "Keybind updated successfully",
|
||||
"settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider",
|
||||
"settings.option.general.keybindings.open": "Open",
|
||||
"settings.option.general.themeUpdateNotification": "Automatically check for theme updates",
|
||||
"settings.option.general.showLovedTracksInline": "Show loved tracks inline",
|
||||
"settings.description.search": "Search",
|
||||
|
@ -414,6 +421,8 @@
|
|||
"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.Z8500B": "Clafoutis aux Cerises",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
|
||||
"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.",
|
||||
|
@ -476,6 +485,7 @@
|
|||
"settings.prompt.visual.theme.github.URL": "Enter the URL of the theme you want to install",
|
||||
"settings.prompt.visual.theme.uninstallTheme": "Are you sure you want to uninstall {{ theme }}?",
|
||||
"settings.option.visual.theme.checkForUpdates": "Check for updates",
|
||||
"settings.header.visual.styles": "Styles",
|
||||
"settings.option.visual.theme.manageStyles": "Manage Styles",
|
||||
"settings.option.visual.theme.uninstall": "Uninstall",
|
||||
"settings.option.visual.theme.viewInfo": "View Info",
|
||||
|
@ -527,6 +537,12 @@
|
|||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable Last.fm Now Playing",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "Prevent looped tracks from being scrobbled or displayed in the Now Playing list on Last.fm.",
|
||||
"settings.option.connectivity.lastfmScrobble.filterTypes": "Filter Media Types (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.manualToken": "Enter Last.fm Token Manually",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.fm Connection Timed Out",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.fm Connection Successful",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connecting": "Connecting to Last.fm...",
|
||||
"settings.header.debug": "Debug",
|
||||
"settings.option.debug.copy_log": "Copy logs to clipboard",
|
||||
"settings.option.debug.openAppData": "Open Cider Folder",
|
||||
|
@ -538,11 +554,18 @@
|
|||
"settings.option.experimental.unknownPlugin.description": "Allow installation of plugins from repos other than the Cider Plugin Repository",
|
||||
"settings.option.experimental.compactUI": "Compact UI",
|
||||
"settings.option.window.close_button_hide": "Close Button Should Hide the Application",
|
||||
"settings.option.window.maxElementScale": "Maximum Element Scale",
|
||||
"settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
|
||||
"settings.option.advanced.playlistTrackMapping": "Playlist Track Mapping",
|
||||
"settings.option.advanced.playlistTrackMapping.description": "Enables deep scanning of playlists to determine which tracks are in which playlists. Playlist cache build times can increase significantly.",
|
||||
"settings.option.visual.transparent": "Transparent frame",
|
||||
"settings.option.visual.transparent.description": "needs Theme Support, requires relaunch",
|
||||
"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.compactArtistHeader": "Compact Artist Header",
|
||||
"settings.option.visual.windowColor": "Window Tint Color",
|
||||
"settings.header.visual.windowBackgroundStyle.color": "Color Tint",
|
||||
"settings.header.advanced": "Advanced",
|
||||
"settings.header.connect": "Sync",
|
||||
"settings.option.connect.link_account": "Enable Sync with Cider Connect",
|
||||
|
@ -619,4 +642,4 @@
|
|||
"oobe.visual.suggestingThemes.community3": "Dracula",
|
||||
"oobe.visual.suggestingThemes.community3.text": "The iconic Dracula color scheme.",
|
||||
"oobe.amsignin.title": ""
|
||||
}
|
||||
}
|
|
@ -2,7 +2,7 @@
|
|||
"i18n.languageName": "简体中文(中国)",
|
||||
"i18n.languageNameEnglish": "Simp. Chinese (China)",
|
||||
"i18n.category": "main",
|
||||
"i18n.authors": "@notmaikiwi @BillKerman @jay900604",
|
||||
"i18n.authors": "@notmaikiwi @BillKerman @jay900604 @sakura0224",
|
||||
"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,13 +21,22 @@
|
|||
"term.accountSettings": "账户设置",
|
||||
"term.logout": "退出登录",
|
||||
"term.login": "登录",
|
||||
"term.quickNav": "快速导航",
|
||||
"term.about": "关于",
|
||||
"term.privateSession": "私人聆听",
|
||||
"term.lyrics": "歌词",
|
||||
"term.privateSession": "隐身聆听",
|
||||
"term.disablePrivateSession": "停止隐身聆听",
|
||||
"term.queue": "待播清单",
|
||||
"term.history": "历史记录",
|
||||
"term.autoplay": "自动播放",
|
||||
"term.lyrics": "歌词",
|
||||
"term.miniplayer": "迷你播放器",
|
||||
"term.history": "历史记录",
|
||||
"term.search": "搜索",
|
||||
"term.scroll": "滚动模式",
|
||||
"term.scroll.infinite": "无限制",
|
||||
"term.scroll.paged": "每页${songsPerPage}首",
|
||||
"term.live": "LIVE",
|
||||
"term.showSearch": "显示搜索栏",
|
||||
"term.hideSearch": "隐藏搜索栏",
|
||||
"term.library": "资料库",
|
||||
"term.listenNow": "现在就听",
|
||||
"term.browse": "浏览",
|
||||
|
@ -37,23 +47,33 @@
|
|||
"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.playpause": "播放/暂停",
|
||||
"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": "解除静音",
|
||||
"term.share": "分享",
|
||||
"term.share.success": "已拷貝到剪贴板",
|
||||
"term.share.success": "已拷贝到剪贴板",
|
||||
"term.settings": "设置",
|
||||
"term.seeAll": "查看全部",
|
||||
"term.sortBy": "排序",
|
||||
|
@ -63,12 +83,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": "紧凑",
|
||||
|
@ -90,6 +112,8 @@
|
|||
"term.time.added": "添加于",
|
||||
"term.time.released": "发行于",
|
||||
"term.time.updated": "更新于",
|
||||
"term.time.days": "天",
|
||||
"term.time.day": "天",
|
||||
"term.time.hours": "小时",
|
||||
"term.time.hour": "小时",
|
||||
"term.time.minutes": "分钟",
|
||||
|
@ -101,7 +125,9 @@
|
|||
"term.audioControls": "音频控制",
|
||||
"term.audioSettings": "音频设置",
|
||||
"term.clearAll": "清空",
|
||||
"term.recentStations": "最近播放的频道",
|
||||
"term.recentStations": "最近播放的广播",
|
||||
"term.personalStations": "最近播放的个人广播",
|
||||
"term.amLive": "Apple Music Live",
|
||||
"term.language": "语言",
|
||||
"term.funLanguages": "恶搞",
|
||||
"term.noLyrics": "加载中... / 无搜索结果 / 纯音乐",
|
||||
|
@ -115,13 +141,11 @@
|
|||
"term.contributors": "贡献者",
|
||||
"term.equalizer": "均衡器",
|
||||
"term.reset": "重置",
|
||||
"term.track": {
|
||||
"one": "首歌曲",
|
||||
"other": "首歌曲"
|
||||
},
|
||||
"term.tracks": "歌曲",
|
||||
"term.track": "首歌曲",
|
||||
"term.videos": "音乐视频",
|
||||
"term.menu": "菜单",
|
||||
"term.themeManaged": "由主题所管理",
|
||||
"term.check": "检查",
|
||||
"term.aboutArtist": "关于{{artistName}}",
|
||||
"term.topResult": "热门搜索结果",
|
||||
|
@ -137,13 +161,47 @@
|
|||
"term.song.link.generate": "获取 song.link 共享链接...",
|
||||
"term.musicVideos": "音乐视频",
|
||||
"term.stations": "电台",
|
||||
"term.curators": "策展人",
|
||||
"term.appleCurators": "Apple 策展人",
|
||||
"term.radioShows": "广播单集",
|
||||
"term.recordLabels": "唱片公司",
|
||||
"term.videoExtras": "视频特辑",
|
||||
"term.top": "顶部",
|
||||
"term.version": "版本",
|
||||
"term.noVideos": "无视频",
|
||||
"term.plugins": "插件",
|
||||
"term.plugin": "插件",
|
||||
"term.pluginMenu": "插件菜单",
|
||||
"term.pluginMenu.none": "沒有交互式插件",
|
||||
"term.replay": "音乐回忆",
|
||||
"term.uniqueAlbums": "独特专辑",
|
||||
"term.uniqueArtists": "超绝艺人",
|
||||
"term.uniqueSongs": "别致单曲",
|
||||
"term.topArtists": "热门艺人",
|
||||
"term.listenedTo": "听过",
|
||||
"term.times": "次",
|
||||
"term.topAlbums": "热门专辑",
|
||||
"term.plays": "次",
|
||||
"term.topGenres": "热门类型",
|
||||
"term.confirmLogout": "你确定要退出登录吗?",
|
||||
"term.creditDesignedBy": "由 ${authorUsername} 设计",
|
||||
"term.discNumber": "碟 ${discNumber}",
|
||||
"term.reload" : "重新载入 Cider?",
|
||||
"term.toggleprivate": "切换隐身聆听",
|
||||
"term.webremote": "远程控制",
|
||||
"term.cast": "投射",
|
||||
"term.cast2" : "投射到设备",
|
||||
"term.quit" : "退出应用",
|
||||
"term.zoomin" : "放大",
|
||||
"term.zoomout" : "缩小",
|
||||
"term.zoomreset" : "重置缩放",
|
||||
"term.fullscreen" : "全屏模式",
|
||||
"term.nowPlaying": "正在播放",
|
||||
"home.syncFavorites": "同步喜爱艺人",
|
||||
"home.syncFavorites.gettingArtists": "获取喜爱艺人...",
|
||||
"action.favorite": "喜爱",
|
||||
"action.removeFavorite": "取消喜爱",
|
||||
"action.refresh": "刷新",
|
||||
"home.title": "主页",
|
||||
"home.recentlyPlayed": "最近播放",
|
||||
"home.recentlyAdded": "最近添加",
|
||||
|
@ -164,8 +222,15 @@
|
|||
"podcast.episodes": "单集",
|
||||
"podcast.playEpisode": "播放单集",
|
||||
"podcast.website": "Podcast 网站",
|
||||
"action.hideLibrary": "隐藏资料库",
|
||||
"action.showLibrary": "显示资料库",
|
||||
"action.cut": "剪切",
|
||||
"action.paste": "粘贴",
|
||||
"action.selectAll": "全选",
|
||||
"action.delete": "删除",
|
||||
"action.edit": "编辑",
|
||||
"action.done": "完成",
|
||||
"action.submit": "提交",
|
||||
"action.editTracklist": "编辑歌曲清单",
|
||||
"action.addToLibrary": "加入资料库",
|
||||
"action.addToLibrary.success": "成功加入资料库",
|
||||
|
@ -181,7 +246,7 @@
|
|||
"action.createPlaylist": "新建播放列表",
|
||||
"action.addToPlaylist": "添加到播放列表",
|
||||
"action.removeFromPlaylist": "从播放列表移除",
|
||||
"action.addToFavorites": "加至收藏",
|
||||
"action.addToFavorites": "添加至收藏",
|
||||
"action.follow": "关注",
|
||||
"action.follow.success": "已关注",
|
||||
"action.follow.error": "尝试关注的过程发生了错误",
|
||||
|
@ -193,7 +258,8 @@
|
|||
"action.startRadio": "开始电台",
|
||||
"action.goToArtist": "前往艺人",
|
||||
"action.goToAlbum": "前往专辑",
|
||||
"action.showInAppleMusic": "显示于 Apple Music",
|
||||
"action.showInPlaylist": "在播放列表中显示",
|
||||
"action.showInAppleMusic": "在 Apple Music 中显示",
|
||||
"action.moveToTop": "移到顶部",
|
||||
"action.share": "分享歌曲",
|
||||
"action.rename": "重命名",
|
||||
|
@ -209,24 +275,49 @@
|
|||
"action.export": "导出",
|
||||
"action.showAlbum": "显示专辑",
|
||||
"action.tray.minimize": "最小化",
|
||||
"action.tray.quit": "退出",
|
||||
"action.tray.show": "显示 Cider",
|
||||
"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.view": "查看 ",
|
||||
"menubar.options.reload": "重新载入",
|
||||
"menubar.options.forcereload": "强制重新载入",
|
||||
"menubar.options.toggledevtools": "切换开发人员工具",
|
||||
"menubar.options.window": "窗口",
|
||||
"menubar.options.minimize": "最小化",
|
||||
"menubar.options.plugins": "插件目录",
|
||||
"menubar.options.controls": "控制",
|
||||
"menubar.options.volumeup": "增大音量",
|
||||
"menubar.options.volumedown": "减小音量",
|
||||
"menubar.options.account": "账户",
|
||||
"menubar.options.signout": "注销",
|
||||
"menubar.options.support": "支持",
|
||||
"menubar.options.report": "报告...",
|
||||
"menubar.options.bug": "Bug",
|
||||
"menubar.options.feature": "功能请求",
|
||||
"menubar.options.trans": "翻译报告/请求",
|
||||
"menubar.options.license": "查看授权",
|
||||
"menubar.options.conf": "在编辑器打开配置文件",
|
||||
"menubar.options.zoom": "缩放",
|
||||
"settings.header.general": "通用",
|
||||
"settings.header.general.description": "调整 Cider 的通用设置",
|
||||
"settings.option.audio.volumeStep": "音量改变量",
|
||||
"settings.option.audio.maxVolume": "最大音量",
|
||||
"settings.option.general.language": "语言",
|
||||
"settings.option.general.resumebehavior": "恢复行为",
|
||||
"settings.option.general.resumebehavior.description": "会影响你回到 Cider 应用程序时,恢复歌曲的方式。",
|
||||
"settings.option.general.resumebehavior.locally": "本地",
|
||||
|
@ -237,32 +328,66 @@
|
|||
"settings.option.general.resumetabs.description": "你可以选择启动 Cider 时要默认打开的页面。",
|
||||
"settings.option.general.resumetabs.dynamic": "动态",
|
||||
"settings.option.general.resumetabs.dynamic.description": "Cider 将自动打开你上次停留的页面。",
|
||||
"settings.option.general.language": "语言",
|
||||
"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.open": "打开",
|
||||
"settings.option.general.keybindings.library": "资料库",
|
||||
"settings.option.general.keybindings.session": "聆听",
|
||||
"settings.option.general.keybindings.control": "控制",
|
||||
"settings.option.general.keybindings.interface": "界面",
|
||||
"settings.option.general.keybindings.advanced": "高级",
|
||||
"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.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.volumeStep": "音量改变量",
|
||||
"settings.option.audio.advanced": "高级功能",
|
||||
"settings.option.audio.maxVolume": "最大音量",
|
||||
"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,11 +405,18 @@
|
|||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "春毫茉莉玛琪雅朵",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "北海道奶茶",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "月光软饼干",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "布蕾黑糖鲜奶",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "樱桃克拉芙缇",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "宇治抹茶麻糬",
|
||||
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "温暖抱抱",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider 数码增强音频处理™️",
|
||||
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "通过人类的听力心理学模型和 AAC 编码特色的即时算法,强化 AAC 音频的感知音频质量。",
|
||||
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "数码增强音频处理与空间音频不兼容,请先停用空间音频。",
|
||||
"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.option.audio.enableAdvancedFunctionality.audioNormalization": "音量平衡",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "自动将歌曲播放音量调整到相同水平,享受更舒适的聆听体验。",
|
||||
|
@ -294,11 +426,21 @@
|
|||
"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.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 相容,请关闭 CAP 在进行操作。",
|
||||
"settings.option.visual.uiscale": "UI界面大小",
|
||||
"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": "输入当 Cider 为 0 dBFS 时的峰值 Z 加权 dB SPL。",
|
||||
"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": "专辑插图",
|
||||
|
@ -318,10 +460,22 @@
|
|||
"settings.option.visual.hardwareAcceleration.description": "需要重启 Cider 才会生效",
|
||||
"settings.header.visual.hardwareAcceleration.default": "默认",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
||||
"settings.option.visual.uiscale": "UI界面大小",
|
||||
"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.header.visual.styles": "主题",
|
||||
"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": "插件",
|
||||
|
@ -353,18 +507,27 @@
|
|||
"settings.option.lyrics.enableQQLyrics": "启用 QQ 音乐的歌词",
|
||||
"settings.header.connectivity": "外部连接",
|
||||
"settings.header.connectivity.description": "调整 Cider 与外部应用的交互设置",
|
||||
"settings.option.connectivity.discordRPC": "Discord 动态",
|
||||
"settings.option.connectivity.playbackNotifications": "歌曲播放通知",
|
||||
"settings.option.connectivity.discordRPC": "Discord 动态",
|
||||
"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 正在聆听",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "从歌名里去除合作者 (Last.FM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "不记录单曲循环 (Last.FM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "防止循环单曲被记录或展示在Last.FM 的正在播放列表中。",
|
||||
"settings.option.connectivity.lastfmScrobble.filterTypes": "过滤媒体类型 (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.manualToken": "手动输入 Last.fm 验证码",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.fm 连接超时",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.fm 连接成功",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connecting": "正在连接至 Last.fm...",
|
||||
"settings.header.debug": "Debug",
|
||||
"settings.option.debug.copy_log": "拷贝日志至剪贴板",
|
||||
"settings.option.debug.openAppData": "打开 Cider 程序文件夹",
|
||||
|
@ -376,12 +539,21 @@
|
|||
"settings.option.experimental.unknownPlugin.description": "允许从 Cider 来源以外的 repo 安装插件",
|
||||
"settings.option.experimental.compactUI": "紧凑型 UI",
|
||||
"settings.option.window.close_button_hide": "关闭按钮将 Cider 隐藏至系统栏",
|
||||
"settings.option.window.maxElementScale": "最大元素比例",
|
||||
"settings.option.experimental.inline_playlists": "将播放列表做为行内元素显示",
|
||||
"settings.option.advanced.playlistTrackMapping": "播放列表追踪映射",
|
||||
"settings.option.advanced.playlistTrackMapping.description": "打开对播放列表的深度扫描,以确认歌曲在哪些播放列表中。但播放列表加载时间会显著增加。",
|
||||
"settings.option.visual.transparent": "透明窗口框架",
|
||||
"settings.option.visual.transparent.description": "需主题有支持透明框架,且须重新启动才会生效。",
|
||||
"settings.option.visual.customAccentColor": "自定义强调色",
|
||||
"settings.option.visual.accentColor": "强调色",
|
||||
"settings.option.visual.purplePodcastPlaybackBar": "播放播客时使用紫色进度条",
|
||||
"settings.option.visual.windowColor": "窗口色调",
|
||||
"settings.header.visual.windowBackgroundStyle.color": "色调",
|
||||
"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 +576,54 @@
|
|||
"settings.header.unfinished": "未完成",
|
||||
"remote.web.title": "Cider 远程控制",
|
||||
"remote.web.description": "扫描以下的二维码以控制 Cider",
|
||||
"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": "复制到剪贴板",
|
||||
"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": "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": "经典的苹果风主题。",
|
||||
"oobe.visual.suggestingThemes.community3": "Dracula",
|
||||
"oobe.visual.suggestingThemes.community3.text": "著名的德古拉吸血鬼主题。",
|
||||
"oobe.amsignin.title": ""
|
||||
}
|
||||
|
|
|
@ -19,7 +19,10 @@
|
|||
"term.accountSettings": "帳戶設定",
|
||||
"term.logout": "登出",
|
||||
"term.login": "登入",
|
||||
"term.quit" : "結束",
|
||||
"term.about": "關於",
|
||||
"term.cast" : "投影",
|
||||
"term.cast2" : "投影到裝置",
|
||||
"term.privateSession": "私人時間",
|
||||
"term.queue": "待播清單",
|
||||
"term.lyrics": "歌詞",
|
||||
|
@ -37,6 +40,7 @@
|
|||
"term.podcasts": "Podcasts",
|
||||
"term.playlists": "播放列表",
|
||||
"term.playlist": "播放列表",
|
||||
"term.charts": "圖表",
|
||||
"term.newPlaylist": "新的播放列表",
|
||||
"term.newPlaylistFolder": "新的播放列表檔案夾",
|
||||
"term.createNewPlaylist": "新增播放列表",
|
||||
|
@ -45,6 +49,7 @@
|
|||
"term.navigateBack": "回上一頁",
|
||||
"term.navigateForward": "到下一頁",
|
||||
"term.play": "播放",
|
||||
"term.playpause": "播放/暫停",
|
||||
"term.pause": "暫停",
|
||||
"term.stop": "停止",
|
||||
"term.previous": "上一首",
|
||||
|
@ -53,8 +58,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 +116,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": "公關團隊",
|
||||
|
@ -129,26 +135,32 @@
|
|||
"term.videos": "音樂錄影帶",
|
||||
"term.menu": "選單",
|
||||
"term.check": "檢查",
|
||||
"term.themeManaged": "此功能現在由主題管理。",
|
||||
"term.aboutArtist": "關於{{artistName}}",
|
||||
"term.requestError": "請求發生錯誤。",
|
||||
"term.song.link.generate": "正在取得 song.link 的分享網址...",
|
||||
"term.musicVideos": "音樂錄影帶",
|
||||
"term.version": "版本",
|
||||
"term.creditDesignedBy": "由 ${authorUsername} 設計",
|
||||
"term.plugin": "模組",
|
||||
"term.plugins": "模組",
|
||||
"term.pluginMenu": "模組選單",
|
||||
"term.pluginMenu.none": "沒有交互式模組",
|
||||
"term.fullscreen" : "全螢幕模式",
|
||||
"home.title": "首頁",
|
||||
"home.recentlyPlayed": "最近播放",
|
||||
"home.recentlyAdded": "最近加入",
|
||||
"home.artistsFeed": "藝人追蹤",
|
||||
"home.artistsFeed.noArtist": "追蹤你喜愛的藝人來取得他們的最新發行歌曲。",
|
||||
"home.syncFavorites" : "同步追蹤" ,
|
||||
"home.syncFavorites.gettingArtists" : "取得追蹤的藝人歌手列表... " ,
|
||||
"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 +171,8 @@
|
|||
"podcast.website": "Podcast 網站",
|
||||
"action.edit": "編輯",
|
||||
"action.done": "完成",
|
||||
"action.hideLibrary": "隱藏側邊欄",
|
||||
"action.showLibrary": "顯示側邊欄",
|
||||
"action.editTracklist": "編輯歌曲清單",
|
||||
"action.addToLibrary": "加入到資料庫",
|
||||
"action.addToLibrary.success": "成功加入資料庫",
|
||||
|
@ -213,13 +227,15 @@
|
|||
"action.deletepreset": "刪除預設",
|
||||
"action.open": "開啟",
|
||||
"action.cast.chromecast": "Chromecast",
|
||||
"action.cast.todevices": "投射到裝置",
|
||||
"action.cast.stop": "停止投射到所有裝置",
|
||||
"action.cast.todevices": "投影到裝置",
|
||||
"action.cast.stop": "停止投影到所有裝置",
|
||||
"action.cast.airplay": "AirPlay",
|
||||
"action.cast.airplay.underdevelopment": "AirPlay 仍處於開發階段中,敬請期待。",
|
||||
"action.cast.scan": "尋找",
|
||||
"action.cast.scanning": "尋找中...",
|
||||
"action.createNew": "新增...",
|
||||
"action.refresh": "重新整理",
|
||||
"menubar.options.reload": "重新載入",
|
||||
"settings.header.general": "一般",
|
||||
"settings.header.general.description": "調整 Cider 的一般設定",
|
||||
"settings.option.general.resumebehavior": "還原行為",
|
||||
|
@ -252,6 +268,9 @@
|
|||
"settings.header.audio.description": "調整 Cider 的音訊設定",
|
||||
"settings.option.audio.volumeStep": "音量改變量",
|
||||
"settings.option.audio.maxVolume": "最大音量",
|
||||
"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)",
|
||||
|
@ -261,7 +280,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 +291,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,7 +304,7 @@
|
|||
"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.profile": "Cider 空間音訊配置檔案",
|
||||
|
@ -300,6 +319,11 @@
|
|||
"settings.option.visual.uiscale": "介面顯示大小",
|
||||
"settings.header.visual": "外觀",
|
||||
"settings.header.visual.description": "調整 Cider 的外觀",
|
||||
"settings.option.visual.windowStyle": "視窗布局風格",
|
||||
"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": "專輯插圖",
|
||||
|
@ -324,6 +348,8 @@
|
|||
"settings.option.visual.theme.github.openfolder": "開啟主題存放位置",
|
||||
"settings.option.visual.theme.github.explore": "探索 GitHub 上的主題",
|
||||
"settings.prompt.visual.theme.github.URL": "輸入你要安裝的主題網址",
|
||||
"settings.option.visual.theme.checkForUpdates": "檢查更新",
|
||||
"settings.header.visual.styles": "主題",
|
||||
"settings.option.visual.theme.manageStyles": "管理主題",
|
||||
"settings.option.visual.theme.uninstall": "移除",
|
||||
"settings.option.visual.theme.viewInfo": "查看資訊",
|
||||
|
@ -345,6 +371,7 @@
|
|||
"settings.option.visual.showPersonalInfo": "顯示個人檔案",
|
||||
"settings.header.window": "視窗",
|
||||
"settings.header.window.description": "調整 Cider 的視窗設定",
|
||||
"settings.option.window.maxElementScale": "最大元素比例",
|
||||
"settings.option.window.openOnStartup": "開機時,啟動 Cider ",
|
||||
"settings.option.window.openOnStartup.hidden": "啟動時,自動隱藏至系統列",
|
||||
"settings.option.window.useNativeTitleBar": "使用原生視窗標題列",
|
||||
|
@ -358,7 +385,7 @@
|
|||
"settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌詞優先語言偏好選項",
|
||||
"settings.option.lyrics.enableYoutubeLyrics": "播放 MV 時,使用 YouTube 歌詞",
|
||||
"settings.option.lyrics.enableQQLyrics": "開啟 QQ 音樂的歌詞",
|
||||
"settings.header.connectivity": "外部連接",
|
||||
"settings.header.connectivity": "連接",
|
||||
"settings.header.connectivity.description": "調整 Cider 與外部的連接",
|
||||
"settings.option.connectivity.playbackNotifications": "歌曲播放通知",
|
||||
"settings.option.connectivity.discordRPC": "Discord 動態",
|
||||
|
@ -368,11 +395,19 @@
|
|||
"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.option.connectivity.lastfmScrobble.filterLoop.description": "防止循環單曲被打亂或顯示在 Last.FM 的正在播放列表中。",
|
||||
"settings.option.connectivity.lastfmScrobble.filterTypes": "過濾媒體類型 (Last.FM)",
|
||||
"settings.option.connectivity.lastfmScrobble.manualToken": "手動輸入 Last.FM 驗證碼",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectError": "Last.FM 連線超時",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Last.FM 連線成功",
|
||||
"settings.notyf.connectivity.lastfmScrobble.connecting": "正在連線到 Last.FM...",
|
||||
"settings.header.debug": "除錯",
|
||||
"settings.option.debug.copy_log": "複製執行紀錄檔至剪貼簿",
|
||||
"settings.option.debug.openAppData": "打開 Cider 資料夾",
|
||||
|
@ -380,7 +415,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 +427,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": "寬度",
|
||||
|
|
|
@ -162,13 +162,10 @@ export class AppEvents {
|
|||
|
||||
// LastFM Auth URL
|
||||
if (arg.includes('auth')) {
|
||||
let authURI = arg.split('/auth/')[1]
|
||||
const authURI = arg.split('/auth/')[1]
|
||||
if (authURI.startsWith('lastfm')) { // If we wanted more auth options
|
||||
const authKey = authURI.split('lastfm?token=')[1];
|
||||
utils.setStoreValue('lastfm.enabled', true);
|
||||
utils.setStoreValue('lastfm.auth_token', authKey);
|
||||
utils.getWindow().webContents.send('LastfmAuthenticated', authKey);
|
||||
this.plugin.callPlugin('lastfm', 'authenticate', authKey);
|
||||
console.log('token: ', authURI.split('lastfm?token=')[1])
|
||||
utils.getWindow().webContents.executeJavaScript(`ipcRenderer.send('lastfm:auth', "${authURI.split('lastfm?token=')[1]}")`).catch(console.error)
|
||||
}
|
||||
}
|
||||
// Play
|
||||
|
@ -335,7 +332,7 @@ export class AppEvents {
|
|||
|
||||
{
|
||||
visible: !visible,
|
||||
label: this.i18n['action.tray.playpause'],
|
||||
label: this.i18n['term.playpause'],
|
||||
click: () => {
|
||||
utils.getWindow().webContents.executeJavaScript('MusicKitInterop.playPause()')
|
||||
}
|
||||
|
@ -343,7 +340,7 @@ export class AppEvents {
|
|||
|
||||
{
|
||||
visible: !visible,
|
||||
label: this.i18n['action.tray.next'],
|
||||
label: this.i18n['term.next'],
|
||||
click: () => {
|
||||
utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`)
|
||||
}
|
||||
|
@ -351,7 +348,7 @@ export class AppEvents {
|
|||
|
||||
{
|
||||
visible: !visible,
|
||||
label: this.i18n['action.tray.previous'],
|
||||
label: this.i18n['term.previous'],
|
||||
click: () => {
|
||||
utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`)
|
||||
}
|
||||
|
@ -372,7 +369,7 @@ export class AppEvents {
|
|||
}
|
||||
},
|
||||
{
|
||||
label: this.i18n['action.tray.quit'],
|
||||
label: this.i18n['term.quit'],
|
||||
click: () => {
|
||||
app.quit()
|
||||
}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import {join} from "path";
|
||||
import {app, BrowserWindow as bw, ipcMain, ShareMenu, shell, screen} from "electron";
|
||||
import { join } from "path";
|
||||
import { app, BrowserWindow as bw, ipcMain, ShareMenu, shell, screen, dialog } from "electron";
|
||||
import * as windowStateKeeper from "electron-window-state";
|
||||
import * as express from "express";
|
||||
import * as getPort from "get-port";
|
||||
import {search} from "youtube-search-without-api-key";
|
||||
import { search } from "youtube-search-without-api-key";
|
||||
import {
|
||||
existsSync,
|
||||
rmSync,
|
||||
|
@ -16,19 +16,18 @@ import {
|
|||
rmdirSync,
|
||||
lstatSync,
|
||||
} from "fs";
|
||||
import {Stream} from "stream";
|
||||
import {networkInterfaces} from "os";
|
||||
import { Stream } from "stream";
|
||||
import { networkInterfaces } from "os";
|
||||
import * as mm from 'music-metadata';
|
||||
import fetch from 'electron-fetch'
|
||||
import {wsapi} from "./wsapi";
|
||||
import {utils} from './utils';
|
||||
import {Plugins} from "./plugins";
|
||||
import {watch} from "chokidar";
|
||||
import { wsapi } from "./wsapi";
|
||||
import { utils } from './utils';
|
||||
import { Plugins } from "./plugins";
|
||||
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;
|
||||
import { LocalFiles } from "../providers/local/";
|
||||
|
||||
|
||||
/**
|
||||
|
@ -40,11 +39,11 @@ const { readdir } = require('fs').promises;
|
|||
export class BrowserWindow {
|
||||
public static win: any | undefined = null;
|
||||
private devMode: boolean = !app.isPackaged;
|
||||
public static express: any | undefined = null;
|
||||
|
||||
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 = {
|
||||
|
@ -53,6 +52,7 @@ export class BrowserWindow {
|
|||
dev: app.isPackaged,
|
||||
osRelease: os.release(),
|
||||
updatable: !process.windowsStore || !process.mas,
|
||||
useV3: utils.getStoreValue('advanced.experiments').includes("ampv3"),
|
||||
components: [
|
||||
"pages/podcasts",
|
||||
"pages/apple-account-settings",
|
||||
|
@ -63,8 +63,7 @@ export class BrowserWindow {
|
|||
"pages/browse",
|
||||
"pages/groupings",
|
||||
"pages/charts",
|
||||
"pages/settings",
|
||||
"pages/installed-themes",
|
||||
//"pages/installed-themes",
|
||||
"pages/listen_now",
|
||||
"pages/radio",
|
||||
"pages/home",
|
||||
|
@ -80,14 +79,16 @@ export class BrowserWindow {
|
|||
"pages/about",
|
||||
"pages/library-videos",
|
||||
"pages/remote-pair",
|
||||
"pages/themes-github",
|
||||
"pages/plugins-github",
|
||||
//"pages/themes-github",
|
||||
//"pages/plugins-github",
|
||||
"pages/replay",
|
||||
"pages/audiolabs",
|
||||
"pages/zoo",
|
||||
"pages/plugin-renderer",
|
||||
"pages/keybinds",
|
||||
"pages/oobe",
|
||||
"pages/cider-profile",
|
||||
"components/app-content",
|
||||
"components/sidebar",
|
||||
"components/mediaitem-artwork",
|
||||
"components/artwork-material",
|
||||
"components/menu-panel",
|
||||
|
@ -118,159 +119,174 @@ export class BrowserWindow {
|
|||
"components/fullscreen",
|
||||
"components/miniplayer",
|
||||
"components/castmenu",
|
||||
"components/pathmenu",
|
||||
"components/airplay-modal",
|
||||
"components/artist-chip",
|
||||
"components/hello-world",
|
||||
"components/inline-collection-list",
|
||||
"components/settings-window",
|
||||
"components/pagination",
|
||||
"components/settings-keybinds",
|
||||
"components/settings-themes",
|
||||
"components/settings-themes-github",
|
||||
"components/settings-plugins-github",
|
||||
],
|
||||
appRoutes: [
|
||||
{
|
||||
page: "library-recentlyadded",
|
||||
component: `<cider-recentlyadded></cider-recentlyadded>`,
|
||||
condition: "page == 'library-recentlyadded'"
|
||||
condition: "$root.page == 'library-recentlyadded'"
|
||||
},
|
||||
{
|
||||
page: "plugin-renderer",
|
||||
component: `<plugin-renderer></plugin-renderer>`,
|
||||
condition: "page == 'plugin-renderer'"
|
||||
condition: "$root.page == 'plugin-renderer'"
|
||||
},
|
||||
{
|
||||
page: "zoo",
|
||||
component: "<cider-zoo></cider-zoo>",
|
||||
condition: "page == 'zoo'"
|
||||
condition: "$root.page == 'zoo'"
|
||||
},
|
||||
{
|
||||
page: "podcasts",
|
||||
component: `<apple-podcasts></apple-podcasts>`,
|
||||
condition: `page == 'podcasts'`
|
||||
condition: `$root.page == 'podcasts'`
|
||||
}, {
|
||||
page: "library-videos",
|
||||
component: `<cider-library-videos></cider-library-videos>`,
|
||||
condition: `page == 'library-videos'`
|
||||
condition: `$root.page == 'library-videos'`
|
||||
}, {
|
||||
page: "apple-account-settings",
|
||||
component: `<apple-account-settings></apple-account-settings>`,
|
||||
condition: `page == 'apple-account-settings'`
|
||||
condition: `$root.page == 'apple-account-settings'`
|
||||
}, {
|
||||
page: "about",
|
||||
component: `<about-page></about-page>`,
|
||||
condition: `page == 'about'`
|
||||
condition: `$root.page == 'about'`
|
||||
}, {
|
||||
page: "cider-artist",
|
||||
component: `<cider-artist :data="artistPage.data"></cider-artist>`,
|
||||
condition: `page == 'artist-page' && artistPage.data.attributes`
|
||||
component: `<cider-artist :data="$root.artistPage.data"></cider-artist>`,
|
||||
condition: `$root.page == 'artist-page' && $root.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'`
|
||||
component: `<cider-collection-list :data="$root.collectionList.response" :type="$root.collectionList.type" :title="$root.collectionList.title"></cider-collection-list>`,
|
||||
condition: `$root.page == 'collection-list'`
|
||||
}, {
|
||||
page: "home",
|
||||
component: `<cider-home></cider-home>`,
|
||||
condition: `page == 'home'`
|
||||
condition: `$root.page == 'home'`
|
||||
}, {
|
||||
page: "artist-feed",
|
||||
component: `<cider-artist-feed></cider-artist-feed>`,
|
||||
condition: `page == 'artist-feed'`
|
||||
condition: `$root.page == 'artist-feed'`
|
||||
}, {
|
||||
page: "playlist-inline",
|
||||
component: `<playlist-inline :data="showingPlaylist"></playlist-inline>`,
|
||||
condition: `modals.showPlaylist`
|
||||
component: `<playlist-inline :data="$root.showingPlaylist"></playlist-inline>`,
|
||||
condition: `$root.modals.showPlaylist`
|
||||
}, {
|
||||
page: "playlist_",
|
||||
component: `<cider-playlist :data="showingPlaylist"></cider-playlist>`,
|
||||
condition: `page.includes('playlist_')`
|
||||
component: `<cider-playlist :data="$root.showingPlaylist"></cider-playlist>`,
|
||||
condition: `$root.page.includes('playlist_')`
|
||||
}, {
|
||||
page: "album_",
|
||||
component: `<cider-playlist :data="showingPlaylist"></cider-playlist>`,
|
||||
condition: `page.includes('album_')`
|
||||
component: `<cider-playlist :data="$root.showingPlaylist"></cider-playlist>`,
|
||||
condition: `$root.page.includes('album_')`
|
||||
}, {
|
||||
page: "recordLabel_",
|
||||
component: `<cider-recordlabel :data="showingPlaylist"></cider-recordlabel>`,
|
||||
condition: `page.includes('recordLabel_')`
|
||||
component: `<cider-recordlabel :data="$root.showingPlaylist"></cider-recordlabel>`,
|
||||
condition: `$root.page.includes('recordLabel_')`
|
||||
}, {
|
||||
page: "social-profiles_",
|
||||
component: `<cider-socialprofile :data="$root.showingPlaylist"></cider-socialprofile>`,
|
||||
condition: `$root.page.includes('social-profiles_')`
|
||||
}, {
|
||||
page: "multiroom",
|
||||
component: `<cider-multiroom :data="multiroom"></cider-multiroom>`,
|
||||
condition: `page.includes('multiroom')`
|
||||
component: `<cider-multiroom :data="$root.multiroom"></cider-multiroom>`,
|
||||
condition: `$root.page.includes('multiroom')`
|
||||
}, {
|
||||
page: "curator_",
|
||||
component: `<cider-recordlabel :data="showingPlaylist"></cider-recordlabel>`,
|
||||
condition: `page.includes('curator_')`
|
||||
component: `<cider-recordlabel :data="$root.showingPlaylist"></cider-recordlabel>`,
|
||||
condition: `$root.page.includes('curator_')`
|
||||
}, {
|
||||
page: "browsepage",
|
||||
component: `<cider-browse :data="browsepage"></cider-browse>`,
|
||||
condition: `page == 'browse'`,
|
||||
component: `<cider-browse :data="$root.browsepage"></cider-browse>`,
|
||||
condition: `$root.page == 'browse'`,
|
||||
onEnter: ``
|
||||
},{
|
||||
}, {
|
||||
page: "groupings",
|
||||
component: `<cider-groupings :data="browsepage"></cider-groupings>`,
|
||||
condition: `page == 'groupings'`,
|
||||
component: `<cider-groupings :data="$root.browsepage"></cider-groupings>`,
|
||||
condition: `$root.page == 'groupings'`,
|
||||
onEnter: ``
|
||||
},{
|
||||
}, {
|
||||
page: "charts",
|
||||
component: `<cider-charts :data="browsepage"></cider-charts>`,
|
||||
condition: `page == 'charts'`,
|
||||
component: `<cider-charts :data="$root.browsepage"></cider-charts>`,
|
||||
condition: `$root.page == 'charts'`,
|
||||
onEnter: ``
|
||||
}, {
|
||||
page: "listen_now",
|
||||
component: `<cider-listen-now :data="listennow"></cider-listen-now>`,
|
||||
condition: `page == 'listen_now'`,
|
||||
component: `<cider-listen-now :data="$root.listennow"></cider-listen-now>`,
|
||||
condition: `$root.page == 'listen_now'`,
|
||||
onEnter: ``
|
||||
}, {
|
||||
page: "radio",
|
||||
component: `<cider-radio :data="radio"></cider-radio>`,
|
||||
condition: `page == 'radio'`,
|
||||
component: `<cider-radio :data="$root.radio"></cider-radio>`,
|
||||
condition: `$root.page == 'radio'`,
|
||||
onEnter: ``
|
||||
}, {
|
||||
page: "settings",
|
||||
component: `<cider-settings></cider-settings>`,
|
||||
condition: `page == 'settings'`
|
||||
condition: `$root.page == 'settings'`
|
||||
}, {
|
||||
page: "installed-themes",
|
||||
component: `<installed-themes></installed-themes>`,
|
||||
condition: `page == 'installed-themes'`
|
||||
condition: `$root.page == 'installed-themes'`
|
||||
}, {
|
||||
page: "search",
|
||||
component: `<cider-search :search="search"></cider-search>`,
|
||||
condition: `page == 'search'`
|
||||
component: `<cider-search :search="$root.search"></cider-search>`,
|
||||
condition: `$root.page == 'search'`
|
||||
}, {
|
||||
page: "library-songs",
|
||||
component: `<cider-library-songs :data="library.songs"></cider-library-songs>`,
|
||||
condition: `page == 'library-songs'`,
|
||||
component: `<cider-library-songs :data="$root.library.songs"></cider-library-songs>`,
|
||||
condition: `$root.page == 'library-songs'`,
|
||||
onEnter: ``
|
||||
}, {
|
||||
page: "library-albums",
|
||||
component: `<cider-library-albums :data="library.songs"></cider-library-albums>`,
|
||||
condition: `page == 'library-albums'`,
|
||||
component: `<cider-library-albums :data="$root.library.songs"></cider-library-albums>`,
|
||||
condition: `$root.page == 'library-albums'`,
|
||||
onEnter: ``
|
||||
}, {
|
||||
page: "library-artists",
|
||||
component: `<cider-library-artists></cider-library-artists>`,
|
||||
condition: `page == 'library-artists'`,
|
||||
condition: `$root.page == 'library-artists'`,
|
||||
onEnter: ``
|
||||
}, {
|
||||
page: "appleCurator",
|
||||
component: `<cider-applecurator :data="appleCurator"></cider-applecurator>`,
|
||||
condition: `page.includes('appleCurator')`
|
||||
component: `<cider-applecurator :data="$root.appleCurator"></cider-applecurator>`,
|
||||
condition: `$root.page.includes('appleCurator')`
|
||||
}, {
|
||||
page: "themes-github",
|
||||
component: `<themes-github></themes-github>`,
|
||||
condition: `page == 'themes-github'`
|
||||
condition: `$root.page == 'themes-github'`
|
||||
}, {
|
||||
page: "plugins-github",
|
||||
component: `<plugins-github></plugins-github>`,
|
||||
condition: `page == 'plugins-github'`
|
||||
condition: `$root.page == 'plugins-github'`
|
||||
}, {
|
||||
page: "remote-pair",
|
||||
component: `<remote-pair></remote-pair>`,
|
||||
condition: `page == 'remote-pair'`
|
||||
condition: `$root.page == 'remote-pair'`
|
||||
}, {
|
||||
page: "audiolabs",
|
||||
component: `<audiolabs-page></audiolabs-page>`,
|
||||
condition: `page == 'audiolabs'`
|
||||
condition: `$root.page == 'audiolabs'`
|
||||
}, {
|
||||
page: "replay",
|
||||
component: `<replay-page></replay-page>`,
|
||||
condition: `page == 'replay'`
|
||||
condition: `$root.page == 'replay'`
|
||||
}, {
|
||||
page: "keydinds",
|
||||
component: `<keybinds-settings></keybinds-settings>`,
|
||||
condition: `$root.page == 'keybinds-settings'`
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -291,7 +307,7 @@ export class BrowserWindow {
|
|||
show: false,
|
||||
// backgroundColor: "#1E1E1E",
|
||||
titleBarStyle: 'hidden',
|
||||
trafficLightPosition: {x: 15, y: 20},
|
||||
trafficLightPosition: { x: 15, y: 20 },
|
||||
webPreferences: {
|
||||
experimentalFeatures: true,
|
||||
nodeIntegration: true,
|
||||
|
@ -357,7 +373,8 @@ export class BrowserWindow {
|
|||
* @yields {object} Electron browser window
|
||||
*/
|
||||
async createWindow(): Promise<Electron.BrowserWindow> {
|
||||
this.clientPort = await getPort({port: 9000});
|
||||
const envPort = process.env?.CIDER_PORT || '9000'
|
||||
this.clientPort = await getPort({ port: parseInt(envPort, 10) || 9000 });
|
||||
BrowserWindow.verifyFiles();
|
||||
this.StartWatcher(utils.getPath('themes'));
|
||||
|
||||
|
@ -404,9 +421,10 @@ export class BrowserWindow {
|
|||
}
|
||||
|
||||
// Start the webserver for the browser window to load
|
||||
|
||||
// LocalFiles.DB.init()
|
||||
this.startWebServer();
|
||||
|
||||
|
||||
BrowserWindow.win = new bw(this.options);
|
||||
// cant be built in CI
|
||||
// if (process.platform === "win32" && (utils.getStoreValue('visual.transparent') ?? false)) {
|
||||
|
@ -462,7 +480,7 @@ export class BrowserWindow {
|
|||
*/
|
||||
private startWebServer(): void {
|
||||
const app = express();
|
||||
|
||||
BrowserWindow.express = app;
|
||||
app.use(express.static(join(utils.getPath('srcPath'), "./renderer/")));
|
||||
app.set("views", join(utils.getPath('srcPath'), "./renderer/views"));
|
||||
app.set("view engine", "ejs");
|
||||
|
@ -494,9 +512,9 @@ export class BrowserWindow {
|
|||
app.get("/cideraudio/impulses/:file", (req, res) => {
|
||||
const impulseExternals = join(utils.getPath("externals"), "/impulses/")
|
||||
const impulseFile = join(impulseExternals, req.params.file)
|
||||
if(existsSync(impulseFile)) {
|
||||
if (existsSync(impulseFile)) {
|
||||
res.sendFile(impulseFile)
|
||||
}else{
|
||||
} else {
|
||||
res.sendFile(join(utils.getPath('srcPath'), "./renderer/audio/impulses/" + req.params.file))
|
||||
}
|
||||
})
|
||||
|
@ -546,14 +564,6 @@ 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;
|
||||
|
@ -614,10 +624,12 @@ export class BrowserWindow {
|
|||
//region Connect Integration
|
||||
app.get("/connect/set-cc-user/:data", (req, res) => {
|
||||
//utils.getStoreValue('connectUser', JSON.parse()) // [Connect] Save user in store
|
||||
utils.setStoreValue('connectUser', JSON.parse(req.params.data))
|
||||
utils.getWindow().reload()
|
||||
utils.getWindow().webContents.send('setStoreValue', 'connectUser', JSON.parse(req.params.data))
|
||||
res.redirect(`https://connect.cidercollective.dev/linked.html`)
|
||||
});
|
||||
|
||||
LocalFiles.setupHandlers()
|
||||
|
||||
// [Connect] Set auth URL in store for `shell.openExternal`
|
||||
utils.setStoreValue('cc_authURL', `https://connect.cidercollective.dev/callback/discord?app=cider&appPort=${this.clientPort}`)
|
||||
console.log(`[Connect] Auth URL: ${utils.getStoreValue('cc_authURL')}`)
|
||||
|
@ -637,7 +649,7 @@ export class BrowserWindow {
|
|||
remote.use(express.static(join(utils.getPath('srcPath'), "./web-remote/")))
|
||||
remote.set("views", join(utils.getPath('srcPath'), "./web-remote/views"));
|
||||
remote.set("view engine", "ejs");
|
||||
getPort({port: 6942}).then((port: number) => {
|
||||
getPort({ port: 6942 }).then((port: number) => {
|
||||
this.remotePort = port;
|
||||
// Start Remote Discovery
|
||||
this.broadcastRemote()
|
||||
|
@ -668,13 +680,13 @@ export class BrowserWindow {
|
|||
callback({
|
||||
redirectURL: `http://localhost:${this.clientPort}/apple-hls.js`,
|
||||
});
|
||||
} else if (details.url.includes("ciderlocal")) {
|
||||
} else if (details.url.includes("ciderlocal") && !details.url.includes("https://apic-desktop.musixmatch.com") ) {
|
||||
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)
|
||||
//console.log('localurl',text)
|
||||
callback({
|
||||
redirectURL: `http://localhost:${this.clientPort}/ciderlocal/${Buffer.from(text).toString('base64url')}`,
|
||||
});
|
||||
}else {
|
||||
} else {
|
||||
callback({
|
||||
cancel: false,
|
||||
});
|
||||
|
@ -716,7 +728,7 @@ export class BrowserWindow {
|
|||
'KHTML, like Gecko) Mobile/17D50 UCBrowser/12.8.2.1268 Mobile AliApp(TUnionSDK/0.1.20.3) '
|
||||
details.requestHeaders['Referer'] = "https://y.qq.com/portal/player.html"
|
||||
}
|
||||
callback({requestHeaders: details.requestHeaders});
|
||||
callback({ requestHeaders: details.requestHeaders });
|
||||
}
|
||||
);
|
||||
|
||||
|
@ -773,7 +785,7 @@ export class BrowserWindow {
|
|||
const Jimp = require("jimp")
|
||||
const img = await Jimp.read(wpPath)
|
||||
const blurAmount = args.blurAmount ?? 256
|
||||
if(blurAmount) {
|
||||
if (blurAmount) {
|
||||
img.blur(blurAmount)
|
||||
}
|
||||
const screens = await screen.getAllDisplays()
|
||||
|
@ -810,7 +822,7 @@ export class BrowserWindow {
|
|||
}
|
||||
// if path is directory, delete it
|
||||
if (lstatSync(path).isDirectory()) {
|
||||
await rmdirSync(path, {recursive: true});
|
||||
await rmdirSync(path, { recursive: true });
|
||||
} else {
|
||||
// if path is file, delete it
|
||||
await unlinkSync(path);
|
||||
|
@ -841,7 +853,7 @@ export class BrowserWindow {
|
|||
// remove WidevineCDM from appdata folder
|
||||
const widevineCdmPath = join(app.getPath("userData"), "./WidevineCdm");
|
||||
if (existsSync(widevineCdmPath)) {
|
||||
rmSync(widevineCdmPath, {recursive: true, force: true})
|
||||
rmSync(widevineCdmPath, { recursive: true, force: true })
|
||||
}
|
||||
// reinstall WidevineCDM
|
||||
app.relaunch()
|
||||
|
@ -849,6 +861,7 @@ export class BrowserWindow {
|
|||
})
|
||||
|
||||
ipcMain.handle("get-github-plugin", async (event, url) => {
|
||||
await this.StopWatcher()
|
||||
const returnVal = {
|
||||
success: true,
|
||||
theme: null,
|
||||
|
@ -893,9 +906,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,
|
||||
|
@ -940,6 +955,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) => {
|
||||
|
@ -1128,7 +1145,7 @@ export class BrowserWindow {
|
|||
|
||||
// Move window
|
||||
ipcMain.on("windowmove", (_event, x, y) => {
|
||||
BrowserWindow.win.setBounds({x, y});
|
||||
BrowserWindow.win.setBounds({ x, y });
|
||||
});
|
||||
|
||||
//Fullscreen
|
||||
|
@ -1143,7 +1160,7 @@ export class BrowserWindow {
|
|||
|
||||
//Fullscreen
|
||||
ipcMain.on('detachDT', (_event, _) => {
|
||||
BrowserWindow.win.webContents.openDevTools({mode: 'detach'});
|
||||
BrowserWindow.win.webContents.openDevTools({ mode: 'detach' });
|
||||
})
|
||||
|
||||
ipcMain.handle('relaunchApp', (_event, _) => {
|
||||
|
@ -1162,6 +1179,10 @@ export class BrowserWindow {
|
|||
app.quit();
|
||||
})
|
||||
|
||||
ipcMain.handle("quit-app", (_event, _) => {
|
||||
app.quit();
|
||||
})
|
||||
|
||||
app.on('before-quit', () => {
|
||||
|
||||
})
|
||||
|
@ -1176,102 +1197,17 @@ 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.handle("scanLibrary", async (event, folders) => {
|
||||
const oldmetadatalist = await LocalFiles.sendOldLibrary()
|
||||
BrowserWindow.win.webContents.send('getUpdatedLocalList', oldmetadatalist);
|
||||
const metadatalist = await LocalFiles.scanLibrary()
|
||||
BrowserWindow.win.webContents.send('getUpdatedLocalList', metadatalist);
|
||||
LocalFiles.cleanUpDB()
|
||||
})
|
||||
|
||||
)
|
||||
LocalFiles.eventEmitter.on('newtracks', (data) => {
|
||||
BrowserWindow.win.webContents.send('getUpdatedLocalList', data);
|
||||
});
|
||||
|
||||
ipcMain.on('writeWAV', (event, leftpcm, rightpcm, bufferlength) => {
|
||||
|
||||
|
@ -1439,13 +1375,13 @@ export class BrowserWindow {
|
|||
console.log('sc', SoundCheckTag)
|
||||
BrowserWindow.win.webContents.send('SoundCheckTag', SoundCheckTag)
|
||||
}).catch(err => {
|
||||
console.log(err)
|
||||
});
|
||||
console.log(err)
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
ipcMain.on('share-menu', async (_event, url) => {
|
||||
if (process.platform != 'darwin') return;
|
||||
if (process.platform !== 'darwin') return;
|
||||
//https://www.electronjs.org/docs/latest/api/share-menu
|
||||
console.log('[Share Sheet - App.ts]', url)
|
||||
const options = {
|
||||
|
@ -1464,10 +1400,17 @@ export class BrowserWindow {
|
|||
}
|
||||
|
||||
});
|
||||
|
||||
ipcMain.on('open-appdata', (_event) => {
|
||||
shell.openPath(app.getPath('userData'));
|
||||
});
|
||||
|
||||
ipcMain.handle('folderSelector', async (_event) => {
|
||||
let u = await dialog.showOpenDialog({
|
||||
properties: ['openDirectory', 'multiSelections']
|
||||
});
|
||||
return u.filePaths
|
||||
});
|
||||
|
||||
//#region Cider Connect
|
||||
ipcMain.on('cc-auth', (_event) => {
|
||||
|
@ -1492,35 +1435,38 @@ export class BrowserWindow {
|
|||
/* *********************************************************************************************
|
||||
* Window Events
|
||||
* **********************************************************************************************/
|
||||
if (process.platform === "win32") {
|
||||
let WND_STATE = {
|
||||
MINIMIZED: 0,
|
||||
NORMAL: 1,
|
||||
MAXIMIZED: 2,
|
||||
FULL_SCREEN: 3,
|
||||
};
|
||||
let wndState = WND_STATE.NORMAL;
|
||||
let WND_STATE = {
|
||||
MINIMIZED: 0,
|
||||
NORMAL: 1,
|
||||
MAXIMIZED: 2,
|
||||
FULL_SCREEN: 3,
|
||||
};
|
||||
let wndState = WND_STATE.NORMAL;
|
||||
|
||||
BrowserWindow.win.on("resize", (_: any) => {
|
||||
const isMaximized = BrowserWindow.win.isMaximized();
|
||||
const isMinimized = BrowserWindow.win.isMinimized();
|
||||
const isFullScreen = BrowserWindow.win.isFullScreen();
|
||||
const state = wndState;
|
||||
if (isMinimized && state !== WND_STATE.MINIMIZED) {
|
||||
wndState = WND_STATE.MINIMIZED;
|
||||
BrowserWindow.win.webContents.send('window-state-changed', 'minimized');
|
||||
} else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) {
|
||||
wndState = WND_STATE.FULL_SCREEN;
|
||||
BrowserWindow.win.webContents.send('window-state-changed', 'fullscreen')
|
||||
} else if (isMaximized && state !== WND_STATE.MAXIMIZED) {
|
||||
wndState = WND_STATE.MAXIMIZED;
|
||||
BrowserWindow.win.webContents.send('window-state-changed', 'maximized')
|
||||
BrowserWindow.win.webContents.executeJavaScript(`app.chrome.maximized = true`);
|
||||
} else if (state !== WND_STATE.NORMAL) {
|
||||
wndState = WND_STATE.NORMAL;
|
||||
BrowserWindow.win.webContents.send('window-state-changed', 'normal')
|
||||
BrowserWindow.win.webContents.executeJavaScript(
|
||||
`app.chrome.maximized = false`
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
BrowserWindow.win.on("resize", (_: any) => {
|
||||
const isMaximized = BrowserWindow.win.isMaximized();
|
||||
const isMinimized = BrowserWindow.win.isMinimized();
|
||||
const isFullScreen = BrowserWindow.win.isFullScreen();
|
||||
const state = wndState;
|
||||
if (isMinimized && state !== WND_STATE.MINIMIZED) {
|
||||
wndState = WND_STATE.MINIMIZED;
|
||||
} else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) {
|
||||
wndState = WND_STATE.FULL_SCREEN;
|
||||
} else if (isMaximized && state !== WND_STATE.MAXIMIZED) {
|
||||
wndState = WND_STATE.MAXIMIZED;
|
||||
BrowserWindow.win.webContents.executeJavaScript(`app.chrome.maximized = true`);
|
||||
} else if (state !== WND_STATE.NORMAL) {
|
||||
wndState = WND_STATE.NORMAL;
|
||||
BrowserWindow.win.webContents.executeJavaScript(
|
||||
`app.chrome.maximized = false`
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
let isQuiting = false
|
||||
|
||||
|
@ -1563,10 +1509,10 @@ export class BrowserWindow {
|
|||
// Set window Handler
|
||||
BrowserWindow.win.webContents.setWindowOpenHandler((x: any) => {
|
||||
if (x.url.includes("apple") || x.url.includes("localhost")) {
|
||||
return {action: "allow"};
|
||||
return { action: "allow" };
|
||||
}
|
||||
shell.openExternal(x.url).catch(console.error);
|
||||
return {action: "deny"};
|
||||
return { action: "deny" };
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -1622,7 +1568,7 @@ export class BrowserWindow {
|
|||
"CtlN": "Cider",
|
||||
"iV": "196623"
|
||||
};
|
||||
let server2 = mdns.createAdvertisement(x, `${await getPort({port: 3839})}`, {
|
||||
let server2 = mdns.createAdvertisement(x, `${await getPort({ port: 3839 })}`, {
|
||||
name: encoded,
|
||||
txt: txt_record
|
||||
});
|
||||
|
|
|
@ -16,10 +16,10 @@ import {utils} from './utils';
|
|||
* @see {@link https://github.com/ciderapp/Cider/wiki/Plugins|Documentation}
|
||||
*/
|
||||
export class Plugins {
|
||||
private static PluginMap: any = {};
|
||||
private basePluginsPath = path.join(__dirname, '../plugins');
|
||||
private userPluginsPath = path.join(electron.app.getPath('userData'), 'Plugins');
|
||||
private readonly pluginsList: any = {};
|
||||
private static PluginMap: any = {};
|
||||
|
||||
constructor() {
|
||||
this.pluginsList = this.getPlugins();
|
||||
|
@ -35,8 +35,8 @@ export class Plugins {
|
|||
|
||||
public getPlugins(): any {
|
||||
let plugins: any = {};
|
||||
|
||||
|
||||
|
||||
|
||||
if (fs.existsSync(this.basePluginsPath)) {
|
||||
fs.readdirSync(this.basePluginsPath).forEach(file => {
|
||||
if (file.endsWith('.ts') || file.endsWith('.js')) {
|
||||
|
@ -49,8 +49,8 @@ export class Plugins {
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if (fs.existsSync(this.userPluginsPath)) {
|
||||
fs.readdirSync(this.userPluginsPath).forEach(file => {
|
||||
// Plugins V1
|
||||
|
@ -104,10 +104,11 @@ export class Plugins {
|
|||
public callPlugins(event: string, ...args: any[]) {
|
||||
for (const plugin in this.pluginsList) {
|
||||
if (this.pluginsList[plugin][event]) {
|
||||
try{
|
||||
try {
|
||||
this.pluginsList[plugin][event](...args);
|
||||
}catch(e) {
|
||||
console.log(`[${plugin}] Plugin error: ${e}`);
|
||||
} catch (e) {
|
||||
console.error(`[${plugin}] An error was encountered: ${e}`);
|
||||
console.error(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ import * as ElectronStore from 'electron-store';
|
|||
import * as electron from "electron";
|
||||
import {app} from "electron";
|
||||
import fetch from "electron-fetch";
|
||||
|
||||
export class Store {
|
||||
static cfg: ElectronStore;
|
||||
|
||||
|
@ -12,15 +13,6 @@ export class Store {
|
|||
},
|
||||
"general": {
|
||||
"close_button_hide": false,
|
||||
"discordrpc": {
|
||||
"enabled": true,
|
||||
"client": "Cider",
|
||||
"clear_on_pause": true,
|
||||
"hide_buttons": false,
|
||||
"hide_timestamp": false,
|
||||
"state_format": "by {artist}",
|
||||
"details_format": "{title}",
|
||||
},
|
||||
"language": "en_US", // electron.app.getLocale().replace('-', '_') this can be used in future
|
||||
"playbackNotifications": true,
|
||||
"resumeOnStartupBehavior": "local",
|
||||
|
@ -39,7 +31,8 @@ export class Store {
|
|||
"applemusic": false,
|
||||
"library": false,
|
||||
"amplaylists": false,
|
||||
"playlists": false
|
||||
"playlists": false,
|
||||
"localLibrary": false
|
||||
},
|
||||
"onStartup": {
|
||||
"enabled": false,
|
||||
|
@ -66,7 +59,7 @@ export class Store {
|
|||
"CommandOrControl",
|
||||
"G"
|
||||
],
|
||||
"songs" : [
|
||||
"songs": [
|
||||
"CommandOrControl",
|
||||
"J"
|
||||
],
|
||||
|
@ -89,23 +82,35 @@ export class Store {
|
|||
],
|
||||
"audioSettings": [
|
||||
"CommandOrControl",
|
||||
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift": "Alt"),
|
||||
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift" : "Alt"),
|
||||
"A"
|
||||
],
|
||||
"pluginMenu": [
|
||||
"CommandOrControl",
|
||||
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift": "Alt"),
|
||||
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift" : "Alt"),
|
||||
"P"
|
||||
],
|
||||
"castToDevices": [
|
||||
"CommandOrControl",
|
||||
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift": "Alt"),
|
||||
process.platform == "darwin" ? "Option" : (process.platform == "linux" ? "Shift" : "Alt"),
|
||||
"C"
|
||||
],
|
||||
"settings": [
|
||||
"CommandOrControl", // Who the hell uses a different key for this? Fucking Option?
|
||||
","
|
||||
],
|
||||
"zoomn": [
|
||||
"Control",
|
||||
"numadd",
|
||||
],
|
||||
"zoomt": [
|
||||
"Control",
|
||||
"numsub",
|
||||
],
|
||||
"zoomrst": [
|
||||
"Control",
|
||||
"num0",
|
||||
],
|
||||
"openDeveloperTools": [
|
||||
"CommandOrControl",
|
||||
"Shift",
|
||||
|
@ -114,21 +119,50 @@ export class Store {
|
|||
},
|
||||
"showLovedTracksInline": true
|
||||
},
|
||||
"connectivity": {
|
||||
"discord_rpc": {
|
||||
"enabled": true,
|
||||
"client": "Cider",
|
||||
"clear_on_pause": true,
|
||||
"hide_buttons": false,
|
||||
"hide_timestamp": false,
|
||||
"state_format": "by {artist}",
|
||||
"details_format": "{title}",
|
||||
},
|
||||
"lastfm": {
|
||||
"enabled": false,
|
||||
"scrobble_after": 50,
|
||||
"filter_loop": false,
|
||||
"filter_types": {},
|
||||
"secrets": {
|
||||
"username": "",
|
||||
"key": ""
|
||||
}
|
||||
|
||||
},
|
||||
},
|
||||
"home": {
|
||||
"followedArtists": [],
|
||||
"favoriteItems": []
|
||||
},
|
||||
"libraryPrefs": {
|
||||
"songs": {
|
||||
"scroll": "paged",
|
||||
"sort": "name",
|
||||
"sortOrder": "asc",
|
||||
"size": "normal"
|
||||
},
|
||||
"albums": {
|
||||
"scroll": "paged",
|
||||
"sort": "name",
|
||||
"sortOrder": "asc",
|
||||
"viewAs": "covers"
|
||||
},
|
||||
"playlists": {
|
||||
"scroll": "infinite"
|
||||
},
|
||||
"localPaths": [],
|
||||
"pageSize": 250
|
||||
},
|
||||
"audio": {
|
||||
"volume": 1,
|
||||
|
@ -139,18 +173,19 @@ export class Store {
|
|||
"playbackRate": 1,
|
||||
"quality": "HIGH",
|
||||
"seamless_audio": true,
|
||||
"normalization": false,
|
||||
"normalization": true,
|
||||
"dBSPL": false,
|
||||
"dBSPLcalibration": 90,
|
||||
"maikiwiAudio": {
|
||||
"ciderPPE": false,
|
||||
"ciderPPE": true,
|
||||
"ciderPPE_value": "MAIKIWI",
|
||||
"opportunisticCorrection_state": "OFF",
|
||||
"atmosphereRealizer1": false,
|
||||
"atmosphereRealizer1_value": "NATURAL_STANDARD",
|
||||
"atmosphereRealizer2": false,
|
||||
"atmosphereRealizer2_value": "NATURAL_STANDARD",
|
||||
"spatial": false,
|
||||
"spatialProfile": "71_420maikiwi",
|
||||
"spatialProfile": "BPLK",
|
||||
"vibrantBass": { // Hard coded into the app. Don't include any of this config into exporting presets in store.ts
|
||||
'frequencies': [17.182, 42.169, 53.763, 112.69, 119.65, 264.59, 336.57, 400.65, 505.48, 612.7, 838.7, 1155.3, 1175.6, 3406.8, 5158.6, 5968.1, 6999.9, 7468.6, 8862.9, 9666, 10109],
|
||||
'Q': [2.5, 0.388, 5, 5, 2.5, 7.071, 14.14, 10, 7.071, 14.14, 8.409, 0.372, 7.071, 10, 16.82, 7.071, 28.28, 20, 8.409, 40, 40],
|
||||
|
@ -206,31 +241,25 @@ export class Store {
|
|||
},
|
||||
"windowControlPosition": 0, // 0 default right
|
||||
"nativeTitleBar": false,
|
||||
"uiScale": 1.0,
|
||||
"windowColor": "#000000",
|
||||
"customAccentColor": false,
|
||||
"accentColor": "#fc3c44"
|
||||
"accentColor": "#fc3c44",
|
||||
"purplePodcastPlaybackBar": false,
|
||||
"maxElementScale": -1 // -1 default, anything else is a custom scale
|
||||
},
|
||||
"lyrics": {
|
||||
"enable_mxm": false,
|
||||
"enable_mxm": true,
|
||||
"mxm_karaoke": false,
|
||||
"mxm_language": "en",
|
||||
"mxm_language": "disabled",
|
||||
"enable_qq": false,
|
||||
"enable_yt": false,
|
||||
},
|
||||
"lastfm": {
|
||||
"enabled": false,
|
||||
"scrobble_after": 30,
|
||||
"auth_token": "",
|
||||
"enabledRemoveFeaturingArtists": true,
|
||||
"filterLoop": true,
|
||||
"NowPlaying": "true"
|
||||
},
|
||||
"advanced": {
|
||||
"AudioContext": false,
|
||||
"AudioContext": true,
|
||||
"experiments": [],
|
||||
"playlistTrackMapping": true,
|
||||
"ffmpegLocation": ""
|
||||
"ffmpegLocation": "",
|
||||
"disableLogging": true
|
||||
},
|
||||
"connectUser": {
|
||||
"auth": null,
|
||||
|
@ -241,15 +270,9 @@ export class Store {
|
|||
}
|
||||
},
|
||||
}
|
||||
private migrations: any = {
|
||||
'>=1.4.3': (store: ElectronStore) => {
|
||||
if (typeof store.get('general.discordrpc') == 'number' || typeof store.get('general.discordrpc') == 'string') {
|
||||
store.delete('general.discordrpc');
|
||||
}
|
||||
},
|
||||
}
|
||||
private migrations: any = {}
|
||||
private schema: ElectronStore.Schema<any> = {
|
||||
"general.discordrpc": {
|
||||
"connectivity.discord_rpc": {
|
||||
type: 'object'
|
||||
},
|
||||
}
|
||||
|
@ -260,57 +283,13 @@ export class Store {
|
|||
defaults: this.defaults,
|
||||
schema: this.schema,
|
||||
migrations: this.migrations,
|
||||
clearInvalidConfig: true
|
||||
clearInvalidConfig: false //disabled for now
|
||||
});
|
||||
|
||||
Store.cfg.set(this.mergeStore(this.defaults, Store.cfg.store))
|
||||
this.ipcHandler();
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge Configurations
|
||||
* @param target The target configuration
|
||||
* @param source The source configuration
|
||||
*/
|
||||
private mergeStore = (target: { [x: string]: any; }, source: { [x: string]: any; }) => {
|
||||
// Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties
|
||||
for (const key of Object.keys(source)) {
|
||||
if (key.includes('migrations')) {
|
||||
continue;
|
||||
}
|
||||
if (source[key] instanceof Array) {
|
||||
continue
|
||||
}
|
||||
if (source[key] instanceof Object) Object.assign(source[key], this.mergeStore(target[key], source[key]))
|
||||
}
|
||||
// Join `target` and modified `source`
|
||||
Object.assign(target || {}, source)
|
||||
return target
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* IPC Handler
|
||||
*/
|
||||
private ipcHandler(): void {
|
||||
electron.ipcMain.handle('getStoreValue', (_event, key, defaultValue) => {
|
||||
return (defaultValue ? Store.cfg.get(key, true) : Store.cfg.get(key));
|
||||
});
|
||||
|
||||
electron.ipcMain.handle('setStoreValue', (_event, key, value) => {
|
||||
Store.cfg.set(key, value);
|
||||
});
|
||||
|
||||
electron.ipcMain.on('getStore', (event) => {
|
||||
event.returnValue = Store.cfg.store
|
||||
})
|
||||
|
||||
electron.ipcMain.on('setStore', (_event, store) => {
|
||||
Store.cfg.store = store
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
static pushToCloud(): void {
|
||||
if (Store.cfg.get('connectUser.auth') === null) return;
|
||||
var syncData = Object();
|
||||
|
@ -324,7 +303,7 @@ export class Store {
|
|||
plugins: Store.cfg.store.plugins
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
if (Store.cfg.get('connectUser.sync.settings')) {
|
||||
syncData.push({
|
||||
general: Store.cfg.get('general'),
|
||||
|
@ -348,4 +327,46 @@ export class Store {
|
|||
body: JSON.stringify(postBody)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge Configurations
|
||||
* @param target The target configuration
|
||||
* @param source The source configuration
|
||||
*/
|
||||
private mergeStore = (target: { [x: string]: any; }, source: { [x: string]: any; }) => {
|
||||
// Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties
|
||||
for (const key of Object.keys(source)) {
|
||||
if (key.includes('migrations')) {
|
||||
continue;
|
||||
}
|
||||
if (source[key] instanceof Array) {
|
||||
continue
|
||||
}
|
||||
if (source[key] instanceof Object) Object.assign(source[key], this.mergeStore(target[key], source[key]))
|
||||
}
|
||||
// Join `target` and modified `source`
|
||||
Object.assign(target || {}, source)
|
||||
return target
|
||||
}
|
||||
|
||||
/**
|
||||
* IPC Handler
|
||||
*/
|
||||
private ipcHandler(): void {
|
||||
electron.ipcMain.handle('getStoreValue', (_event, key, defaultValue) => {
|
||||
return (defaultValue ? Store.cfg.get(key, true) : Store.cfg.get(key));
|
||||
});
|
||||
|
||||
electron.ipcMain.handle('setStoreValue', (_event, key, value) => {
|
||||
Store.cfg.set(key, value);
|
||||
});
|
||||
|
||||
electron.ipcMain.on('getStore', (event) => {
|
||||
event.returnValue = Store.cfg.store
|
||||
})
|
||||
|
||||
electron.ipcMain.on('setStore', (_event, store) => {
|
||||
Store.cfg.store = store
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,18 +2,39 @@ 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, BrowserWindow, ipcMain} from "electron";
|
||||
import fetch from "electron-fetch";
|
||||
import {AppImageUpdater, NsisUpdater} from "electron-updater";
|
||||
import * as log from "electron-log";
|
||||
import ElectronStore from "electron-store";
|
||||
|
||||
export class utils {
|
||||
|
||||
/**
|
||||
* Playback Functions
|
||||
*/
|
||||
static playback = {
|
||||
pause: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.pause()")
|
||||
},
|
||||
play: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.play()")
|
||||
},
|
||||
playPause: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.playPause()")
|
||||
},
|
||||
next: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.next()")
|
||||
},
|
||||
previous: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.previous()")
|
||||
},
|
||||
seek: (seconds: number) => {
|
||||
bw.win.webContents.executeJavaScript(`MusicKit.getInstance().seekToTime(${seconds})`)
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Paths for the application to use
|
||||
*/
|
||||
private static paths: any = {
|
||||
static paths: any = {
|
||||
srcPath: path.join(__dirname, "../../src"),
|
||||
rendererPath: path.join(__dirname, "../../src/renderer"),
|
||||
mainPath: path.join(__dirname, "../../src/main"),
|
||||
|
@ -43,6 +64,21 @@ export class utils {
|
|||
return app;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the IPCMain
|
||||
*/
|
||||
static getIPCMain(): Electron.IpcMain {
|
||||
return ipcMain
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the Express instance
|
||||
* @returns {any}
|
||||
*/
|
||||
static getExpress(): any {
|
||||
return bw.express
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the i18n locale for the given language.
|
||||
* @param language {string} The language to fetch the locale for.
|
||||
|
@ -64,7 +100,7 @@ export class utils {
|
|||
} else {
|
||||
i18n = Object.assign(i18n, JSON.parse(fs.readFileSync(path.join(this.paths.i18nPath, `en_US.json`), "utf8")));
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
if (key) {
|
||||
return i18n[key]
|
||||
|
@ -90,7 +126,6 @@ export class utils {
|
|||
return Store.cfg.store
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the store instance
|
||||
* @returns {Store}
|
||||
|
@ -116,15 +151,15 @@ export class utils {
|
|||
return Store.pushToCloud
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 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 {
|
||||
|
@ -134,25 +169,4 @@ export class utils {
|
|||
static loadJSFrontend(path: string): void {
|
||||
bw.win.webContents.executeJavaScript(fs.readFileSync(path, "utf8"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Playback Functions
|
||||
*/
|
||||
static playback = {
|
||||
pause: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.pause()")
|
||||
},
|
||||
play: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.play()")
|
||||
},
|
||||
playPause: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.playPause()")
|
||||
},
|
||||
next: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.next()")
|
||||
},
|
||||
previous: () => {
|
||||
bw.win.webContents.executeJavaScript("MusicKitInterop.previous()")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
"pages/library-artists",
|
||||
"pages/browse",
|
||||
"pages/groupings",
|
||||
"pages/settings",
|
||||
"pages/installed-themes",
|
||||
"pages/listen_now",
|
||||
"pages/radio",
|
||||
|
@ -60,6 +59,7 @@
|
|||
"components/fullscreen",
|
||||
"components/miniplayer",
|
||||
"components/castmenu",
|
||||
"components/pathmenu",
|
||||
"components/airplay-modal",
|
||||
"components/artist-chip",
|
||||
"components/hello-world",
|
||||
|
|
|
@ -69,6 +69,11 @@
|
|||
"component": "<cider-playlist :data=\"showingPlaylist\"></cider-playlist>",
|
||||
"condition": "page.includes('album_')"
|
||||
},
|
||||
{
|
||||
"page": "social-profiles_",
|
||||
"component": "<cider-socialprofile :data=\"showingPlaylist\"></cider-socialprofile>",
|
||||
"condition": "$root.page.includes('social-profiles_')"
|
||||
},
|
||||
{
|
||||
"page": "recordLabel_",
|
||||
"component": "<cider-recordlabel :data=\"showingPlaylist\"></cider-recordlabel>",
|
||||
|
|
|
@ -64,6 +64,15 @@ export class wsapi {
|
|||
electron.ipcMain.on('wsapi-returnvolumeMax', (_event: any, arg: any) => {
|
||||
this.returnmaxVolume(JSON.parse(arg));
|
||||
});
|
||||
electron.ipcMain.on('wsapi-libraryStatus', (_event: any, inLibrary: boolean, rating: number) => {
|
||||
this.returnLibraryStatus(inLibrary, rating);
|
||||
});
|
||||
electron.ipcMain.on('wsapi-rate', (_event: any, kind: string, id: string, rating: number) => {
|
||||
this.returnRatingStatus(kind, id, rating);
|
||||
});
|
||||
electron.ipcMain.on('wsapi-change-library', (_event: any, kind: string, id: string, shouldAdd: boolean) => {
|
||||
this.returnLibraryChange(kind, id, shouldAdd);
|
||||
});
|
||||
this.wss = new WebSocketServer({
|
||||
port: this.port,
|
||||
perMessageDeflate: {
|
||||
|
@ -242,6 +251,15 @@ export class wsapi {
|
|||
case "get-currentmediaitem":
|
||||
this._win.webContents.executeJavaScript(`wsapi.getPlaybackState()`);
|
||||
break;
|
||||
case "library-status":
|
||||
this._win.webContents.executeJavaScript(`wsapi.getLibraryStatus("${data.type}", "${data.id}")`);
|
||||
break;
|
||||
case "rating":
|
||||
this._win.webContents.executeJavaScript(`wsapi.rate("${data.type}", "${data.id}", ${data.rating})`);
|
||||
break;
|
||||
case "change-library":
|
||||
this._win.webContents.executeJavaScript(`wsapi.changeLibrary("${data.type}", "${data.id}", ${data.add})`);
|
||||
break;
|
||||
case "quit":
|
||||
electron.app.quit();
|
||||
break;
|
||||
|
@ -317,4 +335,35 @@ export class wsapi {
|
|||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
||||
returnLibraryStatus(inLibrary: boolean, rating: number) {
|
||||
const response: standardResponse = {
|
||||
status: 0, data: {
|
||||
inLibrary, rating
|
||||
}, message: "OK", type: "libraryStatus"
|
||||
}
|
||||
this.clients.forEach(function each(client: any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
||||
returnRatingStatus(kind: string, id: string, rating: number) {
|
||||
const response: standardResponse = {
|
||||
status: 0, data: { kind, id, rating },
|
||||
message: "OK", type: "rate"
|
||||
};
|
||||
this.clients.forEach(function each(client: any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
||||
returnLibraryChange(kind: string, id: string, shouldAdd: boolean) {
|
||||
const response: standardResponse = {
|
||||
status: 0, data: { kind, id, add: shouldAdd },
|
||||
message: "OK", type: "change-library"
|
||||
};
|
||||
this.clients.forEach(function each(client: any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
}
|
|
@ -1,18 +1,18 @@
|
|||
require('v8-compile-cache');
|
||||
|
||||
const {app, components, ipcMain} = require('electron');
|
||||
import {join} from 'path';
|
||||
require("v8-compile-cache");
|
||||
|
||||
import {join} from "path";
|
||||
import {app} from "electron"
|
||||
if (!app.isPackaged) {
|
||||
app.setPath('userData', join(app.getPath('appData'), 'Cider'));
|
||||
app.setPath("userData", join(app.getPath("appData"), "Cider"));
|
||||
}
|
||||
|
||||
import {Store} from "./base/store";
|
||||
import {AppEvents} from "./base/app";
|
||||
import {Plugins} from "./base/plugins";
|
||||
import {BrowserWindow} from "./base/browserwindow";
|
||||
import {init as Sentry} from '@sentry/electron';
|
||||
import {init as Sentry} from "@sentry/electron";
|
||||
import {RewriteFrames} from "@sentry/integrations";
|
||||
import {components, ipcMain} from "electron"
|
||||
|
||||
// Analytics for debugging fun yeah.
|
||||
Sentry({
|
||||
|
@ -32,13 +32,13 @@ const CiderPlug = new Plugins();
|
|||
* App Event Handlers
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
||||
|
||||
app.on('ready', () => {
|
||||
app.on("ready", () => {
|
||||
Cider.ready(CiderPlug);
|
||||
|
||||
console.log('[Cider] Application is Ready. Creating Window.')
|
||||
console.log("[Cider] Application is Ready. Creating Window.")
|
||||
if (!app.isPackaged) {
|
||||
console.info('[Cider] Running in development mode.')
|
||||
require('vue-devtools').install()
|
||||
console.info("[Cider] Running in development mode.")
|
||||
require("vue-devtools").install()
|
||||
}
|
||||
|
||||
components.whenReady().then(async () => {
|
||||
|
@ -49,11 +49,11 @@ app.on('ready', () => {
|
|||
console.log(gpuInfo)
|
||||
})
|
||||
|
||||
console.log('[Cider][Widevine] Status:', components.status());
|
||||
console.log("[Cider][Widevine] Status:", components.status());
|
||||
Cider.bwCreated();
|
||||
win.on("ready-to-show", () => {
|
||||
console.debug('[Cider] Window is Ready.')
|
||||
CiderPlug.callPlugins('onReady', win);
|
||||
console.debug("[Cider] Window is Ready.")
|
||||
CiderPlug.callPlugins("onReady", win);
|
||||
win.show();
|
||||
});
|
||||
});
|
||||
|
@ -68,20 +68,16 @@ ipcMain.handle("renderer-ready", (event) => {
|
|||
CiderPlug.callPlugins("onRendererReady", event);
|
||||
})
|
||||
|
||||
ipcMain.on('playbackStateDidChange', (_event, attributes) => {
|
||||
CiderPlug.callPlugins('onPlaybackStateDidChange', attributes);
|
||||
ipcMain.on("playbackStateDidChange", (_event, attributes) => {
|
||||
CiderPlug.callPlugins("onPlaybackStateDidChange", attributes);
|
||||
});
|
||||
|
||||
ipcMain.on('nowPlayingItemDidChange', (_event, attributes) => {
|
||||
CiderPlug.callPlugins('onNowPlayingItemDidChange', attributes);
|
||||
ipcMain.on("nowPlayingItemDidChange", (_event, attributes) => {
|
||||
CiderPlug.callPlugins("onNowPlayingItemDidChange", attributes);
|
||||
});
|
||||
|
||||
ipcMain.on('nowPlayingItemDidChangeLastFM', (_event, attributes) => {
|
||||
CiderPlug.callPlugin('lastfm.js', 'nowPlayingItemDidChangeLastFM', attributes);
|
||||
})
|
||||
|
||||
app.on('before-quit', () => {
|
||||
CiderPlug.callPlugins('onBeforeQuit');
|
||||
app.on("before-quit", () => {
|
||||
CiderPlug.callPlugins("onBeforeQuit");
|
||||
console.warn(`${app.getName()} exited.`);
|
||||
});
|
||||
|
||||
|
@ -90,21 +86,21 @@ app.on('before-quit', () => {
|
|||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
||||
|
||||
// @ts-ignore
|
||||
app.on('widevine-ready', (version, lastVersion) => {
|
||||
app.on("widevine-ready", (version, lastVersion) => {
|
||||
if (null !== lastVersion) {
|
||||
console.log('[Cider][Widevine] Widevine ' + version + ', upgraded from ' + lastVersion + ', is ready to be used!')
|
||||
console.log("[Cider][Widevine] Widevine " + version + ", upgraded from " + lastVersion + ", is ready to be used!")
|
||||
} else {
|
||||
console.log('[Cider][Widevine] Widevine ' + version + ' is ready to be used!')
|
||||
console.log("[Cider][Widevine] Widevine " + version + " is ready to be used!")
|
||||
}
|
||||
})
|
||||
|
||||
// @ts-ignore
|
||||
app.on('widevine-update-pending', (currentVersion, pendingVersion) => {
|
||||
console.log('[Cider][Widevine] Widevine ' + currentVersion + ' is ready to be upgraded to ' + pendingVersion + '!')
|
||||
app.on("widevine-update-pending", (currentVersion, pendingVersion) => {
|
||||
console.log("[Cider][Widevine] Widevine " + currentVersion + " is ready to be upgraded to " + pendingVersion + "!")
|
||||
})
|
||||
|
||||
// @ts-ignore
|
||||
app.on('widevine-error', (error) => {
|
||||
console.log('[Cider][Widevine] Widevine installation encountered an error: ' + error)
|
||||
app.on("widevine-error", (error) => {
|
||||
console.log("[Cider][Widevine] Widevine installation encountered an error: " + error)
|
||||
app.exit()
|
||||
})
|
||||
|
|
|
@ -52,29 +52,57 @@ export default class DiscordRPC {
|
|||
const self = this
|
||||
this.connect();
|
||||
console.debug(`[Plugin][${this.name}] Ready.`);
|
||||
ipcMain.on('updateRPCImage', (_event, imageurl) => {
|
||||
ipcMain.on('updateRPCImage', async (_event, imageurl) => {
|
||||
if (!this._utils.getStoreValue("general.privateEnabled")) {
|
||||
fetch('https://api.cider.sh/v1/images', {
|
||||
let b64data = ""
|
||||
let postbody = ""
|
||||
if (imageurl.startsWith("/ciderlocalart")){
|
||||
let port = await _win.webContents.executeJavaScript(
|
||||
`app.clientPort`
|
||||
);
|
||||
console.log("http://localhost:"+port+imageurl)
|
||||
const response = await fetch("http://localhost:"+port+imageurl)
|
||||
b64data = (await response.buffer()).toString('base64');
|
||||
postbody = JSON.stringify({data: b64data})
|
||||
fetch('https://api.cider.sh/v1/images', {
|
||||
|
||||
method: 'POST',
|
||||
body: JSON.stringify({url: imageurl}),
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'User-Agent': _win.webContents.getUserAgent()
|
||||
},
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(function (json) {
|
||||
self._attributes["artwork"]["url"] = json.url
|
||||
self.setActivity(self._attributes)
|
||||
method: 'POST',
|
||||
body: postbody,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'User-Agent': _win.webContents.getUserAgent()
|
||||
},
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(function (json) {
|
||||
self._attributes["artwork"]["url"] = json.url
|
||||
self.setActivity(self._attributes)
|
||||
})
|
||||
} else {
|
||||
postbody = JSON.stringify({url: imageurl})
|
||||
fetch('https://api.cider.sh/v1/images', {
|
||||
|
||||
method: 'POST',
|
||||
body: postbody,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'User-Agent': _win.webContents.getUserAgent()
|
||||
},
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(function (json) {
|
||||
self._attributes["artwork"]["url"] = json.url
|
||||
self.setActivity(self._attributes)
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
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'})
|
||||
this._client.endlessLogin({clientId: this._utils.getStoreValue("connectivity.discord_rpc.client") === "Cider" ? '911790844204437504' : '886578863147192350'})
|
||||
.then(() => {
|
||||
this.ready = true
|
||||
this._utils.getWindow().webContents.send("rpcReloaded", this._client.user)
|
||||
|
@ -88,6 +116,7 @@ export default class DiscordRPC {
|
|||
})
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Runs on app stop
|
||||
*/
|
||||
|
@ -125,7 +154,7 @@ export default class DiscordRPC {
|
|||
* @private
|
||||
*/
|
||||
private connect() {
|
||||
if (!this._utils.getStoreValue("general.discordrpc.enabled")) {
|
||||
if (!this._utils.getStoreValue("connectivity.discord_rpc.enabled")) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -143,7 +172,7 @@ export default class DiscordRPC {
|
|||
})
|
||||
|
||||
// Login to Discord
|
||||
this._client.endlessLogin({clientId: this._utils.getStoreValue("general.discordrpc.client") === "Cider" ? '911790844204437504' : '886578863147192350'})
|
||||
this._client.endlessLogin({clientId: this._utils.getStoreValue("connectivity.discord_rpc.client") === "Cider" ? '911790844204437504' : '886578863147192350'})
|
||||
.then(() => {
|
||||
this.ready = true
|
||||
})
|
||||
|
@ -161,8 +190,8 @@ export default class DiscordRPC {
|
|||
|
||||
// Check if show buttons is (true) or (false)
|
||||
let activity: Object = {
|
||||
details: this._utils.getStoreValue("general.discordrpc.details_format"),
|
||||
state: this._utils.getStoreValue("general.discordrpc.state_format"),
|
||||
details: this._utils.getStoreValue("connectivity.discord_rpc.details_format"),
|
||||
state: this._utils.getStoreValue("connectivity.discord_rpc.state_format"),
|
||||
largeImageKey: attributes?.artwork?.url?.replace('{w}', '1024').replace('{h}', '1024'),
|
||||
largeImageText: attributes.albumName,
|
||||
instance: false // Whether the activity is in a game session
|
||||
|
@ -177,7 +206,7 @@ export default class DiscordRPC {
|
|||
}
|
||||
|
||||
// Set the activity
|
||||
if (!attributes.status && this._utils.getStoreValue("general.discordrpc.clear_on_pause")) {
|
||||
if (!attributes.status && this._utils.getStoreValue("connectivity.discord_rpc.clear_on_pause")) {
|
||||
this._client.clearActivity()
|
||||
} else if (activity && this._activityCache !== activity) {
|
||||
this._client.setActivity(activity)
|
||||
|
@ -191,7 +220,7 @@ export default class DiscordRPC {
|
|||
private filterActivity(activity: any, attributes: any): Object {
|
||||
|
||||
// Add the buttons if people want them
|
||||
if (!this._utils.getStoreValue("general.discordrpc.hide_buttons")) {
|
||||
if (!this._utils.getStoreValue("connectivity.discord_rpc.hide_buttons")) {
|
||||
activity.buttons = [
|
||||
{label: 'Listen on Cider', url: attributes.url.cider},
|
||||
{label: 'View on Apple Music', url: attributes.url.appleMusic}
|
||||
|
@ -199,13 +228,13 @@ export default class DiscordRPC {
|
|||
}
|
||||
|
||||
// Add the timestamp if its playing and people want them
|
||||
if (!this._utils.getStoreValue("general.discordrpc.hide_timestamp") && attributes.status) {
|
||||
if (!this._utils.getStoreValue("connectivity.discord_rpc.hide_timestamp") && attributes.status) {
|
||||
activity.startTimestamp = Date.now() - (attributes?.durationInMillis - attributes?.remainingTime)
|
||||
activity.endTimestamp = attributes.endTime
|
||||
}
|
||||
|
||||
// If the user wants to keep the activity when paused
|
||||
if (!this._utils.getStoreValue("general.discordrpc.clear_on_pause")) {
|
||||
if (!this._utils.getStoreValue("connectivity.discord_rpc.clear_on_pause")) {
|
||||
activity.smallImageKey = attributes.status ? 'play' : 'pause';
|
||||
activity.smallImageText = attributes.status ? 'Playing' : 'Paused';
|
||||
}
|
||||
|
|
|
@ -1,278 +1,236 @@
|
|||
import * as electron from 'electron';
|
||||
import * as fs from 'fs';
|
||||
import {resolve} from 'path';
|
||||
export default class lastfm {
|
||||
|
||||
export default class LastFMPlugin {
|
||||
private sessionPath = resolve(electron.app.getPath('userData'), 'session.json');
|
||||
private apiCredentials = {
|
||||
/**
|
||||
* Base Plugin Information
|
||||
*/
|
||||
public name: string = 'LastFM Plugin';
|
||||
public version: string = '2.0.0';
|
||||
public author: string = 'Core (Cider Collective)';
|
||||
|
||||
|
||||
private _apiCredentials = {
|
||||
key: "f9986d12aab5a0fe66193c559435ede3",
|
||||
secret: "acba3c29bd5973efa38cc2f0b63cc625"
|
||||
}
|
||||
/**
|
||||
* Private variables for interaction in plugins
|
||||
* Plugin Initialization
|
||||
*/
|
||||
private _win: any;
|
||||
private _app: any;
|
||||
private _lastfm: any;
|
||||
private _store: any;
|
||||
private _timer: any;
|
||||
|
||||
private authenticateFromFile() {
|
||||
let sessionData = require(this.sessionPath)
|
||||
console.log("[LastFM][authenticateFromFile] Logging in with Session Info.")
|
||||
this._lastfm.setSessionCredentials(sessionData.username, sessionData.key)
|
||||
console.log("[LastFM][authenticateFromFile] Logged in.", sessionData.username, sessionData.key)
|
||||
}
|
||||
|
||||
|
||||
authenticate() {
|
||||
try {
|
||||
if (this._store.lastfm.auth_token) {
|
||||
this._store.lastfm.enabled = true;
|
||||
}
|
||||
|
||||
if (!this._store.lastfm.enabled || !this._store.lastfm.auth_token) {
|
||||
this._store.lastfm.enabled = false;
|
||||
return
|
||||
}
|
||||
/// dont move this require to top , app wont load
|
||||
const LastfmAPI = require('lastfmapi');
|
||||
const lfmAPI = new LastfmAPI({
|
||||
'api_key': this.apiCredentials.key,
|
||||
'secret': this.apiCredentials.secret
|
||||
});
|
||||
|
||||
this._lastfm = Object.assign(lfmAPI, {cachedAttributes: false, cachedNowPlayingAttributes: false});
|
||||
|
||||
fs.stat(this.sessionPath, (err: any) => {
|
||||
if (err) {
|
||||
console.error("[LastFM][Session] Session file couldn't be opened or doesn't exist,", err)
|
||||
console.log("[LastFM][Auth] Beginning authentication from configuration")
|
||||
console.log("[LastFM][tk]", this._store.lastfm.auth_token)
|
||||
this._lastfm.authenticate(this._store.lastfm.auth_token, (err: any, session: any) => {
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
console.log("[LastFM] Successfully obtained LastFM session info,", session); // {"name": "LASTFM_USERNAME", "key": "THE_USER_SESSION_KEY"}
|
||||
console.log("[LastFM] Saving session info to disk.")
|
||||
let tempData = JSON.stringify(session)
|
||||
fs.writeFile(this.sessionPath, tempData, (err: any) => {
|
||||
if (err)
|
||||
console.log("[LastFM][fs]", err)
|
||||
else {
|
||||
console.log("[LastFM][fs] File was written successfully.")
|
||||
this.authenticateFromFile()
|
||||
new electron.Notification({
|
||||
title: electron.app.getName(),
|
||||
body: "Successfully logged into LastFM using Authentication Key."
|
||||
}).show()
|
||||
}
|
||||
})
|
||||
});
|
||||
} else {
|
||||
this.authenticateFromFile()
|
||||
}
|
||||
})
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
}
|
||||
}
|
||||
|
||||
private scrobbleSong(attributes: any) {
|
||||
if (this._timer) clearTimeout(this._timer);
|
||||
var self = this;
|
||||
this._timer = setTimeout(async () => {
|
||||
const currentAttributes = attributes;
|
||||
|
||||
if (!self._lastfm || self._lastfm.cachedAttributes === attributes) {
|
||||
return
|
||||
}
|
||||
|
||||
if (self._lastfm.cachedAttributes) {
|
||||
if (self._lastfm.cachedAttributes.playParams.id === attributes.playParams.id) return;
|
||||
}
|
||||
|
||||
const artist = await this.getPrimaryArtist(attributes)
|
||||
const album = this.getAlbumName(attributes)
|
||||
|
||||
if (currentAttributes.status && currentAttributes === attributes) {
|
||||
if (fs.existsSync(this.sessionPath)) {
|
||||
// Scrobble playing song.
|
||||
if (attributes.status === true) {
|
||||
self._lastfm.track.scrobble({
|
||||
'artist': artist,
|
||||
'track': attributes.name,
|
||||
'album': album,
|
||||
'albumArtist': artist,
|
||||
'timestamp': new Date().getTime() / 1000
|
||||
}, function (err: any, scrobbled: any) {
|
||||
if (err) {
|
||||
return console.error('[LastFM] An error occurred while scrobbling', err);
|
||||
}
|
||||
|
||||
console.log('[LastFM] Successfully scrobbled: ', scrobbled);
|
||||
});
|
||||
self._lastfm.cachedAttributes = attributes
|
||||
}
|
||||
} else {
|
||||
self.authenticate();
|
||||
}
|
||||
} else {
|
||||
return console.log('[LastFM] Did not add ', attributes.name, '—', artist, 'because now playing a other song.');
|
||||
}
|
||||
}, Math.round(attributes.durationInMillis * Math.min((self._store.lastfm.scrobble_after / 100), 0.8)));
|
||||
}
|
||||
|
||||
private async updateNowPlayingSong(attributes: any) {
|
||||
if (!this._lastfm || this._lastfm.cachedNowPlayingAttributes === attributes || !this._store.lastfm.NowPlaying) {
|
||||
return
|
||||
}
|
||||
|
||||
if (this._lastfm.cachedNowPlayingAttributes) {
|
||||
if (this._lastfm.cachedNowPlayingAttributes.playParams.id === attributes.playParams.id) return;
|
||||
}
|
||||
|
||||
if (fs.existsSync(this.sessionPath)) {
|
||||
const artist = await this.getPrimaryArtist(attributes)
|
||||
const album = this.getAlbumName(attributes)
|
||||
|
||||
// update Now Playing
|
||||
if (attributes.status === true) {
|
||||
this._lastfm.track.updateNowPlaying({
|
||||
'artist': artist,
|
||||
'track': attributes.name,
|
||||
'album': album,
|
||||
'albumArtist': artist
|
||||
}, function (err: any, nowPlaying: any) {
|
||||
if (err) {
|
||||
return console.error('[LastFM] An error occurred while updating nowPlayingSong', err);
|
||||
}
|
||||
|
||||
console.log('[LastFM] Successfully updated nowPlayingSong', nowPlaying);
|
||||
});
|
||||
this._lastfm.cachedNowPlayingAttributes = attributes
|
||||
}
|
||||
|
||||
} else {
|
||||
this.authenticate()
|
||||
}
|
||||
}
|
||||
|
||||
private getAlbumName(attributes: any): string {
|
||||
return attributes.albumName.replace(/ - Single| - EP/g, '');
|
||||
}
|
||||
|
||||
private async getPrimaryArtist(attributes: any) {
|
||||
const songId = attributes.playParams.catalogId || attributes.playParams.id
|
||||
|
||||
if (!this._store.lastfm.enabledRemoveFeaturingArtists || !songId) return attributes.artistName;
|
||||
|
||||
const res = await this._win.webContents.executeJavaScript(`
|
||||
(async () => {
|
||||
const subMk = await MusicKit.getInstance().api.v3.music("/v1/catalog/" + MusicKit.getInstance().storefrontId + "/songs/${songId}", {
|
||||
include: {
|
||||
songs: ["artists"]
|
||||
}
|
||||
})
|
||||
if (!subMk) console.error('[LastFM] Request failed: /v1/catalog/us/songs/${songId}')
|
||||
return subMk.data
|
||||
})()
|
||||
`).catch(console.error)
|
||||
if (!res) return attributes.artistName
|
||||
|
||||
const data = res.data
|
||||
if (!data.length) {
|
||||
console.error(`[LastFM] Unable to locate song with id of ${songId}`)
|
||||
return attributes.artistName;
|
||||
}
|
||||
|
||||
const artists = res.data[0].relationships.artists.data
|
||||
if (!artists.length) {
|
||||
console.error(`[LastFM] Unable to find artists related to the song with id of ${songId}`)
|
||||
return attributes.artistName;
|
||||
}
|
||||
|
||||
const primaryArtist = artists[0]
|
||||
return primaryArtist.attributes.name
|
||||
}
|
||||
private _lfm: any = null;
|
||||
private _authenticated: boolean = false;
|
||||
private _scrobbleDelay: any = null;
|
||||
private _utils: any = null;
|
||||
private _scrobbleCache: any = {};
|
||||
private _nowPlayingCache: any = {};
|
||||
|
||||
/**
|
||||
* Base Plugin Details (Eventually implemented into a GUI in settings)
|
||||
* Public Methods
|
||||
*/
|
||||
public name: string = 'LastFMPlugin';
|
||||
public description: string = 'LastFM plugin for Cider';
|
||||
public version: string = '0.0.1';
|
||||
public author: string = 'vapormusic / Cider Collective';
|
||||
|
||||
/**
|
||||
* Runs on plugin load (Currently run on application start)
|
||||
*/
|
||||
constructor(utils: { getApp: () => any; getStore: () => any; }) {
|
||||
this._app = utils.getApp();
|
||||
this._store = utils.getStore()
|
||||
utils.getApp().on('second-instance', (_e: any, argv: any) => {
|
||||
// Checks if first instance is authorized and if second instance has protocol args
|
||||
argv.forEach((value: any) => {
|
||||
if (value.includes('auth')) {
|
||||
console.log('[LastFMPlugin ok]')
|
||||
let authURI = String(argv).split('/auth/')[1];
|
||||
if (authURI.startsWith('lastfm')) { // If we wanted more auth options
|
||||
const authKey = authURI.split('lastfm?token=')[1];
|
||||
this._store.lastfm.enabled = true;
|
||||
this._store.lastfm.auth_token = authKey;
|
||||
console.log(authKey);
|
||||
this._win.webContents.send('LastfmAuthenticated', authKey);
|
||||
this.authenticate();
|
||||
}
|
||||
}
|
||||
})
|
||||
constructor(utils: any) {
|
||||
this._utils = utils;
|
||||
}
|
||||
|
||||
onReady(_win: Electron.BrowserWindow): void {
|
||||
this.initializeLastFM("", this._apiCredentials)
|
||||
|
||||
// Register the ipcMain handlers
|
||||
this._utils.getIPCMain().handle('lastfm:url', (event: any) => {
|
||||
console.debug(`[${lastfm.name}:url] Called.`)
|
||||
return this._lfm.getAuthenticationUrl({"cb": "cider://auth/lastfm"})
|
||||
})
|
||||
electron.app.on('open-url', (event: any, arg: any) => {
|
||||
console.log('[LastFMPlugin] yes')
|
||||
event.preventDefault();
|
||||
if (arg.includes('auth')) {
|
||||
let authURI = String(arg).split('/auth/')[1];
|
||||
if (authURI.startsWith('lastfm')) { // If we wanted more auth options
|
||||
const authKey = authURI.split('lastfm?token=')[1];
|
||||
this._store.lastfm.enabled = true;
|
||||
this._store.lastfm.auth_token = authKey;
|
||||
this._win.webContents.send('LastfmAuthenticated', authKey);
|
||||
console.log(authKey);
|
||||
this.authenticate();
|
||||
}
|
||||
}
|
||||
|
||||
this._utils.getIPCMain().on('lastfm:auth', (event: any, token: string) => {
|
||||
console.debug(`[${lastfm.name}:auth] Token: `, token)
|
||||
this.authenticateLastFM(token)
|
||||
})
|
||||
|
||||
this._utils.getIPCMain().on('lastfm:disconnect', (_event: any) => {
|
||||
this._lfm.setSessionCredentials(null, null);
|
||||
this._authenticated = false;
|
||||
console.debug(`[${lastfm.name}:disconnect] Disconnected`)
|
||||
})
|
||||
|
||||
this._utils.getIPCMain().on('lastfm:nowPlayingChange', (event: any, attributes: any) => {
|
||||
if (this._utils.getStoreValue("connectivity.lastfm.filter_loop") || this._utils.getStoreValue("general.privateEnabled")) return;
|
||||
this.updateNowPlayingTrack(attributes)
|
||||
})
|
||||
|
||||
this._utils.getIPCMain().on('lastfm:scrobbleTrack', (event: any, attributes: any) => {
|
||||
if (this._utils.getStoreValue("general.privateEnabled")) return;
|
||||
this.scrobbleTrack(attributes)
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on app ready
|
||||
* Runs on playback State Change
|
||||
* @param attributes Music Attributes (attributes.status = current state)
|
||||
*/
|
||||
onReady(win: any): void {
|
||||
this._win = win;
|
||||
this.authenticate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on app stop
|
||||
*/
|
||||
onBeforeQuit(): void {
|
||||
console.log('Example plugin stopped');
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on song change
|
||||
* @param attributes Music Attributes
|
||||
* @param scrobble
|
||||
*/
|
||||
nowPlayingItemDidChangeLastFM(attributes: any): void {
|
||||
if (!this._store.general.privateEnabled) {
|
||||
attributes.status = true
|
||||
if (!this._store.lastfm.filterLoop) {
|
||||
this._lastfm.cachedNowPlayingAttributes = false;
|
||||
this._lastfm.cachedAttributes = false
|
||||
}
|
||||
this.updateNowPlayingSong(attributes)
|
||||
this.scrobbleSong(attributes)
|
||||
onNowPlayingItemDidChange(attributes: any, scrobble = false): void {
|
||||
if (this._utils.getStoreValue("general.privateEnabled")) return;
|
||||
this.updateNowPlayingTrack(attributes)
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize LastFM
|
||||
* @param token
|
||||
* @param api
|
||||
* @private
|
||||
*/
|
||||
private initializeLastFM(token: string, api: { key: string, secret: string }): void {
|
||||
console.debug(`[${lastfm.name}:initialize] Initializing LastFM`)
|
||||
const LastfmAPI = require("lastfmapi")
|
||||
this._lfm = new LastfmAPI({
|
||||
'api_key': api.key,
|
||||
'secret': api.secret,
|
||||
});
|
||||
|
||||
if (this._utils.getStoreValue("connectivity.lastfm.secrets.username") && this._utils.getStoreValue("connectivity.lastfm.secrets.key")) {
|
||||
this._lfm.setSessionCredentials(this._utils.getStoreValue("connectivity.lastfm.secrets.username"), this._utils.getStoreValue("connectivity.lastfm.secrets.key"));
|
||||
this._authenticated = true;
|
||||
} else {
|
||||
this.authenticateLastFM(token)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Authenticate the user with the given token
|
||||
* @param token
|
||||
* @private
|
||||
*/
|
||||
private authenticateLastFM(token: string): void {
|
||||
if (!token) return;
|
||||
this._lfm.authenticate(token, (err: any, session: any) => {
|
||||
if (err) {
|
||||
console.error(`[${lastfm.name}:authenticate] Error: ${typeof err === "string" ? err : err.message}`);
|
||||
|
||||
this._utils.getWindow().webContents.executeJavaScript(`app.notyf.error("${err.message}");`)
|
||||
return;
|
||||
}
|
||||
this._utils.getWindow().webContents.send('lastfm:authenticated', session)
|
||||
this._authenticated = true;
|
||||
console.debug(`[${lastfm.name}:authenticate] Authenticated as ${session.username}`)
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Verifies the track information with lastfm
|
||||
* @param attributes
|
||||
* @param callback
|
||||
* @private
|
||||
*/
|
||||
private verifyTrack(attributes: any, callback: Function): void {
|
||||
if (!attributes) return attributes;
|
||||
|
||||
if (!attributes.lfmAlbum) {
|
||||
this._lfm.album.getInfo({
|
||||
"artist": attributes.artistName,
|
||||
"album": attributes.albumName
|
||||
}, (err: any, data: any) => {
|
||||
if (err) {
|
||||
console.error(`[${lastfm.name}] [album.getInfo] Error: ${typeof err === "string" ? err : err.message}`)
|
||||
return {};
|
||||
}
|
||||
if (data) {
|
||||
attributes.lfmAlbum = data
|
||||
callback(attributes)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
this._lfm.track.getCorrection(attributes.artistName, attributes.name, (err: any, data: any) => {
|
||||
if (err) {
|
||||
console.error(`[${lastfm.name}] [track.getCorrection] Error: ${typeof err === "string" ? err : err.message}`)
|
||||
return {};
|
||||
}
|
||||
if (data) {
|
||||
attributes.lfmTrack = data.correction.track
|
||||
callback(attributes)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Scrobbles the track to lastfm
|
||||
* @param attributes
|
||||
* @private
|
||||
*/
|
||||
private scrobbleTrack(attributes: any): void {
|
||||
if (!attributes?.lfmTrack || !attributes?.lfmAlbum) {
|
||||
this.verifyTrack(attributes, (a: any) => {
|
||||
this.scrobbleTrack(a)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (!this._authenticated || !attributes || this._utils.getStoreValue("connectivity.lastfm.filter_types")[attributes.playParams.kind] || (this._utils.getStoreValue("connectivity.lastfm.filter_loop") && this._scrobbleCache.track === attributes.lfmTrack.name)) return;
|
||||
|
||||
// Scrobble
|
||||
const scrobble = {
|
||||
'artist': attributes.lfmTrack.artist.name,
|
||||
'track': attributes.lfmTrack.name,
|
||||
'album': attributes.lfmAlbum.name,
|
||||
'albumArtist': attributes.lfmAlbum.artist,
|
||||
'timestamp': new Date().getTime() / 1000,
|
||||
'trackNumber': attributes.trackNumber,
|
||||
'duration': attributes.durationInMillis / 1000,
|
||||
}
|
||||
|
||||
// Easy Debugging
|
||||
console.debug(`[${lastfm.name}:scrobble] Scrobbling ${scrobble.artist} - ${scrobble.track}`)
|
||||
|
||||
// Scrobble the track
|
||||
this._lfm.track.scrobble(scrobble, (err: any, _res: any) => {
|
||||
if (err) {
|
||||
console.error(`[${lastfm.name}:scrobble] Scrobble failed: ${err.message}`);
|
||||
} else {
|
||||
console.debug(`[${lastfm.name}:scrobble] Track scrobbled: ${scrobble.artist} - ${scrobble.track}`);
|
||||
this._scrobbleCache = scrobble
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the now playing track
|
||||
* @param attributes
|
||||
* @private
|
||||
*/
|
||||
private updateNowPlayingTrack(attributes: any): void {
|
||||
if (!attributes?.lfmTrack || !attributes?.lfmAlbum) {
|
||||
this.verifyTrack(attributes, (a: any) => {
|
||||
this.updateNowPlayingTrack(a)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (!this._authenticated || !attributes || this._utils.getStoreValue("connectivity.lastfm.filter_types")[attributes.playParams.kind] || (this._utils.getStoreValue("connectivity.lastfm.filter_loop") && this._nowPlayingCache.track === attributes.lfmTrack.name)) return;
|
||||
|
||||
const nowPlaying = {
|
||||
'artist': attributes.lfmTrack.artist.name,
|
||||
'track': attributes.lfmTrack.name,
|
||||
'album': attributes.lfmAlbum.name,
|
||||
'trackNumber': attributes.trackNumber,
|
||||
'duration': attributes.durationInMillis / 1000,
|
||||
'albumArtist': attributes.lfmAlbum.artist,
|
||||
}
|
||||
|
||||
this._lfm.track.updateNowPlaying(nowPlaying, (err: any, res: any) => {
|
||||
if (err) {
|
||||
console.error(`[${lastfm.name}:updateNowPlaying] Now Playing Update failed: ${err.message}`);
|
||||
} else {
|
||||
console.debug(`[${lastfm.name}:updateNowPlaying] Now Playing Updated: ${nowPlaying.artist} - ${nowPlaying.track}`);
|
||||
this._nowPlayingCache = nowPlaying
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
|
@ -17,6 +17,8 @@ export default class Thumbar {
|
|||
* Menubar Assets
|
||||
* @private
|
||||
*/
|
||||
|
||||
private isNotMac: boolean = process.platform !== 'darwin';
|
||||
private isMac: boolean = process.platform === 'darwin';
|
||||
private _menuTemplate: any = [
|
||||
{
|
||||
|
@ -28,14 +30,14 @@ export default class Thumbar {
|
|||
},
|
||||
{type: 'separator'},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.toggleprivate'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.toggleprivate'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.togglePrivateSession").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.cfg.general.privateEnabled = !app.cfg.general.privateEnabled`)
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.settings'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.settings'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.settings").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('settings')`)
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.openSettingsPage()`)
|
||||
},
|
||||
...(this.isMac ? [
|
||||
{type: 'separator'},
|
||||
|
@ -47,11 +49,21 @@ export default class Thumbar {
|
|||
{type: 'separator'},
|
||||
{role: 'quit'}
|
||||
] : []),
|
||||
...(this.isNotMac ? [
|
||||
{type: 'separator'},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.quit'),
|
||||
accelerator: 'Control+Q',
|
||||
click: () => app.quit()
|
||||
|
||||
}
|
||||
] : [])
|
||||
]
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.view'),
|
||||
submenu: [
|
||||
...(this.isMac ? [
|
||||
{role: 'reload'},
|
||||
{role: 'forceReload'},
|
||||
{role: 'toggleDevTools'},
|
||||
|
@ -62,40 +74,41 @@ export default class Thumbar {
|
|||
{type: 'separator'},
|
||||
{role: 'togglefullscreen'},
|
||||
{type: 'separator'},
|
||||
] : []),
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.search'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.search'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.search").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript('app.focusSearch()')
|
||||
},
|
||||
{type:'separator'},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.listennow'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.listenNow'),
|
||||
accelerator: utils.getStoreValue('general.keybindings.listnow').join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('listen_now')`)
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.browse'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.browse'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.browse").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('browse')`)
|
||||
},
|
||||
{type: 'separator'},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.recentlyAdded')
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.recentlyAdded')
|
||||
,accelerator: utils.getStoreValue("general.keybindings.recentAdd").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-recentlyadded')`)
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.songs'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.songs'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.songs").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-songs')`)
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.albums'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.albums'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.albums").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-albums')`)
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.artists'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.artists'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.artists").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-artists')`)
|
||||
},
|
||||
|
@ -105,29 +118,16 @@ export default class Thumbar {
|
|||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.window'),
|
||||
submenu: [
|
||||
{role: 'minimize', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.minimize')},
|
||||
{type: 'separator'},
|
||||
...(this.isMac ? [
|
||||
{
|
||||
label: 'Show',
|
||||
click: () => utils.getWindow().show()
|
||||
},
|
||||
{role: 'toggleDevTools'},
|
||||
{role: 'zoom'},
|
||||
{type: 'separator'},
|
||||
{
|
||||
label:'Zoom',
|
||||
submenu: [
|
||||
{role: 'zoom'},
|
||||
{role: 'resetZoom'},
|
||||
{role: 'zoomIn'},
|
||||
{role: 'zoomOut'},
|
||||
]
|
||||
},
|
||||
{type: 'separator'},
|
||||
{role: 'togglefullscreen'},
|
||||
|
||||
|
||||
{type: 'separator'},
|
||||
{role: 'front'},
|
||||
{role: 'close'},
|
||||
{role: 'front'},
|
||||
{role: 'close'},
|
||||
{
|
||||
label: 'Edit',
|
||||
submenu: [
|
||||
|
@ -139,29 +139,74 @@ export default class Thumbar {
|
|||
{role: 'paste'},
|
||||
]
|
||||
},
|
||||
] : [
|
||||
{type: 'separator'},
|
||||
] : [ ]),
|
||||
...(this.isNotMac ? [
|
||||
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.zoom'),
|
||||
submenu: [
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.zoomin'),
|
||||
role: 'zoomIn',
|
||||
accelerator: utils.getStoreValue("general.keybindings.zoomn").join('+')
|
||||
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.zoomout'),
|
||||
role: 'zoomOut',
|
||||
accelerator: utils.getStoreValue("general.keybindings.zoomt").join('+')
|
||||
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.zoomreset'),
|
||||
role: 'resetZoom',
|
||||
accelerator: utils.getStoreValue("general.keybindings.zoomrst").join('+')
|
||||
}
|
||||
]
|
||||
},
|
||||
{type: 'separator'},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.fullscreen'),
|
||||
accelerator: 'Control+Enter',
|
||||
role: 'togglefullscreen'
|
||||
},
|
||||
{type: 'separator'},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'action.close'),
|
||||
accelerator: 'Control+W',
|
||||
role: 'close'
|
||||
},
|
||||
{type:'separator'},
|
||||
{role: 'reload', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.reload')},
|
||||
{role: 'forceReload', label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.forcereload')},
|
||||
]),
|
||||
]
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.reload'),
|
||||
accelerator: 'Control+R',
|
||||
role: 'reload'
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.forcereload'),
|
||||
accelerator: 'Control+Shift+R',
|
||||
role: 'forceReload'
|
||||
},
|
||||
] : []),
|
||||
],
|
||||
},
|
||||
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.controls'),
|
||||
submenu: [
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.playpause'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.playpause'),
|
||||
accelerator: 'Space',
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.SpacePause()`)
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.next'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.next'),
|
||||
accelerator: 'CommandOrControl+Right',
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`)
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.previous'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.previous'),
|
||||
accelerator: 'CommandOrControl+Left',
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`)
|
||||
},
|
||||
|
@ -178,19 +223,19 @@ export default class Thumbar {
|
|||
},
|
||||
{type: 'separator'},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.cast'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.cast2'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.castToDevices").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.castMenu = true`)
|
||||
},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.webremote'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.webremote'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.webRemote").join('+'),
|
||||
sublabel: 'Opens in external window',
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('remote-pair')`)
|
||||
},
|
||||
{type: 'separator'},
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.audio'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.audioSettings'),
|
||||
accelerator: utils.getStoreValue("general.keybindings.audioSettings").join('+'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.audioSettings = true`)
|
||||
},
|
||||
|
@ -207,7 +252,7 @@ export default class Thumbar {
|
|||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.account'),
|
||||
submenu: [
|
||||
{
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'menubar.options.accountsettings'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.accountSettings'),
|
||||
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('apple-account-settings')`)
|
||||
},
|
||||
{
|
||||
|
@ -221,11 +266,11 @@ export default class Thumbar {
|
|||
role: 'help',
|
||||
submenu: [
|
||||
{
|
||||
label: utils.getLocale('Discord', 'menubar.options.discord'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.discord'),
|
||||
click: () => shell.openExternal("https://discord.gg/AppleMusic").catch(console.error)
|
||||
},
|
||||
{
|
||||
label: utils.getLocale('GitHub Wiki', 'menubar.options.github'),
|
||||
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.github'),
|
||||
click: () => shell.openExternal("https://github.com/ciderapp/Cider/wiki/Troubleshooting").catch(console.error)
|
||||
},
|
||||
{type: 'separator'},
|
||||
|
|
|
@ -6,7 +6,10 @@ export default class mpris {
|
|||
* Private variables for interaction in plugins
|
||||
*/
|
||||
private static utils: any;
|
||||
|
||||
/**
|
||||
* MPRIS Service
|
||||
*/
|
||||
private static player: Player.Player;
|
||||
/**
|
||||
* Base Plugin Details (Eventually implemented into a GUI in settings)
|
||||
*/
|
||||
|
@ -15,30 +18,17 @@ export default class mpris {
|
|||
public version: string = '1.0.0';
|
||||
public author: string = 'Core';
|
||||
|
||||
/**
|
||||
* MPRIS Service
|
||||
*/
|
||||
private static player: Player.Player;
|
||||
private static mprisEvents: Object = {
|
||||
"playpause": "playPause",
|
||||
"play": "play",
|
||||
"pause": "pause",
|
||||
"next": "next",
|
||||
"previous": "previous",
|
||||
}
|
||||
|
||||
/*******************************************************************************************
|
||||
* Private Methods
|
||||
* ****************************************************************************************/
|
||||
|
||||
/**
|
||||
* Runs a media event
|
||||
* @param type - pausePlay, next, previous
|
||||
* @private
|
||||
* Runs on plugin load (Currently run on application start)
|
||||
*/
|
||||
private static runMediaEvent(type: string) {
|
||||
console.debug(`[Plugin][${this.name}] ${type}.`);
|
||||
mpris.utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.${type}()`).catch(console.error)
|
||||
constructor(utils: any) {
|
||||
mpris.utils = utils
|
||||
|
||||
console.debug(`[Plugin][${mpris.name}] Loading Complete.`);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -54,7 +44,6 @@ export default class mpris {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Connects to MPRIS Service
|
||||
*/
|
||||
|
@ -63,29 +52,49 @@ export default class mpris {
|
|||
const player = Player({
|
||||
name: 'cider',
|
||||
identity: 'Cider',
|
||||
supportedUriSchemes: [],
|
||||
supportedMimeTypes: [],
|
||||
supportedInterfaces: ['player']
|
||||
});
|
||||
|
||||
console.debug(`[Plugin][${mpris.name}] Successfully connected.`);
|
||||
console.debug(`[${mpris.name}:connect] Successfully connected.`);
|
||||
|
||||
const pos_atr = {durationInMillis: 0};
|
||||
player.getPosition = function () {
|
||||
const durationInMicro = pos_atr.durationInMillis * 1000;
|
||||
const percentage = parseFloat("0") || 0;
|
||||
return durationInMicro * percentage;
|
||||
const renderer = mpris.utils.getWindow().webContents
|
||||
const loopType: { [key: string]: number; } = {
|
||||
'none': 0,
|
||||
'track': 1,
|
||||
'playlist': 2,
|
||||
}
|
||||
|
||||
for (const [key, value] of Object.entries(mpris.mprisEvents)) {
|
||||
player.on(key, function () {
|
||||
mpris.runMediaEvent(value)
|
||||
});
|
||||
}
|
||||
player.on('next', () => mpris.utils.playback.next())
|
||||
player.on('previous', () => mpris.utils.playback.previous())
|
||||
player.on('playpause', () => mpris.utils.playback.playPause())
|
||||
player.on('play', () => mpris.utils.playback.play())
|
||||
player.on('pause', () => mpris.utils.playback.pause())
|
||||
player.on('quit', () => mpris.utils.getApp().exit())
|
||||
player.on('position', (args: { position: any; }) => mpris.utils.playback.seek(args.position / 1000 / 1000))
|
||||
player.on('loopStatus', (status: string) => renderer.executeJavaScript(`app.mk.repeatMode = ${loopType[status.toLowerCase()]}`))
|
||||
player.on('shuffle', () => renderer.executeJavaScript('app.mk.shuffleMode = (app.mk.shuffleMode === 0) ? 1 : 0'))
|
||||
|
||||
player.on('quit', function () {
|
||||
process.exit();
|
||||
});
|
||||
mpris.utils.getIPCMain().on('mpris:playbackTimeDidChange', (event: any, time: number) => {
|
||||
player.getPosition = () => time;
|
||||
})
|
||||
|
||||
mpris.utils.getIPCMain().on('repeatModeDidChange', (_e: any, mode: number) => {
|
||||
switch (mode) {
|
||||
case 0:
|
||||
player.loopStatus = Player.LOOP_STATUS_NONE;
|
||||
break;
|
||||
case 1:
|
||||
player.loopStatus = Player.LOOP_STATUS_TRACK;
|
||||
break;
|
||||
case 2:
|
||||
player.loopStatus = Player.LOOP_STATUS_PLAYLIST;
|
||||
break;
|
||||
}
|
||||
})
|
||||
|
||||
mpris.utils.getIPCMain().on('shuffleModeDidChange', (_e: any, mode: number) => {
|
||||
player.shuffle = mode === 1
|
||||
})
|
||||
|
||||
mpris.player = player;
|
||||
}
|
||||
|
@ -93,9 +102,9 @@ export default class mpris {
|
|||
/**
|
||||
* Update M.P.R.I.S Player Attributes
|
||||
*/
|
||||
private static updatePlayer(attributes: any) {
|
||||
private static updateMetaData(attributes: any) {
|
||||
|
||||
const MetaData = {
|
||||
mpris.player.metadata = {
|
||||
'mpris:trackid': mpris.player.objectPath(`track/${attributes.playParams.id.replace(/[.]+/g, "")}`),
|
||||
'mpris:length': attributes.durationInMillis * 1000, // In microseconds
|
||||
'mpris:artUrl': (attributes.artwork.url.replace('/{w}x{h}bb', '/512x512bb')).replace('/2000x2000bb', '/35x35bb'),
|
||||
|
@ -103,33 +112,12 @@ export default class mpris {
|
|||
'xesam:album': `${attributes.albumName}`,
|
||||
'xesam:artist': [`${attributes.artistName}`],
|
||||
'xesam:genre': attributes.genreNames
|
||||
}
|
||||
|
||||
if (mpris.player.metadata["mpris:trackid"] === MetaData["mpris:trackid"]) {
|
||||
return
|
||||
}
|
||||
|
||||
mpris.player.metadata = MetaData;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Update M.P.R.I.S Player State
|
||||
* @private
|
||||
* @param attributes
|
||||
*/
|
||||
private static updatePlayerState(attributes: any) {
|
||||
switch (attributes.status) {
|
||||
case true: // Playing
|
||||
mpris.player.playbackStatus = Player.PLAYBACK_STATUS_PLAYING;
|
||||
break;
|
||||
case false: // Paused
|
||||
mpris.player.playbackStatus = Player.PLAYBACK_STATUS_PAUSED;
|
||||
break;
|
||||
default:
|
||||
mpris.player.playbackStatus = Player.PLAYBACK_STATUS_STOPPED;
|
||||
break
|
||||
}
|
||||
}
|
||||
/*******************************************************************************************
|
||||
* Public Methods
|
||||
* ****************************************************************************************/
|
||||
|
||||
/**
|
||||
* Clear state
|
||||
|
@ -143,26 +131,12 @@ export default class mpris {
|
|||
mpris.player.playbackStatus = Player.PLAYBACK_STATUS_STOPPED;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************************
|
||||
* Public Methods
|
||||
* ****************************************************************************************/
|
||||
|
||||
/**
|
||||
* Runs on plugin load (Currently run on application start)
|
||||
*/
|
||||
constructor(utils: any) {
|
||||
mpris.utils = utils
|
||||
|
||||
console.debug(`[Plugin][${mpris.name}] Loading Complete.`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on app ready
|
||||
*/
|
||||
@mpris.linuxOnly
|
||||
onReady(_: any): void {
|
||||
console.debug(`[Plugin][${mpris.name}] Ready.`);
|
||||
console.debug(`[${mpris.name}:onReady] Ready.`);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -187,9 +161,8 @@ export default class mpris {
|
|||
* @param attributes Music Attributes (attributes.status = current state)
|
||||
*/
|
||||
@mpris.linuxOnly
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
console.debug(`[Plugin][${mpris.name}] onPlaybackStateDidChange.`);
|
||||
mpris.updatePlayerState(attributes)
|
||||
onPlaybackStateDidChange(attributes: any): void {
|
||||
mpris.player.playbackStatus = attributes?.status ? Player.PLAYBACK_STATUS_PLAYING : Player.PLAYBACK_STATUS_PAUSED
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -198,8 +171,7 @@ export default class mpris {
|
|||
*/
|
||||
@mpris.linuxOnly
|
||||
onNowPlayingItemDidChange(attributes: object): void {
|
||||
console.debug(`[Plugin][${mpris.name}] onMetadataDidChange.`);
|
||||
mpris.updatePlayer(attributes);
|
||||
mpris.updateMetaData(attributes);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
12
src/main/providers/local/db/index.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
import * as PouchDB from 'pouchdb-node';
|
||||
import {join} from 'path';
|
||||
import {app} from "electron";
|
||||
PouchDB.plugin(require('pouchdb-upsert'));
|
||||
export class ProviderDB {
|
||||
public static db: any = null
|
||||
static init() {
|
||||
if (ProviderDB.db == null){
|
||||
ProviderDB.db = new PouchDB(join(app.getPath('userData'), 'tracksdb'))
|
||||
}
|
||||
}
|
||||
}
|
180
src/main/providers/local/index.ts
Normal file
|
@ -0,0 +1,180 @@
|
|||
import { ProviderDB } from "./db";
|
||||
import * as path from 'path';
|
||||
const { readdir } = require('fs').promises;
|
||||
import { utils } from '../../base/utils';
|
||||
import * as mm from 'music-metadata';
|
||||
import {Md5} from 'ts-md5/dist/md5';
|
||||
import e from "express";
|
||||
import { EventEmitter } from 'events';
|
||||
|
||||
export class LocalFiles {
|
||||
static localSongs: any = [];
|
||||
static localSongsArts: any = [];
|
||||
public static DB = ProviderDB.db;
|
||||
static eventEmitter = new EventEmitter();
|
||||
|
||||
static getDataType(item_id : String | any){
|
||||
if ((item_id ?? ('')).startsWith('ciderlocalart'))
|
||||
return 'artwork'
|
||||
else if ((item_id ?? ('')).startsWith('ciderlocal'))
|
||||
return 'track'
|
||||
}
|
||||
|
||||
static async sendOldLibrary() {
|
||||
ProviderDB.init()
|
||||
let rows = (await ProviderDB.db.allDocs({include_docs: true,
|
||||
attachments: true})).rows.map((item: any)=>{return item.doc})
|
||||
let tracks = rows.filter((item: any) => {return this.getDataType(item._id) == "track"})
|
||||
let arts = rows.filter((item: any) => {return this.getDataType(item._id) == "artwork"})
|
||||
this.localSongs = tracks;
|
||||
this.localSongsArts = arts;
|
||||
return tracks;
|
||||
}
|
||||
|
||||
static async scanLibrary() {
|
||||
ProviderDB.init()
|
||||
let folders = utils.getStoreValue("libraryPrefs.localPaths")
|
||||
if (folders == null || folders.length == null || folders.length == 0) folders = []
|
||||
let files: any[] = []
|
||||
for (var folder of folders) {
|
||||
// get files from the Music folder
|
||||
files = files.concat(await LocalFiles.getFiles(folder))
|
||||
}
|
||||
|
||||
let supporttedformats = ["mp3", "aac", "webm", "flac", "m4a", "ogg", "wav", "opus"]
|
||||
let audiofiles = files.filter(f => supporttedformats.includes(f.substring(f.lastIndexOf('.') + 1)));
|
||||
let metadatalist = []
|
||||
let metadatalistart = []
|
||||
let numid = 0;
|
||||
for (var audio of audiofiles) {
|
||||
try {
|
||||
const metadata = await mm.parseFile(audio);
|
||||
let lochash = Md5.hashStr(audio) ?? numid;
|
||||
if (metadata != null) {
|
||||
let form = {
|
||||
"id": "ciderlocal" + lochash,
|
||||
"_id": "ciderlocal" + lochash,
|
||||
"type": "podcast-episodes",
|
||||
"href": audio,
|
||||
"attributes": {
|
||||
"artwork": {
|
||||
"width": 3000,
|
||||
"height": 3000,
|
||||
"url": "/ciderlocalart/" + "ciderlocal" + lochash,
|
||||
},
|
||||
"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": `${metadata?.common?.year ?? '2022'}-05-13T00:23:00Z`,
|
||||
"durationInMillis": Math.floor((metadata.format.duration ?? 0) * 1000),
|
||||
"bitrate": Math.floor((metadata.format?.bitrate ?? 0) / 1000),
|
||||
"offers": [
|
||||
{
|
||||
"kind": "get",
|
||||
"type": "STDQ"
|
||||
}
|
||||
],
|
||||
"contentRating": "clean"
|
||||
},
|
||||
flavor: Math.floor((metadata.format?.bitrate ?? 0) / 1000),
|
||||
localFilesMetadata: {
|
||||
lossless: metadata.format?.lossless,
|
||||
container: metadata.format?.container,
|
||||
bitDepth: metadata.format?.bitsPerSample ?? 0,
|
||||
sampleRate: metadata.format?.sampleRate ?? 0,
|
||||
},
|
||||
};
|
||||
let art = {
|
||||
id: "ciderlocal" + lochash,
|
||||
_id: "ciderlocalart" + lochash,
|
||||
url: metadata.common.picture != undefined ? metadata.common.picture[0].data.toString('base64') : "",
|
||||
}
|
||||
metadatalistart.push(art)
|
||||
numid += 1;
|
||||
ProviderDB.db.putIfNotExists(form)
|
||||
ProviderDB.db.putIfNotExists(art)
|
||||
metadatalist.push(form)
|
||||
|
||||
if (this.localSongs.length === 0 && numid % 10 === 0) { // send updated chunks only if there is no previous database
|
||||
this.eventEmitter.emit('newtracks', metadatalist)}
|
||||
}
|
||||
} catch (e) {console.error("localfiles error:", e)}
|
||||
}
|
||||
// console.log('metadatalist', metadatalist);
|
||||
this.localSongs = metadatalist;
|
||||
this.localSongsArts = metadatalistart;
|
||||
return metadatalist;
|
||||
}
|
||||
static async 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() ? this.getFiles(res) : res;
|
||||
}));
|
||||
return Array.prototype.concat(...files);
|
||||
}
|
||||
|
||||
static async cleanUpDB(){
|
||||
let folders = utils.getStoreValue("libraryPrefs.localPaths")
|
||||
let rows = (await ProviderDB.db.allDocs({include_docs: true,
|
||||
attachments: true})).rows.map((item: any)=>{return item.doc})
|
||||
let tracks = rows.filter((item: any) => {return this.getDataType(item._id) == "track" && !folders.some((i: String) => {return item["attributes"]["assetUrl"].startsWith("file:///" + i)})})
|
||||
let hashs = tracks.map((i: any) => {return i._id})
|
||||
for (let hash of hashs){
|
||||
try{
|
||||
ProviderDB.db.get(hash).then(function (doc: any) {
|
||||
return ProviderDB.db.remove(doc);
|
||||
});} catch(e){}
|
||||
try{
|
||||
ProviderDB.db.get(hash.replace('ciderlocal','ciderlocalart')).then(function (doc: any) {
|
||||
return ProviderDB.db.remove(doc);
|
||||
});} catch(e){}
|
||||
}
|
||||
}
|
||||
|
||||
static setupHandlers () {
|
||||
const app = utils.getExpress()
|
||||
console.log("Setting up handlers for local files")
|
||||
app.get("/ciderlocal/:songs", (req: any, res: any) => {
|
||||
const audio = atob(req.params.songs.replace(/_/g, '/').replace(/-/g, '+'));
|
||||
//console.log('auss', audio)
|
||||
let data = {
|
||||
data:
|
||||
LocalFiles.localSongs.filter((f: any) => audio.split(',').includes(f.id))
|
||||
};
|
||||
res.send(data);
|
||||
});
|
||||
|
||||
app.get("/ciderlocalart/:songs", (req: any, res: any) => {
|
||||
const audio = req.params.songs;
|
||||
// metadata.common.picture[0].data.toString('base64')
|
||||
|
||||
res.setHeader('Cache-Control', 'public, max-age=31536000');
|
||||
res.setHeader('Expires', new Date(Date.now() + 31536000000).toUTCString());
|
||||
res.setHeader('Content-Type', 'image/jpeg');
|
||||
|
||||
let data =
|
||||
LocalFiles.localSongsArts.filter((f: any) => f.id == audio);
|
||||
res.status(200).send(Buffer.from(data[0]?.url, 'base64'));
|
||||
});
|
||||
|
||||
return app
|
||||
}
|
||||
}
|
|
@ -11,9 +11,6 @@ const MusicKitInterop = {
|
|||
if (MusicKitInterop.filterTrack(attributes, true, false)) {
|
||||
global.ipcRenderer.send('playbackStateDidChange', attributes)
|
||||
global.ipcRenderer.send('wsapi-updatePlaybackState', attributes);
|
||||
// if (typeof _plugins != "undefined") {
|
||||
// _plugins.execute("OnPlaybackStateChanged", {Attributes: MusicKitInterop.getAttributes()})
|
||||
// }
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -23,19 +20,18 @@ const MusicKitInterop = {
|
|||
});
|
||||
/** wsapi */
|
||||
|
||||
MusicKit.getInstance().addEventListener(MusicKit.Events.playbackTimeDidChange, () => {
|
||||
ipcRenderer.send('mpris:playbackTimeDidChange', (MusicKit.getInstance()?.currentPlaybackTime * 1000 * 1000 ) ?? 0);
|
||||
})
|
||||
|
||||
MusicKit.getInstance().addEventListener(MusicKit.Events.nowPlayingItemDidChange, async () => {
|
||||
console.debug('nowPlayingItemDidChange')
|
||||
console.debug('[cider:preload] nowPlayingItemDidChange')
|
||||
const attributes = MusicKitInterop.getAttributes()
|
||||
const trackFilter = MusicKitInterop.filterTrack(attributes, false, true)
|
||||
|
||||
if (trackFilter) {
|
||||
if (MusicKitInterop.filterTrack(attributes, false, true)) {
|
||||
global.ipcRenderer.send('nowPlayingItemDidChange', attributes);
|
||||
}
|
||||
|
||||
// LastFM's Custom Call
|
||||
await MusicKitInterop.modifyNamesOnLocale();
|
||||
if (trackFilter || !app.cfg.lastfm.filterLoop) {
|
||||
global.ipcRenderer.send('nowPlayingItemDidChangeLastFM', attributes);
|
||||
} else if (attributes.name !== 'no-title-found' && attributes.playParams.id !== "no-id-found") {
|
||||
global.ipcRenderer.send('lastfm:nowPlayingChange', attributes);
|
||||
}
|
||||
|
||||
if (MusicKit.getInstance().nowPlayingItem) {
|
||||
|
@ -46,41 +42,27 @@ const MusicKitInterop = {
|
|||
|
||||
MusicKit.getInstance().addEventListener(MusicKit.Events.authorizationStatusDidChange, () => {
|
||||
global.ipcRenderer.send('authorizationStatusDidChange', MusicKit.getInstance().authorizationStatus)
|
||||
})
|
||||
});
|
||||
|
||||
MusicKit.getInstance().addEventListener(MusicKit.Events.mediaPlaybackError, (e) => {
|
||||
console.warn(`[mediaPlaybackError] ${e}`);
|
||||
})
|
||||
console.warn(`[cider:preload] mediaPlaybackError] ${e}`);
|
||||
});
|
||||
|
||||
MusicKit.getInstance().addEventListener(MusicKit.Events.shuffleModeDidChange, () => {
|
||||
global.ipcRenderer.send('shuffleModeDidChange', MusicKit.getInstance().shuffleMode)
|
||||
});
|
||||
|
||||
MusicKit.getInstance().addEventListener(MusicKit.Events.repeatModeDidChange, () => {
|
||||
global.ipcRenderer.send('repeatModeDidChange', MusicKit.getInstance().repeatMode)
|
||||
});
|
||||
},
|
||||
|
||||
sleep(ms) {
|
||||
return new Promise((resolve) => {
|
||||
setTimeout(resolve, ms);
|
||||
setTimeout(resolve, ms);
|
||||
});
|
||||
},
|
||||
|
||||
async modifyNamesOnLocale() {
|
||||
if (app.mklang === '' || app.mklang == null) {
|
||||
return;
|
||||
}
|
||||
const mk = MusicKit.getInstance()
|
||||
const nowPlayingItem = mk.nowPlayingItem;
|
||||
if ((nowPlayingItem?._songId ?? nowPlayingItem?.songId) == null){
|
||||
return;
|
||||
}
|
||||
const id = nowPlayingItem?._songId ?? (nowPlayingItem?.songId ?? nowPlayingItem?.id)
|
||||
if (id != null && id !== -1) {
|
||||
try{
|
||||
const query = await mk.api.v3.music(`/v1${(((nowPlayingItem?._songId ?? nowPlayingItem?.songId) != null) && ((nowPlayingItem?._songId ?? nowPlayingItem?.songId) !== -1)) ? `/catalog/${mk.storefrontId}/` : `/me/library/`}songs/${id}?l=${app.mklang}`);
|
||||
if (query?.data?.data[0]){
|
||||
let attrs = query?.data?.data[0]?.attributes;
|
||||
if (attrs?.name) { nowPlayingItem.attributes.name = attrs?.name ?? ''}
|
||||
if (attrs?.albumName) { nowPlayingItem.attributes.albumName = attrs?.albumName ?? ''}
|
||||
if (attrs?.artistName) { nowPlayingItem.attributes.artistName = attrs?.artistName ?? ''}
|
||||
|
||||
}} catch (e) { }
|
||||
} else {}
|
||||
},
|
||||
getAttributes: function () {
|
||||
const mk = MusicKit.getInstance()
|
||||
const nowPlayingItem = mk.nowPlayingItem;
|
||||
|
@ -96,8 +78,8 @@ const MusicKitInterop = {
|
|||
attributes.playParams = attributes?.playParams ?? {id: 'no-id-found'};
|
||||
attributes.playParams.id = attributes?.playParams?.id ?? 'no-id-found';
|
||||
attributes.url = {
|
||||
cider: `https://cider.sh/link?play/s/${nowPlayingItem?._songId ?? (nowPlayingItem?.songId ??'no-id-found')}`,
|
||||
appleMusic: attributes.websiteUrl ? attributes.websiteUrl : `https://music.apple.com/${mk.storefrontId}/song/${nowPlayingItem?._songId ?? (nowPlayingItem?.songId ??'no-id-found')}`
|
||||
cider: `https://cider.sh/link?play/s/${nowPlayingItem?._songId ?? (nowPlayingItem?.songId ?? 'no-id-found')}`,
|
||||
appleMusic: attributes.websiteUrl ? attributes.websiteUrl : `https://music.apple.com/${mk.storefrontId}/song/${nowPlayingItem?._songId ?? (nowPlayingItem?.songId ?? 'no-id-found')}`
|
||||
}
|
||||
if (attributes.playParams.id === 'no-id-found') {
|
||||
attributes.playParams.id = nowPlayingItem?.id ?? 'no-id-found';
|
||||
|
@ -109,13 +91,14 @@ const MusicKitInterop = {
|
|||
? remainingTimeExport * 1000
|
||||
: 0;
|
||||
attributes.durationInMillis = attributes?.durationInMillis ?? 0;
|
||||
attributes.currentPlaybackTime = mk?.currentPlaybackTime ?? 0;
|
||||
attributes.currentPlaybackProgress = currentPlaybackProgress ?? 0;
|
||||
attributes.startTime = Date.now();
|
||||
attributes.endTime = Math.round(
|
||||
attributes?.playParams?.id === cache.playParams.id
|
||||
? Date.now() + attributes?.remainingTime
|
||||
: attributes?.startTime + attributes?.durationInMillis
|
||||
);
|
||||
);
|
||||
return attributes;
|
||||
},
|
||||
|
||||
|
@ -156,19 +139,19 @@ const MusicKitInterop = {
|
|||
// } catch (e) { }
|
||||
// if (MusicKit.getInstance().queue.nextPlayableItemIndex != -1 && MusicKit.getInstance().queue.nextPlayableItemIndex != null)
|
||||
// MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.nextPlayableItemIndex);
|
||||
MusicKit.getInstance().skipToNextItem().then(r => console.debug(`[MusicKitInterop.next] Skipping to Next ${r}`));
|
||||
MusicKit.getInstance().skipToNextItem().then(r => console.debug(`[cider:preload] [next] Skipping to Next ${r}`));
|
||||
},
|
||||
|
||||
previous: () => {
|
||||
// if (MusicKit.getInstance().queue.previousPlayableItemIndex != -1 && MusicKit.getInstance().queue.previousPlayableItemIndex != null)
|
||||
// MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.previousPlayableItemIndex);
|
||||
MusicKit.getInstance().skipToPreviousItem().then(r => console.debug(`[MusicKitInterop.previous] Skipping to Previous ${r}`));
|
||||
MusicKit.getInstance().skipToPreviousItem().then(r => console.debug(`[cider:preload] [previous] Skipping to Previous ${r}`));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
process.once('loaded', () => {
|
||||
console.debug("Setting ipcRenderer")
|
||||
console.debug("[cider:preload] IPC Listeners Created!")
|
||||
global.MusicKitInterop = MusicKitInterop;
|
||||
});
|
||||
|
|
1
src/renderer/assets/angles-left.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" fill="white" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M77.25 256l137.4-137.4c12.5-12.5 12.5-32.75 0-45.25s-32.75-12.5-45.25 0l-160 160c-12.5 12.5-12.5 32.75 0 45.25l160 160C175.6 444.9 183.8 448 192 448s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25L77.25 256zM269.3 256l137.4-137.4c12.5-12.5 12.5-32.75 0-45.25s-32.75-12.5-45.25 0l-160 160c-12.5 12.5-12.5 32.75 0 45.25l160 160C367.6 444.9 375.8 448 384 448s16.38-3.125 22.62-9.375c12.5-12.5 12.5-32.75 0-45.25L269.3 256z"/></svg>
|
After Width: | Height: | Size: 685 B |
1
src/renderer/assets/angles-right.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" fill="white" viewBox="0 0 448 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M246.6 233.4l-160-160c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25L178.8 256l-137.4 137.4c-12.5 12.5-12.5 32.75 0 45.25C47.63 444.9 55.81 448 64 448s16.38-3.125 22.62-9.375l160-160C259.1 266.1 259.1 245.9 246.6 233.4zM438.6 233.4l-160-160c-12.5-12.5-32.75-12.5-45.25 0s-12.5 32.75 0 45.25L370.8 256l-137.4 137.4c-12.5 12.5-12.5 32.75 0 45.25C239.6 444.9 247.8 448 256 448s16.38-3.125 22.62-9.375l160-160C451.1 266.1 451.1 245.9 438.6 233.4z"/></svg>
|
After Width: | Height: | Size: 706 B |
1
src/renderer/assets/chevron-right.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" fill="white" viewBox="0 0 320 512"><!--! Font Awesome Pro 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path d="M96 480c-8.188 0-16.38-3.125-22.62-9.375c-12.5-12.5-12.5-32.75 0-45.25L242.8 256L73.38 86.63c-12.5-12.5-12.5-32.75 0-45.25s32.75-12.5 45.25 0l192 192c12.5 12.5 12.5 32.75 0 45.25l-192 192C112.4 476.9 104.2 480 96 480z"/></svg>
|
After Width: | Height: | Size: 478 B |
|
@ -1,10 +1,41 @@
|
|||
<svg width="71" height="55" viewBox="0 0 71 55" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0)">
|
||||
<path d="M60.1045 4.8978C55.5792 2.8214 50.7265 1.2916 45.6527 0.41542C45.5603 0.39851 45.468 0.440769 45.4204 0.525289C44.7963 1.6353 44.105 3.0834 43.6209 4.2216C38.1637 3.4046 32.7345 3.4046 27.3892 4.2216C26.905 3.0581 26.1886 1.6353 25.5617 0.525289C25.5141 0.443589 25.4218 0.40133 25.3294 0.41542C20.2584 1.2888 15.4057 2.8186 10.8776 4.8978C10.8384 4.9147 10.8048 4.9429 10.7825 4.9795C1.57795 18.7309 -0.943561 32.1443 0.293408 45.3914C0.299005 45.4562 0.335386 45.5182 0.385761 45.5576C6.45866 50.0174 12.3413 52.7249 18.1147 54.5195C18.2071 54.5477 18.305 54.5139 18.3638 54.4378C19.7295 52.5728 20.9469 50.6063 21.9907 48.5383C22.0523 48.4172 21.9935 48.2735 21.8676 48.2256C19.9366 47.4931 18.0979 46.6 16.3292 45.5858C16.1893 45.5041 16.1781 45.304 16.3068 45.2082C16.679 44.9293 17.0513 44.6391 17.4067 44.3461C17.471 44.2926 17.5606 44.2813 17.6362 44.3151C29.2558 49.6202 41.8354 49.6202 53.3179 44.3151C53.3935 44.2785 53.4831 44.2898 53.5502 44.3433C53.9057 44.6363 54.2779 44.9293 54.6529 45.2082C54.7816 45.304 54.7732 45.5041 54.6333 45.5858C52.8646 46.6197 51.0259 47.4931 49.0921 48.2228C48.9662 48.2707 48.9102 48.4172 48.9718 48.5383C50.038 50.6034 51.2554 52.5699 52.5959 54.435C52.6519 54.5139 52.7526 54.5477 52.845 54.5195C58.6464 52.7249 64.529 50.0174 70.6019 45.5576C70.6551 45.5182 70.6887 45.459 70.6943 45.3942C72.1747 30.0791 68.2147 16.7757 60.1968 4.9823C60.1772 4.9429 60.1437 4.9147 60.1045 4.8978ZM23.7259 37.3253C20.2276 37.3253 17.3451 34.1136 17.3451 30.1693C17.3451 26.225 20.1717 23.0133 23.7259 23.0133C27.308 23.0133 30.1626 26.2532 30.1066 30.1693C30.1066 34.1136 27.28 37.3253 23.7259 37.3253ZM47.3178 37.3253C43.8196 37.3253 40.9371 34.1136 40.9371 30.1693C40.9371 26.225 43.7636 23.0133 47.3178 23.0133C50.9 23.0133 53.7545 26.2532 53.6986 30.1693C53.6986 34.1136 50.9 37.3253 47.3178 37.3253Z" fill="#ffffff"/>
|
||||
</g>
|
||||
<defs>
|
||||
<clipPath id="clip0">
|
||||
<rect width="71" height="55" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
fill="currentColor"
|
||||
class="bi bi-discord"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="discord.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="51.8125"
|
||||
inkscape:cx="7.5946924"
|
||||
inkscape:cy="8.0096502"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1009"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M13.545 2.907a13.227 13.227 0 0 0-3.257-1.011.05.05 0 0 0-.052.025c-.141.25-.297.577-.406.833a12.19 12.19 0 0 0-3.658 0 8.258 8.258 0 0 0-.412-.833.051.051 0 0 0-.052-.025c-1.125.194-2.22.534-3.257 1.011a.041.041 0 0 0-.021.018C.356 6.024-.213 9.047.066 12.032c.001.014.01.028.021.037a13.276 13.276 0 0 0 3.995 2.02.05.05 0 0 0 .056-.019c.308-.42.582-.863.818-1.329a.05.05 0 0 0-.01-.059.051.051 0 0 0-.018-.011 8.875 8.875 0 0 1-1.248-.595.05.05 0 0 1-.02-.066.051.051 0 0 1 .015-.019c.084-.063.168-.129.248-.195a.05.05 0 0 1 .051-.007c2.619 1.196 5.454 1.196 8.041 0a.052.052 0 0 1 .053.007c.08.066.164.132.248.195a.051.051 0 0 1-.004.085 8.254 8.254 0 0 1-1.249.594.05.05 0 0 0-.03.03.052.052 0 0 0 .003.041c.24.465.515.909.817 1.329a.05.05 0 0 0 .056.019 13.235 13.235 0 0 0 4.001-2.02.049.049 0 0 0 .021-.037c.334-3.451-.559-6.449-2.366-9.106a.034.034 0 0 0-.02-.019Zm-8.198 7.307c-.789 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.45.73 1.438 1.613 0 .888-.637 1.612-1.438 1.612Zm5.316 0c-.788 0-1.438-.724-1.438-1.612 0-.889.637-1.613 1.438-1.613.807 0 1.451.73 1.438 1.613 0 .888-.631 1.612-1.438 1.612Z"
|
||||
id="path2"
|
||||
style="fill:#ffffff;fill-opacity:1" />
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 2.2 KiB |
3
src/renderer/assets/feather/hard-drive.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-hard-drive">
|
||||
<path d="M22 12H2m3.45-6.89L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11zM6 16h.01M10 16h.01"/>
|
||||
</svg>
|
After Width: | Height: | Size: 372 B |
4
src/renderer/assets/feather/headphones.svg
Normal file
|
@ -0,0 +1,4 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-headphones">
|
||||
<path d="M3 18v-6a9 9 0 0 1 18 0v6"/>
|
||||
<path d="M21 19a2 2 0 0 1-2 2h-1a2 2 0 0 1-2-2v-3a2 2 0 0 1 2-2h3zM3 19a2 2 0 0 0 2 2h1a2 2 0 0 0 2-2v-3a2 2 0 0 0-2-2H3z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 390 B |
5
src/renderer/assets/feather/pen-tool.svg
Normal file
|
@ -0,0 +1,5 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-pen-tool" width="20" height="20">
|
||||
<path d="m12 19 7-7 3 3-7 7-3-3z"/>
|
||||
<path d="m18 13-1.5-7.5L2 2l3.5 14.5L13 18l5-5zM2 2l7.586 7.586"/>
|
||||
<circle cx="11" cy="11" r="2"/>
|
||||
</svg>
|
After Width: | Height: | Size: 363 B |
1
src/renderer/assets/feather/plugins.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-package"><line x1="16.5" y1="9.4" x2="7.5" y2="4.21"></line><path d="M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"></path><polyline points="3.27 6.96 12 12.01 20.73 6.96"></polyline><line x1="12" y1="22.08" x2="12" y2="12"></line></svg>
|
After Width: | Height: | Size: 517 B |
41
src/renderer/assets/feather/style.svg
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="24px"
|
||||
height="24px"
|
||||
viewBox="0 0 24 24"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="style-svgrepo-com.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#000000"
|
||||
borderopacity="0.25"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="36.541667"
|
||||
inkscape:cx="8.031927"
|
||||
inkscape:cy="12.054732"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1044"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M23.14.93l-.07-.07A2.926 2.926 0 0 0 20.98 0a2.886 2.886 0 0 0-2.08.86L8.858 10.9a3.04 3.04 0 0 0-.53.72 7.793 7.793 0 0 0-4.1 1.621c-.191.144-.36.316-.5.51a6.08 6.08 0 0 0-.98 1.961c-.25.69-.59 1.631-1.22 3-.42.91-.75 1.541-.98 1.981a3.092 3.092 0 0 0-.54 1.631c.014.206.08.406.19.58a2.64 2.64 0 0 0 2.23 1.07 10.462 10.462 0 0 0 8.161-3.371c.378-.44.692-.932.93-1.461a7.882 7.882 0 0 0 .69-3.361.142.142 0 0 1 .02-.04c.325-.144.62-.347.87-.6L23.14 5.1A2.888 2.888 0 0 0 24 3.021 2.927 2.927 0 0 0 23.14.93zM9.7 18.317c-.17.368-.388.711-.65 1.02a8.393 8.393 0 0 1-6.891 2.6c.05-.1.11-.21.17-.32.24-.46.58-1.11 1.02-2.061a39.058 39.058 0 0 0 1.28-3.151c.14-.491.355-.957.64-1.381.062-.08.133-.154.21-.22a5.221 5.221 0 0 1 2.59-1.14c.121.537.396 1.027.79 1.411l.07.07c.35.357.788.616 1.27.75a5.614 5.614 0 0 1-.499 2.422zM21.73 3.691L11.678 13.735a.947.947 0 0 1-.67.28.983.983 0 0 1-.67-.28l-.07-.07a.948.948 0 0 1 0-1.34L20.309 2.271c.18-.173.42-.27.671-.271a.937.937 0 0 1 .67.27l.08.08c.36.374.36.967 0 1.341z"
|
||||
fill="#494c4e"
|
||||
fill-rule="evenodd"
|
||||
id="path2"
|
||||
style="fill:#000000;fill-opacity:1" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
3
src/renderer/assets/feather/zap.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-zap" width="20" height="20">
|
||||
<path d="M13 2 3 14h9l-1 8 10-12h-9l1-8z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 263 B |
|
@ -1,3 +1,41 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
|
||||
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
|
||||
</svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
fill="currentColor"
|
||||
class="bi bi-github"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="github.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="51.8125"
|
||||
inkscape:cx="7.5946924"
|
||||
inkscape:cy="8.0096502"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1009"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z"
|
||||
id="path2"
|
||||
style="fill:#ffffff;fill-opacity:1" />
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 818 B After Width: | Height: | Size: 1.7 KiB |
|
@ -1 +1,4 @@
|
|||
<svg fill="none" height="391" viewBox="0 0 391 391" width="391" xmlns="http://www.w3.org/2000/svg"><path d="m52 102h296v199h-296z" fill="#fff"/><path d="m174 1.09995c-79.2999 8.9-145.5999 65.29995-166.59995 141.70005-15.2 55.6-5.8 114 26.10005 161.7 61.7 92.3 189.4999 114.2 278.7999 47.8 74.8-55.8 99.8-156.6 59.7-241-9.7-20.3001-20.4-35.6001-36.4-52.2001-27.2-27.9-61.3-46.7-99.6-54.99995-18.3-3.900005-43.3-5.1-62-3zm117.8 102.90005c25.2 7 43.6 24.6 50.2 48 7.8 28.1-.1 55.6-21.5 73.9-11.5 9.8-32.5 17.1-49.6 17.1h-7.6l-.8 7.2c-1.9 19.4-11.4 32.5-27 37-2.9.9-25.2 1.2-80 1.2l-75.9999.1-6-2.8c-9.6-4.5-16.9-12.7-19.7-22.2-.4-1.6-.8-36.6-.8-77.8 0-80.7 0-80.6 5.2-82.7 1.4-.5 48.5999-.9 114.2999-.9 109.5-.1 112.2-.1 119.3 1.9z" fill="#579fbf"/><path d="m264 173v34h8.8c15.5 0 25-5.3 31.2-17.4 3.3-6.6 3.5-7.4 3.5-17.5 0-9.6-.3-11.1-2.8-16.3-3-6.2-8.6-11.6-15.2-14.8-3.3-1.6-6.2-2-14.8-2h-10.7z" fill="#579fbf"/><path d="m177.885 147.41c-7.3 2.4-9.6 3.7-15.3 8.4l-4.7 3.9-4.3-3.5c-14.2-11.6-35-12.9-46.7-2.9-5.8 5-8.1996 10.3-8.7996 19.4-.5 8.1 1.2 15.8 4.9996 23.2 1.1 2.2 5.9 8 10.6 13 14.7 15.3 42.4 40.7 44.4 40.7 1.2 0 12.1-10.1 27.3-25.3 22.9-22.8 25.7-25.9 28.6-32.1 4.1-8.7 5-18.8 2.5-26.4-4.9-14.6-23.4-23.4-38.6-18.4z" fill="#ff5f5f"/></svg>
|
||||
<svg width="38" height="38" viewBox="0 0 600 400" xmlns="http://www.w3.org/2000/svg">
|
||||
<path style="fill:#fff;fill-opacity:1;fill-rule:nonzero;stroke:#000;stroke-width:13;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" d="M464.7 222.884c-21.905 2.737-39.702.683-39.702.683V89.44h41.754s46.548 13 46.548 62.273c0 45.165-23.272 62.959-48.6 71.171m115.382-94.16C561.821 32.277 465.385 20.292 465.385 20.292H33.42c-14.266 0-16.021 18.833-16.021 18.833s-1.924 172.892-.529 279.07c3.87 57.21 61.058 63.076 61.058 63.076s195.155-.57 282.462-1.14c57.558-10.083 63.339-60.573 62.769-88.188 102.713 5.707 175.182-66.771 156.923-163.219"/>
|
||||
<path style="fill:#ff5f5f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00346" d="M216.99 306.032c4.46 2.246 7.31-.544 7.31-.544s65.27-59.573 94.674-93.882c26.154-30.691 27.858-82.413-17.056-101.739-44.913-19.324-81.866 22.736-81.866 22.736-32.046-35.245-80.546-33.46-102.979-9.608-22.431 23.852-14.598 64.791 2.137 87.576 15.709 21.388 84.757 82.93 95.222 93.338 0 0 .763.798 2.557 2.123"/>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.1 KiB |
|
@ -1 +1,50 @@
|
|||
<svg height="38" viewBox="0 0 38 38" width="38" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m34.6194245 8.17880011c2.1314244 3.07072649 3.3805755 6.80008579 3.3805755 10.82119989s-1.2491511 7.7504734-3.3805755 10.8211999l-4.9217466-4.9217466c.9664963-1.748848 1.5166078-3.7599079 1.5166078-5.8994533s-.5501115-4.1506053-1.5166078-5.8994533zm-4.7982246-4.79822459-4.9217466 4.92174663c-1.748848-.96649637-3.7599079-1.51660786-5.8994533-1.51660786-6.7457637 0-12.21428571 5.46852201-12.21428571 12.21428571s5.46852201 12.2142857 12.21428571 12.2142857c2.1395454 0 4.1506053-.5501115 5.8994533-1.5166078l4.9217466 4.9217466c-3.0707265 2.1314244-6.8000858 3.3805755-10.8211999 3.3805755-10.49341025 0-19-8.5065898-19-19 0-10.49341025 8.50658975-19 19-19 4.0211141 0 7.7504734 1.24915112 10.8211999 3.38057552z" fill="#7fadf2"/><path d="m34.6194245 8.17880011c2.1314244 3.07072649 3.3805755 6.80008579 3.3805755 10.82119989s-1.2491511 7.7504734-3.3805755 10.8211999l-4.9217466-4.9217466c.9664963-1.748848 1.5166078-3.7599079 1.5166078-5.8994533s-.5501115-4.1506053-1.5166078-5.8994533z" fill="#b8d3f4"/></g></svg>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
height="38"
|
||||
viewBox="0 0 38 38"
|
||||
width="38"
|
||||
version="1.1"
|
||||
id="svg8"
|
||||
sodipodi:docname="open_collective.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs12" />
|
||||
<sodipodi:namedview
|
||||
id="namedview10"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="21.815789"
|
||||
inkscape:cx="11.665862"
|
||||
inkscape:cy="18.977081"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1009"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g6" />
|
||||
<g
|
||||
fill="none"
|
||||
fill-rule="evenodd"
|
||||
id="g6">
|
||||
<path
|
||||
d="m34.6194245 8.17880011c2.1314244 3.07072649 3.3805755 6.80008579 3.3805755 10.82119989s-1.2491511 7.7504734-3.3805755 10.8211999l-4.9217466-4.9217466c.9664963-1.748848 1.5166078-3.7599079 1.5166078-5.8994533s-.5501115-4.1506053-1.5166078-5.8994533zm-4.7982246-4.79822459-4.9217466 4.92174663c-1.748848-.96649637-3.7599079-1.51660786-5.8994533-1.51660786-6.7457637 0-12.21428571 5.46852201-12.21428571 12.21428571s5.46852201 12.2142857 12.21428571 12.2142857c2.1395454 0 4.1506053-.5501115 5.8994533-1.5166078l4.9217466 4.9217466c-3.0707265 2.1314244-6.8000858 3.3805755-10.8211999 3.3805755-10.49341025 0-19-8.5065898-19-19 0-10.49341025 8.50658975-19 19-19 4.0211141 0 7.7504734 1.24915112 10.8211999 3.38057552z"
|
||||
fill="#7fadf2"
|
||||
id="path2"
|
||||
style="fill:#ffffff;fill-opacity:1" />
|
||||
<path
|
||||
d="m34.6194245 8.17880011c2.1314244 3.07072649 3.3805755 6.80008579 3.3805755 10.82119989s-1.2491511 7.7504734-3.3805755 10.8211999l-4.9217466-4.9217466c.9664963-1.748848 1.5166078-3.7599079 1.5166078-5.8994533s-.5501115-4.1506053-1.5166078-5.8994533z"
|
||||
fill="#b8d3f4"
|
||||
id="path4"
|
||||
style="fill:#ffffff;fill-opacity:1" />
|
||||
</g>
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 2.2 KiB |
4
src/renderer/assets/search-alt.svg
Normal file
|
@ -0,0 +1,4 @@
|
|||
<svg viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg" fill="currentColor">
|
||||
<path d="M505 442.7 405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"/>
|
||||
<path d="M236.475 116.292c-30.447 13.753-37.74 53.708-14.117 77.332 23.624 23.624 63.579 16.33 77.332-14.117 29.331 95.273-88.453 166.118-158.893 95.678s.406-188.224 95.678-158.893z" style="stroke-width:23.8909"/>
|
||||
</svg>
|
After Width: | Height: | Size: 666 B |
1
src/renderer/assets/settings.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-settings"><circle cx="12" cy="12" r="3"></circle><path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path></svg>
|
After Width: | Height: | Size: 1,011 B |
7
src/renderer/assets/spatialization.svg
Normal file
|
@ -0,0 +1,7 @@
|
|||
<svg fill="#fff" viewBox="0 0 20 20" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M10 12.5c-5.92 0-9 3.5-9 5.5v1h18v-1c0-2-3.08-5.5-9-5.5z"/>
|
||||
<circle cx="10" cy="6" r="5"/>
|
||||
<g style="fill:#fff">
|
||||
<path d="M47.788 25.736a19.5 19.5 0 0 1 0 21.4m7.1-28.5a30 30 0 0 1 0 35.6m6.5-42.1a38.8 38.8 0 0 1 0 48.6m105.752-35a19.5 19.5 0 0 0 0 21.4m-7.1-28.5a30 30 0 0 0 0 35.6m-6.5-42.1a38.8 38.8 0 0 0 0 48.6" style="fill:none;stroke:#fff;stroke-width:5;stroke-linecap:round" transform="translate(-7.276 -.048) scale(.16067)"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 562 B |
|
@ -1,49 +1,41 @@
|
|||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 112.197 112.197" style="enable-background:new 0 0 112.197 112.197;" xml:space="preserve">
|
||||
<g>
|
||||
<circle style="fill:#55ACEE;" cx="56.099" cy="56.098" r="56.098"/>
|
||||
<g>
|
||||
<path style="fill:#F1F2F2;" d="M90.461,40.316c-2.404,1.066-4.99,1.787-7.702,2.109c2.769-1.659,4.894-4.284,5.897-7.417
|
||||
c-2.591,1.537-5.462,2.652-8.515,3.253c-2.446-2.605-5.931-4.233-9.79-4.233c-7.404,0-13.409,6.005-13.409,13.409
|
||||
c0,1.051,0.119,2.074,0.349,3.056c-11.144-0.559-21.025-5.897-27.639-14.012c-1.154,1.98-1.816,4.285-1.816,6.742
|
||||
c0,4.651,2.369,8.757,5.965,11.161c-2.197-0.069-4.266-0.672-6.073-1.679c-0.001,0.057-0.001,0.114-0.001,0.17
|
||||
c0,6.497,4.624,11.916,10.757,13.147c-1.124,0.308-2.311,0.471-3.532,0.471c-0.866,0-1.705-0.083-2.523-0.239
|
||||
c1.706,5.326,6.657,9.203,12.526,9.312c-4.59,3.597-10.371,5.74-16.655,5.74c-1.08,0-2.15-0.063-3.197-0.188
|
||||
c5.931,3.806,12.981,6.025,20.553,6.025c24.664,0,38.152-20.432,38.152-38.153c0-0.581-0.013-1.16-0.039-1.734
|
||||
C86.391,45.366,88.664,43.005,90.461,40.316L90.461,40.316z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
fill="currentColor"
|
||||
class="bi bi-twitter"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="twitter.svg"
|
||||
inkscape:version="1.2 (dc2aedaf03, 2022-05-15)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
id="namedview6"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="51.8125"
|
||||
inkscape:cx="7.5946924"
|
||||
inkscape:cy="8.0096502"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1009"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="M5.026 15c6.038 0 9.341-5.003 9.341-9.334 0-.14 0-.282-.006-.422A6.685 6.685 0 0 0 16 3.542a6.658 6.658 0 0 1-1.889.518 3.301 3.301 0 0 0 1.447-1.817 6.533 6.533 0 0 1-2.087.793A3.286 3.286 0 0 0 7.875 6.03a9.325 9.325 0 0 1-6.767-3.429 3.289 3.289 0 0 0 1.018 4.382A3.323 3.323 0 0 1 .64 6.575v.045a3.288 3.288 0 0 0 2.632 3.218 3.203 3.203 0 0 1-.865.115 3.23 3.23 0 0 1-.614-.057 3.283 3.283 0 0 0 3.067 2.277A6.588 6.588 0 0 1 .78 13.58a6.32 6.32 0 0 1-.78-.045A9.344 9.344 0 0 0 5.026 15z"
|
||||
id="path2"
|
||||
style="fill:#ffffff;fill-opacity:1" />
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.6 KiB |
|
@ -11,6 +11,7 @@ const CiderAudio = {
|
|||
intelliGainComp: null,
|
||||
atmosphereRealizer2: null,
|
||||
atmosphereRealizer1: null,
|
||||
opportunisticCorrection: null
|
||||
},
|
||||
ccON: false,
|
||||
mediaRecorder: null,
|
||||
|
@ -23,7 +24,7 @@ const CiderAudio = {
|
|||
CiderAudio.connectContext(document.getElementById("apple-music-player"), 0);
|
||||
|
||||
cb();
|
||||
clearInterval(searchInt);
|
||||
clearInterval(searchInt);
|
||||
}
|
||||
}, 1000);
|
||||
},
|
||||
|
@ -40,6 +41,7 @@ const CiderAudio = {
|
|||
intelliGainComp: null,
|
||||
atmosphereRealizer2: null,
|
||||
atmosphereRealizer1: null,
|
||||
opportunisticCorrection: null,
|
||||
}
|
||||
} catch (e) { }
|
||||
CiderAudio.source.connect(CiderAudio.context.destination);
|
||||
|
@ -47,7 +49,8 @@ const CiderAudio = {
|
|||
},
|
||||
connectContext: function (mediaElem) {
|
||||
if (!CiderAudio.context) {
|
||||
CiderAudio.context = new window.AudioContext({ sampleRate: 96000 }); // Don't ever remove the sample rate arg. Ask Maikiwi.
|
||||
CiderAudio.context = new window.AudioContext({ sampleRate: 96000, latencyHint: "playback"}); // Don't ever remove the sample rate arg. Ask Maikiwi.
|
||||
app.lyricOffset = CiderAudio.context.baseLatency + CiderAudio.context.outputLatency
|
||||
}
|
||||
if (!CiderAudio.source) {
|
||||
CiderAudio.source = CiderAudio.context.createMediaElementSource(mediaElem);
|
||||
|
@ -80,6 +83,7 @@ const CiderAudio = {
|
|||
}
|
||||
|
||||
} catch (e) {
|
||||
console.debug("[Cider][MaikiwiSoundCheck] normalizer func err: " + e)
|
||||
}
|
||||
},
|
||||
normalizerOff: function () {
|
||||
|
@ -225,6 +229,14 @@ const CiderAudio = {
|
|||
"description": "8500",
|
||||
}
|
||||
],
|
||||
opportunisticCorrectionProfiles: [
|
||||
{
|
||||
"id": "CHU",
|
||||
"file": './cideraudio/impulses/MoondropCHU_Cider.wav',
|
||||
"name": "Moondrop CHU Specific",
|
||||
"description": "",
|
||||
}
|
||||
],
|
||||
spatial_ninf: function () {
|
||||
CiderAudio.audioNodes.spatialNode = null;
|
||||
CiderAudio.audioNodes.spatialNode = CiderAudio.context.createConvolver();
|
||||
|
@ -385,7 +397,7 @@ const CiderAudio = {
|
|||
if (this._isBufferFull()) {
|
||||
this._flush();
|
||||
}
|
||||
let dataLength = audioRawData[0].length;
|
||||
let dataLength = audioRawData[0]?.length ?? 0;
|
||||
for (let idx=0; idx<dataLength; idx++) {
|
||||
for (let channel=0; channel < numberOfChannels; channel++) {
|
||||
let value = audioRawData[channel][idx];
|
||||
|
@ -466,7 +478,7 @@ const CiderAudio = {
|
|||
}
|
||||
}
|
||||
CiderAudio.audioNodes.recorderNode.parameters.get('isRecording').setValueAtTime(1, CiderAudio.context.currentTime);
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.recorderNode);
|
||||
CiderAudio.audioNodes.intelliGainComp.connect(CiderAudio.audioNodes.recorderNode);
|
||||
|
||||
});
|
||||
clearInterval(searchInt);
|
||||
|
@ -488,7 +500,7 @@ const CiderAudio = {
|
|||
// CiderAudio.ccON = false;
|
||||
}
|
||||
},
|
||||
atmosphereRealizer2_n5: function (status, destination) {
|
||||
atmosphereRealizer2_n6: function (status, destination) {
|
||||
if (status === true) {
|
||||
CiderAudio.audioNodes.atmosphereRealizer2 = CiderAudio.context.createConvolver();
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.normalize = false;
|
||||
|
@ -506,40 +518,46 @@ const CiderAudio = {
|
|||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] atmosphereRealizer2_n5 -> Spatial");} catch (e) { }
|
||||
try { CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] atmosphereRealizer2_n6 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
case "n5":
|
||||
case "n6":
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n5 -> atmosphereRealizer2");
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n6 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n5':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n6 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n5 -> atmosphereRealizer1");
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n6 -> vibrantbassNode");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n5 -> vibrantbassNode");
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n6 -> audioBands");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n5 -> audioBands");
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.opportunisticCorrection);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n6 -> opportunisticCorrection");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n5 -> llpw");
|
||||
console.debug("[Cider][Audio] atmosphereRealizer2_n6 -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.context.destination); console.debug("[Cider][Audio] atmosphereRealizer2_n5 -> destination");} catch (e) { }
|
||||
try { CiderAudio.audioNodes.atmosphereRealizer2.connect(CiderAudio.context.destination); console.debug("[Cider][Audio] atmosphereRealizer2_n6 -> destination");} catch (e) { }
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -547,7 +565,7 @@ const CiderAudio = {
|
|||
|
||||
}
|
||||
},
|
||||
atmosphereRealizer1_n4: function (status, destination) {
|
||||
atmosphereRealizer1_n5: function (status, destination) {
|
||||
if (status === true) {
|
||||
CiderAudio.audioNodes.atmosphereRealizer1 = CiderAudio.context.createConvolver();
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.normalize = false;
|
||||
|
@ -565,40 +583,46 @@ const CiderAudio = {
|
|||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] atmosphereRealizer1_n4 -> Spatial");} catch (e) { }
|
||||
try { CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] atmosphereRealizer1_n5 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
case "n5":
|
||||
case "n6":
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n4 -> atmosphereRealizer2");
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n5 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n5':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n5 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n4 -> atmosphereRealizer1");
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n5 -> vibrantbassNode");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n4 -> vibrantbassNode");
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n5 -> audioBands");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n4 -> audioBands");
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.opportunisticCorrection);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n5 -> opportunisticCorrection");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n4 -> llpw");
|
||||
console.debug("[Cider][Audio] atmosphereRealizer1_n5 -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.context.destination); console.debug("[Cider][Audio] atmosphereRealizer1_n4 -> destination");} catch (e) { }
|
||||
try { CiderAudio.audioNodes.atmosphereRealizer1.connect(CiderAudio.context.destination); console.debug("[Cider][Audio] atmosphereRealizer1_n5 -> destination");} catch (e) { }
|
||||
break;
|
||||
|
||||
}
|
||||
|
@ -606,6 +630,64 @@ const CiderAudio = {
|
|||
|
||||
}
|
||||
},
|
||||
opportunisticCorrection_n2: function (status, destination) {
|
||||
if (status === true) {
|
||||
CiderAudio.audioNodes.opportunisticCorrection = CiderAudio.context.createConvolver();
|
||||
CiderAudio.audioNodes.opportunisticCorrection.normalize = false;
|
||||
let opportunisticCorrectionProfile = CiderAudio.opportunisticCorrectionProfiles.find(function (profile) {
|
||||
return profile.id === app.cfg.audio.maikiwiAudio.opportunisticCorrection_state;
|
||||
});
|
||||
|
||||
if (opportunisticCorrectionProfile === undefined) {
|
||||
opportunisticCorrectionProfile = CiderAudio.opportunisticCorrectionProfiles[0];
|
||||
}
|
||||
fetch(opportunisticCorrectionProfile.file).then(async (impulseData) => {
|
||||
let bufferedImpulse = await impulseData.arrayBuffer();
|
||||
CiderAudio.audioNodes.opportunisticCorrection.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.opportunisticCorrection.connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] opportunisticCorrection_n2 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
case "n6":
|
||||
try {
|
||||
CiderAudio.audioNodes.opportunisticCorrection.connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] opportunisticCorrection_n2 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n5':
|
||||
try {
|
||||
CiderAudio.audioNodes.opportunisticCorrection.connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] opportunisticCorrection_n2 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try { CiderAudio.audioNodes.opportunisticCorrection.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] opportunisticCorrection_n2 -> vibrantbassNode");} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try { CiderAudio.audioNodes.opportunisticCorrection.connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] opportunisticCorrection_n2 -> audioBands");} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try {
|
||||
CiderAudio.audioNodes.opportunisticCorrection.connect(CiderAudio.audioNodes.opportunisticCorrection);
|
||||
console.debug("[Cider][Audio] opportunisticCorrection_n2 -> opportunisticCorrection");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.opportunisticCorrection.connect(CiderAudio.audioNodes.opportunisticCorrection[0]);
|
||||
console.debug("[Cider][Audio] opportunisticCorrection_n2 -> opportunisticCorrection");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.opportunisticCorrection.connect(CiderAudio.context.destination); console.debug("[Cider][Audio] opportunisticCorrection_n2 -> destination");} catch (e) { }
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
llpw_n1: function (status, destination) {
|
||||
if (status === true) {
|
||||
let c_LLPW_Q = [1.250, 0.131, 10, 2.5, 2.293, 0.110, 14.14, 1.552, 28.28, 7.071, 2.847, 5, 0.625, 7.071, 3.856, 3.856, 20, 28.28, 20, 14.14, 2.102, 6.698, 3.536, 10];
|
||||
|
@ -619,89 +701,48 @@ const CiderAudio = {
|
|||
switch (app.cfg.audio.maikiwiAudio.ciderPPE_value) {
|
||||
case "MAIKIWI":
|
||||
|
||||
try {
|
||||
switch (localStorage.getItem("playingBitrate")) {
|
||||
case "64":
|
||||
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver();
|
||||
CiderAudio.audioNodes.llpw[0].normalize = false;
|
||||
fetch('./cideraudio/impulses/CAP_64.wav').then(async (impulseData) => {
|
||||
let bufferedImpulse = await impulseData.arrayBuffer();
|
||||
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
console.debug("[Cider][Audio] CAP Adaptive - 64kbps");
|
||||
|
||||
break;
|
||||
case "256":
|
||||
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false;
|
||||
CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37; // Post Gain Compensation
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]);
|
||||
fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => {
|
||||
let bufferedImpulse = await impulseData.arrayBuffer();
|
||||
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
console.debug("[Cider][Audio] CAP Adaptive - 256kbps_2_48k");
|
||||
|
||||
break;
|
||||
default:
|
||||
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false;
|
||||
CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37; // Post Gain Compensation
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]);
|
||||
fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => {
|
||||
let bufferedImpulse = await impulseData.arrayBuffer();
|
||||
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
console.debug("[Cider][Audio] CAP Adaptive - CONFIG FALLBACK - 256kbps_2_48k");
|
||||
try {
|
||||
switch (localStorage.getItem("playingBitrate")) {
|
||||
case "64":
|
||||
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver();
|
||||
CiderAudio.audioNodes.llpw[0].normalize = false;
|
||||
fetch('./cideraudio/impulses/CAP_64.wav').then(async (impulseData) => {
|
||||
let bufferedImpulse = await impulseData.arrayBuffer();
|
||||
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
console.debug("[Cider][Audio] CAP Adaptive - 64kbps");
|
||||
|
||||
break;
|
||||
case "256":
|
||||
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false;
|
||||
CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37; // Post Gain Compensation
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]);
|
||||
fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => {
|
||||
let bufferedImpulse = await impulseData.arrayBuffer();
|
||||
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
console.debug("[Cider][Audio] CAP Adaptive - 256kbps");
|
||||
|
||||
break;
|
||||
default:
|
||||
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[0].gain.value = 1
|
||||
console.debug("[Cider][Audio] CAP Disabled (Passthrough) : Non-Lossy Bitrate.");
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false;
|
||||
CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37;
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]);
|
||||
fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => {
|
||||
let bufferedImpulse = await impulseData.arrayBuffer();
|
||||
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
console.debug("[Cider][Audio] CAP Adaptive - (Error Fallback) 256kbps");
|
||||
}
|
||||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
case "n5":
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
|
||||
case 'n3':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
} catch (e) {
|
||||
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.llpw[0].normalize = false;
|
||||
CiderAudio.audioNodes.llpw[1] = CiderAudio.context.createGain(); CiderAudio.audioNodes.llpw[1].gain.value = 2.37;
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[1]);
|
||||
fetch('./cideraudio/impulses/CAP_256_FINAL_48k.wav').then(async (impulseData) => {
|
||||
let bufferedImpulse = await impulseData.arrayBuffer();
|
||||
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
console.debug("[Cider][Audio] CAP Adaptive - (Error Fallback) 256kbps");
|
||||
}
|
||||
|
||||
break;
|
||||
case "MAIKIWI_LEGACY":
|
||||
CiderAudio.audioNodes.llpw[0] = CiderAudio.context.createConvolver();
|
||||
CiderAudio.audioNodes.llpw[0].normalize = false;
|
||||
|
@ -709,41 +750,6 @@ const CiderAudio = {
|
|||
let bufferedImpulse = await impulseData.arrayBuffer();
|
||||
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
case "n5":
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
|
||||
break;
|
||||
}
|
||||
|
||||
console.debug("[Cider][Audio] CAP - Maikiwi Signature Mode");
|
||||
break;
|
||||
case "NATURAL":
|
||||
|
@ -754,41 +760,6 @@ const CiderAudio = {
|
|||
CiderAudio.audioNodes.llpw[0].buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse);
|
||||
});
|
||||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
case "n5":
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.llpw[0].connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
console.debug("[Cider][Audio] CAP - Natural Mode");
|
||||
break;
|
||||
|
||||
|
@ -803,41 +774,7 @@ const CiderAudio = {
|
|||
for (let i = 1; i < LLPW_FREQUENCIES.length; i ++) {
|
||||
CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]);
|
||||
}
|
||||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
case "n5":
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
|
||||
break;
|
||||
}
|
||||
console.debug("[Cider][Audio] CAP - Legacy Mode");
|
||||
console.debug("[Cider][Audio] CAP - Legacy Mode");
|
||||
|
||||
break;
|
||||
|
||||
|
@ -851,46 +788,53 @@ const CiderAudio = {
|
|||
});
|
||||
app.cfg.audio.maikiwiAudio.ciderPPE_value = "MAIKIWI";
|
||||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
case "n5":
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try { CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try { CiderAudio.audioNodes.llpw[1].connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
|
||||
break;
|
||||
}
|
||||
console.debug("[Cider][Audio] CAP - Maikiwi Adaptive Mode (Defaulted from broki config)");
|
||||
break;
|
||||
}
|
||||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] llpw_n1 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
case "n6":
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n5':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> vibrantbassNode");} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.audioBands[0]); console.debug("[Cider][Audio] llpw_n1 -> audioBands");} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.opportunisticCorrection);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> opportunisticCorrection");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] llpw_n1 -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.llpw.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] llpw_n1 -> destination");} catch (e) { }
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
vibrantbass_n3: function (status, destination) {
|
||||
vibrantbass_n4: function (status, destination) {
|
||||
if (status === true) {
|
||||
let VIBRANTBASSBANDS = app.cfg.audio.maikiwiAudio.vibrantBass.frequencies;
|
||||
let VIBRANTBASSGAIN = app.cfg.audio.maikiwiAudio.vibrantBass.gain;
|
||||
|
@ -911,41 +855,47 @@ const CiderAudio = {
|
|||
|
||||
switch (destination) {
|
||||
case "spatial":
|
||||
try { CiderAudio.audioNodes.vibrantbassNode[0].connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] vibrantbass_n3 -> Spatial");} catch (e) { }
|
||||
try { CiderAudio.audioNodes.vibrantbassNode.at(-1).connect(CiderAudio.audioNodes.spatialNode); console.debug("[Cider][Audio] vibrantbass_n4 -> Spatial");} catch (e) { }
|
||||
break;
|
||||
|
||||
case "n5":
|
||||
case "n6":
|
||||
try {
|
||||
CiderAudio.audioNodes.vibrantbassNode[0].connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] vibrantbass_n3 -> atmosphereRealizer2");
|
||||
CiderAudio.audioNodes.vibrantbassNode.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] vibrantbass_n4 -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n5':
|
||||
try {
|
||||
CiderAudio.audioNodes.vibrantbassNode.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] vibrantbass_n4 -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try {
|
||||
CiderAudio.audioNodes.vibrantbassNode[0].connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] vibrantbass_n3 -> atmosphereRealizer1");
|
||||
CiderAudio.audioNodes.vibrantbassNode.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] vibrantbass_n4 -> vibrantbassNode");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try {
|
||||
CiderAudio.audioNodes.vibrantbassNode[0].connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] vibrantbass_n3 -> vibrantbassNode");
|
||||
CiderAudio.audioNodes.vibrantbassNode.at(-1).connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
console.debug("[Cider][Audio] vibrantbass_n4 -> audioBands");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try {
|
||||
CiderAudio.audioNodes.vibrantbassNode[0].connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
console.debug("[Cider][Audio] vibrantbass_n3 -> audioBands");
|
||||
CiderAudio.audioNodes.vibrantbassNode.at(-1).connect(CiderAudio.audioNodes.opportunisticCorrection);
|
||||
console.debug("[Cider][Audio] vibrantbass_n4 -> opportunisticCorrection");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.vibrantbassNode[0].connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] vibrantbass_n3 -> llpw");
|
||||
CiderAudio.audioNodes.vibrantbassNode.at(-1).connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] vibrantbass_n4 -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.vibrantbassNode[0].connect(CiderAudio.context.destination); console.debug("[Cider][Audio] vibrantbass_n3 -> destination");} catch (e) { }
|
||||
try { CiderAudio.audioNodes.vibrantbassNode.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] vibrantbass_n4 -> destination");} catch (e) { }
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -958,15 +908,17 @@ const CiderAudio = {
|
|||
try { for (var i of CiderAudio.audioNodes.llpw) { i.disconnect(); } CiderAudio.audioNodes.llpw = null } catch (e) { }
|
||||
try { for (var i of CiderAudio.audioNodes.vibrantbassNode) { i.disconnect(); } CiderAudio.audioNodes.vibrantbassNode = null } catch (e) { }
|
||||
try { for (var i of CiderAudio.audioNodes.audioBands) { i.disconnect(); } CiderAudio.audioNodes.vibrantbassNode = null} catch (e) { };
|
||||
try {CiderAudio.audioNodes.opportunisticCorrection.disconnect(); CiderAudio.audioNodes.opportunisticCorrection = null } catch (e) { };
|
||||
console.debug("[Cider][Audio] Finished hierarchical unloading")
|
||||
},
|
||||
hierarchical_loading: async function () {
|
||||
const configMap = new Map([
|
||||
['spatial', app.cfg.audio.maikiwiAudio.spatial === true],
|
||||
['n5', app.cfg.audio.maikiwiAudio.atmosphereRealizer2 === true],
|
||||
['n4', app.cfg.audio.maikiwiAudio.atmosphereRealizer1 === true],
|
||||
['n3', app.cfg.audio.equalizer.vibrantBass != 0],
|
||||
['n2', Math.max(...app.cfg.audio.equalizer.gain) != 0],
|
||||
['n6', app.cfg.audio.maikiwiAudio.atmosphereRealizer2 === true],
|
||||
['n5', app.cfg.audio.maikiwiAudio.atmosphereRealizer1 === true],
|
||||
['n4', app.cfg.audio.equalizer.vibrantBass != 0],
|
||||
['n3', Math.max(...app.cfg.audio.equalizer.gain) != 0],
|
||||
['n2', app.cfg.audio.maikiwiAudio.opportunisticCorrection_state !== "OFF"],
|
||||
['n1', app.cfg.audio.maikiwiAudio.ciderPPE === true]
|
||||
]);
|
||||
|
||||
|
@ -979,22 +931,26 @@ const CiderAudio = {
|
|||
CiderAudio.spatial_ninf();
|
||||
lastNode = 'spatial';
|
||||
break;
|
||||
case 'n6':
|
||||
app.cfg.audio.normalization = true;
|
||||
CiderAudio.atmosphereRealizer2_n6(true, lastNode);
|
||||
lastNode = 'n6';
|
||||
break;
|
||||
case 'n5':
|
||||
app.cfg.audio.normalization = true;
|
||||
CiderAudio.atmosphereRealizer2_n5(true, lastNode);
|
||||
CiderAudio.atmosphereRealizer1_n5(true, lastNode);
|
||||
lastNode = 'n5';
|
||||
break;
|
||||
case 'n4':
|
||||
app.cfg.audio.normalization = true;
|
||||
CiderAudio.atmosphereRealizer1_n4(true, lastNode);
|
||||
lastNode = 'n4';
|
||||
break;
|
||||
case 'n3':
|
||||
CiderAudio.vibrantbass_n3(true, lastNode);
|
||||
lastNode = 'n3';
|
||||
case 'n4':
|
||||
CiderAudio.vibrantbass_n4(true, lastNode);
|
||||
lastNode = 'n4';
|
||||
break;
|
||||
case 'n2':
|
||||
case 'n3':
|
||||
CiderAudio.equalizer(true, lastNode);
|
||||
lastNode = 'n3';
|
||||
break;
|
||||
case 'n2':
|
||||
CiderAudio.opportunisticCorrection_n2(true, lastNode);
|
||||
lastNode = 'n2';
|
||||
break;
|
||||
case 'n1':
|
||||
|
@ -1011,22 +967,28 @@ const CiderAudio = {
|
|||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode);
|
||||
console.debug("[Cider][Audio] gainNode -> Spatial");
|
||||
break;
|
||||
case 'n5':
|
||||
case 'n6':
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] gainNode -> atmosphereRealizer2");
|
||||
break;
|
||||
case 'n4':
|
||||
case 'n5':
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] gainNode -> atmosphereRealizer1");
|
||||
break;
|
||||
case 'n3':
|
||||
case 'n4':
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] gainNode -> vibrantbass");
|
||||
break;
|
||||
case 'n2':
|
||||
case 'n3':
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
console.debug("[Cider][Audio] gainNode -> audioBands");
|
||||
|
||||
break;
|
||||
case 'n2':
|
||||
try {
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.opportunisticCorrection);
|
||||
console.debug("[Cider][Audio] gainNode -> opportunisticCorrection");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);
|
||||
|
@ -1045,7 +1007,7 @@ const CiderAudio = {
|
|||
|
||||
},
|
||||
|
||||
equalizer: function (status, destination) { // n2_1
|
||||
equalizer: function (status, destination) { // n3_1
|
||||
if (status === true) {
|
||||
let BANDS = app.cfg.audio.equalizer.frequencies;
|
||||
let GAIN = app.cfg.audio.equalizer.gain;
|
||||
|
@ -1066,41 +1028,47 @@ const CiderAudio = {
|
|||
|
||||
switch (destination) {
|
||||
case 'spatial':
|
||||
CiderAudio.audioNodes.audioBands[BANDS.length - 1].connect(CiderAudio.audioNodes.spatialNode);
|
||||
CiderAudio.audioNodes.audioBands.at(-1).connect(CiderAudio.audioNodes.spatialNode);
|
||||
console.debug("[Cider][Audio] Equalizer -> Spatial");
|
||||
break;
|
||||
case "n5":
|
||||
case "n6":
|
||||
try {
|
||||
CiderAudio.audioNodes.audioBands[BANDS.length - 1].connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
CiderAudio.audioNodes.audioBands.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer2);
|
||||
console.debug("[Cider][Audio] Equalizer -> atmosphereRealizer2");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n5':
|
||||
try {
|
||||
CiderAudio.audioNodes.audioBands.at(-1).connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] Equalizer -> atmosphereRealizer1");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n4':
|
||||
try {
|
||||
CiderAudio.audioNodes.audioBands[BANDS.length - 1].connect(CiderAudio.audioNodes.atmosphereRealizer1);
|
||||
console.debug("[Cider][Audio] Equalizer -> atmosphereRealizer1");
|
||||
CiderAudio.audioNodes.audioBands.at(-1).connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] Equalizer -> vibrantbassNode");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n3':
|
||||
try {
|
||||
CiderAudio.audioNodes.audioBands[BANDS.length - 1].connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
console.debug("[Cider][Audio] Equalizer -> vibrantbassNode");
|
||||
CiderAudio.audioNodes.audioBands.at(-1).connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
console.debug("[Cider][Audio] Equalizer -> audioBands");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n2':
|
||||
try {
|
||||
CiderAudio.audioNodes.audioBands[BANDS.length - 1].connect(CiderAudio.audioNodes.audioBands[0]);
|
||||
console.debug("[Cider][Audio] Equalizer -> audioBands");
|
||||
CiderAudio.audioNodes.audioBands.at(-1).connect(CiderAudio.audioNodes.opportunisticCorrection);
|
||||
console.debug("[Cider][Audio] Equalizer -> opportunisticCorrection");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n1':
|
||||
try {
|
||||
CiderAudio.audioNodes.audioBands[BANDS.length - 1].connect(CiderAudio.audioNodes.llpw[0]);
|
||||
CiderAudio.audioNodes.audioBands.at(-1).connect(CiderAudio.audioNodes.llpw[0]);
|
||||
console.debug("[Cider][Audio] Equalizer -> llpw");
|
||||
} catch (e) { }
|
||||
break;
|
||||
case 'n0':
|
||||
try { CiderAudio.audioNodes.audioBands[BANDS.length - 1].connect(CiderAudio.context.destination); console.debug("[Cider][Audio] Equalizer -> destination");} catch (e) { }
|
||||
try { CiderAudio.audioNodes.audioBands.at(-1).connect(CiderAudio.context.destination); console.debug("[Cider][Audio] Equalizer -> destination");} catch (e) { }
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
BIN
src/renderer/audio/impulses/MoondropCHU_Cider.wav
Normal file
|
@ -1,5 +1,9 @@
|
|||
var notyf = new Notyf();
|
||||
|
||||
function clamp(num, min, max) {
|
||||
return Math.min(Math.max(num, min), max);
|
||||
}
|
||||
|
||||
const MusicKitObjects = {
|
||||
LibraryPlaylist: function () {
|
||||
this.id = "";
|
||||
|
@ -52,75 +56,15 @@ Vue.component("animated-number", {
|
|||
},
|
||||
});
|
||||
|
||||
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: {},
|
||||
});
|
||||
|
||||
function fallbackinitMusicKit() {
|
||||
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);
|
||||
}
|
||||
|
||||
request.addEventListener("load", loadAlternateKey);
|
||||
request.open(
|
||||
"GET",
|
||||
"https://raw.githubusercontent.com/lujjjh/LitoMusic/main/token.json"
|
||||
);
|
||||
request.send();
|
||||
}
|
||||
|
||||
function initMusicKit() {
|
||||
|
||||
if(!this.responseText) {
|
||||
console.log("Using stored token")
|
||||
this.responseText = JSON.stringify({
|
||||
token: localStorage.getItem("lastToken")
|
||||
})
|
||||
}
|
||||
let parsedJson = JSON.parse(this.responseText);
|
||||
localStorage.setItem("lastToken", parsedJson.token);
|
||||
MusicKit.configure({
|
||||
developerToken: parsedJson.token,
|
||||
app: {
|
||||
|
@ -150,8 +94,12 @@ function capiInit() {
|
|||
request.timeout = 5000;
|
||||
request.addEventListener("load", initMusicKit);
|
||||
request.onreadystatechange = function (aEvt) {
|
||||
if (request.readyState == 4) {
|
||||
if (request.status != 200) fallbackinitMusicKit();
|
||||
if (request.readyState == 4 && request.status != 200) {
|
||||
if(localStorage.getItem("lastToken") != null) {
|
||||
initMusicKit()
|
||||
} else {
|
||||
console.error(`Failed to load capi, cannot get token [${request.status}]`)
|
||||
}
|
||||
}
|
||||
};
|
||||
request.open("GET", "https://api.cider.sh/v1/");
|
||||
|
|
|
@ -239,6 +239,14 @@ input[type=range].md-slider::-webkit-slider-runnable-track {
|
|||
width: auto;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1133px) and (max-width: 1233px) {
|
||||
.about-page {
|
||||
.row .col-auto {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.col-1 {
|
||||
flex: 0 0 auto;
|
||||
width: 8.33333333%;
|
||||
|
|
13
src/renderer/less/bootstrap.less
vendored
|
@ -2432,10 +2432,9 @@ fieldset:disabled .btn {
|
|||
.nav-pills .nav-link {
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
border-radius: 50px;
|
||||
border-radius: 6px;
|
||||
color: #eee;
|
||||
-webkit-user-drag: none;
|
||||
// transition: transform .35s var(--appleEase), background-color .35s var(--appleEase);
|
||||
font-weight: 500;
|
||||
margin: 0px 4px;
|
||||
&:hover {
|
||||
|
@ -2447,7 +2446,7 @@ fieldset:disabled .btn {
|
|||
.nav-pills .show > .nav-link {
|
||||
color: #fff;
|
||||
background-color: var(--selected);
|
||||
outline:2px solid var(--keyColor);
|
||||
// outline:2px solid var(--keyColor);
|
||||
}
|
||||
|
||||
.nav-fill > .nav-link,
|
||||
|
@ -2643,6 +2642,14 @@ fieldset:disabled .btn {
|
|||
width: auto;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 1133px) and (max-width: 1233px) {
|
||||
.about-page {
|
||||
.row .col-auto {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.col-1 {
|
||||
flex : 0 0 auto;
|
||||
width: 8.33333333%;
|
||||
|
|
|
@ -35,6 +35,11 @@
|
|||
margin : 0px;
|
||||
height : 100%;
|
||||
position : relative;
|
||||
white-space: nowrap;
|
||||
|
||||
._svg-icon {
|
||||
flex: 0 0 auto;
|
||||
}
|
||||
|
||||
&:before {
|
||||
--dist : 1px;
|
||||
|
@ -338,7 +343,9 @@
|
|||
|
||||
#app.twopanel .app-chrome:not(.chrome-bottom) .app-chrome--center .top-nav-group .app-sidebar-item {
|
||||
min-width: 110px;
|
||||
font-size: 0em;
|
||||
.sidebar-item-text {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sidebar-icon {
|
||||
margin: 0px;
|
||||
|
@ -353,7 +360,9 @@
|
|||
|
||||
#app.twopanel .app-chrome:not(.chrome-bottom) .app-chrome--center .top-nav-group .app-sidebar-item {
|
||||
min-width: 60px;
|
||||
font-size: 0em;
|
||||
.sidebar-item-text {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sidebar-icon {
|
||||
margin: 0px;
|
||||
|
|
|
@ -162,6 +162,33 @@
|
|||
align-self: center;
|
||||
}
|
||||
|
||||
.page-btn {
|
||||
align-self: center;
|
||||
height: 32px;
|
||||
width:max-content;
|
||||
}
|
||||
|
||||
.page-btn img {
|
||||
height: 100%;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.md-ico-first {
|
||||
content: url('./assets/angles-left.svg');
|
||||
}
|
||||
|
||||
.md-ico-prev {
|
||||
content: url('./assets/chevron-left.svg');
|
||||
}
|
||||
|
||||
.md-ico-next {
|
||||
content: url('./assets/chevron-right.svg');
|
||||
}
|
||||
|
||||
.md-ico-last {
|
||||
content: url('./assets/angles-right.svg');
|
||||
}
|
||||
|
||||
.reload-btn {
|
||||
background: rgb(86 86 86 / 52%);
|
||||
border-radius: 100%;
|
||||
|
@ -398,6 +425,19 @@
|
|||
border-radius: var(--mediaItemRadius);
|
||||
position: relative;
|
||||
|
||||
.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;
|
||||
|
@ -431,6 +471,7 @@
|
|||
.mediaitem-artwork {
|
||||
border-radius: var(--mediaItemRadiusSmall);
|
||||
}
|
||||
|
||||
.overlay-play {
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
opacity: 0;
|
||||
|
@ -944,10 +985,11 @@
|
|||
|
||||
/* mediaitem-square */
|
||||
.cd-mediaitem-square {
|
||||
--transitionDuration: .5s;
|
||||
--scaleRate: 1.25;
|
||||
--scaleRateArtwork: 1;
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
width: calc(160px * var(--windowRelativeScale));
|
||||
height: calc(200px * var(--windowRelativeScale));
|
||||
display: inline-flex;
|
||||
flex: 0 0 auto;
|
||||
flex-direction: column;
|
||||
|
@ -960,8 +1002,8 @@
|
|||
position: relative;
|
||||
|
||||
.artwork {
|
||||
height: 150px;
|
||||
width: 150px;
|
||||
height: calc(140px * var(--windowRelativeScale));
|
||||
width: calc(140px * var(--windowRelativeScale));
|
||||
background: blue;
|
||||
border-radius: var(--mediaItemRadius);
|
||||
background: var(--artwork);
|
||||
|
@ -1042,15 +1084,32 @@
|
|||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1600px) {
|
||||
width: calc(200px * var(--scaleRate));
|
||||
height: calc(200px * var(--scaleRate));
|
||||
// &:not(.mediaitem-card):not(.mediaitem-brick):not(.mediaitem-video):not(.noscale) {
|
||||
// @media (min-width: 1460px) {
|
||||
// --scaleRate: 1.1;
|
||||
// --scaleRateArtwork: 0.9;
|
||||
// width: calc(200px * var(--scaleRate));
|
||||
// height: calc(200px * var(--scaleRate));
|
||||
|
||||
// .artwork-container > .artwork {
|
||||
// width: calc(190px * var(--scaleRateArtwork));
|
||||
// height: calc(190px * var(--scaleRateArtwork));
|
||||
// }
|
||||
// }
|
||||
|
||||
// @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));
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
.artwork-container > .artwork {
|
||||
width: calc(190px * var(--scaleRateArtwork));
|
||||
height: calc(190px * var(--scaleRateArtwork));
|
||||
}
|
||||
}
|
||||
|
||||
.info-rect {
|
||||
width: 90%;
|
||||
|
@ -1099,23 +1158,39 @@
|
|||
}
|
||||
|
||||
&.mediaitem-video {
|
||||
--scaleRate: 1.25;
|
||||
--scaleRateArtwork: 1.25;
|
||||
height: 200px;
|
||||
width: 240px;
|
||||
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
|
||||
|
||||
.artwork {
|
||||
height: 120px;
|
||||
width: 212px;
|
||||
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
|
||||
}
|
||||
|
||||
@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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1123,20 +1198,50 @@
|
|||
&.mediaitem-brick {
|
||||
height: 200px;
|
||||
width: 240px;
|
||||
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
|
||||
|
||||
.artwork {
|
||||
height: 123px;
|
||||
width: 220px;
|
||||
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
|
||||
}
|
||||
|
||||
&: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 {
|
||||
width: 140px;
|
||||
height: 180px;
|
||||
width: calc(140px, var(--windowRelativeScale));
|
||||
height: calc(180px, var(--windowRelativeScale));
|
||||
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
|
||||
|
||||
.artwork {
|
||||
height: 128px;
|
||||
width: 128px;
|
||||
height: calc(128px, var(--windowRelativeScale));
|
||||
width: calc(128px, var(--windowRelativeScale));
|
||||
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1149,6 +1254,7 @@
|
|||
position: relative;
|
||||
border-radius: calc(var(--mediaItemRadius) * 2);
|
||||
box-shadow: var(--mediaItemShadow-ShadowSubtle);
|
||||
transition: width var(--transitionDuration) linear, height var(--transitionDuration) linear;
|
||||
|
||||
.artwork {
|
||||
width: 230px;
|
||||
|
@ -1156,7 +1262,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;
|
||||
|
||||
|
@ -1170,6 +1276,8 @@
|
|||
padding: 10px 10px 14px;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
display: grid;
|
||||
align-content: center;
|
||||
|
||||
&::before {
|
||||
background: var(--bgartwork);
|
||||
|
@ -1184,6 +1292,7 @@
|
|||
z-index: 0;
|
||||
opacity: 1;
|
||||
filter: brightness(0.5) blur(50px) saturate(180%);
|
||||
transition: filter 0.2s ease-in-out;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1198,7 +1307,7 @@
|
|||
|
||||
& + .subtitle {
|
||||
max-height: none !important;
|
||||
margin-top: -0.5em;
|
||||
// margin-top: -0.5em;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1228,14 +1337,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: 1200px) {
|
||||
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: 1400px) {
|
||||
width: calc(230px * 1.25);
|
||||
height: calc(298px * 1.25);
|
||||
.artwork-container > .artwork {
|
||||
width: calc(230px * 1.25);
|
||||
height: calc(230px * 1.25);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1776,7 +1905,7 @@ input[type=checkbox][switch]:checked:active::before {
|
|||
align-items: center;
|
||||
color: white;
|
||||
|
||||
> svg {
|
||||
> ._svg-icon {
|
||||
height: 16px;
|
||||
width: 16px;
|
||||
pointer-events: none;
|
||||
|
@ -1967,6 +2096,7 @@ input[type=checkbox][switch]:checked:active::before {
|
|||
font-size: 12px;
|
||||
cursor: pointer;
|
||||
flex: 0 0 32px;
|
||||
box-shadow: var(--ciderShadow-Generic);
|
||||
|
||||
&:hover {
|
||||
background: var(--selected);
|
||||
|
@ -2071,107 +2201,116 @@ input[type=checkbox][switch]:checked:active::before {
|
|||
}
|
||||
|
||||
// fancy pills
|
||||
.nav-pills {
|
||||
position: relative;
|
||||
|
||||
.nav-link {
|
||||
transition: transform .3s var(--appleEase);
|
||||
.fancy-pills {
|
||||
.nav-pills {
|
||||
position: relative;
|
||||
|
||||
|
||||
&:after {
|
||||
--dist: 1px;
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: var(--dist);
|
||||
bottom: var(--dist);
|
||||
left: var(--dist);
|
||||
right: var(--dist);
|
||||
// width : 100%;
|
||||
// height : 100%;
|
||||
|
||||
.nav-link {
|
||||
transition: transform .3s var(--appleEase);
|
||||
position: relative;
|
||||
background-color: transparent;
|
||||
border: 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);
|
||||
// background: #eee;
|
||||
background: transparent;
|
||||
color: #333;
|
||||
|
||||
&:after {
|
||||
opacity: 1;
|
||||
background-color: #eee;
|
||||
transition: background-color .25s var(--appleEase),
|
||||
border-radius .25s var(--appleEase),
|
||||
color .0s var(--appleEase),
|
||||
opacity 0.0s var(--appleEase);
|
||||
}
|
||||
}
|
||||
|
||||
&.active {
|
||||
outline: none;
|
||||
transform: scale(1.1);
|
||||
// background: #eee;
|
||||
background: transparent;
|
||||
color: #333;
|
||||
font-weight: 600;
|
||||
|
||||
&:after {
|
||||
opacity: 1;
|
||||
background-color: #eee;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.nav-link.active {
|
||||
outline: none;
|
||||
transform: scale(1.0);
|
||||
background: transparent;
|
||||
color: #eee;
|
||||
transform: scale(1.0);
|
||||
|
||||
-webkit-user-drag: none;
|
||||
font-weight: 500;
|
||||
margin: 0px 4px;
|
||||
|
||||
|
||||
&:after {
|
||||
background: rgb(200 200 200 / 15%);
|
||||
opacity: 1;
|
||||
transition: color 0s;
|
||||
// border-radius: 5px;
|
||||
--dist: 4px;
|
||||
--dist: 1px;
|
||||
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;
|
||||
transition: background-color .5s var(--appleEase), opacity 0.25s var(--appleEase), border-radius .32s var(--appleEase);
|
||||
}
|
||||
|
||||
|
||||
|
||||
&:hover {
|
||||
outline: none;
|
||||
transform: scale(1.1);
|
||||
z-index: 1;
|
||||
// background: #eee;
|
||||
background: transparent;
|
||||
color: #333;
|
||||
|
||||
|
||||
&:after {
|
||||
background: #eee;
|
||||
border-radius: inherit;
|
||||
--dist: 1px;
|
||||
opacity: 1;
|
||||
background-color: #eee;
|
||||
transition: background-color .25s var(--appleEase),
|
||||
border-radius .25s var(--appleEase),
|
||||
color .0s var(--appleEase),
|
||||
opacity 0.0s var(--appleEase);
|
||||
}
|
||||
}
|
||||
|
||||
&.active {
|
||||
outline: none;
|
||||
transform: scale(1.1);
|
||||
// background: #eee;
|
||||
background: transparent;
|
||||
color: #333;
|
||||
font-weight: 600;
|
||||
|
||||
&:after {
|
||||
opacity: 1;
|
||||
background-color: #eee;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
&:hover {
|
||||
.nav-link.active {
|
||||
outline: none;
|
||||
transform: scale(1.0);
|
||||
background: transparent;
|
||||
color: #eee;
|
||||
transform: scale(1.0);
|
||||
|
||||
&:after {
|
||||
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;
|
||||
|
||||
&:after {
|
||||
background: #eee;
|
||||
border-radius: inherit;
|
||||
--dist: 1px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:after {
|
||||
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;
|
||||
|
||||
&:after {
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2242,4 +2381,25 @@ input[type=checkbox][switch]:checked:active::before {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.listennow-chip.circle {
|
||||
border-radius: 50%;
|
||||
div {
|
||||
border-radius: 50%;
|
||||
}
|
||||
img {
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.pagination-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
margin-bottom: 16px;
|
||||
.md-input-number{
|
||||
min-width: 12em;
|
||||
}
|
||||
}
|
604
src/renderer/less/fullscreen.less
Normal file
|
@ -0,0 +1,604 @@
|
|||
.fullscreen-view-container {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: black;
|
||||
z-index: 99;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.fullscreen-view {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: black;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
--chromeHeight1: 70px;
|
||||
|
||||
.app-content-container {
|
||||
width:100%;
|
||||
height:100%;
|
||||
#app-content {
|
||||
width:100%;
|
||||
height:100%;
|
||||
|
||||
.fs-search {
|
||||
|
||||
.search-input--icon {
|
||||
width: 4em;
|
||||
background-size: 40%;
|
||||
background-position: center;
|
||||
}
|
||||
input {
|
||||
padding-left: 2em;
|
||||
font-size: 2em;
|
||||
border-radius: var(--mediaItemRadius)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.fs-header {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: var(--chromeHeight1);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
z-index: 9999;
|
||||
|
||||
.top-nav-group {
|
||||
background : #1e1e1e99;
|
||||
border : 1px solid lighten(@baseColor, 8);
|
||||
border-radius: 12px;
|
||||
display : flex;
|
||||
height : 55px;
|
||||
width: 90%;
|
||||
backdrop-filter: var(--glassFilter);
|
||||
|
||||
|
||||
.app-sidebar-item {
|
||||
background-color: #1e1e1e00;
|
||||
border-radius : 10px !important;
|
||||
border : 0px;
|
||||
min-width : 120px;
|
||||
padding : 6px;
|
||||
justify-content : center;
|
||||
align-items : center;
|
||||
margin : 0px;
|
||||
height : 100%;
|
||||
position : relative;
|
||||
font-size: 1.1em;
|
||||
font-weight: 500;
|
||||
|
||||
&:before {
|
||||
--dist : 1px;
|
||||
content : '';
|
||||
position : absolute;
|
||||
top : var(--dist);
|
||||
left : var(--dist);
|
||||
right : var(--dist);
|
||||
bottom : var(--dist);
|
||||
background-color: #fff;
|
||||
opacity : 0;
|
||||
border-radius : 10px;
|
||||
transform : scale(0.5);
|
||||
transition : transform 0.2s ease-in-out, opacity 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
&:after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background-color: transparent;
|
||||
|
||||
&:before {
|
||||
transition: transform 0.1s ease-in-out, opacity 0.1s ease-in-out;
|
||||
opacity : .1;
|
||||
transform : scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
&.active {
|
||||
background-color: transparent;
|
||||
|
||||
&:before {
|
||||
opacity : .2;
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
&.md-btn-primary {
|
||||
box-shadow : 0px 0px 0px 1px lighten(@baseColor, @colorMixRate * 8);
|
||||
background-color: lighten(@baseColor, @colorMixRate * 5);
|
||||
z-index : 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.fs-row {
|
||||
flex-grow: 0.5;
|
||||
}
|
||||
|
||||
.playback-button--small.active {
|
||||
background-color: rgb(200 200 200 / 25%);
|
||||
}
|
||||
|
||||
.playback-button--small {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.right-col {
|
||||
height: 50vh;
|
||||
}
|
||||
|
||||
.bg-artwork-container {
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1121px) {
|
||||
.display--large {
|
||||
display: flex !important;
|
||||
}
|
||||
}
|
||||
|
||||
.display--large {
|
||||
display: flex;
|
||||
|
||||
.slider {
|
||||
width: 100%;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.input-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100%
|
||||
}
|
||||
|
||||
.volume-button--small {
|
||||
border-radius: 6px;
|
||||
color: inherit;
|
||||
background-size: 16px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-color: transparent;
|
||||
height: 15px;
|
||||
width: 30px;
|
||||
border: 0px;
|
||||
box-shadow: unset;
|
||||
opacity: 0.70;
|
||||
background-image: url("./assets/feather/volume-2.svg");
|
||||
}
|
||||
|
||||
.volume-button--small:active {
|
||||
transform: scale(0.9);
|
||||
}
|
||||
|
||||
.volume-button--small.active {
|
||||
background-image: url("./assets/feather/volume.svg");
|
||||
}
|
||||
|
||||
input[type=range] {
|
||||
-webkit-appearance: none;
|
||||
height: 4px;
|
||||
background: rgba(255, 255, 255, 0.4);
|
||||
border-radius: 5px;
|
||||
background-size: 70% 100%;
|
||||
background-repeat: no-repeat;
|
||||
|
||||
&::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
height: 14px;
|
||||
width: 14px;
|
||||
border-radius: 50%;
|
||||
background: rgb(50 50 50);
|
||||
cursor: default;
|
||||
box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
|
||||
transition: all var(--appleTransition);
|
||||
}
|
||||
|
||||
&::-webkit-slider-thumb:hover {
|
||||
background-image: radial-gradient(var(--songProgressColor) 2px, transparent 3px, transparent 10px);
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
&::-webkit-slider-thumb:active {
|
||||
background-image: radial-gradient(var(--songProgressColor) 3px, transparent 4px, transparent 10px);
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
&::-webkit-slider-runnable-track {
|
||||
-webkit-appearance: none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.background {
|
||||
position: absolute;
|
||||
background-size: cover;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
.bgArtworkMaterial {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
.bg-artwork-container {
|
||||
z-index: unset;
|
||||
}
|
||||
|
||||
.bg-artwork-container .bg-artwork {
|
||||
filter: brightness(85%) saturate(95%) blur(180px) contrast(0.9) opacity(0.9);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.lyrics-col {
|
||||
|
||||
height: 62vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
width: 80%;
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
box-shadow: unset;
|
||||
}
|
||||
|
||||
&:hover ::-webkit-scrollbar-thumb {
|
||||
box-shadow: inset 0px 0px 10px 10px rgb(200 200 200 / 50%);
|
||||
}
|
||||
|
||||
.no-lyrics {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.lyric-line {
|
||||
font-size: 35px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.queue-col {
|
||||
|
||||
width: 60vh;
|
||||
height: 62vh;
|
||||
|
||||
.queue-title {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.queue-panel > * {
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
box-shadow: unset;
|
||||
}
|
||||
|
||||
&:hover ::-webkit-scrollbar-thumb {
|
||||
box-shadow: inset 0px 0px 10px 10px rgb(200 200 200 / 50%);
|
||||
}
|
||||
}
|
||||
|
||||
.tab-toggles {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
width: 15vh;
|
||||
height: 5vh;
|
||||
justify-content: space-evenly;
|
||||
|
||||
.volume {
|
||||
background-image: url("./assets/feathers/volume.svg");
|
||||
padding: 0.5vh;
|
||||
width: 2vh;
|
||||
height: 2vh;
|
||||
background-origin: content-box;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.queue {
|
||||
background-image: url("./assets/list.svg");
|
||||
padding: 0.5vh;
|
||||
width: 2.5vh;
|
||||
height: 2.5vh;
|
||||
background-origin: content-box;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.lyrics {
|
||||
background-image: url("./assets/quote-right.svg");
|
||||
padding: 0.5vh;
|
||||
width: 2.5vh;
|
||||
height: 2.5vh;
|
||||
background-origin: content-box;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.active {
|
||||
background-color: rgba(200, 200, 200, 0.7);
|
||||
border-radius: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
.artwork-col {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.artwork {
|
||||
width: 50vh;
|
||||
height: 50vh;
|
||||
}
|
||||
|
||||
.controls-parents {
|
||||
width: 50vh;
|
||||
}
|
||||
|
||||
.app-playback-controls {
|
||||
.song-artist, .song-name {
|
||||
font-weight: 600;
|
||||
text-align: center;
|
||||
font-size: 0.9em;
|
||||
height: 1.2em;
|
||||
line-height: 0.9em;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 360px;
|
||||
|
||||
.song-name-normal {
|
||||
height: inherit;
|
||||
}
|
||||
|
||||
&.song-artist-marquee {
|
||||
> marquee {
|
||||
//margin-bottom: -3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.song-artist {
|
||||
font-size: 0.875em;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.song-name {
|
||||
width: unset !important;
|
||||
margin-top: 0.15vh;
|
||||
display: -webkit-box;
|
||||
line-height: 1.2;
|
||||
text-overflow: ellipsis;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.app-playback-controls .playback-info {
|
||||
margin-top: 0.5vh;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
|
||||
input[type="range"] {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
> div {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.app-playback-controls .song-progress {
|
||||
@bgColor: transparent;
|
||||
//height: 16px;
|
||||
position: absolute;
|
||||
bottom: -1.5vh;
|
||||
left: 0px;
|
||||
background: @bgColor;
|
||||
|
||||
.song-duration p {
|
||||
font-weight: 400;
|
||||
font-size: 10px;
|
||||
height: 1.2em;
|
||||
line-height: 1.3em;
|
||||
overflow: hidden;
|
||||
margin: 0 0 0 0.25em;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
> input[type=range] {
|
||||
&::-webkit-slider-thumb {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
input[type=range] {
|
||||
appearance: none;
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
background-color: rgb(200 200 200 / 10%);
|
||||
border-radius: 2px;
|
||||
|
||||
&::-webkit-slider-thumb {
|
||||
opacity: 0;
|
||||
transform: scale(0.5);
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 100%;
|
||||
background: var(--songProgressColor);
|
||||
cursor: default;
|
||||
transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
|
||||
}
|
||||
|
||||
&::-moz-range-thumb {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 100%;
|
||||
background: var(--songProgressColor);
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.control-buttons {
|
||||
margin-top: 2vh;
|
||||
display: inline-flex;
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.cd-mediaitem-square {
|
||||
font-size: 17px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.cd-mediaitem-square .artwork-container .artwork {
|
||||
box-shadow: var(--mediaItemShadow-Shadow);
|
||||
}
|
||||
|
||||
.cd-mediaitem-list-item {
|
||||
height: 80px;
|
||||
}
|
||||
|
||||
.cd-mediaitem-list-item .title {
|
||||
font-size: 1.2em;
|
||||
font-weight: 450;
|
||||
}
|
||||
|
||||
.cd-mediaitem-list-item .subtitle {
|
||||
font-size: 1.1em;
|
||||
font-weight: 380;
|
||||
}
|
||||
|
||||
.cd-mediaitem-list-item .duration {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.cd-mediaitem-list-item .artwork {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
.cd-btn-seeall {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 3em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.home-page .well.artistfeed-well {
|
||||
height: 512px;
|
||||
}
|
||||
|
||||
.header-text {
|
||||
font-size: 3em;
|
||||
height: 3em;
|
||||
padding-left: 0.2em;
|
||||
}
|
||||
|
||||
.grouping-container .grouping-btn {
|
||||
font-size: 1.3em;
|
||||
color: var(--textColor);
|
||||
background-color: var(--sidebarColor);
|
||||
font-weight: 600;
|
||||
padding: 32px;
|
||||
//box-shadow: var(--ciderShadow-Generic);
|
||||
}
|
||||
|
||||
.content-inner.playlist-page {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.playlist-page .playlist-display {
|
||||
width: 100%;
|
||||
max-width: 500px;
|
||||
flex:1;
|
||||
text-align: center;
|
||||
|
||||
.playlistInfo {
|
||||
>.row {
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
.playlist-controls {
|
||||
div {
|
||||
width:100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
.playlist-page .mediaContainer {
|
||||
width: 30vh;
|
||||
height: 30vh;
|
||||
aspect-ratio: 1;
|
||||
}
|
||||
.playlist-page .playlist-display .playlistInfo .playlist-info {
|
||||
gap: 16px;
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.playlist-page .playlist-display .playlistInfo .playlist-hero {
|
||||
transform: unset;
|
||||
}
|
||||
|
||||
.artist-page .artist-header {
|
||||
min-height: 60vh;
|
||||
}
|
||||
|
||||
.artist-page .artist-image {
|
||||
width: 20vh;
|
||||
height: 20vh;
|
||||
aspect-ratio: 1;
|
||||
}
|
||||
|
||||
.artist-page.animated .artist-header {
|
||||
min-height: 80vh;
|
||||
}
|
||||
|
||||
.playlist-page .playlist-body {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
481
src/renderer/less/helpers.css
Normal file
|
@ -0,0 +1,481 @@
|
|||
.notyf__toast {
|
||||
-webkit-app-region: no-drag;
|
||||
cursor: pointer;
|
||||
}
|
||||
.notyf-info {
|
||||
background: var(--keyColor);
|
||||
}
|
||||
.tooltip-inner {
|
||||
background: #2f2f2f;
|
||||
opacity: 1;
|
||||
border: 1px solid rgba(0, 0, 0, 0.35);
|
||||
transition: all 0.3s ease-in-out;
|
||||
box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
.modal-fullscreen {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
z-index: 1000;
|
||||
}
|
||||
.modal-fullscreen .modal-window {
|
||||
background: #333;
|
||||
border-radius: 10px;
|
||||
box-shadow: var(--mediaItemShadow-Shadow);
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
max-height: 500px;
|
||||
max-width: 360px;
|
||||
background: #121212;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
}
|
||||
.modal-fullscreen .modal-window:after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
pointer-events: none;
|
||||
box-shadow: var(--mediaItemShadow);
|
||||
z-index: 1;
|
||||
border-radius: inherit;
|
||||
}
|
||||
.modal-fullscreen .modal-window .modal-header {
|
||||
width: 100%;
|
||||
padding: 6px;
|
||||
}
|
||||
.modal-fullscreen .modal-window .modal-content {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
overflow-y: overlay;
|
||||
}
|
||||
.spatialproperties-panel .modal-window {
|
||||
overflow: hidden;
|
||||
}
|
||||
.spatialproperties-panel .modal-window:not(.airplay-modal) {
|
||||
height: 700px;
|
||||
max-height: 700px;
|
||||
width: 800px;
|
||||
max-width: 800px;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .info-header {
|
||||
padding-left: 12px;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .visual-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
overflow: hidden;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .visual {
|
||||
position: relative;
|
||||
height: 250px;
|
||||
width: 300px;
|
||||
display: inline-flex;
|
||||
align-items: flex-end;
|
||||
justify-content: center;
|
||||
filter: drop-shadow(2px 12px 6px rgba(0, 0, 0, 0.25));
|
||||
margin: 0 auto;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .visual .face {
|
||||
position: absolute;
|
||||
width: calc(12px * 6);
|
||||
height: calc(12px * 6);
|
||||
border-radius: 6px;
|
||||
transform: rotateX(60deg) rotateZ(-45deg);
|
||||
transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .visual .listener {
|
||||
position: absolute;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 6px;
|
||||
transform: rotateX(60deg) rotateZ(-45deg);
|
||||
transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
||||
background: white;
|
||||
color: black;
|
||||
z-index: 2;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .visual .audiosource {
|
||||
position: absolute;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 6px;
|
||||
transform: rotateX(60deg) rotateZ(-45deg);
|
||||
transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
||||
background: yellow;
|
||||
z-index: 2;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .visual .face:nth-of-type(1) {
|
||||
background: linear-gradient(45deg, #28223a, #1f2038);
|
||||
z-index: 1;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .visual .face:nth-of-type(2) {
|
||||
background: linear-gradient(45deg, #7d53ad, #5763ff);
|
||||
transform: rotateX(60deg) rotateZ(-45deg) translateZ(30px);
|
||||
opacity: 0.7;
|
||||
z-index: 3;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .modal-header {
|
||||
padding: 16px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .modal-header .modal-title {
|
||||
text-align: center;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .modal-header .close-btn {
|
||||
width: 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: 10px;
|
||||
right: 10px;
|
||||
border-radius: 50px;
|
||||
display: grid;
|
||||
align-content: center;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .modal-header .close-btn:before {
|
||||
content: "";
|
||||
font-family: "codicon";
|
||||
color: var(--textColor);
|
||||
font-size: 20px;
|
||||
}
|
||||
.spatialproperties-panel .modal-window .modal-header .close-btn:hover {
|
||||
background-color: #c42b1c;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window {
|
||||
max-height: 600px;
|
||||
max-width: 400px;
|
||||
background: rgba(18, 18, 18, 0.9);
|
||||
overflow: hidden;
|
||||
backdrop-filter: blur(16px) saturate(180%);
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .modal-header {
|
||||
padding: 16px;
|
||||
position: relative;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .modal-header .modal-title {
|
||||
text-align: center;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .modal-header .close-btn {
|
||||
width: 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: 10px;
|
||||
right: 10px;
|
||||
border-radius: 50px;
|
||||
display: grid;
|
||||
align-content: center;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .modal-header .close-btn:before {
|
||||
content: "";
|
||||
font-family: "codicon";
|
||||
color: var(--textColor);
|
||||
font-size: 20px;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .modal-header .close-btn:hover {
|
||||
background-color: #c42b1c;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .modal-search {
|
||||
width: 100%;
|
||||
padding: 0px 16px;
|
||||
position: relative;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .playlist-item {
|
||||
appearance: none;
|
||||
border: 0px;
|
||||
text-align: left;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
display: flex;
|
||||
background: rgba(32, 32, 32, 0.46);
|
||||
color: #eee;
|
||||
font-family: inherit;
|
||||
font-size: 0.98em;
|
||||
padding: 6px 12px;
|
||||
align-items: center;
|
||||
flex-flow: row;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .playlist-item .icon {
|
||||
pointer-events: none;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-right: 6px;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .playlist-item .name {
|
||||
position: relative;
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .playlist-item:hover {
|
||||
background: var(--selected);
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .playlist-item:active {
|
||||
background: var(--selected-click);
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .playlist-item.focused {
|
||||
background: var(--keyColor);
|
||||
}
|
||||
.addtoplaylist-panel .modal-window .playlist-item:last-child {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
.menu-panel {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 100001;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
.menu-panel .menu-header-body {
|
||||
padding: 6px;
|
||||
display: flex;
|
||||
background: rgba(200, 200, 200, 0.1);
|
||||
}
|
||||
.menu-panel .menu-header-body .menu-option-header {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
border-radius: var(--mediaItemRadius);
|
||||
appearance: none;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
}
|
||||
.menu-panel .menu-header-body .menu-option-header.active .sidebar-icon > .svg-icon {
|
||||
--color: var(--keyColor);
|
||||
}
|
||||
.menu-panel .menu-header-body .menu-option-header:hover {
|
||||
background: var(--selected);
|
||||
}
|
||||
.menu-panel .menu-header-body .menu-option-header:active {
|
||||
background: var(--selected-click);
|
||||
}
|
||||
.menu-panel .menu-panel-body {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
background: rgba(30, 30, 30, 0.45);
|
||||
backdrop-filter: blur(32px) saturate(180%);
|
||||
position: relative;
|
||||
min-width: 200px;
|
||||
box-shadow: var(--ciderShadow-Generic);
|
||||
border-radius: var(--panelRadius);
|
||||
overflow: hidden;
|
||||
font-size: 13px;
|
||||
}
|
||||
.menu-panel .menu-panel-body .menu-option {
|
||||
text-align: left;
|
||||
display: flex;
|
||||
appearance: none;
|
||||
border: 0px;
|
||||
font: inherit;
|
||||
background: transparent;
|
||||
color: inherit;
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
padding: 9px 14px;
|
||||
align-items: center;
|
||||
}
|
||||
.menu-panel .menu-panel-body .menu-option::before {
|
||||
background: var(--hover);
|
||||
border-radius: 6px;
|
||||
content: "";
|
||||
--sizeY: 3px;
|
||||
--sizeX: 4px;
|
||||
top: var(--sizeY);
|
||||
left: var(--sizeX);
|
||||
bottom: var(--sizeY);
|
||||
right: var(--sizeX);
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
transform: scale(0.98);
|
||||
z-index: -1;
|
||||
transition: transform 0.25s ease-out, opacity 0.25s ease-out;
|
||||
}
|
||||
.menu-panel .menu-panel-body .menu-option:hover::before {
|
||||
transition: transform 0s ease-in, opacity 0s ease-in;
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
.menu-panel .menu-panel-body .menu-option:active::before {
|
||||
transition: transform 0.1s ease-in-out, opacity 0.1s ease-in-out;
|
||||
opacity: 1;
|
||||
transform: scale(0.98);
|
||||
background: var(--selected-click);
|
||||
}
|
||||
.menu-panel .menu-header-text {
|
||||
margin: 18px 6px;
|
||||
}
|
||||
.menu-panel .menu-header-text .close-btn {
|
||||
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: 10px;
|
||||
right: 10px;
|
||||
border-radius: 50px;
|
||||
display: grid;
|
||||
align-content: center;
|
||||
}
|
||||
.menu-panel .menu-header-text .close-btn:before {
|
||||
content: "";
|
||||
font-family: "codicon";
|
||||
color: var(--textColor);
|
||||
font-size: 20px;
|
||||
}
|
||||
.menu-panel .menu-header-text .close-btn:hover {
|
||||
background-color: #c42b1c;
|
||||
}
|
||||
.menu-panel .menu-body {
|
||||
overflow: overlay;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap: 0px;
|
||||
padding: 0px;
|
||||
position: relative;
|
||||
}
|
||||
.menu-panel .menu-footer {
|
||||
width: 100%;
|
||||
padding: 12px;
|
||||
}
|
||||
.queue-panel {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
}
|
||||
.queue-panel .queue-header-text {
|
||||
margin: 18px 6px;
|
||||
}
|
||||
.queue-panel .queue-body {
|
||||
overflow: overlay;
|
||||
height: 100%;
|
||||
}
|
||||
.queue-panel .queue-footer {
|
||||
width: 100%;
|
||||
padding: 12px;
|
||||
}
|
||||
.queue-panel .autoplay {
|
||||
background: rgba(200, 200, 200, 0.15);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
appearance: none;
|
||||
border: 0;
|
||||
border-radius: 6px;
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
}
|
||||
.queue-panel .infinity {
|
||||
content: url("assets/infinity.svg");
|
||||
margin: auto;
|
||||
}
|
||||
.moreinfo-modal .modal-window {
|
||||
height: 70%;
|
||||
max-height: 100%;
|
||||
width: 45%;
|
||||
max-width: 100%;
|
||||
overflow: hidden;
|
||||
line-height: 1.25;
|
||||
}
|
||||
.moreinfo-modal .modal-content {
|
||||
padding: 1em;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
.moreinfo-modal .modal-content br {
|
||||
display: block;
|
||||
/* makes it have a width */
|
||||
content: "";
|
||||
/* clears default height */
|
||||
margin: 2em;
|
||||
margin-bottom: -0.6rem;
|
||||
}
|
||||
.moreinfo-modal .modal-header {
|
||||
flex-direction: column;
|
||||
}
|
||||
.moreinfo-modal .modal-header .modal-title {
|
||||
text-align: unset !important;
|
||||
width: 100%;
|
||||
}
|
||||
.moreinfo-modal .modal-header .modal-title:not(.modal-subtitle) {
|
||||
font-size: 25px;
|
||||
}
|
||||
.mediainfo-popover {
|
||||
user-select: none;
|
||||
background-color: #000000;
|
||||
overflow: hidden;
|
||||
}
|
||||
.mediainfo-popover .content .shadow-artwork {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: -1;
|
||||
filter: blur(32px) brightness(50%) saturate(280%);
|
||||
}
|
||||
.mediainfo-popover .content .popover-artwork {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.mediainfo-popover .content .song-name {
|
||||
font-weight: 600;
|
||||
}
|
||||
.mediainfo-popover .content .song-artist,
|
||||
.mediainfo-popover .content .song-album {
|
||||
opacity: 0.75;
|
||||
cursor: pointer;
|
||||
}
|
||||
.mediainfo-popover .content .song-artist:hover,
|
||||
.mediainfo-popover .content .song-album:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
._svg-icon {
|
||||
--icon: url("assets/chevron-left.svg");
|
||||
--size: 1em;
|
||||
width: var(--size);
|
||||
height: var(--size);
|
||||
-webkit-mask-image: var(--icon);
|
||||
-webkit-mask-position: center;
|
||||
-webkit-mask-size: contain;
|
||||
background: rgba(255, 255, 255, 0.76);
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
}
|
||||
._svg-icon.svg-md {
|
||||
--size: 1.2em;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
.notyf__toast {
|
||||
-webkit-app-region: no-drag;
|
||||
cursor : pointer;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.notyf-info {
|
||||
|
@ -9,142 +9,145 @@
|
|||
|
||||
.tooltip-inner {
|
||||
background: #2f2f2f;
|
||||
opacity : 1;
|
||||
border : 1px solid rgb(0 0 0 / 35%);
|
||||
opacity: 1;
|
||||
border: 1px solid rgb(0 0 0 / 35%);
|
||||
transition: all 0.3s ease-in-out;
|
||||
box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
.modal-fullscreen {
|
||||
display : flex;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items : center;
|
||||
position : fixed;
|
||||
top : 0;
|
||||
left : 0;
|
||||
width : 100%;
|
||||
height : 100%;
|
||||
background : rgba(0, 0, 0, 0.3);
|
||||
z-index : 1000;
|
||||
align-items: center;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
z-index: 1000;
|
||||
|
||||
.modal-window {
|
||||
background : #333;
|
||||
background: #333;
|
||||
border-radius: 10px;
|
||||
box-shadow : var(--mediaItemShadow-Shadow);
|
||||
display : flex;
|
||||
flex-flow : column;
|
||||
max-height : 500px;
|
||||
max-width : 360px;
|
||||
background : #121212;
|
||||
width : 100%;
|
||||
position : relative;
|
||||
box-shadow: var(--mediaItemShadow-Shadow);
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
max-height: 500px;
|
||||
max-width: 360px;
|
||||
background: #121212;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
|
||||
&:after {
|
||||
content : "";
|
||||
position : absolute;
|
||||
top : 0;
|
||||
left : 0;
|
||||
width : 100%;
|
||||
height : 100%;
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
pointer-events: none;
|
||||
box-shadow : var(--mediaItemShadow);
|
||||
z-index : 1;
|
||||
border-radius : inherit;
|
||||
box-shadow: var(--mediaItemShadow);
|
||||
z-index: 1;
|
||||
border-radius: inherit;
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
width : 100%;
|
||||
width: 100%;
|
||||
padding: 6px;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
width : 100%;
|
||||
height : 100%;
|
||||
overflow : hidden;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
overflow-y: overlay;
|
||||
}
|
||||
|
||||
.modal-footer {}
|
||||
.modal-footer {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.spatialproperties-panel {
|
||||
.modal-window {
|
||||
&:not(.airplay-modal){
|
||||
height : 700px;
|
||||
max-height: 700px;
|
||||
width : 800px;
|
||||
max-width : 800px;}
|
||||
overflow : hidden;
|
||||
&:not(.airplay-modal) {
|
||||
height: 700px;
|
||||
max-height: 700px;
|
||||
width: 800px;
|
||||
max-width: 800px;
|
||||
}
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
.info-header {
|
||||
padding-left: 12px;
|
||||
}
|
||||
|
||||
.visual-container {
|
||||
display : flex;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items : center;
|
||||
overflow : hidden;
|
||||
align-items: center;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.visual {
|
||||
position : relative;
|
||||
height : 250px;
|
||||
width : 300px;
|
||||
display : inline-flex;
|
||||
align-items : flex-end;
|
||||
position: relative;
|
||||
height: 250px;
|
||||
width: 300px;
|
||||
display: inline-flex;
|
||||
align-items: flex-end;
|
||||
justify-content: center;
|
||||
filter : drop-shadow(2px 12px 6px rgb(0 0 0 / 25%));
|
||||
margin : 0 auto;
|
||||
filter: drop-shadow(2px 12px 6px rgb(0 0 0 / 25%));
|
||||
margin: 0 auto;
|
||||
|
||||
.face {
|
||||
position : absolute;
|
||||
width : calc(12px * 6);
|
||||
height : calc(12px * 6);
|
||||
position: absolute;
|
||||
width: calc(12px * 6);
|
||||
height: calc(12px * 6);
|
||||
border-radius: 6px;
|
||||
transform : rotateX(60deg) rotateZ(-45deg);
|
||||
transition : transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
||||
transform: rotateX(60deg) rotateZ(-45deg);
|
||||
transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
||||
}
|
||||
|
||||
.listener {
|
||||
position : absolute;
|
||||
width : 32px;
|
||||
height : 32px;
|
||||
position: absolute;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 6px;
|
||||
transform : rotateX(60deg) rotateZ(-45deg);
|
||||
transition : transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
||||
background : white;
|
||||
color : black;
|
||||
z-index : 2;
|
||||
transform: rotateX(60deg) rotateZ(-45deg);
|
||||
transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
||||
background: white;
|
||||
color: black;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.audiosource {
|
||||
position : absolute;
|
||||
width : 32px;
|
||||
height : 32px;
|
||||
position: absolute;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 6px;
|
||||
transform : rotateX(60deg) rotateZ(-45deg);
|
||||
transition : transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
||||
background : yellow;
|
||||
z-index : 2;
|
||||
transform: rotateX(60deg) rotateZ(-45deg);
|
||||
transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear;
|
||||
background: yellow;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.face:nth-of-type(1) {
|
||||
background: linear-gradient(45deg, #28223a, #1f2038);
|
||||
z-index : 1;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.face:nth-of-type(2) {
|
||||
background: linear-gradient(45deg, #7d53ad, #5763ff);
|
||||
transform : rotateX(60deg) rotateZ(-45deg) translateZ(30px);
|
||||
opacity : 0.7;
|
||||
z-index : 3;
|
||||
transform: rotateX(60deg) rotateZ(-45deg) translateZ(30px);
|
||||
opacity: 0.7;
|
||||
z-index: 3;
|
||||
}
|
||||
}
|
||||
|
||||
.modal-header {
|
||||
padding : 16px;
|
||||
padding: 16px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
|
||||
|
@ -153,22 +156,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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -176,14 +165,14 @@
|
|||
|
||||
.addtoplaylist-panel {
|
||||
.modal-window {
|
||||
max-height : 600px;
|
||||
max-width : 400px;
|
||||
background : rgb(18 18 18 / 90%);
|
||||
overflow : hidden;
|
||||
max-height: 600px;
|
||||
max-width: 400px;
|
||||
background: rgb(18 18 18 / 90%);
|
||||
overflow: hidden;
|
||||
backdrop-filter: blur(16px) saturate(180%);
|
||||
|
||||
.modal-header {
|
||||
padding : 16px;
|
||||
padding: 16px;
|
||||
position: relative;
|
||||
|
||||
.modal-title {
|
||||
|
@ -191,54 +180,39 @@
|
|||
}
|
||||
|
||||
.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
|
||||
}
|
||||
}
|
||||
|
||||
.modal-search {
|
||||
width : 100%;
|
||||
padding : 0px 16px;
|
||||
width: 100%;
|
||||
padding: 0px 16px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.playlist-item {
|
||||
appearance : none;
|
||||
border : 0px;
|
||||
text-align : left;
|
||||
width : 100%;
|
||||
margin : 0;
|
||||
display : flex;
|
||||
background : rgba(32, 32, 32, 0.46);
|
||||
color : #eee;
|
||||
appearance: none;
|
||||
border: 0px;
|
||||
text-align: left;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
display: flex;
|
||||
background: rgba(32, 32, 32, 0.46);
|
||||
color: #eee;
|
||||
font-family: inherit;
|
||||
font-size : 0.98em;
|
||||
padding : 6px 12px;
|
||||
font-size: 0.98em;
|
||||
padding: 6px 12px;
|
||||
align-items: center;
|
||||
flex-flow : row;
|
||||
flex-flow: row;
|
||||
|
||||
.icon {
|
||||
pointer-events : none;
|
||||
width : 32px;
|
||||
height : 32px;
|
||||
display : flex;
|
||||
pointer-events: none;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items : center;
|
||||
margin-right : 6px;
|
||||
align-items: center;
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
.name {
|
||||
|
@ -265,35 +239,35 @@
|
|||
}
|
||||
|
||||
.menu-panel {
|
||||
width : 100%;
|
||||
height : 100%;
|
||||
position : fixed;
|
||||
top : 0;
|
||||
left : 0;
|
||||
z-index : 100001;
|
||||
display : flex;
|
||||
justify-content : center;
|
||||
align-items : center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 100001;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
-webkit-app-region: no-drag;
|
||||
|
||||
.menu-header-body {
|
||||
padding : 6px;
|
||||
display : flex;
|
||||
padding: 6px;
|
||||
display: flex;
|
||||
background: rgb(200 200 200 / 10%);
|
||||
|
||||
.menu-option-header {
|
||||
width : 40px;
|
||||
height : 40px;
|
||||
display : flex;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items : center;
|
||||
border-radius : var(--mediaItemRadius);
|
||||
appearance : none;
|
||||
border : 0;
|
||||
background : transparent;
|
||||
align-items: center;
|
||||
border-radius: var(--mediaItemRadius);
|
||||
appearance: none;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
|
||||
&.active {
|
||||
.sidebar-icon>.svg-icon {
|
||||
.sidebar-icon > .svg-icon {
|
||||
--color: var(--keyColor);
|
||||
}
|
||||
}
|
||||
|
@ -309,85 +283,93 @@
|
|||
}
|
||||
|
||||
.menu-panel-body {
|
||||
display : flex;
|
||||
flex-flow : column;
|
||||
background : rgb(30 30 30 / 45%);
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
background: rgb(30 30 30 / 45%);
|
||||
backdrop-filter: blur(32px) saturate(180%);
|
||||
position : relative;
|
||||
min-width : 200px;
|
||||
box-shadow : var(--ciderShadow-Generic);
|
||||
border-radius : var(--panelRadius);
|
||||
overflow : hidden;
|
||||
font-size : 13px;
|
||||
position: relative;
|
||||
min-width: 200px;
|
||||
box-shadow: var(--ciderShadow-Generic);
|
||||
border-radius: var(--panelRadius);
|
||||
overflow: hidden;
|
||||
font-size: 13px;
|
||||
|
||||
|
||||
.menu-option {
|
||||
text-align: left;
|
||||
display : flex;
|
||||
display: flex;
|
||||
appearance: none;
|
||||
border : 0px;
|
||||
font : inherit;
|
||||
border: 0px;
|
||||
font: inherit;
|
||||
background: transparent;
|
||||
color : inherit;
|
||||
margin : 0 auto;
|
||||
position : relative;
|
||||
width : 100%;
|
||||
padding : 9px 14px;
|
||||
color: inherit;
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
width: 100%;
|
||||
padding: 9px 14px;
|
||||
align-items: center;
|
||||
|
||||
&::before {
|
||||
background : var(--hover);
|
||||
background: var(--hover);
|
||||
border-radius: 6px;
|
||||
content : "";
|
||||
--sizeY : 3px;
|
||||
--sizeX : 4px;
|
||||
top : var(--sizeY);
|
||||
left : var(--sizeX);
|
||||
bottom : var(--sizeY);
|
||||
right : var(--sizeX);
|
||||
position : absolute;
|
||||
opacity : 0;
|
||||
transform : scale(0.98);
|
||||
z-index : -1;
|
||||
transition : transform .25s ease-out, opacity .25s ease-out;
|
||||
content: "";
|
||||
--sizeY: 3px;
|
||||
--sizeX: 4px;
|
||||
top: var(--sizeY);
|
||||
left: var(--sizeX);
|
||||
bottom: var(--sizeY);
|
||||
right: var(--sizeX);
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
transform: scale(0.98);
|
||||
z-index: -1;
|
||||
transition: transform .25s ease-out, opacity .25s ease-out;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
&::before {
|
||||
transition: transform 0s ease-in, opacity 0s ease-in;
|
||||
opacity : 1;
|
||||
transform : scale(1);
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
&:active {
|
||||
&::before {
|
||||
transition: transform .1s ease-in-out, opacity .1s ease-in-out;
|
||||
opacity : 1;
|
||||
transform : scale(0.98);
|
||||
opacity: 1;
|
||||
transform: scale(0.98);
|
||||
background: var(--selected-click);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.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)
|
||||
|
@ -396,25 +378,25 @@
|
|||
}
|
||||
|
||||
.menu-body {
|
||||
overflow : overlay;
|
||||
height : 100%;
|
||||
display : flex;
|
||||
overflow: overlay;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
gap : 0px;
|
||||
padding : 0px;
|
||||
position : relative;
|
||||
gap: 0px;
|
||||
padding: 0px;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.menu-footer {
|
||||
width : 100%;
|
||||
width: 100%;
|
||||
padding: 12px;
|
||||
}
|
||||
}
|
||||
|
||||
.queue-panel {
|
||||
height : 100%;
|
||||
width : 100%;
|
||||
display : flex;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
|
||||
.queue-header-text {
|
||||
|
@ -423,52 +405,52 @@
|
|||
|
||||
.queue-body {
|
||||
overflow: overlay;
|
||||
height : 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.queue-footer {
|
||||
width : 100%;
|
||||
width: 100%;
|
||||
padding: 12px;
|
||||
}
|
||||
|
||||
.autoplay {
|
||||
background : rgb(200 200 200 / 15%);
|
||||
display : flex;
|
||||
background: rgb(200 200 200 / 15%);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
appearance : none;
|
||||
border : 0;
|
||||
border-radius : 6px;
|
||||
height : 32px;
|
||||
width : 32px;
|
||||
appearance: none;
|
||||
border: 0;
|
||||
border-radius: 6px;
|
||||
height: 32px;
|
||||
width: 32px;
|
||||
}
|
||||
|
||||
.infinity {
|
||||
content: url("./assets/infinity.svg");
|
||||
margin : auto;
|
||||
margin: auto;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.moreinfo-modal {
|
||||
.modal-window {
|
||||
height : 70%;
|
||||
max-height : 100%;
|
||||
width : 45%;
|
||||
max-width : 100%;
|
||||
overflow : hidden;
|
||||
height: 70%;
|
||||
max-height: 100%;
|
||||
width: 45%;
|
||||
max-width: 100%;
|
||||
overflow: hidden;
|
||||
line-height: 1.25;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
padding : 1em;
|
||||
padding: 1em;
|
||||
font-size: 0.8rem;
|
||||
|
||||
br {
|
||||
display : block;
|
||||
display: block;
|
||||
/* makes it have a width */
|
||||
content : "";
|
||||
content: "";
|
||||
/* clears default height */
|
||||
margin : 2em;
|
||||
margin: 2em;
|
||||
margin-bottom: -0.6rem;
|
||||
}
|
||||
}
|
||||
|
@ -478,7 +460,7 @@
|
|||
|
||||
.modal-title {
|
||||
text-align: unset !important;
|
||||
width : 100%;
|
||||
width: 100%;
|
||||
|
||||
&:not(.modal-subtitle) {
|
||||
font-size: 25px;
|
||||
|
@ -500,18 +482,21 @@
|
|||
top: 0;
|
||||
left: 0;
|
||||
z-index: -1;
|
||||
filter:blur(32px) brightness(50%) saturate(280%);
|
||||
filter: blur(32px) brightness(50%) saturate(280%);
|
||||
}
|
||||
|
||||
.popover-artwork {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
margin: 0 0 20px 0;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.song-name {
|
||||
font-weight: 600;
|
||||
}
|
||||
.song-artist,.song-album {
|
||||
|
||||
.song-artist, .song-album {
|
||||
opacity: 0.75;
|
||||
cursor: pointer;
|
||||
|
||||
|
@ -520,4 +505,20 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
._svg-icon {
|
||||
--icon: url("./assets/chevron-left.svg");
|
||||
--size: 1em;
|
||||
width: var(--size);
|
||||
height: var(--size);
|
||||
-webkit-mask-image: var(--icon);
|
||||
-webkit-mask-position: center;
|
||||
-webkit-mask-size: contain;
|
||||
background: rgb(255 255 255 / 76%);
|
||||
-webkit-mask-repeat: no-repeat;
|
||||
|
||||
&.svg-md {
|
||||
--size: 1.2em;
|
||||
}
|
||||
}
|
|
@ -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 : "";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,15 +1,17 @@
|
|||
body[platform="darwin"] {
|
||||
html {
|
||||
background: transparent!important;
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
&.notransparency::before {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#app {
|
||||
&.simplebg {
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
&::before {
|
||||
display: none;
|
||||
}
|
||||
|
@ -25,6 +27,7 @@ body[platform="darwin"] {
|
|||
.app-chrome .app-chrome-item.search {
|
||||
margin-right: 12px;
|
||||
}
|
||||
|
||||
.app-chrome .app-mainmenu {
|
||||
width: 46px;
|
||||
}
|
||||
|
@ -33,6 +36,21 @@ body[platform="darwin"] {
|
|||
background-color: var(--macOSChromeColor);
|
||||
}
|
||||
}
|
||||
|
||||
&[window-state="normal"] {
|
||||
&::after {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
box-shadow: inset 0px 0px .5px 1px rgb(200 200 200 / 40%);
|
||||
border-radius: 10px;
|
||||
content: " ";
|
||||
z-index: 999999;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#app-main {
|
||||
|
@ -43,7 +61,19 @@ body[platform="darwin"] {
|
|||
}
|
||||
|
||||
#app-content {
|
||||
background-color: var(--baseColor);
|
||||
background-color: #1e1e1e6b;
|
||||
}
|
||||
}
|
||||
|
||||
.settings-window.maxed {
|
||||
.tabs>.col-auto {
|
||||
transition: padding-top .3s linear;
|
||||
padding-top: var(--chromeHeight1);
|
||||
}
|
||||
}
|
||||
|
||||
#apple-music-video-player-controls #player-exit {
|
||||
margin-top: 18px;
|
||||
left: 70px;
|
||||
}
|
||||
}
|
410
src/renderer/less/miniplayer.less
Normal file
|
@ -0,0 +1,410 @@
|
|||
.mini-view {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
.fs-row {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
.playback-button--small.active {
|
||||
background-color: rgb(200 200 200 / 25%);
|
||||
}
|
||||
|
||||
.player-exit {
|
||||
z-index: 3;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
right: 5px;
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
|
||||
.player-pin {
|
||||
z-index: 3;
|
||||
position: absolute;
|
||||
min-width: 20px;
|
||||
min-height: 20px;
|
||||
top: 5px;
|
||||
right: 30px;
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
|
||||
#mini-pin {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.player-pin:hover #mini-pin {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.playback-button--small {
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.right-col {
|
||||
height: 50vh;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1121px) {
|
||||
.display--large {
|
||||
display: flex !important;
|
||||
}
|
||||
}
|
||||
|
||||
.display--large {
|
||||
display: flex;
|
||||
|
||||
.slider {
|
||||
width: 100%;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.input-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
width: 100%
|
||||
}
|
||||
|
||||
.volume-button--small {
|
||||
border-radius: 6px;
|
||||
color: inherit;
|
||||
background-size: 16px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-color: transparent;
|
||||
height: 15px;
|
||||
width: 30px;
|
||||
border: 0px;
|
||||
box-shadow: unset;
|
||||
opacity: 0.70;
|
||||
background-image: url("./assets/feather/volume-2.svg");
|
||||
}
|
||||
|
||||
.volume-button--small:active {
|
||||
transform: scale(0.9);
|
||||
}
|
||||
|
||||
.volume-button--small.active {
|
||||
background-image: url("./assets/feather/volume.svg");
|
||||
}
|
||||
|
||||
input[type=range] {
|
||||
-webkit-appearance: none;
|
||||
height: 4px;
|
||||
background: rgba(255, 255, 255, 0.4);
|
||||
border-radius: 5px;
|
||||
background-size: 70% 100%;
|
||||
background-repeat: no-repeat;
|
||||
|
||||
&::-webkit-slider-thumb {
|
||||
-webkit-appearance: none;
|
||||
height: 14px;
|
||||
width: 14px;
|
||||
border-radius: 50%;
|
||||
background: rgb(50 50 50);
|
||||
cursor: default;
|
||||
box-shadow: inset 0px 0px 0px 1px rgba(255, 255, 255, 0.4);
|
||||
transition: all var(--appleTransition);
|
||||
}
|
||||
|
||||
&::-webkit-slider-thumb:hover {
|
||||
background-image: radial-gradient(var(--songProgressColor) 2px, transparent 3px, transparent 10px);
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
&::-webkit-slider-thumb:active {
|
||||
background-image: radial-gradient(var(--songProgressColor) 3px, transparent 4px, transparent 10px);
|
||||
transform: scale(1);
|
||||
}
|
||||
|
||||
&::-webkit-slider-runnable-track {
|
||||
-webkit-appearance: none;
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.background {
|
||||
position: absolute;
|
||||
background-size: cover;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
-webkit-user-select: none;
|
||||
-webkit-app-region: drag;
|
||||
|
||||
.bgArtworkMaterial {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
.bg-artwork-container {
|
||||
z-index: unset;
|
||||
}
|
||||
|
||||
.bg-artwork-container .bg-artwork {
|
||||
filter: brightness(85%) saturate(95%) blur(180px) contrast(0.9) opacity(0.9);
|
||||
}
|
||||
|
||||
.no-animation {
|
||||
animation: unset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.lyrics-col {
|
||||
|
||||
height: 62vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
width: 80%;
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
box-shadow: unset;
|
||||
}
|
||||
|
||||
&:hover ::-webkit-scrollbar-thumb {
|
||||
box-shadow: inset 0px 0px 10px 10px rgb(200 200 200 / 50%);
|
||||
}
|
||||
|
||||
.no-lyrics {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.lyric-line {
|
||||
font-size: 35px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.queue-col {
|
||||
|
||||
width: 60vh;
|
||||
height: 50vh;
|
||||
|
||||
.queue-title {
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.queue-panel > * {
|
||||
z-index: 3;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
box-shadow: unset;
|
||||
}
|
||||
|
||||
&:hover ::-webkit-scrollbar-thumb {
|
||||
box-shadow: inset 0px 0px 10px 10px rgb(200 200 200 / 50%);
|
||||
}
|
||||
}
|
||||
|
||||
.tab-toggles {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
width: 15vh;
|
||||
height: 5vh;
|
||||
justify-content: space-evenly;
|
||||
|
||||
.volume {
|
||||
background-image: url("./assets/feathers/volume.svg");
|
||||
padding: 0.5vh;
|
||||
width: 2vh;
|
||||
height: 2vh;
|
||||
background-origin: content-box;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.queue {
|
||||
background-image: url("./assets/list.svg");
|
||||
padding: 0.5vh;
|
||||
width: 2.5vh;
|
||||
height: 2.5vh;
|
||||
background-origin: content-box;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.lyrics {
|
||||
background-image: url("./assets/quote-right.svg");
|
||||
padding: 0.5vh;
|
||||
width: 2.5vh;
|
||||
height: 2.5vh;
|
||||
background-origin: content-box;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.active {
|
||||
background-color: rgba(200, 200, 200, 0.7);
|
||||
border-radius: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
.artwork-col {
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.artwork {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
.mediaitem-artwork {
|
||||
border-radius: unset;
|
||||
}
|
||||
}
|
||||
|
||||
.controls-parents {
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
background: #0000009e;
|
||||
backdrop-filter: blur(10px);
|
||||
bottom: 0px;
|
||||
z-index: 3;
|
||||
opacity: 0;
|
||||
padding: 3%;
|
||||
|
||||
&:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.app-playback-controls {
|
||||
-webkit-app-region: no-drag;
|
||||
|
||||
.song-artist, .song-name {
|
||||
font-weight: 600;
|
||||
text-align: center;
|
||||
font-size: 0.9em;
|
||||
height: 1.2em;
|
||||
line-height: 0.9em;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 360px;
|
||||
|
||||
.song-name-normal {
|
||||
height: inherit;
|
||||
}
|
||||
|
||||
&.song-artist-marquee {
|
||||
> marquee {
|
||||
//margin-bottom: -3px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.song-artist {
|
||||
font-size: 0.875em;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.song-name {
|
||||
width: unset !important;
|
||||
margin-top: 0.15vh;
|
||||
display: -webkit-box;
|
||||
line-height: 1.2;
|
||||
text-overflow: ellipsis;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
.app-playback-controls .playback-info {
|
||||
margin-top: 0.5vh;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
position: relative;
|
||||
|
||||
input[type="range"] {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
> div {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
.app-playback-controls .song-progress {
|
||||
@bgColor: transparent;
|
||||
//height: 16px;
|
||||
position: absolute;
|
||||
bottom: -3.5vh;
|
||||
left: 0px;
|
||||
background: @bgColor;
|
||||
|
||||
.song-duration p {
|
||||
font-weight: 400;
|
||||
font-size: 10px;
|
||||
height: 1.2em;
|
||||
line-height: 1.3em;
|
||||
overflow: hidden;
|
||||
margin: 0 0 0 0.25em;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
> input[type=range] {
|
||||
&::-webkit-slider-thumb {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
input[type=range] {
|
||||
appearance: none;
|
||||
width: 100%;
|
||||
height: 4px;
|
||||
background-color: rgb(200 200 200 / 10%);
|
||||
border-radius: 2px;
|
||||
|
||||
&::-webkit-slider-thumb {
|
||||
opacity: 0;
|
||||
transform: scale(0.5);
|
||||
-webkit-appearance: none;
|
||||
appearance: none;
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
border-radius: 100%;
|
||||
background: var(--songProgressColor);
|
||||
cursor: default;
|
||||
transition: opacity .10s var(--appleEase), transform .10s var(--appleEase);
|
||||
}
|
||||
|
||||
&::-moz-range-thumb {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 100%;
|
||||
background: var(--songProgressColor);
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.control-buttons {
|
||||
margin-top: 3.5vh;
|
||||
display: inline-flex;
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
1886
src/renderer/less/pages.css
Normal file
14733
src/renderer/lib/quasar/quasar.min.css
vendored
Normal file
6
src/renderer/lib/quasar/quasar.umd.min.js
vendored
Normal file
|
@ -7,6 +7,8 @@ import {Events} from './events.js'
|
|||
import { wsapi } from "./wsapi_interop.js"
|
||||
import { MusicKitTools } from "./musickittools.js"
|
||||
import { spawnMica } from "./mica.js"
|
||||
import { svgIcon } from './components/svg-icon.js'
|
||||
import { sidebarLibraryItem } from './components/sidebar-library-item.js'
|
||||
|
||||
|
||||
// Define window objects
|
||||
|
@ -17,11 +19,22 @@ window.CiderCache = CiderCache
|
|||
window.CiderFrontAPI = CiderFrontAPI
|
||||
window.wsapi = wsapi
|
||||
|
||||
if (app.cfg.advanced.disableLogging === true) {
|
||||
window.console = {
|
||||
log: function() {},
|
||||
error: function() {},
|
||||
warn: function() {},
|
||||
assert: function() {},
|
||||
debug: function() {}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Mount Vue to #app
|
||||
app.$mount("#app")
|
||||
|
||||
// Init CiderAudio
|
||||
if (app.cfg.advanced.AudioContext){
|
||||
if (app.cfg.advanced.AudioContext === true) {
|
||||
CiderAudio.init()
|
||||
}
|
||||
|
||||
|
|
46
src/renderer/main/components/sidebar-library-item.js
Normal file
|
@ -0,0 +1,46 @@
|
|||
import {html} from "../html.js"
|
||||
|
||||
export const sidebarLibraryItem = Vue.component("sidebar-library-item", {
|
||||
template: html`
|
||||
<button class="app-sidebar-item" v-ripple
|
||||
:class="$root.getSidebarItemClass(page)" @click="$root.setWindowHash(page)">
|
||||
<svg-icon :url="svgIconData" :name="'sidebar-' + svgIconName" v-if="svgIconData != ''"/>
|
||||
<span class="sidebar-item-text">{{ name }}</span>
|
||||
</button>
|
||||
`,
|
||||
props: {
|
||||
name: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
page: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
svgIcon: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: "",
|
||||
},
|
||||
svgIconName: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
cdClick: {
|
||||
type: Function,
|
||||
required: false,
|
||||
},
|
||||
},
|
||||
data: function () {
|
||||
return {
|
||||
app: app,
|
||||
svgIconData: "",
|
||||
};
|
||||
},
|
||||
async mounted() {
|
||||
if (this.svgIcon) {
|
||||
this.svgIconData = this.svgIcon;
|
||||
}
|
||||
},
|
||||
methods: {},
|
||||
})
|
22
src/renderer/main/components/svg-icon.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
import {html} from "../html.js"
|
||||
|
||||
export const svgIcon = Vue.component("svg-icon", {
|
||||
template: html`
|
||||
<div class="_svg-icon" :class="classes" :svg-name="name" :style="{'--icon': 'url(' + url + ')'}"></div>
|
||||
`,
|
||||
props: {
|
||||
name: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
classes: {
|
||||
type: String,
|
||||
required: false
|
||||
},
|
||||
url: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "./assets/repeat.svg"
|
||||
}
|
||||
}
|
||||
})
|
|
@ -24,7 +24,7 @@ const Events = {
|
|||
// CTRL + R
|
||||
if (event.keyCode === 82 && event.ctrlKey) {
|
||||
event.preventDefault()
|
||||
bootbox.confirm("Reload Cider?", (res)=>{
|
||||
app.confirm(app.getLz('term.reload'), (res)=>{
|
||||
if (res) {
|
||||
window.location.reload()
|
||||
}
|
||||
|
@ -69,8 +69,8 @@ const Events = {
|
|||
// Prevent Scrolling on spacebar
|
||||
if (event.keyCode === 32 && event.target === document.body) {
|
||||
event.preventDefault()
|
||||
app.SpacePause()
|
||||
|
||||
app.SpacePause()
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -91,8 +91,6 @@ const Events = {
|
|||
setTimeout(refreshFocus, 200);
|
||||
}
|
||||
|
||||
app.getHTMLStyle()
|
||||
|
||||
refreshFocus();
|
||||
}
|
||||
}
|
||||
|
|
3
src/renderer/main/html.js
Normal file
|
@ -0,0 +1,3 @@
|
|||
export function html (str) {
|
||||
return str[0]
|
||||
}
|
|
@ -21,22 +21,22 @@ async function spawnMica() {
|
|||
let lastScreenWidth;
|
||||
let lastScreenHeight;
|
||||
|
||||
let regen = true;
|
||||
let imgSrc = await ipcRenderer.sendSync("get-wallpaper", {
|
||||
let imgSrc = "";
|
||||
let micaCache = await CiderCache.getCache("mica-cache");
|
||||
if (!micaCache) {
|
||||
micaCache = {
|
||||
path: "",
|
||||
data: "",
|
||||
};
|
||||
}
|
||||
if (micaCache.path == imgSrc.path) {
|
||||
imgSrc = micaCache;
|
||||
}else{
|
||||
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;
|
||||
// }
|
||||
});
|
||||
CiderCache.putCache("mica-cache", imgSrc);
|
||||
}
|
||||
let canvas = document.createElement("canvas");
|
||||
let ctx = canvas.getContext("2d");
|
||||
let img = new Image();
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
const store = new Vuex.Store({
|
||||
state: {
|
||||
windowRelativeScale: 1,
|
||||
library: {
|
||||
// songs: ipcRenderer.sendSync("get-library-songs"),
|
||||
// albums: ipcRenderer.sendSync("get-library-albums"),
|
||||
|
@ -12,6 +13,10 @@ const store = new Vuex.Store({
|
|||
nextUrl: null,
|
||||
items: [],
|
||||
size: "normal"
|
||||
},
|
||||
settings: {
|
||||
currentTabIndex: 0,
|
||||
fullscreen: false
|
||||
}
|
||||
},
|
||||
artwork: {
|
||||
|
@ -19,6 +24,11 @@ const store = new Vuex.Store({
|
|||
}
|
||||
},
|
||||
mutations: {
|
||||
resetRecentlyAdded(state) {
|
||||
state.pageState.recentlyAdded.loaded = false;
|
||||
state.pageState.recentlyAdded.nextUrl = null;
|
||||
state.pageState.recentlyAdded.items = [];
|
||||
},
|
||||
setLCDArtwork(state, artwork) {
|
||||
state.artwork.playerLCD = artwork
|
||||
}
|
||||
|
|
|
@ -118,6 +118,76 @@ const wsapi = {
|
|||
},
|
||||
getmaxVolume() {
|
||||
ipcRenderer.send('wsapi-returnvolumeMax',JSON.stringify(app.cfg.audio.maxVolume));
|
||||
},
|
||||
getLibraryStatus(kind, id) {
|
||||
if (kind === undefined || id === "no-id-found") return;
|
||||
|
||||
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
|
||||
app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/?ids[${truekind}]=${id}`, {
|
||||
relate: "library",
|
||||
fields: "inLibrary"
|
||||
}).then(data => {
|
||||
const res = data.data.data[0];
|
||||
const inLibrary = res && res.attributes && res.attributes.inLibrary;
|
||||
|
||||
app.getRating({ type: truekind, id: id }).then(rating => {
|
||||
ipcRenderer.send('wsapi-libraryStatus', inLibrary, rating);
|
||||
})
|
||||
})
|
||||
},
|
||||
rate(kind, id, rating) {
|
||||
if (kind === undefined || id === "no-id-found") return;
|
||||
|
||||
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
|
||||
|
||||
if (rating === 0) {
|
||||
app.mk.api.v3.music(`/v1/me/ratings/${truekind}/${id}`, {}, {
|
||||
fetchOptions: {
|
||||
method: "DELETE",
|
||||
}
|
||||
}).then(function () {
|
||||
ipcRenderer.send('wsapi-rate', kind, id, rating);
|
||||
})
|
||||
} else {
|
||||
app.mk.api.v3.music(`/v1/me/ratings/${truekind}/${id}`, {}, {
|
||||
fetchOptions: {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({
|
||||
"type": "rating",
|
||||
"attributes": {
|
||||
"value": rating
|
||||
}
|
||||
})
|
||||
}
|
||||
}).then(function () {
|
||||
ipcRenderer.send('wsapi-rate', kind, id, rating);
|
||||
})
|
||||
}
|
||||
},
|
||||
changeLibrary(kind, id, shouldAdd) {
|
||||
if (shouldAdd) {
|
||||
app.addToLibrary(id);
|
||||
ipcRenderer.send('wsapi-change-library', kind, id, shouldAdd);
|
||||
} else {
|
||||
let truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
|
||||
|
||||
app.mk.api.v3.music(`/v1/catalog/${app.mk.storefrontId}/?ids[${truekind}]=${id}`, {
|
||||
relate: "library",
|
||||
fields: "inLibrary"
|
||||
})
|
||||
.then(res => {
|
||||
res = res.data.data[0]
|
||||
if (res && res.relationships && res.relationships.library && res.relationships.library.data) {
|
||||
const item = res.relationships.library.data[0];
|
||||
|
||||
if (item) {
|
||||
app.removeFromLibrary(kind, item.id)
|
||||
}
|
||||
|
||||
ipcRenderer.send('wsapi-change-library', kind, id, shouldAdd);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,42 +0,0 @@
|
|||
<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') %>
|
||||
</button>
|
||||
<button class="nav-item" @click="navigateForward()">
|
||||
<%- include('../svg/chevron-right.svg') %>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Include App Routes -->
|
||||
<% for(var i=0; i < Object.keys(env.appRoutes).length ; i++) {%>
|
||||
<transition
|
||||
<% if(env.appRoutes[i].onEnter) {
|
||||
%>
|
||||
v-on:enter="<%- env.appRoutes[i].onEnter %>"
|
||||
<%
|
||||
}
|
||||
%>
|
||||
:name="chrome.desiredPageTransition">
|
||||
<template
|
||||
v-if="<%- env.appRoutes[i].condition %>">
|
||||
<%- env.appRoutes[i].component %>
|
||||
</template>
|
||||
</transition>
|
||||
<% } %>
|
||||
<!-- Library - Made For You -->
|
||||
<transition :name="chrome.desiredPageTransition" v-on:enter="getMadeForYou()">
|
||||
<template v-if="page == 'library-madeforyou'">
|
||||
<%- include('../pages/madeforyou') %>');
|
||||
%>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Library - Artists-->
|
||||
<!-- Keybinds -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'keybinds-settings'">
|
||||
<keybinds-settings></keybinds-settings>
|
||||
</template>
|
||||
</transition>
|
||||
|
||||
</div>
|
|
@ -65,7 +65,7 @@
|
|||
</button>
|
||||
<button
|
||||
class="usermenu-item"
|
||||
@click="cfg.advanced.AudioContext ? modals.castMenu = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"
|
||||
@click="cfg.advanced.AudioContext ? modals.castMenu = true :(cfg.advanced.AudioContext = true, modals.castMenu = true)"
|
||||
>
|
||||
<span class="usermenu-item-icon">
|
||||
<%- include("../svg/cast.svg") %>
|
||||
|
@ -76,7 +76,7 @@
|
|||
</button>
|
||||
<button
|
||||
class="usermenu-item"
|
||||
@click="cfg.advanced.AudioContext ? modals.audioSettings = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"
|
||||
@click="cfg.advanced.AudioContext ? modals.audioSettings = true : (cfg.advanced.AudioContext = true, modals.audioSettings = true)"
|
||||
>
|
||||
<span class="usermenu-item-icon">
|
||||
<%- include("../svg/headphones.svg") %>
|
||||
|
@ -105,7 +105,7 @@
|
|||
$root.getLz("term.about")
|
||||
}}</span>
|
||||
</button>
|
||||
<button class="usermenu-item" @click="appRoute('settings')">
|
||||
<button class="usermenu-item" @click="modals.settings = true">
|
||||
<span class="usermenu-item-icon">
|
||||
<%- include("../svg/settings.svg") %>
|
||||
</span>
|
||||
|
@ -121,13 +121,21 @@
|
|||
$root.getLz("term.logout")
|
||||
}}</span>
|
||||
</button>
|
||||
<button class="usermenu-item" @click="quit()">
|
||||
<span class="usermenu-item-icon" style="right: 2.5px">
|
||||
<%- include("../svg/x.svg") %>
|
||||
</span>
|
||||
<span class="usermenu-item-name">{{
|
||||
$root.getLz("term.quit")
|
||||
}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
<transition name="sidebartransition">
|
||||
<%- include("sidebar") %>
|
||||
<cider-app-sidebar v-if="!chrome.sidebarCollapsed"></cider-app-sidebar>
|
||||
</transition>
|
||||
<%- include("app-content") %>
|
||||
<app-content-area></app-content-area>
|
||||
<transition name="drawertransition">
|
||||
<div class="app-drawer"
|
||||
v-if="drawer.open && drawer.panel == 'lyrics' && lyrics && lyrics != [] && lyrics.length > 0">
|
||||
|
@ -138,7 +146,7 @@
|
|||
<img v-if="!(cfg.visual.bg_artwork_rotation && animateBackground)" class="bg-artwork no-animation" :src="$store.state.artwork.playerLCD">
|
||||
</div>
|
||||
</div>
|
||||
<lyrics-view v-if="drawer.panel == 'lyrics'" :time="lyriccurrenttime" :lyrics="lyrics"
|
||||
<lyrics-view v-if="drawer.panel == 'lyrics'" :time="mk.currentPlaybackTime - lyricOffset" :lyrics="lyrics"
|
||||
:richlyrics="richlyrics"></lyrics-view>
|
||||
<div v-if="drawer.panel == 'lyrics'" class="lyric-footer">
|
||||
<button class="md-btn" @click="modularUITest(!fullscreenLyrics)">{{fullscreenLyrics ?
|
||||
|
|
|
@ -5,15 +5,15 @@
|
|||
<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>
|
||||
<mediaitem-artwork :url="$root.currentArtUrl"></mediaitem-artwork>
|
||||
</div>
|
||||
<b-popover custom-class="mediainfo-popover" target="artworkLCD" triggers="hover" placement="right">
|
||||
<div class="content">
|
||||
<div class="shadow-artwork">
|
||||
<mediaitem-artwork :url="currentArtUrl" :url="currentArtUrlRaw"></mediaitem-artwork>
|
||||
<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>
|
||||
|
@ -45,7 +45,15 @@
|
|||
</div>
|
||||
<div class="chrome-icon-container">
|
||||
<div class="audio-type private-icon" v-if="cfg.general.privateEnabled === true"></div>
|
||||
<div class="audio-type ppe-icon" v-if="cfg.audio.maikiwiAudio.ciderPPE === true"></div>
|
||||
<div class="audio-type spatial-icon" v-if="cfg.audio.maikiwiAudio.spatial === true"
|
||||
:title="$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization') + ' (' + getProfileLz('CTS', cfg.audio.maikiwiAudio.spatialProfile) + ')'" v-b-tooltip.hover
|
||||
></div>
|
||||
<div class="audio-type lossless-icon" v-if="(mk.nowPlayingItem?.localFilesMetadata?.lossless ?? false) === true"
|
||||
:title="mk.nowPlayingItem?.localFilesMetadata?.bitDepth +'-bit / '+ mk.nowPlayingItem?.localFilesMetadata?.sampleRate/1000 + ' kHz ' + mk.nowPlayingItem.localFilesMetadata.container" v-b-tooltip.hover
|
||||
></div>
|
||||
<div class="audio-type ppe-icon" v-if="mk.nowPlayingItem.localFilesMetadata == null && cfg.audio.maikiwiAudio.ciderPPE === true"
|
||||
:title="$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPE')" v-b-tooltip.hover
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="mk.nowPlayingItem['attributes']['playParams']">
|
||||
|
@ -60,13 +68,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 +96,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">
|
||||
|
@ -126,27 +149,27 @@
|
|||
v-b-tooltip.hover :title="formatVolumeTooltip()">
|
||||
</div>
|
||||
<div class="app-chrome-item generic">
|
||||
<button class="playback-button--small cast"
|
||||
<button class="playback-button--small cast" v-ripple
|
||||
:title="$root.getLz('term.cast')"
|
||||
v-b-tooltip.hover
|
||||
@click="cfg.advanced.AudioContext ? modals.castMenu = true : $root.notyf.error($root.getLz('settings.warn.enableAdvancedFunctionality'))"></button>
|
||||
@click="cfg.advanced.AudioContext ? modals.castMenu = true : (cfg.advanced.AudioContext = true, modals.castMenu = true)"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item generic">
|
||||
<button class="playback-button--small queue" :class="{'active': drawer.panel == 'queue'}"
|
||||
<button class="playback-button--small queue" v-ripple :class="{'active': drawer.panel == 'queue'}"
|
||||
:title="$root.getLz('term.queue')"
|
||||
v-b-tooltip.hover
|
||||
@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"
|
||||
<button class="playback-button--small lyrics" v-ripple
|
||||
: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"
|
||||
<button class="playback-button--small lyrics" v-ripple
|
||||
:style="{'opacity': 0.3, 'pointer-events': 'none'}"></button>
|
||||
</template>
|
||||
|
||||
|
|
|
@ -9,26 +9,26 @@
|
|||
</div>
|
||||
</div>
|
||||
<div class="app-chrome-item full-height" v-else>
|
||||
<button class="app-mainmenu" @blur="mainMenuVisibility(false, true)" @click="mainMenuVisibility(true, false)"
|
||||
@contextmenu="mainMenuVisibility(true, true)" :class="{active: chrome.menuOpened}"
|
||||
<button class="app-mainmenu" @blur="mainMenuVisibility(false)" @click="mainMenuVisibility(true)"
|
||||
@contextmenu="mainMenuVisibility(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="app-chrome-item">
|
||||
<button class="playback-button navigation" @click="navigateBack()" :title="$root.getLz('term.navigateBack')"
|
||||
<button class="playback-button navigation" v-ripple @click="navigateBack()" :title="$root.getLz('term.navigateBack')"
|
||||
v-b-tooltip.hover>
|
||||
<%- include('../svg/chevron-left.svg') %>
|
||||
<svg-icon url="./views/svg/chevron-left.svg"></svg-icon>
|
||||
</button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button class="playback-button navigation" @click="navigateForward()"
|
||||
<button class="playback-button navigation" v-ripple @click="navigateForward()"
|
||||
:title="$root.getLz('term.navigateForward')" v-b-tooltip.hover>
|
||||
<%- include('../svg/chevron-right.svg') %>
|
||||
<svg-icon url="./views/svg/chevron-right.svg"></svg-icon>
|
||||
</button>
|
||||
</div>
|
||||
<div class="app-chrome-item" v-if="getThemeDirective('windowLayout') == 'twopanel'">
|
||||
<button class="playback-button collapseLibrary" v-b-tooltip.hover
|
||||
<button class="playback-button collapseLibrary" v-ripple v-b-tooltip.hover
|
||||
:title="chrome.sidebarCollapsed ? getLz('action.showLibrary') : getLz('action.hideLibrary')"
|
||||
@click="chrome.sidebarCollapsed = !chrome.sidebarCollapsed">
|
||||
<transition name="fade">
|
||||
|
@ -43,38 +43,40 @@
|
|||
<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>
|
||||
</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>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button stop" @click="mk.stop()"
|
||||
v-if="mk.isPlaying && mk.nowPlayingItem.attributes.playParams.kind == 'radioStation'"
|
||||
:title="$root.getLz('term.stop')" v-b-tooltip.hover></button>
|
||||
<button class="playback-button pause" @click="mk.pause()" v-else-if="mk.isPlaying"
|
||||
:title="$root.getLz('term.pause')" v-b-tooltip.hover></button>
|
||||
<button class="playback-button play" @click="mk.play()" v-else :title="$root.getLz('term.play')"
|
||||
v-b-tooltip.hover></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<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>
|
||||
<div class="app-chrome-item playback-control-buttons">
|
||||
<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>
|
||||
</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>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button stop" @click="mk.stop()"
|
||||
v-if="mk.isPlaying && mk.nowPlayingItem.attributes.playParams.kind == 'radioStation'"
|
||||
:title="$root.getLz('term.stop')" v-b-tooltip.hover></button>
|
||||
<button class="playback-button pause" @click="mk.pause()" v-else-if="mk.isPlaying"
|
||||
:title="$root.getLz('term.pause')" v-b-tooltip.hover></button>
|
||||
<button class="playback-button play" @click="mk.play()" v-else :title="$root.getLz('term.play')"
|
||||
v-b-tooltip.hover></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
|
@ -89,10 +91,10 @@
|
|||
<b-popover custom-class="mediainfo-popover" target="artworkLCD" triggers="hover" placement="bottom">
|
||||
<div class="content">
|
||||
<div class="shadow-artwork">
|
||||
<mediaitem-artwork :url="currentArtUrl" :url="currentArtUrlRaw"></mediaitem-artwork>
|
||||
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
|
||||
</div>
|
||||
<div class="popover-artwork">
|
||||
<mediaitem-artwork :size="210" :url="currentArtUrlRaw"></mediaitem-artwork>
|
||||
<mediaitem-artwork :size="210" :url="currentArtUrl"></mediaitem-artwork>
|
||||
</div>
|
||||
<div class="song-name">
|
||||
{{ mk.nowPlayingItem["attributes"]["name"] }}
|
||||
|
@ -121,7 +123,15 @@
|
|||
<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 spatial-icon" v-if="cfg.audio.maikiwiAudio.spatial === true"
|
||||
:title="$root.getLz('settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization') + ' (' + getProfileLz('CTS', cfg.audio.maikiwiAudio.spatialProfile) + ')'" v-b-tooltip.hover
|
||||
></div>
|
||||
<div class="audio-type lossless-icon" v-if="(mk.nowPlayingItem?.localFilesMetadata?.lossless ?? false) === true"
|
||||
:title="mk.nowPlayingItem?.localFilesMetadata?.bitDepth +'-bit / '+ mk.nowPlayingItem?.localFilesMetadata?.sampleRate/1000 + ' kHz ' + mk.nowPlayingItem.localFilesMetadata.container" v-b-tooltip.hover
|
||||
></div>
|
||||
<div class="audio-type ppe-icon" v-if="mk.nowPlayingItem.localFilesMetadata == null && cfg.audio.maikiwiAudio.ciderPPE === true"
|
||||
:title="$root.getLz('settings.option.audio.enableAdvancedFunctionality.ciderPPE')" v-b-tooltip.hover
|
||||
></div>
|
||||
</div>
|
||||
<div class="info-rect">
|
||||
<div class="song-name"
|
||||
|
@ -183,16 +193,28 @@
|
|||
</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" svg-icon-name="home" page="home">
|
||||
</sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.listenNow')" svg-icon="./assets/feather/play-circle.svg"
|
||||
<sidebar-library-item :name="$root.getLz('term.listenNow')" svg-icon="./assets/feather/play-circle.svg" svg-icon-name="listenNow"
|
||||
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.browse')" svg-icon="./assets/feather/globe.svg" svg-icon-name="browse" page="browse">
|
||||
</sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.radio')" svg-icon="./assets/feather/radio.svg" page="radio">
|
||||
<sidebar-library-item :name="$root.getLz('term.radio')" svg-icon="./assets/feather/radio.svg" svg-icon-name="radio" page="radio">
|
||||
</sidebar-library-item>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -208,21 +230,21 @@
|
|||
:title="formatVolumeTooltip()" />
|
||||
</div>
|
||||
<div class="app-chrome-item generic">
|
||||
<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'))"
|
||||
<button class="playback-button--small cast" :title="$root.getLz('term.cast')" v-ripple
|
||||
@click="cfg.advanced.AudioContext ? modals.castMenu = true : (cfg.advanced.AudioContext = true, modals.castMenu = true)"
|
||||
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
|
||||
<button class="playback-button--small queue" :title="$root.getLz('term.queue')" v-b-tooltip.hover v-ripple
|
||||
: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
|
||||
<button class="playback-button--small lyrics" :title="$root.getLz('term.lyrics')" v-b-tooltip.hover v-ripple
|
||||
: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'}" v-ripple></button>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
@ -230,9 +252,9 @@
|
|||
<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="$root.appRoute('search');" @focus="search.showHints = true"
|
||||
@blur="setTimeout(()=>{search.showHints = false}, 300)"
|
||||
v-on:keyup.enter="searchQuery();search.showHints = false" @change="showSearch();" @input="getSearchHints()"
|
||||
v-on:keyup.enter="searchQuery();search.showHints = false" @change="$root.appRoute('search');" @input="getSearchHints()"
|
||||
:placeholder="$root.getLz('term.search') + '...'" v-model="search.term" ref="searchInput"
|
||||
class="search-input" />
|
||||
|
||||
|
@ -257,8 +279,8 @@
|
|||
</div>
|
||||
</div>
|
||||
<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>
|
||||
<button class="app-mainmenu" @blur="mainMenuVisibility(false)" @click="mainMenuVisibility(true)"
|
||||
@contextmenu="mainMenuVisibility(true)" :class="{active: chrome.menuOpened}"></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -25,12 +25,18 @@
|
|||
<transition name="modal">
|
||||
<castmenu v-if="modals.castMenu"></castmenu>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<pathmenu v-if="modals.pathMenu"></pathmenu>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<airplay-modal v-if="modals.airplayPW"></airplay-modal>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<plugin-menu v-if="modals.pluginMenu"></plugin-menu>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<settings-window v-if="modals.settings"></settings-window>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<eq-view v-if="modals.equalizer"></eq-view>
|
||||
</transition>
|
||||
|
|
|
@ -1,303 +0,0 @@
|
|||
<div id="app-sidebar" v-if="!chrome.sidebarCollapsed">
|
||||
<template >
|
||||
<template v-if="getThemeDirective('windowLayout') != 'twopanel'">
|
||||
<div class="app-sidebar-header">
|
||||
<div class="search-input-container">
|
||||
<div class="search-input--icon"></div>
|
||||
<input
|
||||
type="search"
|
||||
spellcheck="false"
|
||||
@click="showSearch()"
|
||||
@focus="search.showHints = true"
|
||||
@blur="setTimeout(()=>{search.showHints = false}, 300)"
|
||||
v-on:keyup.enter="searchQuery();search.showHints = false"
|
||||
@change="showSearch();"
|
||||
@input="getSearchHints()"
|
||||
:placeholder="$root.getLz('term.search') + '...'"
|
||||
v-model="search.term"
|
||||
ref="searchInput"
|
||||
class="search-input"
|
||||
/>
|
||||
|
||||
<div
|
||||
class="search-hints-container"
|
||||
v-if="search.showHints && search.hints.length != 0"
|
||||
>
|
||||
<div class="search-hints">
|
||||
<button
|
||||
class="search-hint text-overflow-elipsis"
|
||||
v-for="hint in search.hints"
|
||||
@click="search.term = hint;search.showHints = false;searchQuery(hint)"
|
||||
>
|
||||
{{ hint }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<div class="app-sidebar-content" scrollaxis="y">
|
||||
<!-- AM Navigation -->
|
||||
<template v-if="getThemeDirective('windowLayout') != 'twopanel'">
|
||||
<div
|
||||
class="app-sidebar-header-text"
|
||||
@click="cfg.general.sidebarCollapsed.cider = !cfg.general.sidebarCollapsed.cider"
|
||||
:class="{collapsed: cfg.general.sidebarCollapsed.cider}"
|
||||
>
|
||||
{{ $root.getLz("app.name") }}
|
||||
</div>
|
||||
<template v-if="!cfg.general.sidebarCollapsed.cider">
|
||||
<sidebar-library-item
|
||||
:name="$root.getLz('home.title')"
|
||||
svg-icon="./assets/feather/home.svg"
|
||||
page="home"
|
||||
>
|
||||
</sidebar-library-item>
|
||||
</template>
|
||||
|
||||
<div
|
||||
class="app-sidebar-header-text"
|
||||
@click="cfg.general.sidebarCollapsed.applemusic = !cfg.general.sidebarCollapsed.applemusic"
|
||||
:class="{collapsed: cfg.general.sidebarCollapsed.applemusic}"
|
||||
>
|
||||
{{ $root.getLz("term.appleMusic") }}
|
||||
</div>
|
||||
<template v-if="!cfg.general.sidebarCollapsed.applemusic">
|
||||
<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>
|
||||
</template>
|
||||
</template>
|
||||
|
||||
<div
|
||||
class="app-sidebar-header-text"
|
||||
@click="cfg.general.sidebarCollapsed.library = !cfg.general.sidebarCollapsed.library"
|
||||
:class="{collapsed: cfg.general.sidebarCollapsed.library}"
|
||||
>
|
||||
{{ $root.getLz("term.library") }}
|
||||
</div>
|
||||
<template v-if="!cfg.general.sidebarCollapsed.library">
|
||||
<sidebar-library-item
|
||||
:name="$root.getLz('term.recentlyAdded')"
|
||||
svg-icon="./assets/feather/plus-circle.svg"
|
||||
v-if="cfg.general.sidebarItems.recentlyAdded"
|
||||
page="library-recentlyadded"
|
||||
></sidebar-library-item>
|
||||
<sidebar-library-item
|
||||
:name="$root.getLz('term.songs')"
|
||||
svg-icon="./assets/feather/music.svg"
|
||||
v-if="cfg.general.sidebarItems.songs"
|
||||
page="library-songs"
|
||||
></sidebar-library-item>
|
||||
<sidebar-library-item
|
||||
:name="$root.getLz('term.albums')"
|
||||
svg-icon="./assets/feather/disc.svg"
|
||||
v-if="cfg.general.sidebarItems.albums"
|
||||
page="library-albums"
|
||||
></sidebar-library-item>
|
||||
<sidebar-library-item
|
||||
:name="$root.getLz('term.artists')"
|
||||
svg-icon="./assets/feather/user.svg"
|
||||
v-if="cfg.general.sidebarItems.artists"
|
||||
page="library-artists"
|
||||
></sidebar-library-item>
|
||||
<sidebar-library-item
|
||||
:name="$root.getLz('term.videos')"
|
||||
svg-icon="./assets/feather/video.svg"
|
||||
v-if="cfg.general.sidebarItems.videos"
|
||||
page="library-videos"
|
||||
></sidebar-library-item>
|
||||
<sidebar-library-item
|
||||
:name="$root.getLz('term.podcasts')"
|
||||
svg-icon="./assets/feather/mic.svg"
|
||||
v-if="cfg.general.sidebarItems.podcasts"
|
||||
page="podcasts"
|
||||
>
|
||||
</sidebar-library-item>
|
||||
</template>
|
||||
|
||||
<template v-if="getPlaylistFolderChildren('p.applemusic').length != 0">
|
||||
<div
|
||||
class="app-sidebar-header-text"
|
||||
@click="cfg.general.sidebarCollapsed.amplaylists = !cfg.general.sidebarCollapsed.amplaylists"
|
||||
@contextmenu="playlistHeaderContextMenu"
|
||||
:class="{collapsed: cfg.general.sidebarCollapsed.amplaylists}"
|
||||
>
|
||||
{{ $root.getLz("term.appleMusic") }}
|
||||
{{ $root.getLz("term.playlists") }}
|
||||
</div>
|
||||
<template v-if="!cfg.general.sidebarCollapsed.amplaylists">
|
||||
<sidebar-playlist
|
||||
v-for="item in getPlaylistFolderChildren('p.applemusic')"
|
||||
:item="item"
|
||||
>
|
||||
</sidebar-playlist>
|
||||
</template>
|
||||
</template>
|
||||
<div
|
||||
class="app-sidebar-header-text"
|
||||
@click="cfg.general.sidebarCollapsed.playlists = !cfg.general.sidebarCollapsed.playlists"
|
||||
@contextmenu="playlistHeaderContextMenu"
|
||||
:class="{collapsed: cfg.general.sidebarCollapsed.playlists}"
|
||||
>
|
||||
{{ $root.getLz("term.playlists") }}
|
||||
</div>
|
||||
<template v-if="!cfg.general.sidebarCollapsed.playlists">
|
||||
<button class="app-sidebar-item" @click="playlistHeaderContextMenu">
|
||||
<div class="sidebar-icon">
|
||||
<svg
|
||||
width="46"
|
||||
height="46"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="2"
|
||||
viewBox="0 0 24 24"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path d="M12 5v14"></path>
|
||||
<path d="M5 12h14"></path>
|
||||
</svg>
|
||||
</div>
|
||||
{{ getLz("action.createNew") }}
|
||||
</button>
|
||||
<sidebar-playlist
|
||||
v-for="item in getPlaylistFolderChildren('p.playlistsroot')"
|
||||
:item="item"
|
||||
>
|
||||
</sidebar-playlist>
|
||||
</template>
|
||||
</div>
|
||||
<div class="app-sidebar-footer display--small app-sidebar-footer--controls">
|
||||
<div
|
||||
class="app-playback-controls"
|
||||
v-if="mkReady()"
|
||||
@contextmenu="nowPlayingContextMenu"
|
||||
>
|
||||
<div class="control-buttons">
|
||||
<div class="app-chrome-item">
|
||||
<button
|
||||
class="playback-button--small shuffle"
|
||||
v-if="mk.shuffleMode == 0"
|
||||
@click="mk.shuffleMode = 1"
|
||||
:title="$root.getLz('term.enableShuffle')"
|
||||
v-b-tooltip.hover.righttop
|
||||
></button>
|
||||
<button
|
||||
class="playback-button--small shuffle active"
|
||||
v-else
|
||||
@click="mk.shuffleMode = 0"
|
||||
:title="$root.getLz('term.disableShuffle')"
|
||||
v-b-tooltip.hover.righttop
|
||||
></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button
|
||||
class="playback-button previous"
|
||||
@click="prevButton()"
|
||||
:title="$root.getLz('term.previous')"
|
||||
v-b-tooltip.hover
|
||||
></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button
|
||||
class="playback-button pause"
|
||||
@click="mk.pause()"
|
||||
v-if="mk.isPlaying"
|
||||
:title="$root.getLz('term.pause')"
|
||||
v-b-tooltip.hover
|
||||
></button>
|
||||
<button
|
||||
class="playback-button play"
|
||||
@click="mk.play()"
|
||||
v-else
|
||||
:title="$root.getLz('term.play')"
|
||||
v-b-tooltip.hover
|
||||
></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button
|
||||
class="playback-button next"
|
||||
@click="skipToNextItem()"
|
||||
:title="$root.getLz('term.next')"
|
||||
v-b-tooltip.hover
|
||||
></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button
|
||||
class="playback-button--small repeat"
|
||||
v-if="mk.repeatMode == 0"
|
||||
@click="mk.repeatMode = 1"
|
||||
:title="$root.getLz('term.enableRepeatOne')"
|
||||
v-b-tooltip.hover
|
||||
></button>
|
||||
<button
|
||||
class="playback-button--small repeat repeatOne"
|
||||
@click="mk.repeatMode = 2"
|
||||
v-else-if="mk.repeatMode == 1"
|
||||
:title="$root.getLz('term.disableRepeatOne')"
|
||||
v-b-tooltip.hover
|
||||
></button>
|
||||
<button
|
||||
class="playback-button--small repeat active"
|
||||
@click="mk.repeatMode = 0"
|
||||
v-else-if="mk.repeatMode == 2"
|
||||
:title="$root.getLz('term.disableRepeat')"
|
||||
v-b-tooltip.hover
|
||||
></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-chrome-item volume">
|
||||
<div class="input-container">
|
||||
<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"
|
||||
class=""
|
||||
@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>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="app-sidebar-notification backgroundNotification"
|
||||
v-if="library.backgroundNotification.show"
|
||||
>
|
||||
<div class="message">
|
||||
{{ library.backgroundNotification.message }} ({{
|
||||
library.backgroundNotification.progress
|
||||
}}
|
||||
/ {{ library.backgroundNotification.total }})
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
|
@ -59,7 +59,7 @@
|
|||
}
|
||||
|
||||
this.hls.attachMedia(this.$refs.video);
|
||||
this.hls.loadSource(this.video);
|
||||
this.hls.loadSource(this.video, p);
|
||||
let u = this.hls;
|
||||
var quality = app.cfg.visual.animated_artwork_qualityLevel;
|
||||
setTimeout(() => {
|
||||
|
|