Revert "Develop > main"
|
@ -3,7 +3,7 @@ jobs:
|
|||
build:
|
||||
working_directory: ~/Cider
|
||||
docker:
|
||||
- image: circleci/node:16-browsers
|
||||
- image: circleci/node:16
|
||||
steps:
|
||||
- checkout
|
||||
- run:
|
||||
|
@ -12,13 +12,13 @@ jobs:
|
|||
- restore_cache:
|
||||
name: Restore Yarn Package Cache
|
||||
keys:
|
||||
- yarn-packages-{{ checksum "cider-yarn.lock" }}
|
||||
- yarn-packages-{{ checksum "yarn.lock" }}
|
||||
- run:
|
||||
name: Install Dependencies
|
||||
command: yarn install --frozen-lockfile --cache-folder ~/.cache/yarn
|
||||
- save_cache:
|
||||
name: Save Yarn Package Cache
|
||||
key: yarn-packages-{{ checksum "cider-yarn.lock" }}
|
||||
key: yarn-packages-{{ checksum "yarn.lock" }}
|
||||
paths:
|
||||
- ~/.cache/yarn
|
||||
- run:
|
||||
|
@ -32,14 +32,6 @@ jobs:
|
|||
sudo dpkg --add-architecture i386
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install -y wine32
|
||||
sudo apt-get install -y x11vnc
|
||||
- run:
|
||||
name: Start X VNC Server
|
||||
command: x11vnc -forever -nopw -create
|
||||
background: true
|
||||
#- run:
|
||||
#name: Base Functionality Testing
|
||||
#command: yarn test
|
||||
- store_test_results:
|
||||
path: test-results
|
||||
- run:
|
||||
|
|
1
.gitignore
vendored
|
@ -1,7 +1,6 @@
|
|||
# Building
|
||||
dist
|
||||
build
|
||||
.flatpak*
|
||||
|
||||
# Misc
|
||||
.idea
|
||||
|
|
Before Width: | Height: | Size: 2.2 KiB |
8691
cider-yarn.lock
|
@ -49,14 +49,12 @@ modules:
|
|||
# Set the Electron cache directory.
|
||||
# (The directory format is: /run/build/MODULE_NAME/flatpak-node/electron-cache)
|
||||
ELECTRON_CACHE: '/run/build/cider/flatpak-node/electron-cache'
|
||||
XDG_CACHE_HOME: /run/build/cider/flatpak-node/cache
|
||||
# Sets the directory where Node is located so way npm won't download the headers.
|
||||
npm_config_nodedir: 'flatpak-node/node-gyp/electron-current'
|
||||
npm_config_nodedir: '/usr/lib/sdk/node14'
|
||||
build-commands:
|
||||
# Have Yarn use the offline mirror.
|
||||
- 'HOME=$PWD yarn config --offline set yarn-offline-mirror $FLATPAK_BUILDER_BUILDDIR/flatpak-node/yarn-mirror'
|
||||
# Download the packages
|
||||
- 'cp cider-yarn.lock yarn.lock'
|
||||
# Download the packages.
|
||||
- 'yarn install --offline'
|
||||
# If you were using npm with electron-webpack/electron-builder, then the above two commands
|
||||
# would look more like the npm commands in the vanilla-quick-start manifest, just without
|
||||
|
@ -76,7 +74,7 @@ modules:
|
|||
sources:
|
||||
- type: git
|
||||
url: https://github.com/ciderapp/cider
|
||||
branch: develop
|
||||
branch: main
|
||||
# Add the flatpak-node-generator generated sources.
|
||||
- generated-sources.json
|
||||
# Our runner script.
|
||||
|
|
|
@ -29,11 +29,10 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@sentry/electron": "^2.5.4",
|
||||
"@sentry/integrations": "^6.17.4",
|
||||
"discord-rpc": "^4.0.1",
|
||||
"ejs": "^3.1.6",
|
||||
"electron-fetch": "^1.7.4",
|
||||
"electron-log": "^4.4.5",
|
||||
"electron-log": "^4.4.4",
|
||||
"electron-notarize": "^1.1.1",
|
||||
"electron-packager": "^15.4.0",
|
||||
"electron-store": "^8.0.1",
|
||||
|
@ -120,8 +119,8 @@
|
|||
"extends": null,
|
||||
"files": [
|
||||
"./build/**/*",
|
||||
"./src/**/*",
|
||||
"./resources/icons/**/*"
|
||||
"./resources/icons/icon.*",
|
||||
"./src/**/*"
|
||||
],
|
||||
"linux": {
|
||||
"target": [
|
||||
|
|
BIN
resources/icons/media/dark/next-inactive.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
BIN
resources/icons/media/dark/pause-inactive.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
BIN
resources/icons/media/dark/play-inactive.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
BIN
resources/icons/media/dark/previous-inactive.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
BIN
resources/icons/media/light/next-inactive.png
Normal file
After Width: | Height: | Size: 2.2 KiB |
BIN
resources/icons/media/light/next.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
resources/icons/media/light/pause-inactive.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/icons/media/light/pause.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/icons/media/light/play-inactive.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
resources/icons/media/light/play.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
resources/icons/media/light/previous-inactive.png
Normal file
After Width: | Height: | Size: 2.1 KiB |
BIN
resources/icons/media/light/previous.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
|
@ -16,43 +16,4 @@ Several changes have been made to configuration options and will be listed below
|
|||
been modified, the ones not mentioned in the list need modifying.
|
||||
|
||||
* `settings.option.experimental.closeButtonBehaviour`: Changed to `close_button_hide` - Should be "Close Button Should Hide the Application". `.quit`, `.minimizeTaskbar` and `.minimizeTray` have been removed. Translations done for en_US.
|
||||
* `action.update`: Added for `en_US`.
|
||||
* `term.topResult`: "Top Result" - Added for `en_US`.
|
||||
* `term.sharedPlaylists`: "Shared Playlists" - Added for `en_US`.
|
||||
* `term.people`: "People" - Added for `en_US`.
|
||||
|
||||
Updated 02/02/2022 17:16 UTC
|
||||
|
||||
* `term.newpreset.name`: Added for `en_US`.
|
||||
* `term.addedpreset`: Added for `en_US`.
|
||||
* `term.deletepreset.warn`: Added for `en_US`.
|
||||
* `term.deletedpreset`: Added for `en_US`.
|
||||
* `term.musicVideos`: Added for `en_US`.
|
||||
* `term.stations`: Added for `en_US`.
|
||||
* `term.curators`: Added for `en_US`.
|
||||
* `term.appleCurators`: Added for `en_US`.
|
||||
* `term.radioShows`: Added for `en_US`.
|
||||
* `term.recordLabels`: Added for `en_US`.
|
||||
* `term.videoExtras`: Added for `en_US`.
|
||||
* `term.top`: Added for `en_US`.
|
||||
* `action.newpreset`: Added for `en_US`.
|
||||
* `action.deletepreset`: Added for `en_US`.
|
||||
|
||||
Updated 04/02/2022 10:00 UTC
|
||||
|
||||
* `term.history`: Added for `en_US`.
|
||||
* `action.copy`: Added for `en_US`.
|
||||
* `settings.header.visual.theme`: Added for `en_US`.
|
||||
* `settings.option.visual.theme.default`: Added for `en_US`.
|
||||
* `settings.option.visual.theme.dark`: Added for `en_US`.
|
||||
* `settings.option.experimental.copy_log`: Added for `en_US`.
|
||||
* `settings.option.experimental.inline_playlists`: Added for `en_US`.
|
||||
|
||||
Update 05/02/2022 09:00 UTC
|
||||
|
||||
* `settings.header.audio.quality.hireslossless`: Added for `en_US`.
|
||||
* `settings.header.audio.quality.hireslossless.description`: Added for `en_US`.
|
||||
* `settings.header.audio.quality.lossless`: Added for `en_US`.
|
||||
* `settings.header.audio.quality.lossless.description`: Added for `en_US`.
|
||||
* `settings.option.audio.enableAdvancedFunctionality.decryptLLPW`: Added for `en_US`.
|
||||
* `settings.option.audio.enableAdvancedFunctionality.decryptLLPW.description`: Added for `en_US`.
|
||||
* `action.update`: Added for `en_US`.
|
|
@ -1,335 +0,0 @@
|
|||
{ // Base File
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "Engwish (OwO)", // name of language in native language
|
||||
"i18n.languageNameEnglish": "Engwish (OwO)", // name of language in English
|
||||
"i18n.category": "fun", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "@deerwithacurl", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
// App info
|
||||
"app.name": "Cidew",
|
||||
|
||||
"date.format": "${m} ${d}, ${y}",
|
||||
|
||||
// Dialogs
|
||||
"dialog.cancel": "Nu",
|
||||
"dialog.ok": "Oki",
|
||||
|
||||
// Notification
|
||||
"notification.updatingLibrarySongs": "Updating wibwawy songs...",
|
||||
"notification.updatingLibraryAlbums": "Updating wibwawy awbums...",
|
||||
"notification.updatingLibraryArtists": "Updating wibwawy awtists...",
|
||||
// Terms
|
||||
"term.appleInc": "Appwe Inc.",
|
||||
"term.appleMusic": "Appwe Mewsic",
|
||||
"term.applePodcasts": "Appwe Pawdcasts",
|
||||
"term.itunes": "iTuwunes",
|
||||
"term.github": "GitHuwub",
|
||||
"term.discord": "Discowd",
|
||||
"term.learnMore": "Weawn moar",
|
||||
"term.accountSettings": "Accownt Settings",
|
||||
"term.logout": "Wogout",
|
||||
"term.login": "Wogin",
|
||||
"term.about": "Abowt",
|
||||
"term.privateSession": "Pwivate Session OwO",
|
||||
"term.queue": "Quwue",
|
||||
"term.search": "Seawch",
|
||||
"term.library": "Wibwawy",
|
||||
"term.listenNow": "Wisten Nao",
|
||||
"term.browse": "Bwowse",
|
||||
"term.radio": "Wadio",
|
||||
"term.recentlyAdded": "Wecentwy Added",
|
||||
"term.songs": "Sawngs",
|
||||
"term.albums": "Awbums",
|
||||
"term.artists": "Awtists",
|
||||
"term.podcasts": "Pawdcasts",
|
||||
"term.playlists": "Pwaywists",
|
||||
"term.playlist": "Pwaywist",
|
||||
"term.newPlaylist": "Nyew Pwaywist",
|
||||
"term.newPlaylistFolder": "New Pwaywist Fowdew",
|
||||
"term.createNewPlaylist": "Cweate New Pwaywist",
|
||||
"term.createNewPlaylistFolder": "Cweate New Pwaywist Fowdew",
|
||||
"term.deletePlaylist": "Awe chu suwe chu wan to dewete dis pwaywist?",
|
||||
"term.play": "Pway",
|
||||
"term.pause": "Pawse",
|
||||
"term.previous": "Pwevious",
|
||||
"term.next": "Next",
|
||||
"term.shuffle": "Shuffwe",
|
||||
"term.repeat": "Wepeat",
|
||||
"term.volume": "Vowume",
|
||||
"term.mute": "Muwute",
|
||||
"term.unmute": "Unmuwute",
|
||||
"term.share": "Shawe",
|
||||
"term.share.success": "Copied to cwipboawd",
|
||||
"term.settings": "Settings",
|
||||
"term.seeAll": "See Aww",
|
||||
"term.sortBy": "Sowt By",
|
||||
"term.sortBy.album": "Awbum",
|
||||
"term.sortBy.artist": "Awtist",
|
||||
"term.sortBy.name": "Name",
|
||||
"term.sortBy.genre": "Genwe",
|
||||
"term.sortBy.releaseDate": "Wewease Date",
|
||||
"term.sortBy.duration": "Duwation",
|
||||
"term.sortOrder": "A-Z",
|
||||
"term.sortOrder.ascending": "Ascending",
|
||||
"term.sortOrder.descending": "Descending",
|
||||
"term.viewAs": "View As",
|
||||
"term.viewAs.coverArt": "Covew Awt",
|
||||
"term.viewAs.list": "Wist",
|
||||
"term.size": "Size",
|
||||
"term.size.normal": "Nowmaw",
|
||||
"term.size.compact": "Wittwe",
|
||||
"term.enable": "Enabwe",
|
||||
"term.disable": "Disabwe",
|
||||
"term.enabled": "Enabwed",
|
||||
"term.disabled": "Disabwed",
|
||||
"term.connect": "Connect",
|
||||
"term.connecting": "Connecting",
|
||||
"term.disconnect": "Disconnect",
|
||||
"term.authed": "Authed",
|
||||
"term.confirm": "Confiwm?",
|
||||
"term.more": "Moar",
|
||||
"term.less": "Wess",
|
||||
"term.showMore": "Show moar",
|
||||
"term.showLess": "Show wess",
|
||||
"term.topSongs" : "Top Songs",
|
||||
"term.latestReleases": "Watest Weweases",
|
||||
"term.time.added": "Added",
|
||||
"term.time.released": "Weweased",
|
||||
"term.time.updated": "Updated",
|
||||
"term.time.hours": "houws",
|
||||
"term.time.hour": "houw",
|
||||
"term.time.minutes": "minuwtes",
|
||||
"term.time.minute": "minuwte",
|
||||
"term.time.seconds": "seconds",
|
||||
"term.time.second": "second",
|
||||
"term.fullscreenView": "Fuwwwscween View",
|
||||
"term.defaultView": "Defauwt View",
|
||||
"term.audioSettings": "Audiowo Settings",
|
||||
"term.clearAll": "Cweaw Aww",
|
||||
"term.recentStations": "Wecent Stations",
|
||||
"term.language": "Wanguage",
|
||||
"term.funLanguages": "Fun",
|
||||
"term.noLyrics": "Woading... / Wywics not found./ Instwumentaw.",
|
||||
"term.copyright": "Copywight",
|
||||
"term.rightsReserved": "All Wights Wesewved.",
|
||||
"term.sponsor": "Sponsow dis pwoject",
|
||||
"term.ciderTeam": "Cidew Team",
|
||||
"term.developer": "Devewopew",
|
||||
"term.socialTeam": "Sociaw Team",
|
||||
"term.socials": "Sociaws",
|
||||
"term.contributors": "Contwibutows",
|
||||
"term.equalizer": "Equawizew",
|
||||
"term.reset": "Weset",
|
||||
"term.tracks": "twacks", // Assume x amount of tracks. e.g. 50 tracks
|
||||
"term.videos": "Videowos",
|
||||
"term.menu": "Menuwu",
|
||||
"term.check": "Check",
|
||||
"term.aboutArtist": "About {{artistName}}", // e.g. 'About Doja Cat'
|
||||
"term.updateCider": "Update Cidew",
|
||||
"term.topResult": "Top Wesuwt", // Search Results
|
||||
"term.sharedPlaylists": "Shawed Pwaywists", // Search Results
|
||||
"term.people": "Peopwe", // Search Results
|
||||
"term.newpreset.name": "New EQ Pweset Name", // Equalizer Preset
|
||||
"term.addedpreset": "Added Pweset",
|
||||
"term.deletepreset.warn": "Awe chu suwe chu want to dewete dis pweset?",
|
||||
"term.deletedpreset": "Wemoved pweset",
|
||||
"term.musicVideos": "Music Videowos", // Search page friendlyTypes
|
||||
"term.stations": "Stations",
|
||||
"term.curators": "Cuwatows",
|
||||
"term.appleCurators": "Appwe Cuwatows",
|
||||
"term.radioShows": "Wadio Shows",
|
||||
"term.recordLabels": "Wecowd Wabews",
|
||||
"term.videoExtras": "Videowo Extwas",
|
||||
"term.top": "Top",
|
||||
|
||||
// Home
|
||||
"home.title": "Home",
|
||||
"home.recentlyPlayed": "Wecentwy Pwayed",
|
||||
"home.recentlyAdded": "Wecentwy Added",
|
||||
"home.artistsFeed": "Youw Awtists Feed",
|
||||
"home.artistsFeed.noArtist": "Fowwow some awtists fiwst and theiw watest weleases wiww be here",
|
||||
"home.madeForYou": "Made Fow Chu",
|
||||
"home.friendsListeningTo": "Fwiends Wistening To",
|
||||
"home.followedArtists": "Fowwowed Awtists",
|
||||
// Errors
|
||||
"error.appleMusicSubRequired": "Appwe Music wequiwes a subscwiption.",
|
||||
"error.connectionError": "Thewe was a pwobwem connecting to Appwe Mewsic.",
|
||||
"error.noResults": "No Wesuwts.",
|
||||
"error.noResults.description": "Twy a new seawch.",
|
||||
|
||||
//Podcasts
|
||||
"podcast.followOnCider": "Fowwow On Cidew",
|
||||
"podcast.followedOnCider": "Fowwowing On Cidew",
|
||||
"podcast.subscribeOnItunes": "Subscwibe On iTuwunes",
|
||||
"podcast.subscribedOnItunes": "Subscwibed On iTuwunes",
|
||||
"podcast.itunesStore": "iTuwunes Stowe",
|
||||
"podcast.episodes": "Episowodes",
|
||||
"podcast.playEpisode": "Pway Episowode",
|
||||
"podcast.website": "Pawdcast Website",
|
||||
|
||||
// Actions
|
||||
"action.addToLibrary": "Add to Wibwawy",
|
||||
"action.addToLibrary.success": "Added to Wibwawy",
|
||||
"action.addToLibrary.error": "Ewwow Adding to Wibwawy",
|
||||
"action.removeFromLibrary": "Wemove fwom Wibwawy",
|
||||
"action.removeFromLibrary.success": "Wemoved fwom Wibwawy",
|
||||
"action.addToQueue": "Add to Quwue",
|
||||
"action.addToQueue.success": "Added to Quwue",
|
||||
"action.addToQueue.error": "Ewwow Adding to Quwue",
|
||||
"action.removeFromQueue": "Wemove fwom Quwue",
|
||||
"action.removeFromQueue.success": "Wemoved fwom Quwue",
|
||||
"action.removeFromQueue.error": "Ewwow Wemoving fwom Quwue",
|
||||
"action.createPlaylist": "Cweate a New Pwaywist",
|
||||
"action.addToPlaylist": "Add to Pwaywist",
|
||||
"action.removeFromPlaylist": "Wemove fwom Pwaywist",
|
||||
"action.addToFavorites": "Add to Favowites",
|
||||
"action.follow": "Fowwow",
|
||||
"action.follow.success": "Fowwowed",
|
||||
"action.follow.error": "Ewwow Fowwowing",
|
||||
"action.unfollow": "Unfowwow",
|
||||
"action.unfollow.success": "Unfowwowed",
|
||||
"action.unfollow.error": "Ewwow Unfowwowing",
|
||||
"action.playNext": "Pway Next",
|
||||
"action.playLater": "Pway Watew",
|
||||
"action.startRadio": "Stawt Wadio",
|
||||
"action.goToArtist": "Go to Awtist",
|
||||
"action.goToAlbum": "Go to Awbum",
|
||||
"action.moveToTop": "Move to top",
|
||||
"action.share": "Shawe",
|
||||
"action.rename": "Wename",
|
||||
"action.love": "Wuv",
|
||||
"action.unlove": "Unwuv",
|
||||
"action.dislike": "Diswike",
|
||||
"action.undoDislike": "Undo diswike",
|
||||
"action.showWebRemoteQR": "Web Wiimote",
|
||||
"action.playTracksNext": "Pway ${app.selectedMediaItems.length} twacks next",
|
||||
"action.playTracksLater": "Pway ${app.selectedMediaItems.length} twacks latew",
|
||||
"action.removeTracks": "Wemove ${self.selectedItems.length} twacks fwom quwue",
|
||||
"action.import": "Impowt",
|
||||
"action.export": "Expowt",
|
||||
"action.showAlbum": "Show Compwete Awbum",
|
||||
"action.tray.minimize": "Minimize to Tway",
|
||||
"action.tray.quit": "Quit",
|
||||
"action.tray.show": "Show",
|
||||
"action.update": "Update",
|
||||
"action.newpreset": "New Pweset...", // Equalizer Preset
|
||||
"action.deletepreset": "Dewete Pweset",
|
||||
|
||||
// Settings - General
|
||||
"settings.header.general": "Genewaw",
|
||||
"settings.header.general.description": "Adjust the genewaw settings fow Cidew.",
|
||||
"settings.option.general.language": "Wanguage",
|
||||
|
||||
// Language optgroups
|
||||
"settings.option.general.language.main": "Wanguages",
|
||||
"settings.option.general.language.fun": "Fun Wanguages",
|
||||
"settings.option.general.language.unsorted": "Unsowted",
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "Audiowo",
|
||||
"settings.header.audio.description": "Adjust the audiowo settings fow Cidew.",
|
||||
"settings.option.audio.quality": "Audiowo Quawity", // Dropdown
|
||||
"settings.header.audio.quality.hireslossless": "Hi-res losswess",
|
||||
"settings.header.audio.quality.hireslossless.description": "(uwp to 24-bit/192 khz)",
|
||||
"settings.header.audio.quality.lossless": "Losswess",
|
||||
"settings.header.audio.quality.lossless.description": "(uwp to 24-bit/48 khz)",
|
||||
"settings.header.audio.quality.high": "High",
|
||||
"settings.header.audio.quality.low": "Low", // keeping as low because confusion with the word wow
|
||||
"settings.header.audio.quality.auto": "Autowo",
|
||||
"settings.option.audio.seamlessTransition": "Seamwess Audiowo Twansition", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality": "Enabwe Advanced Functionawity", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "Enabwing AudiowoContext functionawity wiww awwow fow extended audiowo featuwes wike Audiowo Nowmawization, Equalizews and Visuawizews, howevew on some systems dis may cause stuttewing in audiowo twacks.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW": "Decwypt losswess pwayback wowkfwow", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW.description": "Enabwes the abiwity fow cidew to decwypt losswess auwdio fiwes. A minow pewfowmance hit wiww occuww.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audiowo Nowmawization", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Nowmawizes peak vowume fow individuaw twacks to cweate a moar unifowm wistening expewience.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audiowo Spatiawization", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Spatiawize audiowo and make audiowo moar 3-dimensionaw (note: Dis is not Dowby Atmos)",
|
||||
// Settings - Visual
|
||||
"settings.header.visual": "Visuaw",
|
||||
"settings.header.visual.description": "Adjust the visuaw settings fow Cidew.",
|
||||
"settings.option.visual.windowBackgroundStyle": "Window Backgwound Stywe", // Toggle
|
||||
"settings.header.visual.windowBackgroundStyle.none": "None",
|
||||
"settings.header.visual.windowBackgroundStyle.artwork": "Awtwowk",
|
||||
"settings.header.visual.windowBackgroundStyle.image": "Image",
|
||||
"settings.option.visual.animatedArtwork": "Animated Awtwowk", // Dropdown
|
||||
"settings.header.visual.animatedArtwork.always": "Awways",
|
||||
"settings.header.visual.animatedArtwork.limited": "Wimited to pages and speciaw entwies",
|
||||
"settings.header.visual.animatedArtwork.disable": "Disabwe evewywhewe",
|
||||
"settings.option.visual.animatedArtworkQuality": "Animated Awtwowk Quawity", // Dropdown
|
||||
"settings.header.visual.animatedArtworkQuality.low": "Low",
|
||||
"settings.header.visual.animatedArtworkQuality.medium": "Medium",
|
||||
"settings.header.visual.animatedArtworkQuality.high": "High",
|
||||
"settings.header.visual.animatedArtworkQuality.veryHigh": "Vewy High",
|
||||
"settings.header.visual.animatedArtworkQuality.extreme": "Extweme",
|
||||
"settings.option.visual.animatedWindowBackground": "Animated Window Backgwound", // Toggle
|
||||
"settings.option.visual.hardwareAcceleration": "Hawdwawe Accewewation", // Dropdown
|
||||
"settings.option.visual.hardwareAcceleration.description": "Wequiwes wewaunch",
|
||||
"settings.header.visual.hardwareAcceleration.default": "Defauwt",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.option.visual.showPersonalInfo": "Show Pewsonaw Info", // Toggle
|
||||
|
||||
// Settings - Lyrics
|
||||
"settings.header.lyrics": "Wywics",
|
||||
"settings.header.lyrics.description": "Adjust the wywics settings fow Cidew.",
|
||||
"settings.option.lyrics.enableMusixmatch": "Enabwe Musixmatch Wywics", // Toggle
|
||||
"settings.option.lyrics.enableMusixmatchKaraoke": "Enabwe Kawaoke Mode (Musixmatch onwy)", // Toggle
|
||||
"settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch Twanswation Pwefewwed Wanguage", // Dropdown
|
||||
"settings.option.lyrics.enableYoutubeLyrics": "Enabwe YouTube Wywics fow Mewsic Videowos", // Toggle
|
||||
|
||||
// Settings - Connectivity
|
||||
"settings.header.connectivity": "Connectivity",
|
||||
"settings.header.connectivity.description": "Adjust the connectivity settings fow Cidew.",
|
||||
"settings.option.connectivity.discordRPC": "Discowd Wich Pwesence", // Dropdown
|
||||
"settings.option.connectivity.playbackNotifications": "Pwayback Notifications", // Toggle
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.header.connectivity.discordRPC.cider": "Disway as 'Cider'",
|
||||
"settings.header.connectivity.discordRPC.appleMusic": "Dispway as 'Apple Music'",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "Cweaw Discowd Wich Pwesence on Paws", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "Wast.fm Scwobbwing", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "Wast.fm Scwobble Deway (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Enabwe Wast.fm Nao Pwaying",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Wemove featuwing awtists fwom song titwe (Wast.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Fiwtew wooped twack (Wast.fm)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "Expewimentaw",
|
||||
"settings.header.experimental.description": "Adjust the expewimentaw settings fow Cidew.",
|
||||
"settings.option.experimental.compactUI": "Wittwe UI", // Toggle
|
||||
"settings.option.experimental.close_button_hide": "Cwose Button Shouwd Hide the Appwication",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.notTurnedOn": "Audiowo Spatiawization is disabwed. To use, pwease enabwe it fiwst.",
|
||||
"spatial.spatialProperties": "Spatiaw Pwopewties",
|
||||
"spatial.width": "Width",
|
||||
"spatial.height": "Height",
|
||||
"spatial.depth": "Depth",
|
||||
"spatial.gain": "Gain",
|
||||
"spatial.roomMaterials": "Woom Matewiaws",
|
||||
"spatial.roomDimensions": "Woom Dimensions",
|
||||
"spatial.roomPositions": "Woom Positions",
|
||||
"spatial.setDimensions": "Set Dimensions",
|
||||
"spatial.setPositions": "Set Positions",
|
||||
"spatial.up": "Up",
|
||||
"spatial.front": "Fwont",
|
||||
"spatial.left": "Weft",
|
||||
"spatial.right": "Wight",
|
||||
"spatial.back": "Back",
|
||||
"spatial.down": "Down",
|
||||
"spatial.listener": "Wistenew",
|
||||
"spatial.audioSource": "Audiowo Souwce",
|
||||
|
||||
// Settings - Unfinished
|
||||
"settings.header.unfinished": "Unfinished",
|
||||
|
||||
// Web Remote
|
||||
"remote.web.title": "Cider Wiimote",
|
||||
"remote.web.description": "Scan da QR code to paiw chur phone up with dis Cidew instance",
|
||||
|
||||
// About
|
||||
"about.thanks": "Majow tanks to da Cidew Cowwective Team and aww of ouw contwibutows."
|
||||
}
|
|
@ -32,7 +32,7 @@
|
|||
"term.login": "piss in",
|
||||
"term.about": "piss info",
|
||||
"term.privateSession": "piss in private",
|
||||
"term.queue": "the toilet",
|
||||
"term.queue": "to be pissed",
|
||||
"term.search": "find piss",
|
||||
"term.library": "obtained piss",
|
||||
"term.listenNow": "piss now",
|
||||
|
@ -121,11 +121,9 @@
|
|||
"term.equalizer": "advanced piss configuration",
|
||||
"term.reset": "repiss",
|
||||
"term.tracks": "pisses", // Assume x amount of tracks. e.g. 50 tracks
|
||||
"term.videos": "piss videos",
|
||||
"term.videos": "piss videos 😳",
|
||||
"term.menu": "piss menu",
|
||||
"term.check": "piss!",
|
||||
"term.aboutArtist": "about pisser {{artistName}}", // e.g. 'About Doja Cat'
|
||||
"term.updateCider": "piss on cider",
|
||||
|
||||
// Home
|
||||
"home.title": "piss central",
|
||||
|
@ -156,8 +154,8 @@
|
|||
"action.addToLibrary": "obtain piss",
|
||||
"action.addToLibrary.success": "piss obtained",
|
||||
"action.addToLibrary.error": "error obtaining piss",
|
||||
"action.removeFromLibrary": "dump piss",
|
||||
"action.removeFromLibrary.success": "piss dumped",
|
||||
"action.removeFromLibrary": "unobtain piss",
|
||||
"action.removeFromLibrary.success": "piss unobtained",
|
||||
"action.addToQueue": "add to toilet",
|
||||
"action.addToQueue.success": "added to toilet",
|
||||
"action.addToQueue.error": "error adding to toilet",
|
||||
|
@ -193,10 +191,10 @@
|
|||
"action.import": "impiss",
|
||||
"action.export": "expiss",
|
||||
"action.showAlbum": "show complete piss collection",
|
||||
// Waiting on Core for moving plugin to app.ts
|
||||
"action.tray.minimize": "piss off to tray",
|
||||
"action.tray.quit": "piss off",
|
||||
"action.tray.show": "piss back",
|
||||
"action.update": "piss!",
|
||||
|
||||
// Settings - General
|
||||
"settings.header.general": "general",
|
||||
|
@ -275,7 +273,10 @@
|
|||
"settings.header.experimental": "piss lab",
|
||||
"settings.header.experimental.description": "mitochondria is the powerhouse of the cell",
|
||||
"settings.option.experimental.compactUI": "compact piss", // Toggle
|
||||
"settings.option.experimental.close_button_hide": "play hide-and-seek when clicking close button",
|
||||
"settings.option.experimental.closeButtonBehaviour": "piss off button behaviour",
|
||||
"settings.option.experimental.closeButtonBehaviour.quit": "ask cider to piss off",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "piss off to the taskbar",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "piss off to the tray",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
|
|
|
@ -29,11 +29,10 @@
|
|||
"term.learnMore": "|:ᒷᖋ∷リ ᒲᒍ∷ᒷ",
|
||||
"term.accountSettings": "ᖋᔮᔮᒍ⚍リᒣ ϟᒷᒣᒣ╎リ┤ϟ",
|
||||
"term.logout": "|:ᒍ┤ᒍ⚍ᒣ",
|
||||
"term.login": "|:ᒍ┤ ╎リ",
|
||||
"term.login": "|:ᒍ┤╎リ",
|
||||
"term.about": "ᖋᕊᒍ⚍ᒣ",
|
||||
"term.privateSession": "I!∷╎⍊ᖋᒣᒷ ϟᒷϟϟ╎ᒍリ",
|
||||
"term.queue": "ᑑ⚍ᒷ⚍ᒷ",
|
||||
"term.history": "⍑╎ϟᒣᒍ∷॥",
|
||||
"term.search": "ϟᒷᖋ∷ᔮ⍑",
|
||||
"term.library": "|:╎ᕊ∷ᖋ∷॥",
|
||||
"term.listenNow": "|:╎ϟᒣᒷリ",
|
||||
|
@ -46,11 +45,6 @@
|
|||
"term.podcasts": "I!ᒍ↸ᔮᖋϟᒣϟ",
|
||||
"term.playlists": "i!|:ᖋ॥|:╎ϟᒣϟ",
|
||||
"term.playlist": "i!|:ᖋ॥|:╎ϟᒣ",
|
||||
"term.newPlaylist": "リᒷ∴ i!|:ᖋ॥|:╎ϟᒣ",
|
||||
"term.newPlaylistFolder": "リᒷ∴ i!|:ᖋ॥|:╎ϟᒣ ⎓ᒍ|:↸ᒷ∷",
|
||||
"term.createNewPlaylist": "ᔮ∷ᒷᖋᒣᒷ リᒷ∴ i!|:ᖋ॥|:╎ϟᒣ",
|
||||
"term.createNewPlaylistFolder": "ᔮ∷ᒷᖋᒣᒷ リᒷ∴ i!|:ᖋ॥|:╎ϟᒣ ⎓ᒍ|:↸ᒷ∷",
|
||||
"term.deletePlaylist": "ᖋ∷ᒷ ॥ᒍ⚍ ϟ⚍∷ᒷ ॥ᒍ⚍ ∴ᖋリᒣ ᒣᒍ ↸ᒷ|:ᒷᒣᒷ ᒣ⍑╎ϟ i!|:ᖋ॥|:╎ϟᒣ?",
|
||||
"term.play": "i!|:ᖋ॥",
|
||||
"term.pause": "I!ᖋ⚍ϟᒷ",
|
||||
"term.previous": "I!∷ᒷ⍊╎ᒍ⚍ϟ",
|
||||
|
@ -61,7 +55,6 @@
|
|||
"term.mute": "ᒲ⚍ᒣᒷ",
|
||||
"term.unmute": "⚍リᒲ⚍ᒣᒷ",
|
||||
"term.share": "ϟ⍑ᖋ∷ᒷ",
|
||||
"term.share.success": "ᔮᒍi!╎ᒷ↸ ᒣᒍ ᔮ|:╎i!ᕊᒍᖋ∷↸",
|
||||
"term.settings": "ϟᒷᒣᒣ╎リ┤ϟ",
|
||||
"term.seeAll": "ϟᒷᒷ ᖋ|:|:",
|
||||
"term.sortBy": "ϟᒍ∷ᒣ ᕊ॥",
|
||||
|
@ -125,25 +118,8 @@
|
|||
"term.tracks": "ᒣ∷ᖋᔮ·ǀ·ϟ", // Assume x amount of tracks. e.g. 50 tracks
|
||||
"term.videos": "⍊╎↸ᒷᒍ",
|
||||
"term.menu": "ᒲᒷ⚍リ",
|
||||
"term.check": "ᔮ⍑ᒷᔮ·ǀ·",
|
||||
"term.aboutArtist": "ᖋᕊᒍ⚍ᒣ {{artistName}}", // e.g. 'About Doja Cat'
|
||||
"term.updateCider": "⚍i!↸ᖋᒣᒷ ᔮ╎↸ᒷ∷",
|
||||
"term.topResult": "ᒣᒍi! ∷ᒷϟ⚍|:ᒣ", // Search Results
|
||||
"term.sharedPlaylists": "ϟ⍑ᖋ∷ᒷ↸ i!|:ᖋ॥|:╎ϟᒣϟ", // Search Results
|
||||
"term.people": "i!ᒷᒍi!|:ᒷ", // Search Results
|
||||
"term.newpreset.name": "リᒷ∴ ᒷᑑ i!∷ᒷϟᒷᒣ リᖋᒲᒷ", // Equalizer Preset
|
||||
"term.addedpreset": "ᖋ↸↸ᒷ↸ i!∷ᒷϟᒷᒣ",
|
||||
"term.deletepreset.warn": "ᖋ∷ᒷ ॥ᒍ⚍ ϟ⚍∷ᒷ ॥ᒍ⚍ ∴ᖋリᒣ ᒣᒍ ↸ᒷ|:ᒷᒣᒷ ᒣ⍑╎ϟ i!∷ᒷϟᒷᒣ?",
|
||||
"term.deletedpreset": "∷ᒷᒲᒍ⍊ᒷ↸ i!∷ᒷϟᒷᒣ",
|
||||
"term.musicVideos": "ᒲ⚍ϟ╎ᔮ ⍊╎↸ᒷᒍϟ", // Search page friendlyTypes
|
||||
"term.stations": "ϟᒣᖋᒣ╎ᒍリϟ",
|
||||
"term.curators": "ᔮ⚍∷ᖋᒣᒍ∷ϟ",
|
||||
"term.appleCurators": "ᖋi!i!|:ᒷ ᔮ⚍∷ᖋᒣᒍ∷ϟ",
|
||||
"term.radioShows": "∷ᖋ↸╎ᒍ ϟ⍑ᒍ∴ϟ",
|
||||
"term.recordLabels": "∷ᒷᔮᒍ∷↸ |:ᖋᕊᒷ|:ϟ",
|
||||
"term.videoExtras": "⍊╎↸ᒷᒍ ᒷ/ᒣ∷ᖋϟ",
|
||||
"term.top": "ᒣᒍi!",
|
||||
|
||||
"term.showAlbum": "ϟ⍑ᒍ∴ ᔮᒍᒲi!|:ᒷᒣᒷ ᖋ|:ᕊ⚍ᒲ",
|
||||
|
||||
// Home
|
||||
"home.title": "⍑ᒍᒲᒷ",
|
||||
"home.recentlyPlayed": "∷ᒷᔮᒷリᒣ|:॥ i!|:ᖋ॥ᒷ↸",
|
||||
|
@ -209,14 +185,6 @@
|
|||
"action.removeTracks": "∷ᒷᒲᒍ⍊ᒷ ${self.selectedItems.length} ᒣ∷ᖋᔮ·ǀ·ϟ ⎓∷ᒍᒲ ᑑ⚍ᒷ⚍ᒷ",
|
||||
"action.import": "╎ᒲi!ᒍ∷ᒣ",
|
||||
"action.export": "ᒷ/i!ᒍ∷ᒣ",
|
||||
"action.showAlbum": "ϟ⍑ᒍ∴ ᔮᒍᒲi!|:ᒷᒣᒷ ᖋ|:ᕊ⚍ᒲ",
|
||||
"action.tray.minimize": "ᒲ╎リ╎ᒲ╎∩ᒷ ᒣᒍ ᒣ∷ᖋ॥",
|
||||
"action.tray.quit": "ᑑ⚍╎ᒣ",
|
||||
"action.tray.show": "ϟ⍑ᒍ∴",
|
||||
"action.update": "⚍i!↸ᖋᒣᒷ",
|
||||
"action.copy": "ᔮᒍi!॥",
|
||||
"action.newpreset": "リᒷ∴ i!∷ᒷϟᒷᒣ...", // Equalizer Preset
|
||||
"action.deletepreset": "↸ᒷ|:ᒷᒣᒷ i!∷ᒷϟᒷᒣ",
|
||||
|
||||
// Settings - General
|
||||
"settings.header.general": "┤ᒷリᒷ∷ᖋ|:",
|
||||
|
@ -232,18 +200,12 @@
|
|||
"settings.header.audio": "ᖋ⚍↸╎ᒍ",
|
||||
"settings.header.audio.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ᖋ⚍↸╎ᒍ ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.",
|
||||
"settings.option.audio.quality": "ᖋ⚍↸╎ᒍ ᑑ⚍ᖋ|:╎ᒣ॥", // Dropdown
|
||||
"settings.header.audio.quality.hireslossless": "⍑╎-∷ᒷϟ |:ᒍϟϟ|:ᒷϟϟ",
|
||||
"settings.header.audio.quality.hireslossless.description": "(⚍i! ᒣᒍ 24-ᕊ╎ᒣ/192 ·ǀ·⍑∩)",
|
||||
"settings.header.audio.quality.lossless": "|:ᒍϟϟ|:ᒷϟϟ",
|
||||
"settings.header.audio.quality.lossless.description": "(⚍i! ᒣᒍ 24-ᕊ╎ᒣ/48 ·ǀ·⍑∩)",
|
||||
"settings.header.audio.quality.high": "⍑╎┤⍑",
|
||||
"settings.header.audio.quality.low": "|:ᒍ∴",
|
||||
"settings.header.audio.quality.auto": "ᖋ⚍ᒣᒍ",
|
||||
"settings.option.audio.seamlessTransition": "ϟᒷᖋᒲ|:ᒷϟϟ ᖋ⚍↸╎ᒍ ᒣ∷ᖋリϟ╎ᒣ╎ᒍリ", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality": "ᒷリᖋᕊ|:ᒷ ᖋ↸⍊ᖋリᔮᒷ↸ ⎓⚍リᔮᒣ╎ᒍリᖋ|:╎ᒣ॥", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "ᒷリᖋᕊ|:╎リ┤ ᖋ⚍↸╎ᒍᔮᒍリᒣᒷ/ᒣ ⎓⚍リᔮᒣ╎ᒍリᖋ|:╎ᒣ॥ ∴╎|:|: ᖋ|:|:ᒍ∴ ⎓ᒍ∷ ᒷ/ᒣᒷリ↸ᒷ↸ ᖋ⚍↸╎ᒍ ⎓ᒷᖋᒣ⚍∷ᒷϟ |:╎·ǀ·ᒷ ᖋ⚍↸╎ᒍ リᒍ∷ᒲᖋ|:╎∩ᖋᒣ╎ᒍリ , ᒷᑑ⚍ᖋ|:╎∩ᒷ∷ϟ ᖋリ↸ ⍊╎ϟ⚍ᖋ|:╎∩ᒷ∷ϟ, ⍑ᒍ∴ᒷ⍊ᒷ∷ ᒍリ ϟᒍᒲᒷ ϟ॥ϟᒣᒷᒲϟ ᒣ⍑╎ϟ ᒲᖋ॥ ᔮᖋ⚍ϟᒷ ϟᒣ⚍ᒣᒣᒷ∷╎リ┤ ╎リ ᖋ⚍↸╎ᒍ ᒣ∷ᖋᔮ·ǀ·ϟ.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW": "↸ᒷᔮ∷॥i!ᒣ |:ᒍϟϟ|:ᒷϟϟ i!|:ᖋ॥ᕊᖋᔮ·ǀ· ∴ᒍ∷·ǀ·⎓|:ᒍ∴", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW.description": "ᒷリᖋᕊ|:ᒷϟ ᒣ⍑ᒷ ᖋᕊ╎|:╎ᒣ॥ ⎓ᒍ∷ ᔮ╎↸ᒷ∷ ᒣᒍ ↸ᒷᔮ∷॥i!ᒣ |:ᒍϟϟ|:ᒷϟϟ ᖋ⚍↸╎ᒍ ⎓╎|:ᒷϟ. ᖋ ᒲ╎リᒍ∷ i!ᒷ∷⎓ᒍ∷ᒲᖋリᔮᒷ ⍑╎ᒣ ∴╎|:|: ᒍᔮᔮ⚍∷.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "ᖋ⚍↸╎ᒍ リᒍ∷ᒲᖋ|:╎∩ᖋᒣ╎ᒍリ", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "リᒍ∷ᒲᖋ|:╎∩ᒷϟ i!ᒷᖋ·ǀ· ⍊ᒍ|:⚍ᒲᒷ ⎓ᒍ∷ ╎リ↸╎⍊╎↸⚍ᖋ|: ᒣ∷ᖋᔮ·ǀ·ϟ ᒣᒍ ᔮ∷ᒷᖋᒣᒷ ᖋ ᒲᒍ∷ᒷ ⚍リ╎⎓ᒍ∷ᒲ |:╎ϟᒣᒷリ╎リ┤ ᒷ/i!ᒷ∷╎ᒷリᔮᒷ.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "ᖋ⚍↸╎ᒍ ϟi!ᖋᒣ╎ᖋ|:╎∩ᖋᒣ╎ᒍリ", // Toggle
|
||||
|
@ -270,12 +232,6 @@
|
|||
"settings.option.visual.hardwareAcceleration.description": "∷ᒷᑑ⚍╎∷ᒷϟ ∷ᒷ|:ᖋ⚍リᔮ⍑",
|
||||
"settings.header.visual.hardwareAcceleration.default": "↸ᒷ⎓ᖋ⚍|:ᒣ",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "∴ᒷᕊ┤i!⚍",
|
||||
"settings.header.visual.theme": "ᒣ⍑ᒷᒲᒷ",
|
||||
|
||||
// Settings - Visual - Theme name
|
||||
"settings.option.visual.theme.default": "ᔮ╎↸ᒷ∷",
|
||||
"settings.option.visual.theme.dark": "↸ᖋ∷·ǀ·",
|
||||
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.option.visual.showPersonalInfo": "ϟ⍑ᒍ∴ i!ᒷ∷ϟᒍリᖋ|: ╎リ⎓ᒍ", // Toggle
|
||||
|
||||
|
@ -296,24 +252,24 @@
|
|||
"settings.header.connectivity.discordRPC.cider": "↸╎ϟi!|:ᖋ॥ ᖋϟ 'ᔮ╎↸ᒷ∷'",
|
||||
"settings.header.connectivity.discordRPC.appleMusic": "↸╎ϟi!|:ᖋ॥ ᖋϟ 'ᖋi!i!|:ᒷ ᒲ⚍ϟ╎ᔮ'",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "ᔮ|:ᒷᖋ∷ ↸╎ϟᔮᒍ∷↸ ∷╎ᔮ⍑ i!∷ᒷϟᒷリᔮᒷ ᒍリ i!ᖋ⚍ϟᒷ", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "|:ᖋϟᒣ.⎓ᒲ ϟᔮ∷ᒍᕊᕊ|:╎リ┤", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "|:ᖋϟᒣ.⎓ᒲ ϟᔮ∷ᒍᕊᕊ|:ᒷ ↸ᒷ|:ᖋ॥ (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "ᒷリᖋᕊ|:ᒷ |:ᖋϟᒣ.⎓ᒲ リᒍ∴ i!|:ᖋ॥╎リ┤",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "∷ᒷᒲᒍ⍊ᒷ ⎓ᒷᖋᒣ⚍∷╎リ┤ ᖋ∷ᒣ╎ϟᒣϟ ⎓∷ᒍᒲ ϟᒍリ┤ ᒣ╎ᒣ|:ᒷ (|:ᖋϟᒣ.⎓ᒲ)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "⎓╎|:ᒣᒷ∷ |:ᒍᒍi!ᒷ↸ ᒣ∷ᖋᔮ·ǀ· (|:ᖋϟᒣ.⎓ᒲ)",
|
||||
"settings.option.connectivity.lastfmScrobble": "|:ᖋϟᒣ⎓ᒲ ϟᔮ∷ᒍᕊᕊ|:╎リ┤", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "|:ᖋϟᒣ⎓ᒲ ϟᔮ∷ᒍᕊᕊ|:ᒷ ↸ᒷ|:ᖋ॥ (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "ᒷリᖋᕊ|:ᒷ |:ᖋϟᒣ⎓ᒲ リᒍ∴ i!|:ᖋ॥╎リ┤",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "∷ᒷᒲᒍ⍊ᒷ ⎓ᒷᖋᒣ⚍∷╎リ┤ ᖋ∷ᒣ╎ϟᒣϟ ⎓∷ᒍᒲ ϟᒍリ┤ ᒣ╎ᒣ|:ᒷ (|:ᖋϟᒣ⎓ᒲ)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "⎓╎|:ᒣᒷ∷ |:ᒍᒍi!ᒷ↸ ᒣ∷ᖋᔮ·ǀ· (|:ᖋϟᒣ⎓ᒲ)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "ᒷ/i!ᒷ∷╎ᒲᒷリᒣᖋ|:",
|
||||
"settings.header.experimental.description": "ᖋ↸⋮⚍ϟᒣ ᒣ⍑ᒷ ᒷ/i!ᒷ∷╎ᒲᒷリᒣᖋ|: ϟᒷᒣᒣ╎リ┤ϟ ⎓ᒍ∷ ᔮ╎↸ᒷ∷.",
|
||||
"settings.option.experimental.compactUI": "ᔮᒍᒲi!ᖋᔮᒣ ⚍╎", // Toggle
|
||||
"settings.option.experimental.close_button_hide": "ᔮ|:ᒍϟᒷ ᕊ⚍ᒣᒣᒍリ ϟ⍑ᒍ⚍|:↸ ⍑╎↸ᒷ ᒣ⍑ᒷ ᖋi!i!|:╎ᔮᖋᒣ╎ᒍリ",
|
||||
"settings.option.experimental.copy_log": "ᔮᒍi!॥ |:ᒍ┤ϟ ᒣᒍ ᔮ|:╎i!ᕊᒍᖋ∷↸",
|
||||
"settings.option.experimental.inline_playlists": "╎リ|:╎リᒷ i!|:ᖋ॥|:╎ϟᒣϟ ᖋリ↸ ᖋ|:ᕊ⚍ᒲϟ",
|
||||
"settings.option.experimental.closeButtonBehaviour": "ᔮ|:ᒍϟᒷ ᕊ⚍ᒣᒣᒍリ ᕊᒷ⍑ᖋ⍊╎ᒍ⚍∷",
|
||||
"settings.option.experimental.closeButtonBehaviour.quit": "ᑑ⚍╎ᒣ ᔮ╎↸ᒷ∷",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "ᒲ╎リ╎ᒲ╎∩ᒷ ᒣᒍ ᒣᖋϟ·ǀ·ᕊᖋ∷",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "ᒲ╎リ╎ᒲ╎∩ᒷ ᒣᒍ ϟ॥ϟᒣᒷᒲ ᒣ∷ᖋ॥",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.notTurnedOn": "ᖋ⚍↸╎ᒍ ϟi!ᖋᒣ╎ᖋ|:╎∩ᖋᒣ╎ᒍリ ╎ϟ ↸╎ϟᖋᕊ|:ᒷ↸. ᒣᒍ ⚍ϟᒷ, i!|:ᒷᖋϟᒷ ᒷリᖋᕊ|:ᒷ ╎ᒣ ⎓╎∷ϟᒣ.",
|
||||
"spatial.spatialProperties" : "ϟi!ᖋᒣ╎ᖋ|: i!∷ᒍi!ᒷ∷ᒣ╎ᒷϟ",
|
||||
"spatial.width" : "∴╎↸ᒣ⍑",
|
||||
"spatial.height" : "⍑ᒷ╎┤⍑ᒣ",
|
||||
|
|
|
@ -29,11 +29,10 @@
|
|||
"term.learnMore": "Learn more",
|
||||
"term.accountSettings": "Account Settings",
|
||||
"term.logout": "Logout",
|
||||
"term.login": "Log In",
|
||||
"term.login": "Login",
|
||||
"term.about": "About",
|
||||
"term.privateSession": "Private Session",
|
||||
"term.queue": "Queue",
|
||||
"term.history": "History",
|
||||
"term.search": "Search",
|
||||
"term.library": "Library",
|
||||
"term.listenNow": "Listen Now",
|
||||
|
@ -61,7 +60,6 @@
|
|||
"term.mute": "Mute",
|
||||
"term.unmute": "Unmute",
|
||||
"term.share": "Share",
|
||||
"term.share.success": "Copied to clipboard",
|
||||
"term.settings": "Settings",
|
||||
"term.seeAll": "See All",
|
||||
"term.sortBy": "Sort By",
|
||||
|
@ -88,7 +86,7 @@
|
|||
"term.connecting": "Connecting",
|
||||
"term.disconnect": "Disconnect",
|
||||
"term.authed": "Authed",
|
||||
"term.confirm": "Confirm?",
|
||||
"term.confirm": "Confirm ?",
|
||||
"term.more": "More",
|
||||
"term.less": "Less",
|
||||
"term.showMore": "Show more",
|
||||
|
@ -128,22 +126,7 @@
|
|||
"term.check": "Check",
|
||||
"term.aboutArtist": "About {{artistName}}", // e.g. 'About Doja Cat'
|
||||
"term.updateCider": "Update Cider",
|
||||
"term.topResult": "Top Result", // Search Results
|
||||
"term.sharedPlaylists": "Shared Playlists", // Search Results
|
||||
"term.people": "People", // Search Results
|
||||
"term.newpreset.name": "New EQ Preset Name", // Equalizer Preset
|
||||
"term.addedpreset": "Added Preset",
|
||||
"term.deletepreset.warn": "Are you sure you want to delete this preset?",
|
||||
"term.deletedpreset": "Removed preset",
|
||||
"term.musicVideos": "Music Videos", // Search page friendlyTypes
|
||||
"term.stations": "Stations",
|
||||
"term.curators": "Curators",
|
||||
"term.appleCurators": "Apple Curators",
|
||||
"term.radioShows": "Radio Shows",
|
||||
"term.recordLabels": "Record Labels",
|
||||
"term.videoExtras": "Video Extras",
|
||||
"term.top": "Top",
|
||||
|
||||
|
||||
// Home
|
||||
"home.title": "Home",
|
||||
"home.recentlyPlayed": "Recently Played",
|
||||
|
@ -214,9 +197,6 @@
|
|||
"action.tray.quit": "Quit",
|
||||
"action.tray.show": "Show",
|
||||
"action.update": "Update",
|
||||
"action.copy": "Copy",
|
||||
"action.newpreset": "New Preset...", // Equalizer Preset
|
||||
"action.deletepreset": "Delete Preset",
|
||||
|
||||
// Settings - General
|
||||
"settings.header.general": "General",
|
||||
|
@ -232,18 +212,12 @@
|
|||
"settings.header.audio": "Audio",
|
||||
"settings.header.audio.description": "Adjust the audio settings for Cider.",
|
||||
"settings.option.audio.quality": "Audio Quality", // Dropdown
|
||||
"settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
|
||||
"settings.header.audio.quality.hireslossless.description": "(up to 24-bit/192 kHz)",
|
||||
"settings.header.audio.quality.lossless": "Lossless",
|
||||
"settings.header.audio.quality.lossless.description": "(up to 24-bit/48 kHz)",
|
||||
"settings.header.audio.quality.high": "High",
|
||||
"settings.header.audio.quality.low": "Low",
|
||||
"settings.header.audio.quality.auto": "Auto",
|
||||
"settings.option.audio.seamlessTransition": "Seamless Audio Transition", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality": "Enable Advanced Functionality", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "Enabling AudioContext functionality will allow for extended audio features like Audio Normalization , Equalizers and Visualizers, however on some systems this may cause stuttering in audio tracks.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW": "Decrypt Lossless Playback Workflow", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW.description": "Enables the ability for Cider to decrypt Lossless Audio Files. A minor performance hit will occur.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Audio Normalization", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normalizes peak volume for individual tracks to create a more uniform listening experience.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Spatialization", // Toggle
|
||||
|
@ -270,12 +244,6 @@
|
|||
"settings.option.visual.hardwareAcceleration.description": "Requires relaunch",
|
||||
"settings.header.visual.hardwareAcceleration.default": "Default",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
||||
"settings.header.visual.theme": "Theme",
|
||||
|
||||
// Settings - Visual - Theme name
|
||||
"settings.option.visual.theme.default": "Cider",
|
||||
"settings.option.visual.theme.dark": "Dark",
|
||||
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.option.visual.showPersonalInfo": "Show Personal Info", // Toggle
|
||||
|
||||
|
@ -308,8 +276,6 @@
|
|||
"settings.header.experimental.description": "Adjust the experimental settings for Cider.",
|
||||
"settings.option.experimental.compactUI": "Compact UI", // Toggle
|
||||
"settings.option.experimental.close_button_hide": "Close Button Should Hide the Application",
|
||||
"settings.option.experimental.copy_log": "Copy logs to clipboard",
|
||||
"settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
|
|
|
@ -189,26 +189,17 @@
|
|||
"action.tray.quit": "終了",
|
||||
"action.tray.show": "表示",
|
||||
"action.update": "アップデート",
|
||||
"action.copy": "コピー",
|
||||
"action.newpreset": "ニュープリセット", // Equalizer Preset
|
||||
"action.deletepreset": "プリセットを削除", // Equalizer Preset
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "オーディオ",
|
||||
"settings.header.audio.description": "Ciderのオーディオ設定",
|
||||
"settings.option.audio.quality": "音質", // Dropdown
|
||||
"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.low": "高効率",
|
||||
"settings.header.audio.quality.auto": "自動",
|
||||
"settings.option.audio.seamlessTransition": "曲間なしで再生", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality": "先進的な機能", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "AudioContext 機能を有効にすると、オーディオノーマライズ、空間オーディオ、イコライザーなどの機能を使用できますが、音が途切れるかもしれません。", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW": "ロスレスオーディオ", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW.description": "ロスレスオーディオを有効にする", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "オーディオノーマライズ", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "さまざまな曲の音量を均一にし、より整った音を楽しめるようにする機能です。",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "オーディオ空間化", // Toggle
|
||||
|
|
|
@ -1,339 +0,0 @@
|
|||
{ // Base File
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "한국어 (KR)", // name of language in native language
|
||||
"i18n.languageNameEnglish": "Korean (KR)", // name of language in English
|
||||
"i18n.category": "main", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "@Hazealign", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
||||
// App info
|
||||
"app.name": "Cider",
|
||||
|
||||
"date.format": "${y}. ${m}. ${d}",
|
||||
|
||||
// Dialogs
|
||||
"dialog.cancel": "취소",
|
||||
"dialog.ok": "확인",
|
||||
|
||||
// Notification
|
||||
"notification.updatingLibrarySongs": "라이브러리의 노래를 업데이트하는 중입니다...",
|
||||
"notification.updatingLibraryAlbums": "라이브러리의 앨범을 업데이트하는 중입니다...",
|
||||
"notification.updatingLibraryArtists": "라이브러리의 아티스트를 업데이트하는 중입니다...",
|
||||
// Terms
|
||||
"term.appleInc": "Apple Inc.", // Follows brand term
|
||||
"term.appleMusic": "Apple Music", // Follows brand term
|
||||
"term.applePodcasts": "Apple Podcasts", // Follows brand term
|
||||
"term.itunes": "iTunes", // Follows brand term
|
||||
"term.github": "GitHub", // Follows brand term
|
||||
"term.discord": "Discord", // Follows brand term
|
||||
"term.learnMore": "더 알아보기",
|
||||
"term.accountSettings": "계정 설정",
|
||||
"term.logout": "로그아웃",
|
||||
"term.login": "로그인",
|
||||
"term.about": "정보",
|
||||
"term.privateSession": "개인 세션",
|
||||
"term.queue": "대기열",
|
||||
"term.history": "청취 기록",
|
||||
"term.search": "검색",
|
||||
"term.library": "보관함",
|
||||
"term.listenNow": "지금 듣기",
|
||||
"term.browse": "둘러보기",
|
||||
"term.radio": "라디오",
|
||||
"term.recentlyAdded": "최근 추가된 항목",
|
||||
"term.songs": "노래",
|
||||
"term.albums": "앨범",
|
||||
"term.artists": "아티스트",
|
||||
"term.podcasts": "팟캐스트",
|
||||
"term.playlists": "재생 목록",
|
||||
"term.playlist": "재생 목록",
|
||||
"term.newPlaylist": "새 재생 목록",
|
||||
"term.newPlaylistFolder": "새 재생 목록 폴더",
|
||||
"term.createNewPlaylist": "새 재생 목록 만들기",
|
||||
"term.createNewPlaylistFolder": "새 재생 목록 폴더 만들기",
|
||||
"term.deletePlaylist": "정말로 이 재생 목록을 삭제하시겠습니까?",
|
||||
"term.play": "재생",
|
||||
"term.pause": "일시 정지",
|
||||
"term.previous": "이전",
|
||||
"term.next": "다음",
|
||||
"term.shuffle": "셔플",
|
||||
"term.repeat": "반복",
|
||||
"term.volume": "볼륨",
|
||||
"term.mute": "음소거",
|
||||
"term.unmute": "음소거 해제",
|
||||
"term.share": "공유",
|
||||
"term.share.success": "클립보드에 복사됨",
|
||||
"term.settings": "설정",
|
||||
"term.seeAll": "모두 보기",
|
||||
"term.sortBy": "정렬",
|
||||
"term.sortBy.album": "앨범명",
|
||||
"term.sortBy.artist": "아티스트 이름",
|
||||
"term.sortBy.name": "제목",
|
||||
"term.sortBy.genre": "장르",
|
||||
"term.sortBy.releaseDate": "발매일",
|
||||
"term.sortBy.duration": "길이",
|
||||
"term.sortOrder": "A-Z",
|
||||
"term.sortOrder.ascending": "오름차순",
|
||||
"term.sortOrder.descending": "내림차순",
|
||||
"term.viewAs": "표시",
|
||||
"term.viewAs.coverArt": "커버 아트",
|
||||
"term.viewAs.list": "리스트",
|
||||
"term.size": "크기",
|
||||
"term.size.normal": "표준",
|
||||
"term.size.compact": "컴팩트",
|
||||
"term.enable": "켜기",
|
||||
"term.disable": "끄기",
|
||||
"term.enabled": "켜짐",
|
||||
"term.disabled": "꺼짐",
|
||||
"term.connect": "연결",
|
||||
"term.connecting": "연결 중",
|
||||
"term.disconnect": "연결 해제",
|
||||
"term.authed": "인증됨",
|
||||
"term.confirm": "진행하시겠습니까?",
|
||||
"term.more": "추가",
|
||||
"term.less": "줄이기",
|
||||
"term.showMore": "더 보기",
|
||||
"term.showLess": "덜 보기",
|
||||
"term.topSongs": "많이 듣는 노래",
|
||||
"term.latestReleases": "최근 발매된 노래",
|
||||
"term.time.added": "추가됨",
|
||||
"term.time.released": "발매됨",
|
||||
"term.time.updated": "업데이트됨",
|
||||
"term.time.hours": "시간",
|
||||
"term.time.hour": "시간",
|
||||
"term.time.minutes": "분",
|
||||
"term.time.minute": "분",
|
||||
"term.time.seconds": "초",
|
||||
"term.time.second": "초",
|
||||
"term.fullscreenView": "전체 화면 보기",
|
||||
"term.defaultView": "윈도우 보기",
|
||||
"term.audioSettings": "오디오 설정",
|
||||
"term.clearAll": "모두 지우기",
|
||||
"term.recentStations": "최근 스테이션",
|
||||
"term.language": "언어",
|
||||
"term.funLanguages": "재미를 위한 언어",
|
||||
"term.noLyrics": "로딩 중... / 가사를 찾지 못했습니다. / Instrumental 곡일 수 있습니다.",
|
||||
"term.copyright": "저작권",
|
||||
"term.rightsReserved": "All Rights Reserved.",
|
||||
"term.sponsor": "이 프로젝트를 후원하기",
|
||||
"term.ciderTeam": "Cider 팀",
|
||||
"term.developer": "개발자",
|
||||
"term.socialTeam": "소셜 팀",
|
||||
"term.socials": "소셜",
|
||||
"term.contributors": "기여자",
|
||||
"term.equalizer": "이퀄라이저",
|
||||
"term.reset": "초기화",
|
||||
"term.tracks": "곡", // Assume x amount of tracks. e.g. 50 tracks
|
||||
"term.videos": "비디오",
|
||||
"term.menu": "메뉴",
|
||||
"term.check": "확인",
|
||||
"term.aboutArtist": "{{artistName}}에 대하여", // e.g. 'About Doja Cat'
|
||||
"term.updateCider": "Cider 업데이트",
|
||||
"term.topResult": "Top Result", // Search Results
|
||||
"term.sharedPlaylists": "공유 플레이리스트", // Search Results
|
||||
"term.people": "프로필", // Search Results
|
||||
"term.newpreset.name": "새 이퀄라이저 프리셋", // Equalizer Preset
|
||||
"term.addedpreset": "추가된 프리셋",
|
||||
"term.deletepreset.warn": "정말로 프리셋을 삭제하시겠습니까?",
|
||||
"term.deletedpreset": "프리셋 삭제",
|
||||
"term.musicVideos": "뮤직 비디오", // Search page friendlyTypes
|
||||
"term.stations": "스테이션",
|
||||
"term.curators": "큐레이터",
|
||||
"term.appleCurators": "애플 큐레이터",
|
||||
"term.radioShows": "라디오 쇼",
|
||||
"term.recordLabels": "레코드 레이블",
|
||||
"term.videoExtras": "추가 비디오",
|
||||
"term.top": "Top",
|
||||
|
||||
// Home
|
||||
"home.title": "홈",
|
||||
"home.recentlyPlayed": "최근 재생한 항목",
|
||||
"home.recentlyAdded": "최근 추가된 항목",
|
||||
"home.artistsFeed": "아티스트 피드",
|
||||
"home.artistsFeed.noArtist": "좋아하는 아티스트를 팔로우해보세요.",
|
||||
"home.madeForYou": "나만을 위한 추천",
|
||||
"home.friendsListeningTo": "친구가 듣는 음악",
|
||||
"home.followedArtists": "팔로우한 아티스트",
|
||||
// Errors
|
||||
"error.appleMusicSubRequired": "Apple Music은 구독을 필요로 합니다.",
|
||||
"error.connectionError": "Apple Music에 연결하지 못했습니다.",
|
||||
"error.noResults": "결과 없음",
|
||||
"error.noResults.description": "다시 시도해주세요.",
|
||||
|
||||
//Podcasts
|
||||
"podcast.followOnCider": "Cider에서 팔로우하기",
|
||||
"podcast.followedOnCider": "팔로우 중",
|
||||
"podcast.subscribeOnItunes": "iTunes에서 구독",
|
||||
"podcast.subscribedOnItunes": "구독 중",
|
||||
"podcast.itunesStore": "iTunes Store",
|
||||
"podcast.episodes": "방송",
|
||||
"podcast.playEpisode": "재생",
|
||||
"podcast.website": "팟캐스트 사이트",
|
||||
|
||||
// Actions
|
||||
"action.addToLibrary": "보관함에 추가",
|
||||
"action.addToLibrary.success": "보관함에 추가됨",
|
||||
"action.addToLibrary.error": "보관함에 추가하는데 실패함",
|
||||
"action.removeFromLibrary": "보관함에서 삭제",
|
||||
"action.removeFromLibrary.success": "보관함에서 삭제됨",
|
||||
"action.addToQueue": "대기열에 추가",
|
||||
"action.addToQueue.success": "대기열에 추가됨",
|
||||
"action.addToQueue.error": "대기열에 추가하는데 실패함",
|
||||
"action.removeFromQueue": "대기열에서 삭제",
|
||||
"action.removeFromQueue.success": "대기열에서 삭제됨",
|
||||
"action.removeFromQueue.error": "대기열에서 삭제하는데 실패함",
|
||||
"action.createPlaylist": "새 재생 목록 만들기",
|
||||
"action.addToPlaylist": "재생 목록에 추가",
|
||||
"action.removeFromPlaylist": "재생 목록에서 삭제",
|
||||
"action.addToFavorites": "즐겨찾기에 추가",
|
||||
"action.follow": "팔로우",
|
||||
"action.follow.success": "팔로우 중",
|
||||
"action.follow.error": "팔로우 실패",
|
||||
"action.unfollow": "언팔로우",
|
||||
"action.unfollow.success": "언팔로우됨",
|
||||
"action.unfollow.error": "언팔로우 실패",
|
||||
"action.playNext": "바로 다음에 재생",
|
||||
"action.playLater": "맨 나중에 재생",
|
||||
"action.startRadio": "스테이션 생성",
|
||||
"action.goToArtist": "아티스트 보기",
|
||||
"action.goToAlbum": "앨범 보기",
|
||||
"action.moveToTop": "위로 가기",
|
||||
"action.share": "공유",
|
||||
"action.rename": "편집",
|
||||
"action.love": "좋아요",
|
||||
"action.unlove": "좋아요 취소",
|
||||
"action.dislike": "싫어요",
|
||||
"action.undoDislike": "싫어요 취소",
|
||||
"action.showWebRemoteQR": "웹 리모트",
|
||||
"action.playTracksNext": "다음 ${app.selectedMediaItems.length}곡 재생",
|
||||
"action.playTracksLater": "나중에 ${app.selectedMediaItems.length}곡 재생",
|
||||
"action.removeTracks": "${self.selectedItems.length}곡을 대기열에서 삭제",
|
||||
"action.import": "불러오기",
|
||||
"action.export": "내보내기",
|
||||
"action.showAlbum": "전체 앨범 보기",
|
||||
"action.tray.minimize": "트레이에 최소화",
|
||||
"action.tray.quit": "종료",
|
||||
"action.tray.show": "보기",
|
||||
"action.update": "업데이트",
|
||||
"action.copy": "복사",
|
||||
"action.newpreset": "새 프리셋", // Equalizer Preset
|
||||
"action.deletepreset": "프리셋 삭제",
|
||||
|
||||
// Settings - General
|
||||
"settings.header.general": "일반",
|
||||
"settings.header.general.description": "Cider의 일반 기능을 설정합니다.",
|
||||
"settings.option.general.language": "언어",
|
||||
|
||||
// Language optgroups
|
||||
"settings.option.general.language.main": "언어",
|
||||
"settings.option.general.language.fun": "재미를 위한 언어",
|
||||
"settings.option.general.language.unsorted": "미분류",
|
||||
|
||||
// Settings - Audio
|
||||
"settings.header.audio": "오디오",
|
||||
"settings.header.audio.description": "Cider의 오디오 기능을 설정합니다.",
|
||||
"settings.option.audio.quality": "오디오 음질", // Dropdown
|
||||
"settings.header.audio.quality.high": "고품질",
|
||||
"settings.header.audio.quality.low": "낮음",
|
||||
"settings.header.audio.quality.auto": "자동",
|
||||
"settings.option.audio.seamlessTransition": "크로스페이드 기능", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality": "추가 기능 설정", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "AudioContext 기능을 활성화하여 오디오 정규화, 이퀄라이저, 비쥬얼라이저 등의 기능을 쓸 수 있게 해줍니다. 일부 시스템에서는 오디오가 끊길 수 있습니다.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "오디오 정규화", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "개별 트랙의 최대 볼륨을 정규화하여 보다 균일한 청취 경험을 제공합니다.",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "오디오 공간화", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "오디오를 공간화하고 더욱 3차원적으로 만들어줍니다. (참고: 이 기능은 Dolby Atmos가 아닙니다.)",
|
||||
// Settings - Visual
|
||||
"settings.header.visual": "시각",
|
||||
"settings.header.visual.description": "Cider의 시각 기능을 설정합니다.",
|
||||
"settings.option.visual.windowBackgroundStyle": "윈도우 배경 스타일", // Toggle
|
||||
"settings.header.visual.windowBackgroundStyle.none": "없음",
|
||||
"settings.header.visual.windowBackgroundStyle.artwork": "앨범 아트",
|
||||
"settings.header.visual.windowBackgroundStyle.image": "이미지",
|
||||
"settings.option.visual.animatedArtwork": "애니메이션 앨범 표지", // Dropdown
|
||||
"settings.header.visual.animatedArtwork.always": "항상 활성화",
|
||||
"settings.header.visual.animatedArtwork.limited": "페이지나 특정 화면에서만 활성화",
|
||||
"settings.header.visual.animatedArtwork.disable": "항상 비활성화",
|
||||
"settings.option.visual.animatedArtworkQuality": "애니메이션 앨범 표지 화질", // Dropdown
|
||||
"settings.header.visual.animatedArtworkQuality.low": "낮음",
|
||||
"settings.header.visual.animatedArtworkQuality.medium": "중간",
|
||||
"settings.header.visual.animatedArtworkQuality.high": "높음",
|
||||
"settings.header.visual.animatedArtworkQuality.veryHigh": "매우 높음",
|
||||
"settings.header.visual.animatedArtworkQuality.extreme": "최상",
|
||||
"settings.option.visual.animatedWindowBackground": "움직이는 윈도우 배경", // Toggle
|
||||
"settings.option.visual.hardwareAcceleration": "하드웨어 가속", // Dropdown
|
||||
"settings.option.visual.hardwareAcceleration.description": "재시작을 필요로 합니다.",
|
||||
"settings.header.visual.hardwareAcceleration.default": "기본",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
||||
"settings.header.visual.theme": "테마",
|
||||
|
||||
// Settings - Visual - Theme name
|
||||
"settings.option.visual.theme.default": "Cider",
|
||||
"settings.option.visual.theme.dark": "다크",
|
||||
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.option.visual.showPersonalInfo": "개인 정보 보기", // Toggle
|
||||
|
||||
// Settings - Lyrics
|
||||
"settings.header.lyrics": "가사",
|
||||
"settings.header.lyrics.description": "Cider의 가사 기능을 설정합니다.",
|
||||
"settings.option.lyrics.enableMusixmatch": "Musixmatch 가사 활성화", // Toggle
|
||||
"settings.option.lyrics.enableMusixmatchKaraoke": "노래방 모드 활성화 (Musixmatch만 가능)", // Toggle
|
||||
"settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 번역 선호 언어", // Dropdown
|
||||
"settings.option.lyrics.enableYoutubeLyrics": "뮤직 비디오에 대한 유튜브 자막 활성화", // Toggle
|
||||
|
||||
// Settings - Connectivity
|
||||
"settings.header.connectivity": "연동",
|
||||
"settings.header.connectivity.description": "Cider의 연동 기능을 설정합니다.",
|
||||
"settings.option.connectivity.discordRPC": "Discord Rich Presence", // Dropdown
|
||||
"settings.option.connectivity.playbackNotifications": "재생 알림", // Toggle
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.header.connectivity.discordRPC.cider": "'Cider'로 표시하기",
|
||||
"settings.header.connectivity.discordRPC.appleMusic": "'Apple Music'으로 표시하기",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "일시 정지 시 Discord Rich Presence을 끄기", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "Last.fm 스크로블링", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm 스크로블 딜레이 (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Last.fm Now Playing 기능 활성화",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "곡 제목에서 피쳐링 아티스트를 제외하기 (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "루프 트랙을 필터하기 (Last.fm)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "실험실",
|
||||
"settings.header.experimental.description": "Cider의 실험적 기능을 설정합니다.",
|
||||
"settings.option.experimental.compactUI": "컴팩트 UI", // Toggle
|
||||
"settings.option.experimental.close_button_hide": "닫기 버튼이 애플리케이션을 가릴 것입니다",
|
||||
"settings.option.experimental.copy_log": "로그를 클립보드에 복사하기",
|
||||
"settings.option.experimental.inline_playlists": "인라인 플레이리스트 및 앨범",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.notTurnedOn": "오디오 공간화가 비활성화되어있습니다. 사용하기 전에 먼저 활성화해주세요.",
|
||||
"spatial.spatialProperties": "공간 설정",
|
||||
"spatial.width": "길이",
|
||||
"spatial.height": "높이",
|
||||
"spatial.depth": "깊이",
|
||||
"spatial.gain": "출력",
|
||||
"spatial.roomMaterials": "방 재질",
|
||||
"spatial.roomDimensions": "방 차원",
|
||||
"spatial.roomPositions": "방 위치",
|
||||
"spatial.setDimensions": "차원 설정",
|
||||
"spatial.setPositions": "위치 설정",
|
||||
"spatial.up": "위",
|
||||
"spatial.front": "앞",
|
||||
"spatial.left": "좌",
|
||||
"spatial.right": "우",
|
||||
"spatial.back": "뒤",
|
||||
"spatial.down": "아래",
|
||||
"spatial.listener": "사용자",
|
||||
"spatial.audioSource": "오디오 소스",
|
||||
|
||||
// Settings - Unfinished
|
||||
"settings.header.unfinished": "미완성",
|
||||
|
||||
// Web Remote
|
||||
"remote.web.title": "Cider 리모트",
|
||||
"remote.web.description": "QR 코드를 스캔해서 Cider와 스마트폰을 연결하기",
|
||||
|
||||
// About
|
||||
"about.thanks": "Cider Collective Team과 모든 기여자들에게 감사합니다."
|
||||
}
|
|
@ -197,10 +197,6 @@
|
|||
"settings.header.audio": "音频",
|
||||
"settings.header.audio.description": "调整 Cider 的音频设置",
|
||||
"settings.option.audio.quality": "音质", // Dropdown
|
||||
"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.low": "高效率",
|
||||
"settings.header.audio.quality.auto": "自动",
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
"term.about": "關於",
|
||||
"term.privateSession": "私人模式",
|
||||
"term.queue": "待播清單",
|
||||
"term.history": "歷史紀錄",
|
||||
"term.search": "搜尋",
|
||||
"term.library": "資料庫",
|
||||
"term.listenNow": "立即聆聽",
|
||||
|
@ -46,11 +45,6 @@
|
|||
"term.podcasts": "Podcasts",
|
||||
"term.playlists": "播放列表",
|
||||
"term.playlist": "播放列表",
|
||||
"term.newPlaylist": "新播放列表",
|
||||
"term.newPlaylistFolder": "新資料夾",
|
||||
"term.createNewPlaylist": "新增播放列表",
|
||||
"term.createNewPlaylistFolder": "新增資料夾",
|
||||
"term.deletePlaylist": "你確認要刪除這個播放列表?",
|
||||
"term.play": "播放",
|
||||
"term.pause": "暫停",
|
||||
"term.previous": "上一首",
|
||||
|
@ -61,7 +55,6 @@
|
|||
"term.mute": "靜音",
|
||||
"term.unmute": "取消靜音",
|
||||
"term.share": "分享",
|
||||
"term.share.success": "已複製至剪貼簿",
|
||||
"term.settings": "設定",
|
||||
"term.seeAll": "顯示全部",
|
||||
"term.sortBy": "排序",
|
||||
|
@ -125,24 +118,7 @@
|
|||
"term.tracks": "首歌曲", // Assume x amount of tracks. e.g. 50 tracks
|
||||
"term.videos": "影片",
|
||||
"term.menu": "選項",
|
||||
"term.check": "檢查",
|
||||
"term.aboutArtist": "關於 {{artistName}}", // e.g. 'About Doja Cat'
|
||||
"term.updateCider": "更新 Cider",
|
||||
"term.topResult": "熱門搜尋結果", // Search Results
|
||||
"term.sharedPlaylists": "播放列表", // Search Results
|
||||
"term.people": "個人檔案", // Search Results
|
||||
"term.newpreset.name": "新均衡器範本名稱", // Equalizer Preset
|
||||
"term.addedpreset": "已新增",
|
||||
"term.deletepreset.warn": "你確認要刪除這個範本?",
|
||||
"term.deletedpreset": "已刪除",
|
||||
"term.musicVideos": "MV", // Search page friendlyTypes
|
||||
"term.stations": "電台",
|
||||
//"term.curators": "Curators",
|
||||
//"term.appleCurators": "Apple Curators",
|
||||
"term.radioShows": "廣播單集",
|
||||
"term.recordLabels": "唱片公司",
|
||||
"term.videoExtras": "影片特輯",
|
||||
//"term.top": "Top",
|
||||
"term.showAlbum": "顯示完整的專輯",
|
||||
|
||||
// Home
|
||||
"home.title": "主頁",
|
||||
|
@ -209,14 +185,6 @@
|
|||
"action.removeTracks": "從待播清單刪除 ${self.selectedItems.length} 首歌曲",
|
||||
"action.import": "匯入",
|
||||
"action.export": "匯出",
|
||||
"action.showAlbum": "顯示完整的專輯",
|
||||
"action.tray.minimize": "縮小至系統托盤",
|
||||
"action.tray.quit": "結束",
|
||||
"action.tray.show": "顯示",
|
||||
"action.update": "更新",
|
||||
"action.copy": "複製",
|
||||
"action.newpreset": "新增範本", //Equallizer preset
|
||||
"action.deletepreset": "刪除範本",
|
||||
|
||||
// Settings - General
|
||||
"settings.header.general": "一般",
|
||||
|
@ -232,18 +200,12 @@
|
|||
"settings.header.audio": "音訊",
|
||||
"settings.header.audio.description": "調整Cider的音訊設定",
|
||||
"settings.option.audio.quality": "音訊音質", // Dropdown
|
||||
"settings.header.audio.quality.hireslossless": "高清無損壓縮",
|
||||
"settings.header.audio.quality.hireslossless.description": "(高達 24-bit/192 kHz)",
|
||||
"settings.header.audio.quality.lossless": "無損壓縮",
|
||||
"settings.header.audio.quality.lossless.description": "(高達 24-bit/48 kHz)",
|
||||
"settings.header.audio.quality.high": "高素質",
|
||||
"settings.header.audio.quality.low": "高效率",
|
||||
"settings.header.audio.quality.auto": "自動",
|
||||
"settings.option.audio.seamlessTransition": "無縫播放", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality": "進階功能", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.description": "啟用 AudioContext 將解鎖類似音量平衡和均衡器的進階功能。但是會在一些電腦造成音樂卡頓。",
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW": "無損壓縮解碼", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.decryptLLPW.description": "提供 Cider 解碼無損壓縮檔案的能力,但相應地會增加電腦的工作量。",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "音量平衡", // Toggle
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "將平衡輕柔和響亮的歌曲,建立更統一的聆聽體驗。",
|
||||
"settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "空間音訊", // Toggle
|
||||
|
@ -270,12 +232,6 @@
|
|||
"settings.option.visual.hardwareAcceleration.description": "需要重啓 Cider 才能生效",
|
||||
"settings.header.visual.hardwareAcceleration.default": "預設",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
||||
"settings.header.visual.theme": "主題",
|
||||
|
||||
// Settings - Visual - Theme name
|
||||
"settings.option.visual.theme.default": "預設",
|
||||
"settings.option.visual.theme.dark": "午夜暗",
|
||||
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle
|
||||
|
||||
|
@ -296,24 +252,24 @@
|
|||
"settings.header.connectivity.discordRPC.cider": "顯示為'Cider'",
|
||||
"settings.header.connectivity.discordRPC.appleMusic": "顯示為'Apple Music'",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "暫停時清除 Discord 狀態", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling 記錄", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble 延遲 (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 Last.fm 正在播放",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (Last.fm)",
|
||||
//"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.fm)",
|
||||
"settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 記錄", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延遲 (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 LastFM 正在播放",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (LastFM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (LastFM)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "實驗性功能",
|
||||
"settings.header.experimental.description": "調整Cider的實驗性功能",
|
||||
"settings.option.experimental.compactUI": "緊凑型 UI", // Toggle
|
||||
"settings.option.experimental.close_button_hide": "以關閉按鈕來隱藏 Cider",
|
||||
"settings.option.experimental.copy_log": "複製運行記錄檔至剪貼簿",
|
||||
//"settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
|
||||
"settings.option.experimental.closeButtonBehaviour": "關閉按鈕行為",
|
||||
"settings.option.experimental.closeButtonBehaviour.quit": "結束 Cider",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "縮小至工作列",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "縮小至系統托盤",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.notTurnedOn": "請先在設定中啟用空間音訊。",
|
||||
"spatial.spatialProperties" : "空間音訊屬性",
|
||||
"spatial.width" : "闊度",
|
||||
"spatial.height" : "高度",
|
||||
|
|
|
@ -189,9 +189,6 @@
|
|||
"action.tray.quit": "關閉",
|
||||
"action.tray.show": "顯示",
|
||||
"action.update": "更新",
|
||||
"action.copy": "複製",
|
||||
"action.newpreset": "新預設", // Equalizer Preset
|
||||
"action.deletepreset": "刪除預設", // Equalizer Preset
|
||||
|
||||
|
||||
// Settings - Audio
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
|
||||
// i18n Info
|
||||
"i18n.languageName": "廣東話(香港)", // name of language in native language
|
||||
"i18n.languageName": "廣東話(香港﹚", // name of language in native language
|
||||
"i18n.languageNameEnglish": "Cantonese (Hong Kong)", // name of language in English
|
||||
"i18n.category": "main", // main = real language, fun = fun community languages
|
||||
"i18n.authors": "@tszngaiyip @strikesnc", // Authors, if you contribute to this file feel free to add your name seperated with a space
|
||||
|
@ -33,7 +33,6 @@
|
|||
"term.about": "關於",
|
||||
"term.privateSession": "無痕模式",
|
||||
"term.queue": "待播清單",
|
||||
"term.history": "播放歷史",
|
||||
"term.search": "搵野",
|
||||
"term.library": "資料庫",
|
||||
"term.listenNow": "即刻聽",
|
||||
|
@ -46,11 +45,6 @@
|
|||
"term.podcasts": "Podcasts",
|
||||
"term.playlists": "播放清單",
|
||||
"term.playlist": "播放清單",
|
||||
"term.newPlaylist": "新播放清單",
|
||||
"term.newPlaylistFolder": "新資料夾",
|
||||
"term.createNewPlaylist": "新增播放清單",
|
||||
"term.createNewPlaylistFolder": "新增資料夾",
|
||||
"term.deletePlaylist": "你係咪要刪除呢個播放清單?",
|
||||
"term.play": "播放",
|
||||
"term.pause": "暫停",
|
||||
"term.previous": "前一首",
|
||||
|
@ -61,7 +55,6 @@
|
|||
"term.mute": "靜音",
|
||||
"term.unmute": "取消靜音",
|
||||
"term.share": "分享",
|
||||
"term.share.success": "複製咗喺剪貼簿",
|
||||
"term.settings": "設定",
|
||||
"term.seeAll": "睇哂全部",
|
||||
"term.sortBy": "排序",
|
||||
|
@ -125,24 +118,7 @@
|
|||
"term.tracks": "首歌", // Assume x amount of tracks. e.g. 50 tracks
|
||||
"term.videos": "影片",
|
||||
"term.menu": "選項",
|
||||
"term.check": "檢查",
|
||||
"term.aboutArtist": "關於 {{artistName}}", // e.g. 'About Doja Cat'
|
||||
"term.updateCider": "更新 Cider",
|
||||
"term.topResult": "熱門搜尋結果", // Search Results
|
||||
"term.sharedPlaylists": "播放清單", // Search Results
|
||||
"term.people": "個人檔案", // Search Results
|
||||
"term.newpreset.name": "新EQ範本嘅名", // Equalizer Preset
|
||||
"term.addedpreset": "新增咗",
|
||||
"term.deletepreset.warn": "你係咪要刪除呢個範本?",
|
||||
"term.deletedpreset": "刪除咗",
|
||||
"term.musicVideos": "MV", // Search page friendlyTypes
|
||||
"term.stations": "電台",
|
||||
//"term.curators": "Curators",
|
||||
//"term.appleCurators": "Apple Curators",
|
||||
"term.radioShows": "電台單集",
|
||||
"term.recordLabels": "唱片公司",
|
||||
"term.videoExtras": "相關嘅片",
|
||||
//"term.top": "Top",
|
||||
"term.showAlbum": "顯示完整嘅專輯",
|
||||
|
||||
// Home
|
||||
"home.title": "主頁",
|
||||
|
@ -209,14 +185,6 @@
|
|||
"action.removeTracks": "喺待播清單到刪除 ${self.selectedItems.length} 首歌曲",
|
||||
"action.import": "匯入",
|
||||
"action.export": "匯出",
|
||||
"action.showAlbum": "顯示完整嘅專輯",
|
||||
"action.tray.minimize": "收埋喺系統托盤",
|
||||
"action.tray.quit": "結束",
|
||||
"action.tray.show": "顯示",
|
||||
"action.update": "更新",
|
||||
"action.copy": "複製",
|
||||
"action.newpreset": "新增範本", // Equalizer Preset
|
||||
"action.deletepreset": "刪除範本",
|
||||
|
||||
// Settings - General
|
||||
"settings.header.general": "一般",
|
||||
|
@ -264,12 +232,6 @@
|
|||
"settings.option.visual.hardwareAcceleration.description": "需要重開Cider先會生效",
|
||||
"settings.header.visual.hardwareAcceleration.default": "預設",
|
||||
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
|
||||
"settings.header.visual.theme": "主題",
|
||||
|
||||
// Settings - Visual - Theme name
|
||||
"settings.option.visual.theme.default": "預設",
|
||||
"settings.option.visual.theme.dark": "黑色",
|
||||
|
||||
// Refer to term.disabled for the disabled option
|
||||
"settings.option.visual.showPersonalInfo": "顯示個人檔案", // Toggle
|
||||
|
||||
|
@ -290,24 +252,24 @@
|
|||
"settings.header.connectivity.discordRPC.cider": "顯示為'Cider'",
|
||||
"settings.header.connectivity.discordRPC.appleMusic": "顯示為'Apple Music'",
|
||||
"settings.option.connectivity.discordRPC.clearOnPause": "暫停時清除 Discord 狀態", // Toggle
|
||||
"settings.option.connectivity.lastfmScrobble": "Last.FM Scrobbling 記錄", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "Last.FM Scrobble 延遲 (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 Last.FM 正在播放",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (Last.FM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (Last.FM)",
|
||||
"settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling 記錄", // Option to Connect
|
||||
"settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble 延遲 (%)",
|
||||
"settings.option.connectivity.lastfmScrobble.nowPlaying": "啟用 LastFM 正在播放",
|
||||
"settings.option.connectivity.lastfmScrobble.removeFeatured": "從歌名中移除藝人推薦 (LastFM)",
|
||||
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filter looped track (LastFM)",
|
||||
// Refer to term.connect for the connect button
|
||||
|
||||
// Settings - Experimental
|
||||
"settings.header.experimental": "實驗性功能",
|
||||
"settings.header.experimental.description": "調整Cider嘅實驗性功能",
|
||||
"settings.option.experimental.compactUI": "逼啲既 UI", // Toggle
|
||||
"settings.option.experimental.close_button_hide": "㩒交叉制嚟隱藏 Cider",
|
||||
"settings.option.experimental.copy_log": "將log複製喺剪貼簿",
|
||||
//"settings.option.experimental.inline_playlists": "Inline Playlists and Albums",
|
||||
"settings.option.experimental.closeButtonBehaviour": "關閉按鈕行為",
|
||||
"settings.option.experimental.closeButtonBehaviour.quit": "熄左Cider佢",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTaskbar": "收埋Cider喺工作列",
|
||||
"settings.option.experimental.closeButtonBehaviour.minimizeTray": "收埋Cider喺系統托盤",
|
||||
// Refer to term.disabled & term.enabled
|
||||
|
||||
// Spatialization Menu
|
||||
"spatial.notTurnedOn": "唔該喺設定入面啟用左空間音訊先。",
|
||||
"spatial.spatialProperties" : "空間音訊屬性",
|
||||
"spatial.width" : "幾闊",
|
||||
"spatial.height" : "幾高",
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
import {app, Menu, nativeImage, Tray, ipcMain, clipboard, shell} from 'electron';
|
||||
import {readFileSync} from "fs";
|
||||
import {app, Menu, nativeImage, Tray} from 'electron';
|
||||
import * as path from 'path';
|
||||
import * as log from 'electron-log';
|
||||
import {utils} from './utils';
|
||||
import {utils} from './utils'
|
||||
|
||||
export class AppEvents {
|
||||
private protocols: string[] = [
|
||||
|
@ -26,7 +24,6 @@ export class AppEvents {
|
|||
* @returns {void}
|
||||
*/
|
||||
private start(): void {
|
||||
AppEvents.initLogging()
|
||||
console.info('[AppEvents] App started');
|
||||
|
||||
/**********************************************************************************************************************
|
||||
|
@ -172,8 +169,6 @@ export class AppEvents {
|
|||
let url = arg.split('//')[1]
|
||||
console.warn(`[LinkHandler] Attempting to load url: ${url}`);
|
||||
utils.getWindow().webContents.send('play', 'url', url)
|
||||
} else if (arg.includes('/debug/appdata')) {
|
||||
shell.openPath(app.getPath('userData'))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -289,18 +284,4 @@ export class AppEvents {
|
|||
])
|
||||
this.tray.setContextMenu(menu)
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes logging in the application
|
||||
* @private
|
||||
*/
|
||||
private static initLogging() {
|
||||
log.transports.console.format = '[{h}:{i}:{s}.{ms}] [{level}] {text}';
|
||||
Object.assign(console, log.functions);
|
||||
|
||||
ipcMain.on('fetch-log', (_event) => {
|
||||
const data = readFileSync(log.transports.file.getFile().path, {encoding: 'utf8', flag: 'r'});
|
||||
clipboard.writeText(data)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,27 +1,31 @@
|
|||
import {join} from "path";
|
||||
import {app, BrowserWindow as bw, ipcMain, shell, ShareMenu, Menu, nativeImage} from "electron";
|
||||
import * as path from "path";
|
||||
import {app, BrowserWindow as bw, ipcMain, shell} 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 {existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync} from "fs";
|
||||
import * as yt from "youtube-search-without-api-key";
|
||||
import * as fs from "fs";
|
||||
import {Stream} from "stream";
|
||||
import {generate as generateQR} from "qrcode-terminal";
|
||||
import {hostname, networkInterfaces} from "os";
|
||||
import * as qrcode from "qrcode-terminal";
|
||||
import * as os from "os";
|
||||
import * as mm from 'music-metadata';
|
||||
import fetch from 'electron-fetch'
|
||||
import {wsapi} from "./wsapi";
|
||||
import {jsonc} from "jsonc";
|
||||
import {AppImageUpdater, NsisUpdater} from "electron-updater";
|
||||
import {utils} from './utils';
|
||||
import * as path from "path";
|
||||
|
||||
|
||||
import {NsisUpdater} from "electron-updater";
|
||||
import {utils} from './utils'
|
||||
|
||||
export class BrowserWindow {
|
||||
public static win: any | undefined = null;
|
||||
private devMode: boolean = !app.isPackaged;
|
||||
|
||||
private paths: any = {
|
||||
srcPath: path.join(__dirname, "../../src"),
|
||||
resourcePath: path.join(__dirname, "../../resources"),
|
||||
ciderCache: path.resolve(app.getPath("userData"), "CiderCache"),
|
||||
themes: path.resolve(app.getPath("userData"), "Themes"),
|
||||
plugins: path.resolve(app.getPath("userData"), "Plugins"),
|
||||
};
|
||||
private audioStream: any = new Stream.PassThrough();
|
||||
private clientPort: number = 0;
|
||||
private remotePort: number = 6942;
|
||||
|
@ -29,57 +33,11 @@ export class BrowserWindow {
|
|||
env: {
|
||||
platform: process.platform,
|
||||
dev: app.isPackaged,
|
||||
components: [
|
||||
"pages/podcasts",
|
||||
"pages/apple-account-settings",
|
||||
"pages/library-songs",
|
||||
"pages/browse",
|
||||
"pages/settings",
|
||||
"pages/listen_now",
|
||||
"pages/home",
|
||||
"pages/artist-feed",
|
||||
"pages/cider-playlist",
|
||||
"pages/playlist-inline",
|
||||
"pages/recordLabel",
|
||||
"pages/collection-list",
|
||||
"pages/apple-curator",
|
||||
"pages/artist",
|
||||
"pages/search",
|
||||
"pages/about",
|
||||
"pages/library-videos",
|
||||
"components/mediaitem-artwork",
|
||||
"components/artwork-material",
|
||||
"components/menu-panel",
|
||||
"components/sidebar-playlist",
|
||||
"components/spatial-properties",
|
||||
"components/audio-settings",
|
||||
"components/qrcode-modal",
|
||||
"components/equalizer",
|
||||
"components/add-to-playlist",
|
||||
"components/queue",
|
||||
"components/queue-item",
|
||||
"components/mediaitem-scroller-horizontal",
|
||||
"components/mediaitem-scroller-horizontal-large",
|
||||
"components/mediaitem-scroller-horizontal-sp",
|
||||
"components/mediaitem-scroller-horizontal-mvview",
|
||||
"components/mediaitem-list-item",
|
||||
"components/mediaitem-hrect",
|
||||
"components/mediaitem-square",
|
||||
"components/mediaitem-square-sp",
|
||||
"components/mediaitem-mvview",
|
||||
"components/libraryartist-item",
|
||||
"components/listennow-child",
|
||||
"components/mediaitem-mvview-sp",
|
||||
"components/animatedartwork-view",
|
||||
"components/lyrics-view",
|
||||
"components/fullscreen",
|
||||
"components/miniplayer",
|
||||
]
|
||||
},
|
||||
};
|
||||
private options: any = {
|
||||
icon: join(
|
||||
utils.getPath('resourcePath'),
|
||||
icon: path.join(
|
||||
this.paths.resourcePath,
|
||||
`icons/icon.` + (process.platform === "win32" ? "ico" : "png")
|
||||
),
|
||||
width: 1024,
|
||||
|
@ -90,13 +48,11 @@ export class BrowserWindow {
|
|||
minHeight: 390,
|
||||
frame: false,
|
||||
title: "Cider",
|
||||
vibrancy: "fullscreen-ui",
|
||||
vibrancy: "dark",
|
||||
transparent: process.platform === "darwin",
|
||||
hasShadow: false,
|
||||
show: false,
|
||||
backgroundColor: "#1E1E1E",
|
||||
titleBarStyle: 'hidden',
|
||||
trafficLightPosition: {x: 15, y: 20},
|
||||
webPreferences: {
|
||||
nodeIntegration: true,
|
||||
sandbox: true,
|
||||
|
@ -106,7 +62,7 @@ export class BrowserWindow {
|
|||
plugins: true,
|
||||
nodeIntegrationInWorker: false,
|
||||
webSecurity: false,
|
||||
preload: join(utils.getPath('srcPath'), "./preload/cider-preload.js"),
|
||||
preload: path.join(this.paths.srcPath, "./preload/cider-preload.js"),
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -115,7 +71,7 @@ export class BrowserWindow {
|
|||
*/
|
||||
async createWindow(): Promise<Electron.BrowserWindow> {
|
||||
this.clientPort = await getPort({port: 9000});
|
||||
BrowserWindow.verifyFiles();
|
||||
this.verifyFiles();
|
||||
|
||||
// Load the previous state with fallback to defaults
|
||||
const windowState = windowStateKeeper({
|
||||
|
@ -145,7 +101,7 @@ export class BrowserWindow {
|
|||
/**
|
||||
* Verifies the files for the renderer to use (Cache, library info, etc.)
|
||||
*/
|
||||
private static verifyFiles(): void {
|
||||
private verifyFiles(): void {
|
||||
const expectedDirectories = ["CiderCache"];
|
||||
const expectedFiles = [
|
||||
"library-songs.json",
|
||||
|
@ -156,19 +112,19 @@ export class BrowserWindow {
|
|||
];
|
||||
for (let i = 0; i < expectedDirectories.length; i++) {
|
||||
if (
|
||||
!existsSync(
|
||||
join(app.getPath("userData"), expectedDirectories[i])
|
||||
!fs.existsSync(
|
||||
path.join(app.getPath("userData"), expectedDirectories[i])
|
||||
)
|
||||
) {
|
||||
mkdirSync(
|
||||
join(app.getPath("userData"), expectedDirectories[i])
|
||||
fs.mkdirSync(
|
||||
path.join(app.getPath("userData"), expectedDirectories[i])
|
||||
);
|
||||
}
|
||||
}
|
||||
for (let i = 0; i < expectedFiles.length; i++) {
|
||||
const file = join(utils.getPath('ciderCache'), expectedFiles[i]);
|
||||
if (!existsSync(file)) {
|
||||
writeFileSync(file, JSON.stringify([]));
|
||||
const file = path.join(this.paths.ciderCache, expectedFiles[i]);
|
||||
if (!fs.existsSync(file)) {
|
||||
fs.writeFileSync(file, JSON.stringify([]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -179,8 +135,8 @@ export class BrowserWindow {
|
|||
private startWebServer(): void {
|
||||
const app = express();
|
||||
|
||||
app.use(express.static(join(utils.getPath('srcPath'), "./renderer/")));
|
||||
app.set("views", join(utils.getPath('srcPath'), "./renderer/views"));
|
||||
app.use(express.static(path.join(this.paths.srcPath, "./renderer/")));
|
||||
app.set("views", path.join(this.paths.srcPath, "./renderer/views"));
|
||||
app.set("view engine", "ejs");
|
||||
let firstRequest = true;
|
||||
app.use((req, res, next) => {
|
||||
|
@ -199,53 +155,6 @@ export class BrowserWindow {
|
|||
res.render("main", this.EnvironmentVariables);
|
||||
});
|
||||
|
||||
app.get("/api/playback/:action", (req, res)=>{
|
||||
const action = req.params.action;
|
||||
switch(action) {
|
||||
case "playpause":
|
||||
BrowserWindow.win.webContents.executeJavaScript("wsapi.togglePlayPause()")
|
||||
res.send("Play/Pause toggle")
|
||||
break;
|
||||
case "play":
|
||||
BrowserWindow.win.webContents.executeJavaScript("MusicKit.getInstance().play()")
|
||||
res.send("Playing")
|
||||
break;
|
||||
case "pause":
|
||||
BrowserWindow.win.webContents.executeJavaScript("MusicKit.getInstance().pause()")
|
||||
res.send("Paused")
|
||||
break;
|
||||
case "stop":
|
||||
BrowserWindow.win.webContents.executeJavaScript("MusicKit.getInstance().stop()")
|
||||
res.send("Stopped")
|
||||
break;
|
||||
case "next":
|
||||
BrowserWindow.win.webContents.executeJavaScript("MusicKit.getInstance().skipToNextItem()")
|
||||
res.send("Next")
|
||||
break;
|
||||
case "previous":
|
||||
BrowserWindow.win.webContents.executeJavaScript("MusicKit.getInstance().skipToPreviousItem()")
|
||||
res.send("Previous")
|
||||
break;
|
||||
default: {
|
||||
res.send("Invalid action")
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
app.get("/themes/:theme", (req, res) => {
|
||||
const theme = req.params.theme.toLowerCase();
|
||||
const themePath = join(utils.getPath('srcPath'), "./renderer/themes/", theme);
|
||||
const userThemePath = join(utils.getPath('themes'), theme);
|
||||
if (existsSync(userThemePath)) {
|
||||
res.sendFile(userThemePath);
|
||||
} else if (existsSync(themePath)) {
|
||||
res.sendFile(themePath);
|
||||
} else {
|
||||
res.send(`// Theme not found - ${userThemePath}`);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
app.get("/audio.webm", (req, res) => {
|
||||
try {
|
||||
req.socket.setTimeout(Number.MAX_SAFE_INTEGER);
|
||||
|
@ -274,12 +183,13 @@ export class BrowserWindow {
|
|||
});
|
||||
|
||||
/*
|
||||
* Remote Client -@quacksire
|
||||
* https://github.com/ciderapp/Apple-Music-Electron/blob/818189ed40ff600d76eb59d22016723a75885cd5/resources/functions/handler.js#L1173
|
||||
* Remote Client (I had no idea how to add it to our existing express server, so I just made another one) -@quacksire
|
||||
* TODO: Broadcast the remote so that /web-remote/ can connect
|
||||
* https://github.com/ciderapp/Apple-Music-Electron/blob/818ed18940ff600d76eb59d22016723a75885cd5/resources/functions/handler.js#L1173
|
||||
*/
|
||||
const remote = express();
|
||||
remote.use(express.static(join(utils.getPath('srcPath'), "./web-remote/")))
|
||||
remote.set("views", join(utils.getPath('srcPath'), "./web-remote/views"));
|
||||
remote.use(express.static(path.join(this.paths.srcPath, "./web-remote/")))
|
||||
remote.set("views", path.join(this.paths.srcPath, "./web-remote/views"));
|
||||
remote.set("view engine", "ejs");
|
||||
getPort({port: 6942}).then((port) => {
|
||||
this.remotePort = port;
|
||||
|
@ -288,7 +198,15 @@ export class BrowserWindow {
|
|||
remote.listen(this.remotePort, () => {
|
||||
console.log(`Cider remote port: ${this.remotePort}`);
|
||||
if (firstRequest) {
|
||||
generateQR(`http://${hostname}:${this.remotePort}`);
|
||||
console.log("---- Ignore Me ;) ---");
|
||||
qrcode.generate(`http://${os.hostname}:${this.remotePort}`);
|
||||
console.log("---- Ignore Me ;) ---");
|
||||
/*
|
||||
*
|
||||
* USING https://www.npmjs.com/package/qrcode-terminal for terminal
|
||||
* WE SHOULD USE https://www.npmjs.com/package/qrcode for the remote (or others) for showing to user via an in-app dialog
|
||||
* -@quacksire
|
||||
*/
|
||||
}
|
||||
firstRequest = false;
|
||||
})
|
||||
|
@ -363,24 +281,16 @@ export class BrowserWindow {
|
|||
event.returnValue = process.platform;
|
||||
});
|
||||
|
||||
ipcMain.on("get-themes", (event, _key) => {
|
||||
if (existsSync(utils.getPath("themes"))) {
|
||||
event.returnValue = readdirSync(utils.getPath("themes"));
|
||||
} else {
|
||||
event.returnValue = [];
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.on("get-i18n", (event, key) => {
|
||||
event.returnValue = utils.getLocale(key);
|
||||
});
|
||||
|
||||
ipcMain.on("get-i18n-listing", event => {
|
||||
let i18nFiles = readdirSync(join(__dirname, "../../src/i18n")).filter(file => file.endsWith(".jsonc"));
|
||||
let i18nFiles = fs.readdirSync(path.join(__dirname, "../../src/i18n")).filter(file => file.endsWith(".jsonc"));
|
||||
// read all the files and parse them
|
||||
let i18nListing = []
|
||||
for (let i = 0; i < i18nFiles.length; i++) {
|
||||
const i18n: { [index: string]: Object } = jsonc.parse(readFileSync(join(__dirname, `../../src/i18n/${i18nFiles[i]}`), "utf8"));
|
||||
const i18n: { [index: string]: Object } = jsonc.parse(fs.readFileSync(path.join(__dirname, `../../src/i18n/${i18nFiles[i]}`), "utf8"));
|
||||
i18nListing.push({
|
||||
"code": i18nFiles[i].replace(".jsonc", ""),
|
||||
"nameNative": i18n["i18n.languageName"] ?? i18nFiles[i].replace(".jsonc", ""),
|
||||
|
@ -401,75 +311,75 @@ export class BrowserWindow {
|
|||
});
|
||||
|
||||
ipcMain.on("put-library-songs", (_event, arg) => {
|
||||
writeFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-songs.json"),
|
||||
fs.writeFileSync(
|
||||
path.join(this.paths.ciderCache, "library-songs.json"),
|
||||
JSON.stringify(arg)
|
||||
);
|
||||
});
|
||||
|
||||
ipcMain.on("put-library-artists", (_event, arg) => {
|
||||
writeFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-artists.json"),
|
||||
fs.writeFileSync(
|
||||
path.join(this.paths.ciderCache, "library-artists.json"),
|
||||
JSON.stringify(arg)
|
||||
);
|
||||
});
|
||||
|
||||
ipcMain.on("put-library-albums", (_event, arg) => {
|
||||
writeFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-albums.json"),
|
||||
fs.writeFileSync(
|
||||
path.join(this.paths.ciderCache, "library-albums.json"),
|
||||
JSON.stringify(arg)
|
||||
);
|
||||
});
|
||||
|
||||
ipcMain.on("put-library-playlists", (_event, arg) => {
|
||||
writeFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-playlists.json"),
|
||||
fs.writeFileSync(
|
||||
path.join(this.paths.ciderCache, "library-playlists.json"),
|
||||
JSON.stringify(arg)
|
||||
);
|
||||
});
|
||||
|
||||
ipcMain.on("put-library-recentlyAdded", (_event, arg) => {
|
||||
writeFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-recentlyAdded.json"),
|
||||
fs.writeFileSync(
|
||||
path.join(this.paths.ciderCache, "library-recentlyAdded.json"),
|
||||
JSON.stringify(arg)
|
||||
);
|
||||
});
|
||||
|
||||
ipcMain.on("get-library-songs", (event) => {
|
||||
let librarySongs = readFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-songs.json"),
|
||||
let librarySongs = fs.readFileSync(
|
||||
path.join(this.paths.ciderCache, "library-songs.json"),
|
||||
"utf8"
|
||||
);
|
||||
event.returnValue = JSON.parse(librarySongs);
|
||||
});
|
||||
|
||||
ipcMain.on("get-library-artists", (event) => {
|
||||
let libraryArtists = readFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-artists.json"),
|
||||
let libraryArtists = fs.readFileSync(
|
||||
path.join(this.paths.ciderCache, "library-artists.json"),
|
||||
"utf8"
|
||||
);
|
||||
event.returnValue = JSON.parse(libraryArtists);
|
||||
});
|
||||
|
||||
ipcMain.on("get-library-albums", (event) => {
|
||||
let libraryAlbums = readFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-albums.json"),
|
||||
let libraryAlbums = fs.readFileSync(
|
||||
path.join(this.paths.ciderCache, "library-albums.json"),
|
||||
"utf8"
|
||||
);
|
||||
event.returnValue = JSON.parse(libraryAlbums);
|
||||
});
|
||||
|
||||
ipcMain.on("get-library-playlists", (event) => {
|
||||
let libraryPlaylists = readFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-playlists.json"),
|
||||
let libraryPlaylists = fs.readFileSync(
|
||||
path.join(this.paths.ciderCache, "library-playlists.json"),
|
||||
"utf8"
|
||||
);
|
||||
event.returnValue = JSON.parse(libraryPlaylists);
|
||||
});
|
||||
|
||||
ipcMain.on("get-library-recentlyAdded", (event) => {
|
||||
let libraryRecentlyAdded = readFileSync(
|
||||
join(utils.getPath('ciderCache'), "library-recentlyAdded.json"),
|
||||
let libraryRecentlyAdded = fs.readFileSync(
|
||||
path.join(this.paths.ciderCache, "library-recentlyAdded.json"),
|
||||
"utf8"
|
||||
);
|
||||
event.returnValue = JSON.parse(libraryRecentlyAdded);
|
||||
|
@ -477,14 +387,14 @@ export class BrowserWindow {
|
|||
|
||||
ipcMain.handle("getYTLyrics", async (_event, track, artist) => {
|
||||
const u = track + " " + artist + " official video";
|
||||
return await search(u);
|
||||
return await yt.search(u);
|
||||
});
|
||||
|
||||
ipcMain.on("close", (_event) => {
|
||||
ipcMain.on("close", () => {
|
||||
BrowserWindow.win.close();
|
||||
});
|
||||
|
||||
ipcMain.on("maximize", (_event) => {
|
||||
ipcMain.on("maximize", () => {
|
||||
// listen for maximize event
|
||||
if (BrowserWindow.win.isMaximized()) {
|
||||
BrowserWindow.win.unmaximize();
|
||||
|
@ -533,23 +443,18 @@ export class BrowserWindow {
|
|||
|
||||
ipcMain.on('play', (_event, type, id) => {
|
||||
BrowserWindow.win.webContents.executeJavaScript(`
|
||||
MusicKit.getInstance().setQueue({ ${type}: '${id}'}).then(function(queue) {
|
||||
MusicKit.getInstance().play();
|
||||
});
|
||||
`)
|
||||
MusicKit.getInstance().setQueue({ ${type}: '${id}'}).then(function(queue) {
|
||||
MusicKit.getInstance().play();
|
||||
});
|
||||
`)
|
||||
})
|
||||
|
||||
//QR Code
|
||||
ipcMain.handle('showQR', async (_event, _) => {
|
||||
ipcMain.handle('showQR', async (event, _) => {
|
||||
let url = `http://${BrowserWindow.getIP()}:${this.remotePort}`;
|
||||
shell.openExternal(`https://cider.sh/pair-remote?url=${Buffer.from(encodeURI(url)).toString('base64')}`).catch(console.error);
|
||||
})
|
||||
|
||||
ipcMain.on('get-remote-pair-url', (_event, _) => {
|
||||
let url = `http://${BrowserWindow.getIP()}:${this.remotePort}`;
|
||||
BrowserWindow.win.webContents.send('send-remote-pair-url', url);
|
||||
})
|
||||
|
||||
// Get previews for normalization
|
||||
ipcMain.on("getPreviewURL", (_event, url) => {
|
||||
|
||||
|
@ -565,39 +470,15 @@ export class BrowserWindow {
|
|||
});
|
||||
});
|
||||
|
||||
ipcMain.on('check-for-update', async (_event) => {
|
||||
ipcMain.on('check-for-update', async (_event, url) => {
|
||||
const options: any = {
|
||||
provider: 'generic',
|
||||
url: 'https://43-429851205-gh.circle-artifacts.com/0/%7E/Cider/dist/artifacts' //Base URL
|
||||
}
|
||||
/*
|
||||
* Have to handle the auto updaters seperatly until we can support macOS. electron-builder limitation -q
|
||||
*/
|
||||
const win_autoUpdater = new NsisUpdater(options) //Windows
|
||||
const linux_autoUpdater = new AppImageUpdater(options) //Linux
|
||||
await win_autoUpdater.checkForUpdatesAndNotify()
|
||||
await linux_autoUpdater.checkForUpdatesAndNotify()
|
||||
const autoUpdater = new NsisUpdater(options) //Windows Only (for now) -q
|
||||
await autoUpdater.checkForUpdatesAndNotify()
|
||||
})
|
||||
|
||||
ipcMain.on('share-menu', async (_event, url) => {
|
||||
if ( process.platform != 'darwin') return;
|
||||
//https://www.electronjs.org/docs/latest/api/share-menu
|
||||
console.log('[Share Sheet - App.ts]', url)
|
||||
const options = {
|
||||
title: 'Share',
|
||||
urls: [url]
|
||||
};
|
||||
// @ts-ignore
|
||||
const shareMenu = new ShareMenu(options);
|
||||
shareMenu.popup();
|
||||
})
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* *********************************************************************************************
|
||||
* Window Events
|
||||
* **********************************************************************************************/
|
||||
|
@ -662,128 +543,12 @@ export class BrowserWindow {
|
|||
shell.openExternal(x.url).catch(console.error);
|
||||
return {action: "deny"};
|
||||
});
|
||||
|
||||
/* *********************************************************************************************
|
||||
* Menu
|
||||
* **********************************************************************************************/
|
||||
//@ts-ignore
|
||||
console.log(path.join(__dirname, '../../src/renderer/views/svg/smartphone.svg'))
|
||||
const isMac = process.platform === 'darwin';
|
||||
//TODO: Figure out the icons
|
||||
const remoteIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/smartphone.svg')).toPNG()
|
||||
const soundIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/headphones.svg')).toPNG()
|
||||
const aboutIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/info.svg')).toPNG()
|
||||
const settingsIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/settings.svg')).toPNG()
|
||||
const logoutIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/views/svg/log-out.svg')).toPNG()
|
||||
const ciderIcon = nativeImage.createFromPath(path.join(__dirname, '../../src/renderer/assets/logocute.png'))
|
||||
const template = [
|
||||
// { role: 'appMenu' }
|
||||
...(isMac ? [{
|
||||
label: app.name,
|
||||
submenu: [
|
||||
{ label: 'Web Remote', accelerator: 'CommandOrControl+W', sublabel: 'Opens in external window', click: () => BrowserWindow.win.webContents.executeJavaScript(`ipcRenderer.invoke('showQR')`)}, //accelerator
|
||||
{ label: 'Audio Settings', accelerator: 'CommandOrControl+Shift+A', click: () => BrowserWindow.win.webContents.executeJavaScript(`app.modals.audioSettings = true`)},
|
||||
{ label: 'About', accelerator: 'CommandOrControl+Shift+B', click: () => BrowserWindow.win.webContents.executeJavaScript(`app.appRoute('about'`)},
|
||||
{ label: 'Settings', accelerator: 'CommandOrControl+,', click: () => BrowserWindow.win.webContents.executeJavaScript(`app.appRoute('settings')`)},
|
||||
{ label: 'Logout', accelerator: 'CommandOrControl+Shift+O', click: () => BrowserWindow.win.webContents.executeJavaScript(`app.unauthorize(); document.location.reload()`)},
|
||||
{ type: 'separator' },
|
||||
{ role: 'quit' }
|
||||
]
|
||||
}] : []),
|
||||
// { role: 'viewMenu' }
|
||||
{
|
||||
label: 'View',
|
||||
submenu: [
|
||||
{ role: 'reload' },
|
||||
{ role: 'forceReload' },
|
||||
{ role: 'toggleDevTools' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'resetZoom' },
|
||||
{ role: 'zoomIn' },
|
||||
{ role: 'zoomOut' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'togglefullscreen' }
|
||||
]
|
||||
},
|
||||
// { role: 'windowMenu' }
|
||||
{
|
||||
label: 'Window',
|
||||
submenu: [
|
||||
{ role: 'minimize' },
|
||||
{ role: 'zoom' },
|
||||
...(isMac ? [
|
||||
{ type: 'separator' },
|
||||
{ role: 'front' },
|
||||
{ type: 'separator' },
|
||||
{ role: 'window' }
|
||||
] : [
|
||||
{ role: 'close' }
|
||||
])
|
||||
]
|
||||
},
|
||||
{
|
||||
role: 'help',
|
||||
submenu: [
|
||||
{
|
||||
label: 'Discord',
|
||||
accelerator: 'CommandOrControl+Shift+D',
|
||||
click: async () => {
|
||||
const { shell } = require('electron')
|
||||
await shell.openExternal('https://discord.gg/applemusic')
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Donate',
|
||||
accelerator: 'CommandOrControl+D',
|
||||
icon: ciderIcon,
|
||||
click: async () => {
|
||||
const { shell } = require('electron')
|
||||
await shell.openExternal('https://opencollective.com/ciderapp/')
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Report a...',
|
||||
submenu: [
|
||||
{
|
||||
label: 'Bug',
|
||||
click: async () => {
|
||||
const {shell} = require('electron')
|
||||
await shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=bug%2Ctriage&template=bug_report.yaml&title=%5BBug%5D%3A+")
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Feature Request',
|
||||
click: async () => {
|
||||
const {shell} = require('electron')
|
||||
await shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=enhancement%2Ctriage&template=feature_request.yaml&title=%5BEnhancement%5D%3A+")
|
||||
}
|
||||
},
|
||||
{
|
||||
label: 'Translation Report/Request',
|
||||
click: async () => {
|
||||
const {shell} = require('electron')
|
||||
await shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=%F0%9F%8C%90+Translations&template=translation.yaml&title=%5BTranslation%5D%3A+")
|
||||
}
|
||||
},
|
||||
]
|
||||
},
|
||||
]
|
||||
}
|
||||
]
|
||||
//@ts-ignore
|
||||
const menu = Menu.buildFromTemplate(template)
|
||||
Menu.setApplicationMenu(menu)
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets ip
|
||||
* @private
|
||||
*/
|
||||
private static getIP(): string {
|
||||
let ip: string = '';
|
||||
let alias = 0;
|
||||
const ifaces: any = networkInterfaces();
|
||||
const ifaces: any = os.networkInterfaces();
|
||||
for (let dev in ifaces) {
|
||||
ifaces[dev].forEach((details: any) => {
|
||||
if (details.family === 'IPv4') {
|
||||
|
|
|
@ -31,7 +31,6 @@ export class Store {
|
|||
"quality": "256",
|
||||
"seamless_audio": true,
|
||||
"normalization": false,
|
||||
"decryptLLPW": false,
|
||||
"spatial": false,
|
||||
"maxVolume": 1,
|
||||
"volumePrecision": 0.1,
|
||||
|
@ -143,11 +142,11 @@ export class Store {
|
|||
* IPC Handler
|
||||
*/
|
||||
private ipcHandler(): void {
|
||||
electron.ipcMain.handle('getStoreValue', (_event, key, defaultValue) => {
|
||||
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) => {
|
||||
electron.ipcMain.handle('setStoreValue', (event, key, value) => {
|
||||
Store.cfg.set(key, value);
|
||||
});
|
||||
|
||||
|
@ -155,7 +154,7 @@ export class Store {
|
|||
event.returnValue = Store.cfg.store
|
||||
})
|
||||
|
||||
electron.ipcMain.on('setStore', (_event, store) => {
|
||||
electron.ipcMain.on('setStore', (event, store) => {
|
||||
Store.cfg.store = store
|
||||
})
|
||||
}
|
||||
|
|
|
@ -3,31 +3,9 @@ import * as path from "path";
|
|||
import {jsonc} from "jsonc";
|
||||
import {Store} from "./store";
|
||||
import {BrowserWindow as bw} from "./browserwindow";
|
||||
import {app} from "electron";
|
||||
|
||||
export class utils {
|
||||
|
||||
/**
|
||||
* Paths for the application to use
|
||||
*/
|
||||
private static paths: any = {
|
||||
srcPath: path.join(__dirname, "../../src"),
|
||||
resourcePath: path.join(__dirname, "../../resources"),
|
||||
i18nPath: path.join(__dirname, "../../src/i18n"),
|
||||
ciderCache: path.resolve(app.getPath("userData"), "CiderCache"),
|
||||
themes: path.resolve(app.getPath("userData"), "Themes"),
|
||||
plugins: path.resolve(app.getPath("userData"), "Plugins"),
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the path
|
||||
* @returns {string}
|
||||
* @param name
|
||||
*/
|
||||
static getPath(name: string): string {
|
||||
return this.paths[name];
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the i18n locale for the given language.
|
||||
* @param language {string} The language to fetch the locale for.
|
||||
|
@ -35,10 +13,10 @@ export class utils {
|
|||
* @returns {string | Object} The locale value.
|
||||
*/
|
||||
static getLocale(language: string, key?: string): string | object {
|
||||
let i18n: { [index: string]: Object } = jsonc.parse(fs.readFileSync(path.join(this.paths.i18nPath, "en_US.jsonc"), "utf8"));
|
||||
let i18n: { [index: string]: Object } = jsonc.parse(fs.readFileSync(path.join(__dirname, "../../src/i18n/en_US.jsonc"), "utf8"));
|
||||
|
||||
if (language !== "en_US" && fs.existsSync(path.join(this.paths.i18nPath, `${language}.jsonc`))) {
|
||||
i18n = Object.assign(i18n, jsonc.parse(fs.readFileSync(path.join(this.paths.i18nPath, `${language}.jsonc`), "utf8")));
|
||||
if (language !== "en_US" && fs.existsSync(path.join(__dirname, `../../src/i18n/${language}.jsonc`))) {
|
||||
i18n = Object.assign(i18n, jsonc.parse(fs.readFileSync(path.join(__dirname, `../../src/i18n/${language}.jsonc`), "utf8")));
|
||||
}
|
||||
|
||||
if (key) {
|
||||
|
@ -80,25 +58,4 @@ export class utils {
|
|||
static getWindow(): Electron.BrowserWindow {
|
||||
return bw.win
|
||||
}
|
||||
|
||||
/**
|
||||
* 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()")
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,6 +1,11 @@
|
|||
import * as ws from "ws";
|
||||
import * as http from "http";
|
||||
import * as https from "https";
|
||||
import * as url from "url";
|
||||
import * as fs from "fs";
|
||||
import * as path from "path";
|
||||
import * as electron from "electron";
|
||||
|
||||
const WebSocket = ws;
|
||||
const WebSocketServer = ws.Server;
|
||||
|
||||
interface standardResponse {
|
||||
|
@ -16,13 +21,12 @@ export class wsapi {
|
|||
port: any = 26369
|
||||
wss: any = null
|
||||
clients: any = []
|
||||
private _win: any;
|
||||
|
||||
constructor(win: any) {
|
||||
private _win : any;
|
||||
constructor(win : any) {
|
||||
this._win = win;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
createId() {
|
||||
// create random guid
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||
|
@ -31,34 +35,33 @@ export class wsapi {
|
|||
return v.toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
public async InitWebSockets() {
|
||||
electron.ipcMain.on('wsapi-updatePlaybackState', (_event: any, arg: any) => {
|
||||
public async InitWebSockets () {
|
||||
electron.ipcMain.on('wsapi-updatePlaybackState', (event :any, arg :any) => {
|
||||
this.updatePlaybackState(arg);
|
||||
})
|
||||
|
||||
electron.ipcMain.on('wsapi-returnQueue', (_event: any, arg: any) => {
|
||||
electron.ipcMain.on('wsapi-returnQueue', (event :any, arg :any) => {
|
||||
this.returnQueue(JSON.parse(arg));
|
||||
});
|
||||
|
||||
electron.ipcMain.on('wsapi-returnSearch', (_event: any, arg: any) => {
|
||||
electron.ipcMain.on('wsapi-returnSearch', (event :any, arg :any) => {
|
||||
console.log("SEARCH")
|
||||
this.returnSearch(JSON.parse(arg));
|
||||
});
|
||||
|
||||
electron.ipcMain.on('wsapi-returnSearchLibrary', (_event: any, arg: any) => {
|
||||
electron.ipcMain.on('wsapi-returnSearchLibrary', (event :any, arg :any) => {
|
||||
this.returnSearchLibrary(JSON.parse(arg));
|
||||
});
|
||||
|
||||
electron.ipcMain.on('wsapi-returnDynamic', (_event: any, arg: any, type: any) => {
|
||||
electron.ipcMain.on('wsapi-returnDynamic', (event :any, arg :any, type :any) => {
|
||||
this.returnDynamic(JSON.parse(arg), type);
|
||||
});
|
||||
|
||||
electron.ipcMain.on('wsapi-returnMusicKitApi', (_event: any, arg: any, method: any) => {
|
||||
electron.ipcMain.on('wsapi-returnMusicKitApi', (event :any, arg :any, method :any) => {
|
||||
this.returnMusicKitApi(JSON.parse(arg), method);
|
||||
});
|
||||
|
||||
electron.ipcMain.on('wsapi-returnLyrics', (_event: any, arg: any) => {
|
||||
electron.ipcMain.on('wsapi-returnLyrics', (event :any, arg :any) => {
|
||||
this.returnLyrics(JSON.parse(arg));
|
||||
});
|
||||
this.wss = new WebSocketServer({
|
||||
|
@ -85,20 +88,20 @@ export class wsapi {
|
|||
})
|
||||
console.log(`WebSocketServer started on port: ${this.port}`);
|
||||
|
||||
const defaultResponse: standardResponse = {status: 0, data: {}, message: "OK", type: "generic"};
|
||||
const defaultResponse :standardResponse = {status :0, data:{}, message:"OK", type:"generic"};
|
||||
|
||||
|
||||
this.wss.on('connection', (ws: any) => {
|
||||
this.wss.on('connection', (ws : any) => {
|
||||
ws.id = this.createId();
|
||||
console.log(`Client ${ws.id} connected`)
|
||||
this.clients.push(ws);
|
||||
ws.on('message', function incoming(_message: any) {
|
||||
ws.on('message', function incoming(message : any) {
|
||||
|
||||
});
|
||||
// ws on message
|
||||
ws.on('message', (message: any) => {
|
||||
ws.on('message', (message : any) => {
|
||||
let data = JSON.parse(message);
|
||||
let response: standardResponse = {status: 0, data: {}, message: "OK", type: "generic"};
|
||||
let response :standardResponse = {status :0, data:{}, message:"OK", type:"generic"};
|
||||
if (data.action) {
|
||||
data.action.toLowerCase();
|
||||
}
|
||||
|
@ -137,9 +140,9 @@ export class wsapi {
|
|||
this._win.webContents.executeJavaScript(`wsapi.toggleShuffle()`);
|
||||
break;
|
||||
case "set-shuffle":
|
||||
if (data.shuffle == true) {
|
||||
if(data.shuffle == true) {
|
||||
this._win.webContents.executeJavaScript(`MusicKit.getInstance().shuffleMode = 1`);
|
||||
} else {
|
||||
}else{
|
||||
this._win.webContents.executeJavaScript(`MusicKit.getInstance().shuffleMode = 0`);
|
||||
}
|
||||
break;
|
||||
|
@ -229,7 +232,7 @@ export class wsapi {
|
|||
break;
|
||||
case "quit":
|
||||
electron.app.quit();
|
||||
break;
|
||||
break;
|
||||
}
|
||||
ws.send(JSON.stringify(response));
|
||||
});
|
||||
|
@ -242,56 +245,48 @@ export class wsapi {
|
|||
ws.send(JSON.stringify(defaultResponse));
|
||||
});
|
||||
}
|
||||
|
||||
sendToClient(_id: any) {
|
||||
sendToClient(id : any) {
|
||||
// replace the clients.forEach with a filter to find the client that requested
|
||||
}
|
||||
|
||||
updatePlaybackState(attr: any) {
|
||||
const response: standardResponse = {status: 0, data: attr, message: "OK", type: "playbackStateUpdate"};
|
||||
updatePlaybackState(attr : any) {
|
||||
const response : standardResponse = {status: 0, data: attr, message: "OK", type:"playbackStateUpdate"};
|
||||
this.clients.forEach(function each(client: any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
||||
returnMusicKitApi(results: any, method: any) {
|
||||
const response: standardResponse = {status: 0, data: results, message: "OK", type: `musickitapi.${method}`};
|
||||
this.clients.forEach(function each(client: any) {
|
||||
returnMusicKitApi(results :any, method :any) {
|
||||
const response : standardResponse = {status :0, data: results, message:"OK", type:`musickitapi.${method}`};
|
||||
this.clients.forEach(function each(client :any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
||||
returnDynamic(results: any, type: any) {
|
||||
const response: standardResponse = {status: 0, data: results, message: "OK", type: type};
|
||||
this.clients.forEach(function each(client: any) {
|
||||
returnDynamic(results :any, type :any) {
|
||||
const response : standardResponse = {status :0, data: results, message: "OK", type: type};
|
||||
this.clients.forEach(function each(client :any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
||||
returnLyrics(results: any) {
|
||||
const response: standardResponse = {status: 0, data: results, message: "OK", type: "lyrics"};
|
||||
this.clients.forEach(function each(client: any) {
|
||||
returnLyrics(results :any) {
|
||||
const response : standardResponse = {status :0, data: results, message: "OK", type: "lyrics"};
|
||||
this.clients.forEach(function each(client :any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
||||
returnSearch(results: any) {
|
||||
const response: standardResponse = {status: 0, data: results, message: "OK", type: "searchResults"};
|
||||
this.clients.forEach(function each(client: any) {
|
||||
returnSearch(results :any) {
|
||||
const response : standardResponse = {status :0, data: results, message: "OK", type: "searchResults"};
|
||||
this.clients.forEach(function each(client :any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
||||
returnSearchLibrary(results: any) {
|
||||
const response: standardResponse = {status: 0, data: results, message: "OK", type: "searchResultsLibrary"};
|
||||
this.clients.forEach(function each(client: any) {
|
||||
returnSearchLibrary(results :any) {
|
||||
const response: standardResponse = {status :0, data :results, message:"OK", type:"searchResultsLibrary"};
|
||||
this.clients.forEach(function each(client :any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
||||
returnQueue(queue: any) {
|
||||
const response: standardResponse = {status: 0, data: queue, message: "OK", type: "queue"};
|
||||
this.clients.forEach(function each(client: any) {
|
||||
returnQueue(queue :any) {
|
||||
const response : standardResponse = {status :0,data :queue, message:"OK", type:"queue"};
|
||||
this.clients.forEach(function each(client :any) {
|
||||
client.send(JSON.stringify(response));
|
||||
});
|
||||
}
|
||||
|
|
|
@ -2,27 +2,18 @@ require('v8-compile-cache');
|
|||
|
||||
import {app, components, ipcMain} from 'electron';
|
||||
import {join} from 'path';
|
||||
app.setPath('userData', join(app.getPath('appData'), 'Cider'));
|
||||
|
||||
if (!app.isPackaged) {
|
||||
app.setPath('userData', join(app.getPath('appData'), 'Cider'));
|
||||
}
|
||||
|
||||
// Analytics for debugging fun yeah.
|
||||
import {init as Sentry} from '@sentry/electron';
|
||||
import {Store} from "./base/store";
|
||||
import {AppEvents} from "./base/app";
|
||||
import {Plugins} from "./base/plugins";
|
||||
import {utils} from "./base/utils";
|
||||
import {BrowserWindow} from "./base/browserwindow";
|
||||
import {init as Sentry} from '@sentry/electron';
|
||||
import {RewriteFrames} from "@sentry/integrations";
|
||||
|
||||
// Analytics for debugging fun yeah.
|
||||
Sentry({
|
||||
dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214",
|
||||
integrations: [
|
||||
new RewriteFrames({
|
||||
root: process.cwd(),
|
||||
}),
|
||||
],
|
||||
});
|
||||
Sentry({dsn: "https://68c422bfaaf44dea880b86aad5a820d2@o954055.ingest.sentry.io/6112214"});
|
||||
|
||||
new Store();
|
||||
const Cider = new AppEvents();
|
||||
|
@ -58,11 +49,11 @@ app.on('ready', () => {
|
|||
* Renderer Event Handlers
|
||||
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
||||
|
||||
ipcMain.on('playbackStateDidChange', (_event, attributes) => {
|
||||
ipcMain.on('playbackStateDidChange', (event, attributes) => {
|
||||
CiderPlug.callPlugins('onPlaybackStateDidChange', attributes);
|
||||
});
|
||||
|
||||
ipcMain.on('nowPlayingItemDidChange', (_event, attributes) => {
|
||||
ipcMain.on('nowPlayingItemDidChange', (event, attributes) => {
|
||||
CiderPlug.callPlugins('onNowPlayingItemDidChange', attributes);
|
||||
});
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
let i = 1, k = 1;
|
||||
class ExamplePlugin {
|
||||
export default class ExamplePlugin {
|
||||
/**
|
||||
* Private variables for interaction in plugins
|
||||
*/
|
||||
|
@ -41,7 +41,7 @@ class ExamplePlugin {
|
|||
|
||||
/**
|
||||
* Runs on playback State Change
|
||||
* @param attributes Music Attributes (attributes.status = current state)
|
||||
* @param attributes Music Attributes (attributes.state = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
console.log('onPlaybackStateDidChange has been called ' + i + ' times');
|
||||
|
@ -58,5 +58,3 @@ class ExamplePlugin {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
module.exports = ExamplePlugin;
|
|
@ -1,4 +1,4 @@
|
|||
class sendSongToTitlebar {
|
||||
export default class sendSongToTitlebar {
|
||||
/**
|
||||
* Base Plugin Details (Eventually implemented into a GUI in settings)
|
||||
*/
|
||||
|
@ -24,7 +24,7 @@ class sendSongToTitlebar {
|
|||
onBeforeQuit(): void {}
|
||||
/**
|
||||
* Runs on playback State Change
|
||||
* @param attributes Music Attributes (attributes.status = current state)
|
||||
* @param attributes Music Attributes (attributes.state = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: any): void {
|
||||
this._win.setTitle(`${(attributes != null && attributes.name != null && attributes.name.length > 0) ? (attributes.name + " - ") : ''}Cider`)
|
||||
|
@ -34,6 +34,4 @@ class sendSongToTitlebar {
|
|||
* @param attributes Music Attributes
|
||||
*/
|
||||
onNowPlayingItemDidChange(attributes: object): void {}
|
||||
}
|
||||
|
||||
module.exports = sendSongToTitlebar;
|
||||
}
|
|
@ -90,44 +90,6 @@ export default class DiscordRichPresence {
|
|||
}).catch((e: any) => console.error(`[DiscordRPC][disconnect] ${e}`));
|
||||
}
|
||||
|
||||
/**
|
||||
* Filter the Discord activity object
|
||||
*/
|
||||
private filterActivity(activity: any, attributes: any): Object {
|
||||
|
||||
// Checks if the name is greater than 128 because some songs can be that long
|
||||
if (activity.details && activity.details.length > 128) {
|
||||
activity.details = activity.details.substring(0, 125) + '...'
|
||||
}
|
||||
|
||||
// Check large image
|
||||
if (activity.largeImageKey === null || activity.largeImageKey === ""){
|
||||
activity.largeImageKey = "cider";
|
||||
}
|
||||
|
||||
// Timestamp
|
||||
if (new Date(attributes.endTime).getTime() < 0) {
|
||||
delete activity.startTime
|
||||
delete activity.endTime
|
||||
}
|
||||
|
||||
// not sure
|
||||
if (!attributes.artistName) {
|
||||
delete activity.state;
|
||||
}
|
||||
|
||||
if (!activity.largeImageText || activity.largeImageText.length < 2) {
|
||||
delete activity.largeImageText
|
||||
}
|
||||
|
||||
activity.buttons.forEach((key: {label: string, url: string}, _v: Number) => {
|
||||
if (key.url.includes('undefined') || key.url.includes('no-id-found')) {
|
||||
activity.buttons.splice(key, 1);
|
||||
}
|
||||
})
|
||||
return activity
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the activity of the client
|
||||
* @param {object} attributes
|
||||
|
@ -143,18 +105,23 @@ export default class DiscordRichPresence {
|
|||
this._activity = {
|
||||
details: attributes.name,
|
||||
state: `${attributes.artistName ? `by ${attributes.artistName}` : ''}`,
|
||||
startTimestamp: attributes.startTime,
|
||||
endTimestamp: attributes.endTime,
|
||||
largeImageKey: attributes.artwork.url.replace('{w}', '1024').replace('{h}', '1024'),
|
||||
startTimestamp: ((new Date(attributes.endTime).getTime() < 0) ? null : attributes.startTime),
|
||||
endTimestamp: ((new Date(attributes.endTime).getTime() < 0) ? null : attributes.endTime),
|
||||
largeImageKey: (attributes.artwork.url.replace('{w}', '1024').replace('{h}', '1024')) ?? 'cider',
|
||||
largeImageText: attributes.albumName,
|
||||
instance: false, // Whether the activity is in a game session
|
||||
|
||||
buttons: [
|
||||
{label: "Listen on Cider", url: attributes.url.cider},
|
||||
{label: "View on Apple Music", url: attributes.url.appleMusic},
|
||||
]
|
||||
};
|
||||
|
||||
this._activity = this.filterActivity(this._activity, attributes)
|
||||
|
||||
// Checks if the name is greater than 128 because some songs can be that long
|
||||
if (this._activity.details && this._activity.details.length > 128) {
|
||||
this._activity.details = this._activity.details.substring(0, 125) + '...'
|
||||
}
|
||||
|
||||
// Check if its pausing (false) or playing (true)
|
||||
if (!attributes.status) {
|
||||
|
@ -212,7 +179,7 @@ export default class DiscordRichPresence {
|
|||
|
||||
/**
|
||||
* Runs on playback State Change
|
||||
* @param attributes Music Attributes (attributes.status = current state)
|
||||
* @param attributes Music Attributes (attributes.state = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
this.updateActivity(attributes)
|
||||
|
|
|
@ -231,7 +231,7 @@ export default class LastFMPlugin {
|
|||
|
||||
/**
|
||||
* Runs on playback State Change
|
||||
* @param attributes Music Attributes (attributes.status = current state)
|
||||
* @param attributes Music Attributes (attributes.state = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
this.scrobbleSong(attributes)
|
||||
|
|
|
@ -21,11 +21,11 @@ export default class MPRIS {
|
|||
*/
|
||||
private mpris: any;
|
||||
private mprisEvents: Object = {
|
||||
"playpause": "playPause",
|
||||
"play": "play",
|
||||
"pause": "pause",
|
||||
"next": "next",
|
||||
"previous": "previous",
|
||||
"playpause": "pausePlay",
|
||||
"play": "pausePlay",
|
||||
"pause": "pausePlay",
|
||||
"next": "nextTrack",
|
||||
"previous": "previousTrack",
|
||||
}
|
||||
|
||||
/*******************************************************************************************
|
||||
|
@ -179,7 +179,7 @@ export default class MPRIS {
|
|||
|
||||
/**
|
||||
* Runs on playback State Change
|
||||
* @param attributes Music Attributes (attributes.status = current state)
|
||||
* @param attributes Music Attributes (attributes.state = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
this.updatePlayerState(attributes)
|
||||
|
|
|
@ -1,133 +0,0 @@
|
|||
import {nativeImage, nativeTheme} from "electron";
|
||||
import {utils} from "../base/utils";
|
||||
import {join} from "path";
|
||||
|
||||
export default class Thumbar {
|
||||
/**
|
||||
* Private variables for interaction in plugins
|
||||
*/
|
||||
private _win: any;
|
||||
private _app: any;
|
||||
|
||||
/**
|
||||
* Base Plugin Details (Eventually implemented into a GUI in settings)
|
||||
*/
|
||||
public name: string = 'Thumbnail Toolbar Plugin';
|
||||
public description: string = 'Creates and managed the thumbnail toolbar buttons and their events';
|
||||
public version: string = '1.0.0';
|
||||
public author: string = 'Core';
|
||||
|
||||
/**
|
||||
* Thumbnail Toolbar Assets
|
||||
*/
|
||||
private icons: { pause: Electron.NativeImage, play: Electron.NativeImage, next: Electron.NativeImage, previous: Electron.NativeImage } = {
|
||||
pause: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_pause.png`)),
|
||||
play: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_play.png`)),
|
||||
next: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_next.png`)),
|
||||
previous: nativeImage.createFromPath(join(utils.getPath('resourcePath'), 'icons/thumbar', `${nativeTheme.shouldUseDarkColors ? 'light' : 'dark'}_previous.png`)),
|
||||
}
|
||||
|
||||
/*******************************************************************************************
|
||||
* Private Methods
|
||||
* ****************************************************************************************/
|
||||
|
||||
/**
|
||||
* Blocks non-windows systems from running this plugin
|
||||
* @private
|
||||
* @decorator
|
||||
*/
|
||||
private static windowsOnly(_target: any, _propertyKey: string, descriptor: PropertyDescriptor) {
|
||||
if (process.platform !== 'win32') {
|
||||
descriptor.value = function () {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the thumbnail toolbar
|
||||
*/
|
||||
@Thumbar.windowsOnly
|
||||
private updateButtons(attributes: any) {
|
||||
|
||||
console.log(attributes)
|
||||
|
||||
if (!attributes) {
|
||||
return
|
||||
}
|
||||
|
||||
const buttons = [
|
||||
{
|
||||
tooltip: 'Previous',
|
||||
icon: this.icons.previous,
|
||||
click() {
|
||||
utils.playback.previous()
|
||||
}
|
||||
},
|
||||
{
|
||||
tooltip: attributes.status ? 'Pause' : 'Play',
|
||||
icon: attributes.status ? this.icons.pause : this.icons.play,
|
||||
click() {
|
||||
utils.playback.playPause()
|
||||
}
|
||||
},
|
||||
{
|
||||
tooltip: 'Next',
|
||||
icon: this.icons.next,
|
||||
click() {
|
||||
utils.playback.next()
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
if (!attributes.playParams || attributes.playParams.id === 'no-id-found') {
|
||||
this._win.setThumbarButtons([])
|
||||
} else {
|
||||
this._win.setThumbarButtons(buttons);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************************
|
||||
* Public Methods
|
||||
* ****************************************************************************************/
|
||||
|
||||
/**
|
||||
* Runs on plugin load (Currently run on application start)
|
||||
*/
|
||||
constructor(app: any, _store: any) {
|
||||
this._app = app;
|
||||
console.debug(`[Plugin][${this.name}] Loading Complete.`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on app ready
|
||||
*/
|
||||
onReady(win: Electron.BrowserWindow): void {
|
||||
this._win = win;
|
||||
console.debug(`[Plugin][${this.name}] Ready.`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on app stop
|
||||
*/
|
||||
onBeforeQuit(): void {
|
||||
console.debug(`[Plugin][${this.name}] Stopped.`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on playback State Change
|
||||
* @param attributes Music Attributes (attributes.status = current state)
|
||||
*/
|
||||
onPlaybackStateDidChange(attributes: object): void {
|
||||
this.updateButtons(attributes)
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs on song change
|
||||
* @param attributes Music Attributes
|
||||
*/
|
||||
onNowPlayingItemDidChange(attributes: object): void {
|
||||
this.updateButtons(attributes)
|
||||
}
|
||||
|
||||
}
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
@ -51,8 +51,8 @@ const MusicKitInterop = {
|
|||
attributes.playParams = attributes?.playParams ?? {id: 'no-id-found'};
|
||||
attributes.playParams.id = attributes?.playParams?.id ?? 'no-id-found';
|
||||
attributes.url = {
|
||||
cider: `cider://play/s/${nowPlayingItem?._songId ?? 'no-id-found'}`,
|
||||
appleMusic: attributes.websiteUrl ? attributes.websiteUrl : `https://music.apple.com/${mk.storefrontId}/song/${nowPlayingItem?._songId ?? 'no-id-found'}`
|
||||
cider: "cider://play/s/" + nowPlayingItem?._songId ?? 'no-id-found',
|
||||
appleMusic: "https://music.apple.com/"+ mk.storefrontId +"/song/" + nowPlayingItem?._songId ?? 'no-id-found'
|
||||
}
|
||||
if (attributes.playParams.id === 'no-id-found') {
|
||||
attributes.playParams.id = nowPlayingItem?.id ?? 'no-id-found';
|
||||
|
@ -88,28 +88,20 @@ const MusicKitInterop = {
|
|||
return true;
|
||||
},
|
||||
|
||||
play: () => {
|
||||
MusicKit.getInstance().play().then(r => console.log(`[MusicKitInterop.play] ${r}`));
|
||||
},
|
||||
|
||||
pause: () => {
|
||||
MusicKit.getInstance().pause();
|
||||
},
|
||||
|
||||
playPause: () => {
|
||||
pausePlay: function () {
|
||||
if (MusicKit.getInstance().isPlaying) {
|
||||
MusicKit.getInstance().pause();
|
||||
} else if (MusicKit.getInstance().nowPlayingItem != null) {
|
||||
MusicKit.getInstance().play().then(r => console.log(`[MusicKitInterop.playPause] Playing ${r}`));
|
||||
MusicKit.getInstance().play().then(r => console.log(`[MusicKitInterop] Playing ${r}`));
|
||||
}
|
||||
},
|
||||
|
||||
next: () => {
|
||||
MusicKit.getInstance().skipToNextItem().then(r => console.log(`[MusicKitInterop.next] Skipping to Next ${r}`));
|
||||
nextTrack: function () {
|
||||
MusicKit.getInstance().skipToNextItem().then(r => console.log(`[MusicKitInterop] Skipping to Next ${r}`));
|
||||
},
|
||||
|
||||
previous: () => {
|
||||
MusicKit.getInstance().skipToPreviousItem().then(r => console.log(`[MusicKitInterop.previous] Skipping to Previous ${r}`));
|
||||
previousTrack: function () {
|
||||
MusicKit.getInstance().skipToPreviousItem().then(r => console.log(`[MusicKitInterop] Skipping to Previous ${r}`));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
4
src/renderer/AppHeader.svg
Normal file
After Width: | Height: | Size: 14 KiB |
|
@ -1,39 +0,0 @@
|
|||
<?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 300 100" 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(0.30081,0,0,0.30081,-41.1651,-47.9227)">
|
||||
<g transform="matrix(1.26848,0,0,1.26848,167,195.512)">
|
||||
<circle cx="101" cy="102.5" r="79.5" style="fill:rgb(15,15,15);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.260038,0,0,0.260038,167,195.511)">
|
||||
<g id="Release.afdesign">
|
||||
<g>
|
||||
<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);"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(10.0544,0,0,10.0544,472.765,384.95)">
|
||||
<g transform="matrix(16,0,0,16,0,0)">
|
||||
<path d="M0.705,-0.473C0.685,-0.641 0.558,-0.737 0.389,-0.737C0.197,-0.737 0.05,-0.602 0.05,-0.364C0.05,-0.126 0.195,0.01 0.389,0.01C0.576,0.01 0.688,-0.114 0.705,-0.248L0.549,-0.249C0.535,-0.171 0.474,-0.126 0.392,-0.126C0.281,-0.126 0.206,-0.208 0.206,-0.364C0.206,-0.515 0.28,-0.601 0.393,-0.601C0.477,-0.601 0.538,-0.553 0.549,-0.473L0.705,-0.473Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,12.0341,0)">
|
||||
<path d="M0.06,-0L0.212,-0L0.212,-0.545L0.06,-0.545L0.06,-0ZM0.136,-0.616C0.181,-0.616 0.218,-0.65 0.218,-0.692C0.218,-0.734 0.181,-0.769 0.136,-0.769C0.092,-0.769 0.055,-0.734 0.055,-0.692C0.055,-0.65 0.092,-0.616 0.136,-0.616Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,16.3864,0)">
|
||||
<path d="M0.261,0.009C0.349,0.009 0.395,-0.042 0.416,-0.087L0.423,-0.087L0.423,-0L0.572,-0L0.572,-0.727L0.421,-0.727L0.421,-0.454L0.416,-0.454C0.396,-0.498 0.352,-0.553 0.261,-0.553C0.141,-0.553 0.04,-0.46 0.04,-0.272C0.04,-0.089 0.137,0.009 0.261,0.009ZM0.309,-0.112C0.235,-0.112 0.195,-0.178 0.195,-0.273C0.195,-0.367 0.234,-0.432 0.309,-0.432C0.383,-0.432 0.424,-0.37 0.424,-0.273C0.424,-0.175 0.382,-0.112 0.309,-0.112Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,26.5511,0)">
|
||||
<path d="M0.309,0.011C0.444,0.011 0.535,-0.055 0.556,-0.156L0.416,-0.165C0.401,-0.124 0.362,-0.102 0.311,-0.102C0.236,-0.102 0.188,-0.152 0.188,-0.234L0.188,-0.234L0.559,-0.234L0.559,-0.276C0.559,-0.461 0.447,-0.553 0.303,-0.553C0.142,-0.553 0.038,-0.439 0.038,-0.27C0.038,-0.097 0.141,0.011 0.309,0.011ZM0.188,-0.328C0.191,-0.39 0.238,-0.44 0.305,-0.44C0.371,-0.44 0.417,-0.393 0.417,-0.328L0.188,-0.328Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,36.1136,0)">
|
||||
<path d="M0.06,-0L0.212,-0L0.212,-0.309C0.212,-0.376 0.261,-0.422 0.327,-0.422C0.348,-0.422 0.377,-0.418 0.391,-0.414L0.391,-0.548C0.378,-0.551 0.359,-0.553 0.344,-0.553C0.283,-0.553 0.233,-0.518 0.213,-0.45L0.207,-0.45L0.207,-0.545L0.06,-0.545L0.06,-0Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(-0.0132579,-1.62362e-18,-1.62362e-18,0.0132579,288.703,42.7877)">
|
||||
<g id="g3003">
|
||||
<path id="path3005" d="M1611,832C1611,796.667 1598.67,766.667 1574,742L923,91C897.667,65.667 867.333,53 832,53C796,53 766,65.667 742,91L91,742C65.667,766 53,796 53,832C53,867.333 65.667,897.667 91,923L165,998C191,1022.67 221.333,1035 256,1035C291.333,1035 321.333,1022.67 346,998L832,512L1318,998C1342.67,1022.67 1372.67,1035 1408,1035C1442.67,1035 1473,1022.67 1499,998L1574,923C1598.67,897 1611,866.667 1611,832Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 4.5 KiB |
|
@ -1,39 +0,0 @@
|
|||
<?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 300 100" 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(0.30081,0,0,0.30081,-41.1651,-47.9227)">
|
||||
<g transform="matrix(1.26848,0,0,1.26848,167,195.512)">
|
||||
<circle cx="101" cy="102.5" r="79.5" style="fill:rgb(15,15,15);"/>
|
||||
</g>
|
||||
<g transform="matrix(0.260038,0,0,0.260038,167,195.511)">
|
||||
<g id="Release.afdesign">
|
||||
<g>
|
||||
<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);"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(10.0544,0,0,10.0544,472.765,384.95)">
|
||||
<g transform="matrix(16,0,0,16,0,0)">
|
||||
<path d="M0.705,-0.473C0.685,-0.641 0.558,-0.737 0.389,-0.737C0.197,-0.737 0.05,-0.602 0.05,-0.364C0.05,-0.126 0.195,0.01 0.389,0.01C0.576,0.01 0.688,-0.114 0.705,-0.248L0.549,-0.249C0.535,-0.171 0.474,-0.126 0.392,-0.126C0.281,-0.126 0.206,-0.208 0.206,-0.364C0.206,-0.515 0.28,-0.601 0.393,-0.601C0.477,-0.601 0.538,-0.553 0.549,-0.473L0.705,-0.473Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,12.0341,0)">
|
||||
<path d="M0.06,-0L0.212,-0L0.212,-0.545L0.06,-0.545L0.06,-0ZM0.136,-0.616C0.181,-0.616 0.218,-0.65 0.218,-0.692C0.218,-0.734 0.181,-0.769 0.136,-0.769C0.092,-0.769 0.055,-0.734 0.055,-0.692C0.055,-0.65 0.092,-0.616 0.136,-0.616Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,16.3864,0)">
|
||||
<path d="M0.261,0.009C0.349,0.009 0.395,-0.042 0.416,-0.087L0.423,-0.087L0.423,-0L0.572,-0L0.572,-0.727L0.421,-0.727L0.421,-0.454L0.416,-0.454C0.396,-0.498 0.352,-0.553 0.261,-0.553C0.141,-0.553 0.04,-0.46 0.04,-0.272C0.04,-0.089 0.137,0.009 0.261,0.009ZM0.309,-0.112C0.235,-0.112 0.195,-0.178 0.195,-0.273C0.195,-0.367 0.234,-0.432 0.309,-0.432C0.383,-0.432 0.424,-0.37 0.424,-0.273C0.424,-0.175 0.382,-0.112 0.309,-0.112Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,26.5511,0)">
|
||||
<path d="M0.309,0.011C0.444,0.011 0.535,-0.055 0.556,-0.156L0.416,-0.165C0.401,-0.124 0.362,-0.102 0.311,-0.102C0.236,-0.102 0.188,-0.152 0.188,-0.234L0.188,-0.234L0.559,-0.234L0.559,-0.276C0.559,-0.461 0.447,-0.553 0.303,-0.553C0.142,-0.553 0.038,-0.439 0.038,-0.27C0.038,-0.097 0.141,0.011 0.309,0.011ZM0.188,-0.328C0.191,-0.39 0.238,-0.44 0.305,-0.44C0.371,-0.44 0.417,-0.393 0.417,-0.328L0.188,-0.328Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,36.1136,0)">
|
||||
<path d="M0.06,-0L0.212,-0L0.212,-0.309C0.212,-0.376 0.261,-0.422 0.327,-0.422C0.348,-0.422 0.377,-0.418 0.391,-0.414L0.391,-0.548C0.378,-0.551 0.359,-0.553 0.344,-0.553C0.283,-0.553 0.233,-0.518 0.213,-0.45L0.207,-0.45L0.207,-0.545L0.06,-0.545L0.06,-0Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.0132579,0,0,-0.0132579,266.642,57.2123)">
|
||||
<g id="g3003">
|
||||
<path id="path3005" d="M1611,832C1611,796.667 1598.67,766.667 1574,742L923,91C897.667,65.667 867.333,53 832,53C796,53 766,65.667 742,91L91,742C65.667,766 53,796 53,832C53,867.333 65.667,897.667 91,923L165,998C191,1022.67 221.333,1035 256,1035C291.333,1035 321.333,1022.67 346,998L832,512L1318,998C1342.67,1022.67 1372.67,1035 1408,1035C1442.67,1035 1473,1022.67 1499,998L1574,923C1598.67,897 1611,866.667 1611,832Z" style="fill:rgb(235,235,235);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 35 KiB |
|
@ -1,49 +0,0 @@
|
|||
<?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>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.5 KiB |
|
@ -8,8 +8,6 @@ var CiderAudio = {
|
|||
audioBands : null,
|
||||
preampNode : null,
|
||||
vibrantbassNode: null,
|
||||
llpw: null,
|
||||
llpwEnabled: null
|
||||
},
|
||||
init: function (cb = function () { }) {
|
||||
//AudioOutputs.fInit = true;
|
||||
|
@ -31,29 +29,14 @@ var CiderAudio = {
|
|||
try{ CiderAudio.audioNodes.spatialNode.disconnect();} catch(e){}
|
||||
try{
|
||||
CiderAudio.audioNodes.preampNode.disconnect();
|
||||
for (var i of CiderAudio.audioNodes.llpw){
|
||||
i.disconnect();
|
||||
}
|
||||
for (var i of CiderAudio.audioNodes.vibrantbassNode){
|
||||
i.disconnect();
|
||||
}
|
||||
for (var i of CiderAudio.audioNodes.audioBands){
|
||||
i.disconnect();
|
||||
}
|
||||
CiderAudio.audioNodes.vibrantbassNode.disconnect();
|
||||
CiderAudio.audioNodes.audioBands[0].disconnect();
|
||||
CiderAudio.audioNodes.audioBands[9].disconnect();
|
||||
} catch(e){}
|
||||
try{
|
||||
CiderAudio.audioNodes = {
|
||||
gainNode : null,
|
||||
spatialNode : null,
|
||||
spatialInput: null,
|
||||
audioBands : null,
|
||||
preampNode : null,
|
||||
vibrantbassNode: null,
|
||||
}
|
||||
} catch (e) {}
|
||||
CiderAudio.source.connect(CiderAudio.context.destination);} catch(e){}
|
||||
},
|
||||
connectContext: function (mediaElem){
|
||||
|
||||
if (!CiderAudio.context){
|
||||
CiderAudio.context = new (window.AudioContext || window.webkitAudioContext);
|
||||
}
|
||||
|
@ -126,11 +109,7 @@ var CiderAudio = {
|
|||
let VIBRANTBASSBANDS = app.cfg.audio.vibrantBass.frequencies;
|
||||
let VIBRANTBASSGAIN = app.cfg.audio.vibrantBass.gain;
|
||||
let VIBRANTBASSQ = app.cfg.audio.vibrantBass.Q;
|
||||
LLPW_Q = [5, 1, 3.536, 1.25, 8.409, 1.25, 14.14, 7.071, 5, 0.625, 16.82, 20, 20, 20, 28.28, 28.28, 28.28, 20, 33.64, 33.64, 10, 28.28, 7.071, 3.856];
|
||||
LLPW_GAIN = [0.38, -1.81, -0.23, -0.51, 0.4, 0.84, 0.36, -0.34, 0.27, -1.2, -0.42, -0.67, 0.81, 1.31, -0.71, 0.68, -1.04, 0.79, -0.73, -1.33, 1.17, 0.57, 0.35, 6.33];
|
||||
LLPW_FREQUENCIES = [16.452, 24.636, 37.134, 74.483, 159.54, 308.18, 670.21, 915.81, 1200.7, 2766.4, 2930.6, 4050.6, 4409.1, 5395.2, 5901.6, 6455.5, 7164.1, 7724.1, 8449, 10573, 12368, 14198, 17910, 18916];
|
||||
CiderAudio.audioNodes.audioBands = []; CiderAudio.audioNodes.vibrantbassNode = [];
|
||||
CiderAudio.audioNodes.llpw = []; CiderAudio.audioNodes.llpwEnabled = 0;
|
||||
CiderAudio.audioNodes.audioBands = []; CiderAudio.audioNodes.vibrantbassNode = [];
|
||||
|
||||
for (i = 0; i < BANDS.length; i++) {
|
||||
CiderAudio.audioNodes.audioBands[i] = CiderAudio.context.createBiquadFilter();
|
||||
|
@ -139,14 +118,6 @@ var CiderAudio = {
|
|||
CiderAudio.audioNodes.audioBands[i].Q.value = Q[i];
|
||||
CiderAudio.audioNodes.audioBands[i].gain.value = GAIN[i] * app.cfg.audio.equalizer.mix;
|
||||
}
|
||||
|
||||
for (i = 0; i < LLPW_FREQUENCIES.length; i++) {
|
||||
CiderAudio.audioNodes.llpw[i] = CiderAudio.context.createBiquadFilter();
|
||||
CiderAudio.audioNodes.llpw[i].type = 'peaking'; // 'peaking';
|
||||
CiderAudio.audioNodes.llpw[i].frequency.value = LLPW_FREQUENCIES[i];
|
||||
CiderAudio.audioNodes.llpw[i].Q.value = LLPW_Q[i];
|
||||
CiderAudio.audioNodes.llpw[i].gain.value = LLPW_GAIN[i] * 0.5 * CiderAudio.audioNodes.llpwEnabled;
|
||||
}
|
||||
|
||||
CiderAudio.audioNodes.preampNode = CiderAudio.context.createBiquadFilter();
|
||||
CiderAudio.audioNodes.preampNode.type = 'highshelf';
|
||||
|
@ -164,18 +135,13 @@ var CiderAudio = {
|
|||
if (app.cfg.audio.spatial) {
|
||||
try{
|
||||
CiderAudio.audioNodes.spatialNode.output.disconnect(CiderAudio.context.destination); } catch(e){}
|
||||
CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.llpw[0]);
|
||||
CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.preampNode);
|
||||
} else {
|
||||
try{
|
||||
CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){}
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);
|
||||
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.preampNode);
|
||||
}
|
||||
|
||||
for (i = 1; i < LLPW_FREQUENCIES.length; i ++) {
|
||||
CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]);
|
||||
}
|
||||
CiderAudio.audioNodes.llpw[LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.preampNode);
|
||||
|
||||
CiderAudio.audioNodes.preampNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]);
|
||||
|
||||
for (i = 1; i < VIBRANTBASSBANDS.length; i ++) {
|
||||
|
|
|
@ -96,9 +96,6 @@ const wsapi = {
|
|||
toggleShuffle() {
|
||||
MusicKit.getInstance().shuffleMode = MusicKit.getInstance().shuffleMode === 0 ? 1 : 0
|
||||
},
|
||||
togglePlayPause() {
|
||||
app.mk.isPlaying ? app.mk.pause() : app.mk.play()
|
||||
},
|
||||
toggleRepeat() {
|
||||
if(MusicKit.getInstance().repeatMode == 0) {
|
||||
MusicKit.getInstance().repeatMode = 1
|
||||
|
|
27
src/renderer/logo-simple.svg
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?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 313 105" 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(3.125,0,0,3.125,0,0)">
|
||||
<g transform="matrix(1.38696,0,0,1.38696,-183.553,-76.7485)">
|
||||
<g transform="matrix(16,0,0,16,160.665,73.4177)">
|
||||
<path d="M0.705,-0.473C0.685,-0.641 0.558,-0.737 0.389,-0.737C0.197,-0.737 0.05,-0.602 0.05,-0.364C0.05,-0.126 0.195,0.01 0.389,0.01C0.576,0.01 0.688,-0.114 0.705,-0.248L0.549,-0.249C0.535,-0.171 0.474,-0.126 0.392,-0.126C0.281,-0.126 0.206,-0.208 0.206,-0.364C0.206,-0.515 0.28,-0.601 0.393,-0.601C0.477,-0.601 0.538,-0.553 0.549,-0.473L0.705,-0.473Z" style="fill:white;fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,172.699,73.4177)">
|
||||
<path d="M0.06,-0L0.212,-0L0.212,-0.545L0.06,-0.545L0.06,-0ZM0.136,-0.616C0.181,-0.616 0.218,-0.65 0.218,-0.692C0.218,-0.734 0.181,-0.769 0.136,-0.769C0.092,-0.769 0.055,-0.734 0.055,-0.692C0.055,-0.65 0.092,-0.616 0.136,-0.616Z" style="fill:white;fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,177.051,73.4177)">
|
||||
<path d="M0.261,0.009C0.349,0.009 0.395,-0.042 0.416,-0.087L0.423,-0.087L0.423,-0L0.572,-0L0.572,-0.727L0.421,-0.727L0.421,-0.454L0.416,-0.454C0.396,-0.498 0.352,-0.553 0.261,-0.553C0.141,-0.553 0.04,-0.46 0.04,-0.272C0.04,-0.089 0.137,0.009 0.261,0.009ZM0.309,-0.112C0.235,-0.112 0.195,-0.178 0.195,-0.273C0.195,-0.367 0.234,-0.432 0.309,-0.432C0.383,-0.432 0.424,-0.37 0.424,-0.273C0.424,-0.175 0.382,-0.112 0.309,-0.112Z" style="fill:white;fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,187.216,73.4177)">
|
||||
<path d="M0.309,0.011C0.444,0.011 0.535,-0.055 0.556,-0.156L0.416,-0.165C0.401,-0.124 0.362,-0.102 0.311,-0.102C0.236,-0.102 0.188,-0.152 0.188,-0.234L0.188,-0.234L0.559,-0.234L0.559,-0.276C0.559,-0.461 0.447,-0.553 0.303,-0.553C0.142,-0.553 0.038,-0.439 0.038,-0.27C0.038,-0.097 0.141,0.011 0.309,0.011ZM0.188,-0.328C0.191,-0.39 0.238,-0.44 0.305,-0.44C0.371,-0.44 0.417,-0.393 0.417,-0.328L0.188,-0.328Z" style="fill:white;fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(16,0,0,16,196.778,73.4177)">
|
||||
<path d="M0.06,-0L0.212,-0L0.212,-0.309C0.212,-0.376 0.261,-0.422 0.327,-0.422C0.348,-0.422 0.377,-0.418 0.391,-0.414L0.391,-0.548C0.378,-0.551 0.359,-0.553 0.344,-0.553C0.283,-0.553 0.233,-0.518 0.213,-0.45L0.207,-0.45L0.207,-0.545L0.06,-0.545L0.06,-0Z" style="fill:white;fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
<circle cx="17" cy="16.667" r="12.333" style="fill:rgb(235,235,235);"/>
|
||||
<g id="g147" transform="matrix(0.297476,0,0,0.297476,-16.7212,-19.0819)">
|
||||
<path id="path41" d="M113.553,67.234C111.989,67.44 110.373,67.38 108.796,67.538C105.581,67.86 102.374,68.548 99.283,69.479C85.683,73.576 74.237,83.188 67.62,95.728C58.974,112.114 59.92,132.602 69.683,148.275C73.899,155.044 79.648,160.705 86.34,165.013C90.987,168.005 96.247,170.235 101.606,171.575C107.932,173.157 114.607,173.607 121.076,172.802C139.182,170.549 155.227,158.921 162.858,142.301C165.794,135.905 167.337,128.957 167.644,121.946C168.67,98.52 152.877,76.772 130.7,69.694C126.785,68.444 122.737,67.681 118.642,67.399C116.992,67.285 115.202,67.018 113.553,67.234M112.226,83.813C116.656,83.29 121.632,84.115 125.833,85.514C130.752,87.152 135.254,89.717 139.108,93.203C153.094,105.857 154.806,128.026 143.09,142.744C140.415,146.104 137.152,149.006 133.466,151.217C128.993,153.901 123.948,155.665 118.753,156.221C113.863,156.745 108.876,156.366 104.15,154.943C99.89,153.66 95.81,151.611 92.313,148.85C77.992,137.54 73.888,116.673 83.621,101.038C86.308,96.722 89.827,93.066 93.973,90.133C99.448,86.26 105.67,84.586 112.226,83.813M112.226,89.802C106.903,90.501 101.862,91.851 97.402,95.001C93.9,97.475 90.841,100.562 88.619,104.246C80.752,117.287 83.774,134.719 95.853,144.135C98.477,146.18 101.448,147.812 104.593,148.901C109.23,150.505 114.244,150.887 119.085,150.235C123.337,149.662 127.573,148.069 131.143,145.694C135.459,142.822 139.035,139.018 141.507,134.447C148.532,121.459 144.666,104.627 132.913,95.798C129.999,93.609 126.685,91.926 123.178,90.925C119.742,89.945 115.8,89.332 112.226,89.802M107.138,109.717C108.23,109.447 110.211,111.095 111.12,111.636C114.483,113.639 117.898,115.564 121.297,117.505C122.215,118.029 124.992,119.047 124.931,120.287C124.871,121.486 122.008,122.553 121.076,123.084C117.931,124.873 114.817,126.715 111.673,128.504C110.475,129.186 108.937,130.499 107.58,130.751C105.799,131.083 106.363,127.602 106.363,126.593L106.363,113.76C106.363,112.776 105.865,110.031 107.138,109.717Z" style="fill:rgb(255,91,109);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5 KiB |
29
src/renderer/logotmp2.svg
Normal file
After Width: | Height: | Size: 11 KiB |
2165
src/renderer/style-old.css
Normal file
|
@ -68,6 +68,10 @@ body[loading] {
|
|||
}
|
||||
}
|
||||
|
||||
body[platform='linux'] {
|
||||
background: #222;
|
||||
}
|
||||
|
||||
body.notransparency::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
|
@ -79,14 +83,6 @@ body.notransparency::before {
|
|||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg==);
|
||||
}
|
||||
|
||||
body.stopanimation * {
|
||||
animation: unset !important;
|
||||
|
||||
.loadbar-sound {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
*,
|
||||
*:before,
|
||||
*:after {
|
||||
|
@ -155,7 +151,7 @@ body.stopanimation * {
|
|||
right: 0;
|
||||
bottom: 0;
|
||||
opacity: 0.5;
|
||||
z-index: 0;
|
||||
z-index:0;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg==);
|
||||
}
|
||||
|
||||
|
@ -163,7 +159,6 @@ body.stopanimation * {
|
|||
z-index: 1;
|
||||
}
|
||||
}
|
||||
|
||||
//&::before {
|
||||
// position: absolute;
|
||||
// top: -50%;
|
||||
|
@ -292,25 +287,25 @@ input[type="text"], input[type="number"] {
|
|||
|
||||
.artworkMaterial {
|
||||
position: relative;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
height:100%;
|
||||
width:100%;
|
||||
overflow: hidden;
|
||||
pointer-events: none;
|
||||
|
||||
> img {
|
||||
>img {
|
||||
position: absolute;
|
||||
width: 200%;
|
||||
opacity: 0.5;
|
||||
filter: brightness(200%) blur(180px) saturate(280%) contrast(2);
|
||||
}
|
||||
|
||||
> img:first-child {
|
||||
top: 0;
|
||||
left: 0;
|
||||
>img:first-child {
|
||||
top:0;
|
||||
left:0;
|
||||
}
|
||||
|
||||
> img:last-child {
|
||||
bottom: 0;
|
||||
>img:last-child {
|
||||
bottom:0;
|
||||
right: 0;
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
|
@ -498,11 +493,9 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
|||
}
|
||||
|
||||
.app-sidebar-footer {
|
||||
border-top: 1px solid rgba(200, 200, 200, 0.15);
|
||||
padding: 11px;
|
||||
|
||||
.app-playback-controls {
|
||||
margin: 0 auto;
|
||||
.control-buttons {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
@ -564,7 +557,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
|||
font-size: 14px;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
margin-right: 35px;
|
||||
margin-right: 35px ;
|
||||
}
|
||||
|
||||
.app-sidebar-button > .sidebar-user-text .fullname {
|
||||
|
@ -662,7 +655,7 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
|||
}
|
||||
|
||||
.usermenu-container {
|
||||
top: 0px;
|
||||
bottom: 66px;
|
||||
#cmenu.container();
|
||||
|
||||
.usermenu-body {
|
||||
|
@ -670,19 +663,19 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
|||
|
||||
.usermenu-item {
|
||||
#cmenu.item();
|
||||
|
||||
|
||||
.usermenu-item-icon {
|
||||
position: relative;
|
||||
top: 1.5px;
|
||||
right: 3px;
|
||||
display: table-cell;
|
||||
position:relative;
|
||||
top:1.5px;
|
||||
right:3px;
|
||||
display:table-cell;
|
||||
}
|
||||
|
||||
.usermenu-item-name {
|
||||
position: relative;
|
||||
bottom: 2px;
|
||||
position:relative;
|
||||
bottom:2px;
|
||||
padding-left: 5px;
|
||||
display: table-cell;
|
||||
display:table-cell;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -876,7 +869,6 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
|||
.app-chrome .app-chrome--left {
|
||||
width: 30%;
|
||||
justify-content: left;
|
||||
-webkit-app-region: drag;
|
||||
}
|
||||
|
||||
.app-chrome .app-chrome--center {
|
||||
|
@ -994,31 +986,18 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
|||
height: 100%;
|
||||
}
|
||||
|
||||
.app-chrome .app-chrome-item > .app-mainmenu {
|
||||
width: 110px;
|
||||
.app-chrome .app-chrome-item > .app-title {
|
||||
width: 100px;
|
||||
font-size: 13px;
|
||||
background: url("./assets/AppChromeBtn.svg");
|
||||
background-size: contain;
|
||||
background: url("./AppHeader.svg");
|
||||
background-size: 95px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
height: 70%;
|
||||
height: 100%;
|
||||
margin-right: 16px;
|
||||
margin-left: 16px;
|
||||
margin-top: 1.5px;
|
||||
border: 0px;
|
||||
border-radius: 6px;
|
||||
|
||||
&:hover {
|
||||
background-color: var(--selected);
|
||||
}
|
||||
|
||||
&:active, &.active {
|
||||
background-color: var(--selected-click);
|
||||
}
|
||||
|
||||
&.active {
|
||||
background-image: url("./assets/AppChromeBtn-Open.svg");
|
||||
}
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
-webkit-app-region: drag;
|
||||
}
|
||||
|
||||
.app-chrome .app-chrome-item > .window-controls {
|
||||
|
@ -1072,44 +1051,6 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
|||
height: 100%;
|
||||
}
|
||||
|
||||
body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minimize {
|
||||
height: 12px;
|
||||
width: 12px;
|
||||
background-color: rgb(255, 92, 92);
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
margin: auto 4px;
|
||||
color: rgb(130, 0, 5);
|
||||
-webkit-app-region: no-drag;
|
||||
background-image: unset;
|
||||
}
|
||||
|
||||
body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls {
|
||||
width: 67px;
|
||||
}
|
||||
|
||||
body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.minmax {
|
||||
height: 12px;
|
||||
width: 12px;
|
||||
background-color: rgb(255, 189, 76);
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
margin: auto 4px;
|
||||
-webkit-app-region: no-drag;
|
||||
background-image: unset;
|
||||
}
|
||||
|
||||
body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.close {
|
||||
height: 12px;
|
||||
width: 12px;
|
||||
background-color: rgb(0, 202, 86);
|
||||
border-radius: 50%;
|
||||
display: inline-block;
|
||||
margin: auto 4px auto 4px;
|
||||
-webkit-app-region: no-drag;
|
||||
background-image: unset;
|
||||
}
|
||||
|
||||
.app-chrome .app-chrome-item.playback-controls {
|
||||
width: 80%;
|
||||
height: 90%;
|
||||
|
@ -1148,20 +1089,10 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl
|
|||
.explicit-icon {
|
||||
background-image: url("./assets/explicit.svg");
|
||||
height: 9px;
|
||||
width: 13px;
|
||||
filter: contrast(0);
|
||||
background-repeat: no-repeat;
|
||||
margin-left: 3px;
|
||||
}
|
||||
|
||||
.lossless-icon {
|
||||
background-image: url("http://localhost:9000/assets/lossless.svg");
|
||||
height: 9px;
|
||||
width: 36px;
|
||||
filter: contrast(0);
|
||||
background-repeat: no-repeat;
|
||||
margin-left: 3px;
|
||||
background-size: contain;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1174,49 +1105,43 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl
|
|||
margin: 0 0 0 0.25em;
|
||||
}
|
||||
|
||||
.app-playback-controls:hover .marquee {
|
||||
animation: unset;
|
||||
|
||||
&.song-artist {
|
||||
.app-playback-controls:hover .marquee{
|
||||
animation: unset;
|
||||
&.song-artist{
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.song-artist {
|
||||
.song-artist{
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
&.song-name {
|
||||
&.song-name{
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
&::after {
|
||||
&::after{
|
||||
content: none !important;
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.marquee {
|
||||
animation: marquee 15s linear infinite;
|
||||
|
||||
&.song-artist {
|
||||
overflow: unset;
|
||||
.marquee{
|
||||
animation: marquee 15s linear infinite;
|
||||
&.song-artist{
|
||||
overflow: unset ;
|
||||
}
|
||||
|
||||
.song-artist {
|
||||
overflow: unset;
|
||||
.song-artist{
|
||||
overflow: unset ;
|
||||
}
|
||||
|
||||
&.song-name {
|
||||
overflow: unset;
|
||||
&.song-name{
|
||||
overflow: unset ;
|
||||
}
|
||||
|
||||
&::after {
|
||||
&::after{
|
||||
content: attr(data-value);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
.app-chrome .app-chrome-item > .app-playback-controls .song-progress {
|
||||
@bgColor: transparent;
|
||||
//height: 16px;
|
||||
|
@ -1316,18 +1241,15 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl
|
|||
&:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: var(--hover);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background: var(--selected-click);
|
||||
transform: scale(0.95);
|
||||
}
|
||||
|
||||
.svg-icon {
|
||||
--url: url('views/svg/more.svg') !important;
|
||||
--url: url('views/svg/more.svg')!important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1342,7 +1264,7 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl
|
|||
overflow: hidden;
|
||||
}
|
||||
|
||||
.app-chrome .app-chrome-item > .app-playback-controls .playback-info > .song-progress {
|
||||
.app-chrome .app-chrome-item > .app-playback-controls .playback-info > .song-progress{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
@ -1353,8 +1275,7 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl
|
|||
display: flex;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.app-chrome .app-chrome-item > .app-playback-controls > div > .song-artist-album {
|
||||
.app-chrome .app-chrome-item > .app-playback-controls > div >.song-artist-album {
|
||||
font-weight: 400;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
|
@ -1367,17 +1288,17 @@ body[platform="darwin"] .app-chrome .app-chrome-item > .window-controls > div.cl
|
|||
max-width: 340px;
|
||||
overflow: hidden;
|
||||
|
||||
.song-artist-album-content {
|
||||
.song-artist-album-content{
|
||||
font-weight: 400;
|
||||
font-size: 12px;
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
width:100%;
|
||||
|
||||
&.song-artist-normal {
|
||||
height: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
&.song-artist-marquee {
|
||||
> marquee {
|
||||
|
@ -1405,7 +1326,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
}
|
||||
|
||||
/* Window is smaller <= 1023px width */
|
||||
@media only screen and (max-width: 1120px) {
|
||||
@media only screen and (max-width: 1023px) {
|
||||
.display--small {
|
||||
display: inherit !important;;
|
||||
|
||||
|
@ -1440,12 +1361,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
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(--keyColor) 2px, transparent 3px, transparent 10px);
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
|
||||
&::-webkit-slider-thumb:active {
|
||||
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
|
||||
transform: scale(1);
|
||||
|
@ -1461,6 +1382,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
}
|
||||
|
||||
|
||||
|
||||
.display--large {
|
||||
display: none !important;
|
||||
}
|
||||
|
@ -2242,16 +2164,15 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
border: 1px solid rgba(100, 100, 100, 0.35);
|
||||
border-top: 1px solid rgba(100, 100, 100, 0.5);
|
||||
color: #eee;
|
||||
white-space: nowrap;
|
||||
transition: transform 0.2s var(--appleEase), box-shadow 0.2s var(--appleEase);
|
||||
|
||||
&.md-btn-block {
|
||||
display: block;
|
||||
width: 100%;
|
||||
width:100%;
|
||||
}
|
||||
|
||||
&.md-btn-glyph {
|
||||
display: flex;
|
||||
display:flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
|
@ -2264,11 +2185,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
border-top: 1px solid rgb(220 53 69 / 50%);
|
||||
}
|
||||
|
||||
&.md-btn-small {
|
||||
padding: 6px 8px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
filter: brightness(125%);
|
||||
}
|
||||
|
@ -2295,37 +2211,16 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
}
|
||||
}
|
||||
|
||||
.btn-group {
|
||||
display:inline-flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
> .md-btn {
|
||||
border-radius:0px;
|
||||
width:100%;
|
||||
}
|
||||
> .md-btn:first-child {
|
||||
border-top-left-radius: 6px;
|
||||
border-bottom-left-radius: 6px;
|
||||
}
|
||||
> .md-btn:last-child {
|
||||
border-top-right-radius: 6px;
|
||||
border-bottom-right-radius: 6px;
|
||||
}
|
||||
> .md-btn:not(:first-child):not(:last-child) {
|
||||
border-radius: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
.md-ico-play {
|
||||
content: url("./assets/play.svg");
|
||||
content:url("./assets/play.svg");
|
||||
width: 10px;
|
||||
height: 12px;
|
||||
height: 12px;
|
||||
margin-right: 1px;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.md-ico-shuffle {
|
||||
content: url("./assets/shuffle.svg");
|
||||
content:url("./assets/shuffle.svg");
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
margin-right: 1px;
|
||||
|
@ -2334,16 +2229,16 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
}
|
||||
|
||||
.md-ico-remove {
|
||||
content: url("./assets/feather/x-circle-white.svg");
|
||||
content:url("./assets/feather/x-circle-white.svg");
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
height: 16px;
|
||||
margin-right: 1px;
|
||||
margin-bottom: -1.5px;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.md-ico-add {
|
||||
content: url("./assets/feather/plus-circle-white.svg");
|
||||
content:url("./assets/feather/plus-circle-white.svg");
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
margin-right: 1px;
|
||||
|
@ -2842,7 +2737,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
margin: 32px 6px;
|
||||
font-size: 0.8rem;
|
||||
white-space: pre-wrap;
|
||||
display: block;
|
||||
display:block;
|
||||
}
|
||||
|
||||
.podcast-artwork {
|
||||
|
@ -2881,7 +2776,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
top: 0;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.close-btn {
|
||||
width: 50px;
|
||||
height: 42px;
|
||||
|
@ -2916,7 +2810,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
}
|
||||
|
||||
.podcast-header {
|
||||
text-align: center;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
.podcast-play-btn {
|
||||
|
@ -2929,11 +2823,11 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
margin: 12px;
|
||||
font-size: 0.75em;
|
||||
white-space: pre-wrap;
|
||||
display: block;
|
||||
display:block;
|
||||
line-break: anywhere;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2957,6 +2851,8 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Album / Playlist Page */
|
||||
.playlist-page {
|
||||
--bgColor: transparent;
|
||||
|
@ -3002,7 +2898,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
opacity: .7;
|
||||
animation: playlistArtworkFadeIn 1s var(--appleEase);
|
||||
|
||||
.artworkMaterial > img {
|
||||
.artworkMaterial>img {
|
||||
filter: brightness(100%) blur(80px) saturate(100%) contrast(1);
|
||||
object-position: center;
|
||||
object-fit: cover;
|
||||
|
@ -3025,7 +2921,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
> .row {
|
||||
>.row {
|
||||
width: calc(100% - 32px);
|
||||
}
|
||||
|
||||
|
@ -3166,58 +3062,16 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
margin: 6px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
&.inline-playlist {
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
z-index: 6;
|
||||
position: sticky;
|
||||
margin-top: calc(var(--navigationBarHeight) * -1);
|
||||
|
||||
.floating-header {
|
||||
opacity: 1;
|
||||
top: 0px;
|
||||
z-index: 6;
|
||||
padding: 1em;
|
||||
backdrop-filter: unset;
|
||||
background: black;
|
||||
h3 {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.playlist-inner {
|
||||
background: black;
|
||||
width: 80%;
|
||||
height: 100%;
|
||||
overflow: overlay;
|
||||
box-shadow: var(--ciderShadow-Generic);
|
||||
border-radius: var(--mediaItemRadius) var(--mediaItemRadius) 0px 0px;
|
||||
|
||||
.close-btn {
|
||||
position: sticky;
|
||||
top: 16px;
|
||||
left: 16px;
|
||||
margin-left: 16px;
|
||||
z-index: 7;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes playlistArtworkFadeIn {
|
||||
0% {
|
||||
0%{
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
100%{
|
||||
opacity: 0.7;
|
||||
}
|
||||
}
|
||||
|
||||
// Collection Page
|
||||
.collection-page {
|
||||
padding-bottom: 128px;
|
||||
|
@ -3291,7 +3145,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
|
||||
.header-content {
|
||||
z-index: 1;
|
||||
margin-top: -16px;
|
||||
}
|
||||
|
||||
|
||||
|
@ -3307,7 +3160,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
opacity: .7;
|
||||
animation: playlistArtworkFadeIn 1s var(--appleEase);
|
||||
|
||||
.artworkMaterial > img {
|
||||
.artworkMaterial>img {
|
||||
filter: brightness(100%) blur(80px) saturate(100%) contrast(1);
|
||||
object-position: center;
|
||||
object-fit: cover;
|
||||
|
@ -3352,6 +3205,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
width: 200px;
|
||||
height: 200px;
|
||||
margin: 32px;
|
||||
margin-top: -5px;
|
||||
position: relative;
|
||||
|
||||
.overlay-play {
|
||||
|
@ -3410,7 +3264,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
transition: transform 0s var(--appleEase), box-shadow 0.2s var(--appleEase);
|
||||
}
|
||||
}
|
||||
|
||||
.artist-title {
|
||||
|
||||
.artist-play {
|
||||
|
@ -3559,13 +3412,11 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
-webkit-app-region: no-drag;
|
||||
|
||||
.menu-header-body {
|
||||
padding: 6px;
|
||||
display: flex;
|
||||
background: rgb(200 200 200 / 10%);
|
||||
|
||||
.menu-option-header {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
|
@ -3578,7 +3429,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
background: transparent;
|
||||
|
||||
&.active {
|
||||
.sidebar-icon > .svg-icon {
|
||||
.sidebar-icon>.svg-icon {
|
||||
--color: var(--keyColor);
|
||||
}
|
||||
}
|
||||
|
@ -3592,7 +3443,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.menu-panel-body {
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
|
@ -3690,8 +3540,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
height: 32px;
|
||||
width: 32px;
|
||||
}
|
||||
|
||||
.infinity {
|
||||
.infinity{
|
||||
content: url("./assets/infinity.svg");
|
||||
margin: auto;
|
||||
}
|
||||
|
@ -3871,33 +3720,15 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
/* CSS.gg
|
||||
*/
|
||||
@keyframes load-bar {
|
||||
10% {
|
||||
box-shadow: inset 0 -4px 0
|
||||
}
|
||||
20% {
|
||||
box-shadow: inset 0 -10px 0
|
||||
}
|
||||
30% {
|
||||
box-shadow: inset 0 -12px 0
|
||||
}
|
||||
40% {
|
||||
box-shadow: inset 0 -8px 0
|
||||
}
|
||||
50% {
|
||||
box-shadow: inset 0 -4px 0
|
||||
}
|
||||
60% {
|
||||
box-shadow: inset 0 -6px 0
|
||||
}
|
||||
80% {
|
||||
box-shadow: inset 0 -12px 0
|
||||
}
|
||||
90% {
|
||||
box-shadow: inset 0 -6px 0
|
||||
}
|
||||
to {
|
||||
box-shadow: inset 0 -2px 0
|
||||
}
|
||||
10% {box-shadow: inset 0 -4px 0}
|
||||
20% {box-shadow: inset 0 -10px 0}
|
||||
30% {box-shadow: inset 0 -12px 0}
|
||||
40% {box-shadow: inset 0 -8px 0}
|
||||
50% {box-shadow: inset 0 -4px 0}
|
||||
60% {box-shadow: inset 0 -6px 0}
|
||||
80% {box-shadow: inset 0 -12px 0}
|
||||
90% {box-shadow: inset 0 -6px 0}
|
||||
to {box-shadow: inset 0 -2px 0}
|
||||
}
|
||||
|
||||
.loadbar-sound,
|
||||
|
@ -3909,28 +3740,24 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
height: 28px;
|
||||
box-shadow: inset 0 -12px 0;
|
||||
}
|
||||
|
||||
.loadbar-sound {
|
||||
margin-left: 22px;
|
||||
margin-top: -16px;
|
||||
position: relative;
|
||||
transform: scale(var(--load-bar, 1));
|
||||
transform: scale(var(--load-bar,1));
|
||||
color: var(--keyColor);
|
||||
display: block;
|
||||
}
|
||||
|
||||
.loadbar-sound::after,
|
||||
.loadbar-sound::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
bottom: 0
|
||||
}
|
||||
|
||||
.loadbar-sound::before {
|
||||
left: -4.5px;
|
||||
animation-delay: -2.4s
|
||||
}
|
||||
|
||||
.loadbar-sound::after {
|
||||
right: -4.2px;
|
||||
animation-delay: -3.7s
|
||||
|
@ -4659,7 +4486,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
height: 50vh;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1121px) {
|
||||
@media only screen and (max-width: 1023px) {
|
||||
.display--large {
|
||||
display: flex !important;
|
||||
}
|
||||
|
@ -4698,7 +4525,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
.volume-button--small:active {
|
||||
transform: scale(0.9);
|
||||
}
|
||||
|
||||
|
||||
.volume-button--small.active {
|
||||
background-image: url("./assets/feather/volume.svg");
|
||||
}
|
||||
|
@ -4721,12 +4548,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
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(--keyColor) 2px, transparent 3px, transparent 10px);
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
|
||||
&::-webkit-slider-thumb:active {
|
||||
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
|
||||
transform: scale(1);
|
||||
|
@ -5027,14 +4854,14 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
.player-pin {
|
||||
z-index: 3;
|
||||
position: absolute;
|
||||
min-width: 20px;
|
||||
min-width: 20px;
|
||||
min-height: 20px;
|
||||
top: 5px;
|
||||
right: 30px;
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
|
||||
#mini-pin {
|
||||
|
||||
#mini-pin{
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
@ -5050,7 +4877,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
height: 50vh;
|
||||
}
|
||||
|
||||
@media only screen and (max-width: 1121px) {
|
||||
@media only screen and (max-width: 1023px) {
|
||||
.display--large {
|
||||
display: flex !important;
|
||||
}
|
||||
|
@ -5089,7 +4916,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
.volume-button--small:active {
|
||||
transform: scale(0.9);
|
||||
}
|
||||
|
||||
|
||||
.volume-button--small.active {
|
||||
background-image: url("./assets/feather/volume.svg");
|
||||
}
|
||||
|
@ -5112,12 +4939,12 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
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(--keyColor) 2px, transparent 3px, transparent 10px);
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
|
||||
&::-webkit-slider-thumb:active {
|
||||
background-image: radial-gradient(var(--keyColor) 3px, transparent 4px, transparent 10px);
|
||||
transform: scale(1);
|
||||
|
@ -5264,7 +5091,7 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
.mediaitem-artwork {
|
||||
.mediaitem-artwork{
|
||||
border-radius: unset;
|
||||
}
|
||||
}
|
||||
|
@ -5278,12 +5105,11 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
z-index: 3;
|
||||
opacity: 0;
|
||||
padding: 3%;
|
||||
|
||||
&:hover {
|
||||
opacity: 1;
|
||||
opacity : 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
.app-playback-controls {
|
||||
-webkit-app-region: no-drag;
|
||||
|
@ -5424,7 +5250,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
height: 300px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
.grid-body {
|
||||
display: grid;
|
||||
grid-auto-flow: column dense;
|
||||
|
@ -5439,19 +5264,19 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
width: 350px;
|
||||
height: 60px;
|
||||
}
|
||||
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
&:hover::-webkit-scrollbar {
|
||||
display: initial;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.settings-page {
|
||||
padding: 0px;
|
||||
padding:0px;
|
||||
|
||||
.md-option-header {
|
||||
padding: 1.25em 1.25em;
|
||||
|
@ -5461,7 +5286,6 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
|
|||
font-size: 1.0em;
|
||||
background: rgb(255 255 255 / 3%);
|
||||
}
|
||||
|
||||
.settings-option-body {
|
||||
margin: 16px;
|
||||
}
|
||||
|
@ -5946,7 +5770,7 @@ body.no-gpu {
|
|||
overflow: hidden;
|
||||
}
|
||||
|
||||
|
||||
|
||||
.modal-header {
|
||||
padding: 16px;
|
||||
position: relative;
|
||||
|
@ -5975,49 +5799,43 @@ body.no-gpu {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
.modal-content{
|
||||
display: block;
|
||||
|
||||
.inputs-container {
|
||||
|
||||
.inputs-container{
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.input-container {
|
||||
.input-container{
|
||||
display: inline-grid;
|
||||
width: 54px;
|
||||
justify-items: center;
|
||||
font-size: 0.7em;
|
||||
}
|
||||
|
||||
.input-container.mini {
|
||||
.input-container.mini{
|
||||
display: inline-grid;
|
||||
width: 43px;
|
||||
justify-items: center;
|
||||
font-size: 0.7em;
|
||||
}
|
||||
|
||||
.freq-header {
|
||||
.freq-header{
|
||||
margin-bottom: 2px;
|
||||
}
|
||||
|
||||
.reset-button {
|
||||
|
||||
.reset-button{
|
||||
width: 50%;
|
||||
margin-left: 25%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
input.eq-slider {
|
||||
-webkit-appearance: slider-vertical;
|
||||
width: 5%;
|
||||
}
|
||||
|
||||
input[type="number"] {
|
||||
input[type="number"]{
|
||||
padding: unset;
|
||||
width: 55px;
|
||||
}
|
||||
|
||||
.header input.eq-slider {
|
||||
.header input.eq-slider {
|
||||
-webkit-appearance: slider-vertical;
|
||||
width: 5%;
|
||||
opacity: 0;
|
||||
|
@ -6031,17 +5849,5 @@ body.no-gpu {
|
|||
}
|
||||
}
|
||||
|
||||
body[platform='darwin'] {
|
||||
#window-controls-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.app-chrome .app-chrome-item > .app-mainmenu {
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
-webkit-app-region: drag;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@import url("less/compact.less");
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
# Themes (WIP)
|
||||
|
||||
## Making a theme
|
||||
* If one does not already exist, create a new theme directory in the user data folder.
|
||||
* **Windows:** `%appdata%/Cider/themes`
|
||||
* **Mac:** `~/Library/Application Support/Cider/themes`
|
||||
* **Linux:** `~/.config/Cider/themes`
|
||||
* Create a `theme.less` file with the name of the theme.
|
||||
* In Cider, select the theme in the settings.
|
||||
* To enable hot reloading for the theme, open the DevTools and enter `less.watch()` in the console.
|
||||
|
||||
## Resources
|
||||
* The default styles.less can be found in: [src/renderer/style.less](https://github.com/ciderapp/Cider/tree/main/src/renderer/style.less)
|
||||
* [Less.js documentation](https://lesscss.org/)
|
|
@ -1,3 +0,0 @@
|
|||
#app {
|
||||
--color1: #111;
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
// Default theme
|
|
@ -1,163 +0,0 @@
|
|||
<div id="app-content" :style="{'overflow': (chrome.contentAreaScrolling ? '' : 'hidden')}">
|
||||
<div id="navigation-bar">
|
||||
<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>
|
||||
|
||||
<!-- Podcasts -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'podcasts'">
|
||||
<apple-podcasts></apple-podcasts>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Library - Library Videos -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'library-videos'">
|
||||
<cider-library-videos></cider-library-videos>
|
||||
</template>
|
||||
</transition>
|
||||
|
||||
<!-- Apple Setings Page -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'apple-account-settings'">
|
||||
<apple-account-settings></apple-account-settings>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- About -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'about'">
|
||||
<about-page></about-page>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Artist Page -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'artist-page' && artistPage.data.attributes">
|
||||
<cider-artist :data="artistPage.data"></cider-artist>
|
||||
</template>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<%- include('../pages/zoo') %>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<%- include('../pages/webview') %>
|
||||
</transition>
|
||||
<!-- Collection List -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'collection-list'">
|
||||
<cider-collection-list :data="collectionList.response" :type="collectionList.type"
|
||||
:title="collectionList.title"></cider-collection-list>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Home -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'home'">
|
||||
<cider-home></cider-home>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Home -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'artist-feed'">
|
||||
<cider-artist-feed></cider-artist-feed>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Playlist / Album page-->
|
||||
<transition name="wpfade">
|
||||
<template v-if="modals.showPlaylist">
|
||||
<playlist-inline :data="showingPlaylist"></playlist-inline>
|
||||
</template>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('playlist_')">
|
||||
<cider-playlist :data="showingPlaylist"></cider-playlist>
|
||||
</template>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('album_')">
|
||||
<cider-playlist :data="showingPlaylist"></cider-playlist>
|
||||
</template>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('recordLabel_')">
|
||||
<cider-recordlabel :data="showingPlaylist"></cider-recordlabel>
|
||||
</template>
|
||||
</transition>
|
||||
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('curator_')">
|
||||
<cider-recordlabel :data="showingPlaylist"></cider-recordlabel>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Browse -->
|
||||
<transition v-on:enter="getBrowsePage(); console.log('browse')" name="wpfade">
|
||||
<template v-if="page == 'browse'">
|
||||
<cider-browse :data="browsepage"></cider-browse>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Listen Now -->
|
||||
<transition v-on:enter="getListenNow()" name="wpfade">
|
||||
<template v-if="page == 'listen_now'" @created="console.log('listennow')">
|
||||
<cider-listen-now :data="listennow"></cider-listen-now>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Radio -->
|
||||
<transition v-on:enter="getRadioStations()" name="wpfade">
|
||||
<template v-if="page == 'radio'" @created="console.log('radio')">
|
||||
<div class="content-inner">
|
||||
<h1 class="header-text">{{$root.getLz('term.radio')}}</h1>
|
||||
<h3>{{$root.getLz('term.recentStations')}}</h3>
|
||||
<mediaitem-square :item="item" v-for="item in radio.personal"></mediaitem-square>
|
||||
</div>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Settings -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'settings'">
|
||||
<cider-settings></cider-settings>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Search -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'search'">
|
||||
<cider-search :search="search"></cider-search>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Library - Recently Added -->
|
||||
<transition name="wpfade" v-on:enter="getLibraryAlbumsFull(null, 0); searchLibraryAlbums(0);">
|
||||
<%- include('../pages/library-recentlyadded') %>');
|
||||
</transition>
|
||||
<!-- Library - Songs -->
|
||||
<transition name="wpfade" v-on:enter="getLibrarySongsFull()">
|
||||
<template v-if="page == 'library-songs'">
|
||||
<cider-library-songs :data="library.songs"></cider-library-songs>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Library - Albums -->
|
||||
<transition name="wpfade" v-on:enter="getLibraryAlbumsFull(null, 1); searchLibraryAlbums(1);">
|
||||
<%- include('../pages/library-albums') %>');
|
||||
%>
|
||||
</transition>
|
||||
<!-- Library - Made For You -->
|
||||
<transition name="wpfade" v-on:enter="getMadeForYou()">
|
||||
<template v-if="page == 'library-madeforyou'">
|
||||
<%- include('../pages/madeforyou') %>');
|
||||
%>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Library - Artists-->
|
||||
<transition name="wpfade" v-on:enter="getLibraryArtistsFull(null, 0);">
|
||||
<template v-if="page == 'library-artists'">
|
||||
<%- include('../pages/library-artists') %>');
|
||||
%>
|
||||
</template>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('appleCurator')">
|
||||
<cider-applecurator :data="appleCurator"></cider-applecurator>
|
||||
</template>
|
||||
</transition>
|
||||
|
||||
</div>
|
|
@ -1,27 +0,0 @@
|
|||
<div class="app-navigation" v-cloak>
|
||||
<%- include("sidebar") %>
|
||||
<%- include("app-content") %>
|
||||
<transition name="drawertransition">
|
||||
<div class="app-drawer"
|
||||
v-if="drawer.open && drawer.panel == 'lyrics' && lyrics && lyrics != [] && lyrics.length > 0">
|
||||
<div class="bgArtworkMaterial">
|
||||
<div class="bg-artwork-container">
|
||||
<img class="bg-artwork a" :src="$store.state.artwork.playerLCD">
|
||||
<img class="bg-artwork b" :src="$store.state.artwork.playerLCD">
|
||||
</div>
|
||||
</div>
|
||||
<lyrics-view v-if="drawer.panel == 'lyrics'" :time="lyriccurrenttime" :lyrics="lyrics"
|
||||
:richlyrics="richlyrics"></lyrics-view>
|
||||
<div v-if="drawer.panel == 'lyrics'" class="lyric-footer">
|
||||
<button class="md-btn" @click="modularUITest(!fullscreenLyrics)">{{fullscreenLyrics ?
|
||||
$root.getLz('term.defaultView'): $root.getLz('term.fullscreenView')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
<transition name="drawertransition">
|
||||
<div class="app-drawer" v-if="drawer.open && drawer.panel == 'queue'">
|
||||
<cider-queue ref="queue" v-if="drawer.panel == 'queue'"></cider-queue>
|
||||
</div>
|
||||
</transition>
|
||||
</div>
|
|
@ -1,144 +0,0 @@
|
|||
<div class="app-chrome" :style="{'display': chrome.topChromeVisible ? '' : 'none'}">
|
||||
<div class="app-chrome--left">
|
||||
<div class="app-chrome-item full-height" v-if="chrome.windowControlPosition == 'left'">
|
||||
<div class="window-controls">
|
||||
<div class="close" @click="ipcRenderer.send('close')"></div>
|
||||
<div class="minimize" @click="ipcRenderer.send('minimize')"></div>
|
||||
<div class="minmax restore" v-if="chrome.maximized"
|
||||
@click="ipcRenderer.send('maximize')">
|
||||
</div>
|
||||
<div class="minmax" v-else @click="ipcRenderer.send('maximize')"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-chrome-item full-height" v-else>
|
||||
<button class="app-mainmenu"
|
||||
@blur="mainMenuVisibility(false)"
|
||||
@click="mainMenuVisibility(true)"
|
||||
:class="{active: chrome.menuOpened}"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button--small shuffle" v-if="mk.shuffleMode == 0"
|
||||
@click="mk.shuffleMode = 1"></button>
|
||||
<button class="playback-button--small shuffle active" v-else
|
||||
@click="mk.shuffleMode = 0"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button previous" @click="prevButton()"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button pause" @click="mk.pause()" v-if="mk.isPlaying"></button>
|
||||
<button class="playback-button play" @click="mk.play()" v-else></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button next" @click="mk.skipToNextItem()"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button--small repeat" v-if="mk.repeatMode == 0"
|
||||
@click="mk.repeatMode = 1"></button>
|
||||
<button class="playback-button--small repeat repeatOne" @click="mk.repeatMode = 2"
|
||||
v-else-if="mk.repeatMode == 1"></button>
|
||||
<button class="playback-button--small repeat active" @click="mk.repeatMode = 0"
|
||||
v-else-if="mk.repeatMode == 2"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-chrome--center">
|
||||
<div class="app-chrome-item playback-controls">
|
||||
<template v-if="mkReady()">
|
||||
<div class="app-playback-controls" @mouseover="chrome.progresshover = true"
|
||||
@mouseleave="chrome.progresshover = false" @contextmenu="nowPlayingContextMenu">
|
||||
<div class="artwork" @click="drawer.open = false; fullscreen(true)">
|
||||
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
|
||||
</div>
|
||||
<div class="playback-info">
|
||||
<div class="song-name" style="-webkit-box-orient: horizontal;"
|
||||
:class="[isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-name') ? 'marquee' : '']"
|
||||
:style="[mk.nowPlayingItem['attributes']['contentRating'] == 'explicit' || mk.nowPlayingItem['attributes']['lossless'] == true ? {'margin-left' : '23px'} : {'margin-left' : '0px'} ]">
|
||||
{{ mk.nowPlayingItem["attributes"]["name"] }}
|
||||
<div class="explicit-icon"
|
||||
v-if="mk.nowPlayingItem['attributes']['contentRating'] == 'explicit'"
|
||||
style="display: inline-block"></div>
|
||||
<div class="lossless-icon"
|
||||
v-if="mk.nowPlayingItem['attributes']['lossless'] == true"
|
||||
style="display: inline-block"></div>
|
||||
</div>
|
||||
<div class="song-artist-album">
|
||||
<div class="song-artist-album-content"
|
||||
:class="[isElementOverflowing('#app-main > .app-chrome .app-chrome-item > .app-playback-controls > div >.song-artist-album > .song-artist-album-content') ? 'marquee' : '']"
|
||||
style="display: inline-block; -webkit-box-orient: horizontal; white-space: nowrap;">
|
||||
<div class="item-navigate song-artist" style="display: inline-block"
|
||||
@click="getNowPlayingItemDetailed(`artist`)">
|
||||
{{ mk.nowPlayingItem["attributes"]["artistName"] }}
|
||||
</div>
|
||||
<div class="song-artist item-navigate" style="display: inline-block"
|
||||
@click="getNowPlayingItemDetailed('album')"
|
||||
v-if="mk.nowPlayingItem['attributes']['albumName'] != ''">
|
||||
<div class="separator" style="display: inline-block;">{{"—"}}</div>
|
||||
{{(mk.nowPlayingItem["attributes"]["albumName"]) ?
|
||||
(mk.nowPlayingItem["attributes"]["albumName"]) : "" }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="song-progress">
|
||||
<div class="song-duration"
|
||||
style="justify-content: space-between; height: 1px;"
|
||||
:style="[chrome.progresshover ? {'display': 'flex'} : {'display' : 'none'} ]">
|
||||
<p style="width: auto">{{ convertToMins(getSongProgress()) }}</p>
|
||||
<p style="width: auto">{{ convertToMins(mk.currentPlaybackDuration) }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<input type="range" step="0.01" min="0" :style="progressBarStyle()"
|
||||
@input="playerLCD.desiredDuration = $event.target.value;playerLCD.userInteraction = true"
|
||||
@mouseup="mk.seekToTime($event.target.value);playerLCD.desiredDuration = 0;playerLCD.userInteraction = false"
|
||||
:max="mk.currentPlaybackDuration" :value="getSongProgress()">
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="mk.nowPlayingItem['attributes']['playParams']">
|
||||
<div class="actions">
|
||||
<button class="lcdMenu" @click="nowPlayingContextMenu">
|
||||
<div class="svg-icon"></div>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-chrome--right">
|
||||
<div class="app-chrome-item volume display--large">
|
||||
<button class="volume-button--small volume" @click="muteButtonPressed()"
|
||||
:class="{'active': this.cfg.audio.volume == 0}"></button>
|
||||
<input type="range" class="" @wheel="volumeWheel" step="0.01" min="0" :max="cfg.audio.maxVolume"
|
||||
v-model="mk.volume" v-if="typeof mk.volume != 'undefined'" @change="checkMuteChange()">
|
||||
</div>
|
||||
<div class="app-chrome-item generic">
|
||||
<button class="playback-button--small miniplayer"
|
||||
@click="drawer.open = false; miniPlayer(true)"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item generic">
|
||||
<button class="playback-button--small queue" :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"
|
||||
:class="{'active': drawer.panel == 'lyrics'}"
|
||||
@click="invokeDrawer('lyrics')"></button>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
<div class="app-chrome-item full-height" id="window-controls-container" v-if="chrome.windowControlPosition == 'right'">
|
||||
<div class="window-controls">
|
||||
<div class="minimize" @click="ipcRenderer.send('minimize')"></div>
|
||||
<div class="minmax restore" v-if="chrome.maximized"
|
||||
@click="ipcRenderer.send('maximize')">
|
||||
</div>
|
||||
<div class="minmax" v-else @click="ipcRenderer.send('maximize')"></div>
|
||||
<div class="close" @click="ipcRenderer.send('close')"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
|
@ -1,71 +0,0 @@
|
|||
<cider-menu-panel v-if="menuPanel.visible">
|
||||
</cider-menu-panel>
|
||||
<transition name="fsModeSwitch">
|
||||
<div class="fullscreen-view-container" v-if="appMode == 'fullscreen'">
|
||||
<fullscreen-view :image="currentArtUrl.replace('50x50', '600x600')" :time="lyriccurrenttime"
|
||||
:lyrics="lyrics" :richlyrics="richlyrics"></fullscreen-view>
|
||||
</div>
|
||||
</transition>
|
||||
<transition name="fsModeSwitch">
|
||||
<div class="fullscreen-view-container" v-if="appMode == 'mini'">
|
||||
<mini-view :image="currentArtUrl.replace('50x50', '600x600')" :time="lyriccurrenttime"
|
||||
:lyrics="lyrics" :richlyrics="richlyrics"></mini-view>
|
||||
</div>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<div class="bg-artwork-container" v-if="cfg.visual.window_background_style == 'artwork'"
|
||||
:class="{noanimation: (!cfg.visual.bg_artwork_rotation || !animateBackground)}">
|
||||
<img @load="chrome.artworkReady = true" class="bg-artwork a ">
|
||||
<img class="bg-artwork b">
|
||||
</div>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<div class="bg-artwork--placeholder"></div>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<add-to-playlist :playlists="playlists.listing" v-if="modals.addToPlaylist"></add-to-playlist>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<spatial-properties v-if="modals.spatialProperties"></spatial-properties>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<audio-settings v-if="modals.audioSettings"></audio-settings>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<eq-view v-if="modals.equalizer"></eq-view>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<qrcode-modal v-if="modals.qrcode" :src="webremoteqr" :url="webremoteurl"></qrcode-modal>
|
||||
</transition>
|
||||
<div id="apple-music-video-container">
|
||||
<div id="apple-music-video-player-controls">
|
||||
<div id="player-exit" title="Close" @click="exitMV()">
|
||||
<svg fill="white" xmlns="http://www.w3.org/2000/svg" width="21" height="21" viewBox="0 0 21 21"
|
||||
aria-role="presentation" focusable="false">
|
||||
<path
|
||||
d="M10.5 21C4.724 21 0 16.275 0 10.5S4.724 0 10.5 0 21 4.725 21 10.5 16.276 21 10.5 21zm-3.543-5.967a.96.96 0 00.693-.295l2.837-2.842 2.85 2.842c.167.167.41.295.693.295.552 0 1.001-.461 1.001-1.012 0-.281-.115-.512-.295-.704L11.899 10.5l2.85-2.855a.875.875 0 00.295-.68c0-.55-.45-.998-1.001-.998a.871.871 0 00-.668.295l-2.888 2.855-2.862-2.843a.891.891 0 00-.668-.281.99.99 0 00-1.001.986c0 .269.116.512.295.678L9.088 10.5l-2.837 2.843a.926.926 0 00-.295.678c0 .551.45 1.012 1.001 1.012z"
|
||||
fill-rule="nonzero"/>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="captions">{{((lyricon) ? ((lyrics.length > 0 && lyrics[currentLyricsLine] &&
|
||||
lyrics[currentLyricsLine].line ) ?
|
||||
lyrics[currentLyricsLine].line.replace('lrcInstrumental','') : "") : '') + ((lyricon) ?
|
||||
((lyrics.length
|
||||
> 0 && lyrics[currentLyricsLine] && lyrics[currentLyricsLine].line ) ?
|
||||
(lyrics[currentLyricsLine].translation ? ('\n\r' + lyrics[currentLyricsLine].translation) : ""): "")
|
||||
:
|
||||
'')}}
|
||||
</div>
|
||||
<div id="player-pip"
|
||||
@click="document.querySelector('video#apple-music-video-player').requestPictureInPicture()"
|
||||
title="Picture-in-Picture">
|
||||
<%- include("../svg/pip.svg") %>
|
||||
</div>
|
||||
<div id="player-fullscreen"
|
||||
@click="document.querySelector('video#apple-music-video-player').requestFullscreen()"
|
||||
title="Fullscreen">
|
||||
<%- include("../svg/fullscreen.svg") %>
|
||||
</div>
|
||||
</div>
|
||||
<div id="apple-music-video-player"></div>
|
||||
</div>
|
|
@ -1,173 +0,0 @@
|
|||
<div id="app-sidebar">
|
||||
<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>
|
||||
</div>
|
||||
<div class="search-hints-container" v-if="search.showHints && search.hints.length != 0">
|
||||
<div class="search-hints">
|
||||
<button class="search-hint" v-for="hint in search.hints"
|
||||
@click="search.term = hint;search.showHints = false;searchQuery(hint)">
|
||||
{{ hint }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-sidebar-content">
|
||||
<div class="app-sidebar-header-text">
|
||||
{{$root.getLz('app.name')}}
|
||||
</div>
|
||||
<sidebar-library-item :name="$root.getLz('home.title')" svg-icon="./assets/feather/home.svg"
|
||||
page="home">
|
||||
</sidebar-library-item>
|
||||
<div class="app-sidebar-header-text">
|
||||
{{$root.getLz('term.appleMusic')}}
|
||||
</div>
|
||||
<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>
|
||||
<div class="app-sidebar-header-text">
|
||||
{{$root.getLz('term.library')}}
|
||||
</div>
|
||||
<sidebar-library-item :name="$root.getLz('term.recentlyAdded')"
|
||||
svg-icon="./assets/feather/plus-circle.svg"
|
||||
page="library-recentlyadded"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.songs')" svg-icon="./assets/feather/music.svg"
|
||||
page="library-songs"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.albums')" svg-icon="./assets/feather/disc.svg"
|
||||
page="library-albums"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.artists')" svg-icon="./assets/feather/user.svg"
|
||||
page="library-artists"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.videos')" svg-icon="./assets/feather/video.svg"
|
||||
page="library-videos"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.podcasts')" svg-icon="./assets/feather/mic.svg"
|
||||
page="podcasts">
|
||||
</sidebar-library-item>
|
||||
<div class="app-sidebar-header-text" @contextmenu="playlistHeaderContextMenu">
|
||||
{{ $root.getLz('term.playlists') }}
|
||||
</div>
|
||||
<sidebar-playlist v-for="item in getPlaylistFolderChildren('p.playlistsroot')" :item="item">
|
||||
</sidebar-playlist>
|
||||
</div>
|
||||
<transition name="wpfade">
|
||||
<div class="usermenu-container" v-if="chrome.menuOpened">
|
||||
<div class="usermenu-body">
|
||||
<button class="app-sidebar-button" style="width:100%">
|
||||
|
||||
<img class="sidebar-user-icon" loading="lazy"
|
||||
:src="getMediaItemArtwork(chrome.hideUserInfo ? 'http://localhost:9000/assets/logocut.png' : (chrome.userinfo.attributes['artwork'] ? chrome.userinfo.attributes['artwork']['url'] : ''), 26)"/>
|
||||
|
||||
<div class="sidebar-user-text" v-if="!chrome.hideUserInfo">
|
||||
<template v-if="chrome.userinfo.id || mk.isAuthorized">
|
||||
<div class="fullname text-overflow-elipsis">{{ (chrome.userinfo != null &&
|
||||
chrome.userinfo.attributes != null) ? (chrome.userinfo.attributes.name ?? "") :
|
||||
""
|
||||
}}
|
||||
</div>
|
||||
<div class="handle-text text-overflow-elipsis">{{
|
||||
(chrome.userinfo != null && chrome.userinfo.attributes != null) ?
|
||||
(chrome.userinfo.attributes.handle ?? "") : ""
|
||||
}}
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div @click="mk.authorize()">
|
||||
{{$root.getLz('term.login')}}
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<div class="sidebar-user-text" v-else>
|
||||
{{$root.getLz('app.name')}}
|
||||
</div>
|
||||
</button>
|
||||
<button class="usermenu-item" @click="appRoute('remote-pair')">
|
||||
<div class="row nopadding">
|
||||
<div class="col nopadding">
|
||||
<span class="usermenu-item-icon"><%- include("../svg/smartphone.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('action.showWebRemoteQR')}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
<button class="usermenu-item" v-if="cfg.advanced.AudioContext"
|
||||
@click="modals.audioSettings = true">
|
||||
<span class="usermenu-item-icon"><%- include("../svg/headphones.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('term.audioSettings')}}</span>
|
||||
</button>
|
||||
<button class="usermenu-item" @click="appRoute('about')">
|
||||
<span class="usermenu-item-icon"><%- include("../svg/info.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('term.about')}}</span>
|
||||
</button>
|
||||
<button class="usermenu-item" @click="appRoute('settings')">
|
||||
<span class="usermenu-item-icon"><%- include("../svg/settings.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('term.settings')}}</span>
|
||||
</button>
|
||||
<button class="usermenu-item" @click="unauthorize()">
|
||||
<span class="usermenu-item-icon"
|
||||
style="right:2.5px;"><%- include("../svg/log-out.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('term.logout')}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
<div class="app-sidebar-footer display--small">
|
||||
|
||||
<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"></button>
|
||||
<button class="playback-button--small shuffle active" v-else
|
||||
@click="mk.shuffleMode = 0"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button class="playback-button previous" @click="prevButton()"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button class="playback-button pause" @click="mk.pause()"
|
||||
v-if="mk.isPlaying"></button>
|
||||
<button class="playback-button play" @click="mk.play()" v-else></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button class="playback-button next" @click="mk.skipToNextItem()"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button class="playback-button--small repeat" v-if="mk.repeatMode == 0"
|
||||
@click="mk.repeatMode = 1"></button>
|
||||
<button class="playback-button--small repeat repeatOne" @click="mk.repeatMode = 2"
|
||||
v-else-if="mk.repeatMode == 1"></button>
|
||||
<button class="playback-button--small repeat active"
|
||||
@click="mk.repeatMode = 0" v-else-if="mk.repeatMode == 2"></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}"></button>
|
||||
<input type="range" class="" @wheel="volumeWheel" step="0.01" min="0"
|
||||
:max="cfg.audio.maxVolume"
|
||||
v-model="mk.volume" v-if="typeof mk.volume != 'undefined'"
|
||||
@change="checkMuteChange()">
|
||||
</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>
|
||||
</div>
|
|
@ -258,14 +258,14 @@
|
|||
items: {
|
||||
"new": {
|
||||
"icon": "./assets/feather/plus.svg",
|
||||
"name": app.getLz('action.newpreset'),
|
||||
name: "New Preset...",
|
||||
action: () => {
|
||||
this.addPreset()
|
||||
}
|
||||
},
|
||||
"delete": {
|
||||
"icon": "./assets/feather/x-circle.svg",
|
||||
"name": app.getLz('action.deletepreset'),
|
||||
name: "Delete Preset",
|
||||
action: () => {
|
||||
this.deletePreset()
|
||||
}
|
||||
|
@ -316,13 +316,13 @@
|
|||
},
|
||||
deletePreset() {
|
||||
let presets = this.$root.cfg.audio.equalizer.presets
|
||||
bootbox.confirm(app.getLz('term.deletepreset.warn'), (result) => {
|
||||
bootbox.confirm("Are you sure you want to delete this preset?", (result) => {
|
||||
if (result) {
|
||||
this.changePreset("default")
|
||||
// find the preset by id (preset) and remove it
|
||||
let index = presets.findIndex(p => p.preset == this.preset)
|
||||
presets.splice(index, 1)
|
||||
notyf.success(app.getLz('term.deletedpreset'))
|
||||
notyf.success("Removed preset")
|
||||
}
|
||||
})
|
||||
},
|
||||
|
@ -367,7 +367,7 @@
|
|||
},
|
||||
addPreset() {
|
||||
let self = this
|
||||
bootbox.prompt(app.getLz('term.newpreset.name'), (res) => {
|
||||
bootbox.prompt("New EQ Preset Name", (res) => {
|
||||
if (res) {
|
||||
let eqSettings = Clone(app.cfg.audio.equalizer)
|
||||
let newPreset = new self.eqPreset()
|
||||
|
@ -379,7 +379,7 @@
|
|||
newPreset.mix = eqSettings.mix
|
||||
newPreset.vibrantBass = eqSettings.vibrantBass
|
||||
app.cfg.audio.equalizer.presets.push(newPreset)
|
||||
notyf.success(app.getLz('term.addedpreset'))
|
||||
notyf.success("Added Preset")
|
||||
self.changePreset(newPreset.preset)
|
||||
}
|
||||
})
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
<div class="background">
|
||||
<div class="bgArtworkMaterial">
|
||||
<div class="bg-artwork-container">
|
||||
<img v-if="(app.cfg.visual.bg_artwork_rotation && app.animateBackground)" class="bg-artwork a" :src="image.replace('600x600','30x30') ?? ''">
|
||||
<img v-if="(app.cfg.visual.bg_artwork_rotation && app.animateBackground)" class="bg-artwork b" :src="image.replace('600x600','30x30') ?? ''">
|
||||
<img v-if="!(app.cfg.visual.bg_artwork_rotation && app.animateBackground)" class="bg-artwork no-animation" :src="image.replace('600x600','30x30') ?? ''">
|
||||
<img v-if="(app.cfg.visual.bg_artwork_rotation || app.animateBackground)" class="bg-artwork a" :src="image.replace('600x600','30x30') ?? ''">
|
||||
<img v-if="(app.cfg.visual.bg_artwork_rotation || app.animateBackground)" class="bg-artwork b" :src="image.replace('600x600','30x30') ?? ''">
|
||||
<img v-if="!(app.cfg.visual.bg_artwork_rotation || app.animateBackground)" class="bg-artwork no-animation" :src="image.replace('600x600','30x30') ?? ''">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -8,10 +8,7 @@
|
|||
<button class="autoplay" :style="{'background': app.mk.autoplayEnabled ? 'var(--keyColor)' : ''}" @click="app.mk.autoplayEnabled = !app.mk.autoplayEnabled"> <img class="infinity"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="queue-body" v-if="page == 'history'">
|
||||
<mediaitem-list-item :show-library-status="false" v-for="item in history" :item="item"></mediaitem-list-item>
|
||||
</div>
|
||||
<div class="queue-body" v-if="page == 'queue'">
|
||||
<div class="queue-body">
|
||||
<draggable v-model="queueItems" @start="drag=true" @end="drag=false;move()">
|
||||
<template v-for="(queueItem, position) in queueItems">
|
||||
<div v-if="position <= queuePosition" style="display: none;">{{ position }}</div>
|
||||
|
@ -36,11 +33,7 @@
|
|||
</draggable>
|
||||
</div>
|
||||
<div class="queue-footer">
|
||||
<div class="btn-group" style="width:100%;">
|
||||
<button class="md-btn md-btn-small" :class="{'md-btn-primary': (page == 'queue')}" @click="page = 'queue'">{{app.getLz('term.queue')}}</button>
|
||||
<button class="md-btn md-btn-small" :class="{'md-btn-primary': (page == 'history')}" @click="getHistory();page = 'history'">{{app.getLz('term.history')}}</button>
|
||||
</div>
|
||||
<button class="md-btn md-btn-small" style="width:100%;margin-top:6px;" v-if="queueItems.length > 1" @click="app.mk.clearQueue();updateQueue()">{{app.getLz('term.clearAll')}}</button>
|
||||
<button class="md-btn" style="width:100%;" v-if="queueItems.length > 1" @click="app.mk.clearQueue();updateQueue()">{{app.getLz('term.clearAll')}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
@ -56,8 +49,6 @@
|
|||
queueItems: [],
|
||||
selected: -1,
|
||||
selectedItems: [],
|
||||
history: [],
|
||||
page: "queue",
|
||||
app: this.$root
|
||||
}
|
||||
},
|
||||
|
@ -65,10 +56,6 @@
|
|||
this.updateQueue()
|
||||
},
|
||||
methods: {
|
||||
async getHistory() {
|
||||
let history = await app.mk.api.v3.music(`/v1/me/recent/played/tracks`)
|
||||
this.history = history.data.data
|
||||
},
|
||||
select(e, position) {
|
||||
if(e.ctrlKey || e.shiftKey) {
|
||||
if(this.selectedItems.indexOf(position) == -1) {
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, viewport-fit=cover">
|
||||
<title>Cider</title>
|
||||
<link rel="stylesheet/less" type="text/css" href="style.less"/>
|
||||
<link rel="stylesheet/less" type="text/css" id="userTheme" href="themes/default.less"/>
|
||||
<script src="./js/less.js"></script>
|
||||
<script src="<%- (env.dev ? "./js/vue.js" : "./js/vue.dev.js") %>"></script>
|
||||
<script src="./js/vuex.min.js"></script>
|
||||
|
@ -37,16 +36,667 @@
|
|||
<div id="app" :class="getAppClasses()">
|
||||
<transition name="fsModeSwitch">
|
||||
<div id="app-main" v-show="appMode == 'player'">
|
||||
<%- include('app/chrome-top'); %>
|
||||
<%- include('app/app-navigation'); %>
|
||||
<div class="mv-chrome" v-if="chrome.topChromeVisible == false"></div>
|
||||
<div class="app-chrome" :style="{'display': chrome.topChromeVisible ? '' : 'none'}">
|
||||
<div class="app-chrome--left">
|
||||
<div class="app-chrome-item full-height" v-if="chrome.windowControlPosition == 'left'">
|
||||
<div class="window-controls">
|
||||
<div class="close" @click="closeWindow()"></div>
|
||||
<div class="minimize" @click="ipcRenderer.send('minimize')"></div>
|
||||
<div class="minmax restore" v-if="chrome.maximized"
|
||||
@click="ipcRenderer.send('maximize')">
|
||||
</div>
|
||||
<div class="minmax" v-else @click="ipcRenderer.send('maximize')"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-chrome-item full-height" v-else>
|
||||
<div class="app-title"></div>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button--small shuffle" v-if="mk.shuffleMode == 0"
|
||||
@click="mk.shuffleMode = 1"></button>
|
||||
<button class="playback-button--small shuffle active" v-else
|
||||
@click="mk.shuffleMode = 0"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button previous" @click="prevButton()"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button pause" @click="mk.pause()" v-if="mk.isPlaying"></button>
|
||||
<button class="playback-button play" @click="mk.play()" v-else></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button next" @click="mk.skipToNextItem()"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item display--large">
|
||||
<button class="playback-button--small repeat" v-if="mk.repeatMode == 0"
|
||||
@click="mk.repeatMode = 1"></button>
|
||||
<button class="playback-button--small repeat repeatOne" @click="mk.repeatMode = 2"
|
||||
v-else-if="mk.repeatMode == 1"></button>
|
||||
<button class="playback-button--small repeat active" @click="mk.repeatMode = 0"
|
||||
v-else-if="mk.repeatMode == 2"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-chrome--center">
|
||||
<div class="app-chrome-item playback-controls">
|
||||
<template v-if="mkReady()">
|
||||
<div class="app-playback-controls" @mouseover="chrome.progresshover = true"
|
||||
@mouseleave="chrome.progresshover = false" @contextmenu="nowPlayingContextMenu">
|
||||
<div class="artwork" @click="drawer.open = false; fullscreen(true)">
|
||||
<mediaitem-artwork :url="currentArtUrl"></mediaitem-artwork>
|
||||
</div>
|
||||
<div class="playback-info">
|
||||
<div class="song-name" style="-webkit-box-orient: horizontal;"
|
||||
:class="[isElementOverflowing('#app-main > div.app-chrome > div.app-chrome--center > div > div > div.playback-info > div.song-name') ? 'marquee' : '']"
|
||||
:style="[mk.nowPlayingItem['attributes']['contentRating'] == 'explicit' ? {'margin-left' : '23px'} : {'margin-left' : '0px'} ]">
|
||||
{{ mk.nowPlayingItem["attributes"]["name"] }}
|
||||
<div class="explicit-icon"
|
||||
v-if="mk.nowPlayingItem['attributes']['contentRating'] == 'explicit'"
|
||||
style="display: inline-block"></div>
|
||||
</div>
|
||||
<div class="song-artist-album">
|
||||
<div class="song-artist-album-content"
|
||||
:class="[isElementOverflowing('#app-main > .app-chrome .app-chrome-item > .app-playback-controls > div >.song-artist-album > .song-artist-album-content') ? 'marquee' : '']"
|
||||
style="display: inline-block; -webkit-box-orient: horizontal; white-space: nowrap;">
|
||||
<div class="item-navigate song-artist" style="display: inline-block"
|
||||
@click="getNowPlayingItemDetailed(`artist`)">
|
||||
{{ mk.nowPlayingItem["attributes"]["artistName"] }}
|
||||
</div>
|
||||
<div class="song-artist item-navigate" style="display: inline-block"
|
||||
@click="getNowPlayingItemDetailed('album')"
|
||||
v-if="mk.nowPlayingItem['attributes']['albumName'] != ''">
|
||||
<div class="separator" style="display: inline-block;">{{"—"}}</div>
|
||||
{{(mk.nowPlayingItem["attributes"]["albumName"]) ?
|
||||
(mk.nowPlayingItem["attributes"]["albumName"]) : "" }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="song-progress">
|
||||
<div class="song-duration"
|
||||
style="justify-content: space-between; height: 1px;"
|
||||
:style="[chrome.progresshover ? {'display': 'flex'} : {'display' : 'none'} ]">
|
||||
<p style="width: auto">{{ convertToMins(getSongProgress()) }}</p>
|
||||
<p style="width: auto">{{ convertToMins(mk.currentPlaybackDuration) }}
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<input type="range" step="0.01" min="0" :style="progressBarStyle()"
|
||||
@input="playerLCD.desiredDuration = $event.target.value;playerLCD.userInteraction = true"
|
||||
@mouseup="mk.seekToTime($event.target.value);playerLCD.desiredDuration = 0;playerLCD.userInteraction = false"
|
||||
:max="mk.currentPlaybackDuration" :value="getSongProgress()">
|
||||
</div>
|
||||
</div>
|
||||
<template v-if="mk.nowPlayingItem['attributes']['playParams']">
|
||||
<div class="actions">
|
||||
<button class="lcdMenu" @click="nowPlayingContextMenu">
|
||||
<div class="svg-icon"></div>
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-chrome--right">
|
||||
<div class="app-chrome-item volume display--large">
|
||||
<button class="volume-button--small volume" @click="muteButtonPressed()"
|
||||
:class="{'active': this.cfg.audio.volume == 0}"></button>
|
||||
<input type="range" class="" @wheel="volumeWheel" step="0.01" min="0" :max="cfg.audio.maxVolume"
|
||||
v-model="mk.volume" v-if="typeof mk.volume != 'undefined'" @change="checkMuteChange()">
|
||||
</div>
|
||||
<div class="app-chrome-item generic" v-if="false">
|
||||
<button class="playback-button--small">
|
||||
<%- include("svg/cast.svg") %>
|
||||
</button>
|
||||
</div>
|
||||
<div class="app-chrome-item generic">
|
||||
<button class="playback-button--small miniplayer"
|
||||
@click="drawer.open = false; miniPlayer(true)"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item generic">
|
||||
<button class="playback-button--small queue" :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"
|
||||
:class="{'active': drawer.panel == 'lyrics'}"
|
||||
@click="invokeDrawer('lyrics')"></button>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
<div class="app-chrome-item full-height" v-if="chrome.windowControlPosition == 'right'">
|
||||
<div class="window-controls">
|
||||
<div class="minimize" @click="ipcRenderer.send('minimize')"></div>
|
||||
<div class="minmax restore" v-if="chrome.maximized"
|
||||
@click="ipcRenderer.send('maximize')">
|
||||
</div>
|
||||
<div class="minmax" v-else @click="ipcRenderer.send('maximize')"></div>
|
||||
<div class="close" @click="closeWindow()"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-navigation" v-cloak>
|
||||
<div id="app-sidebar">
|
||||
<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>
|
||||
</div>
|
||||
<div class="search-hints-container" v-if="search.showHints && search.hints.length != 0">
|
||||
<div class="search-hints">
|
||||
<button class="search-hint" v-for="hint in search.hints"
|
||||
@click="search.term = hint;search.showHints = false;searchQuery(hint)">
|
||||
{{ hint }}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="app-sidebar-content">
|
||||
<div class="app-sidebar-header-text">
|
||||
Cider
|
||||
</div>
|
||||
<sidebar-library-item :name="$root.getLz('home.title')" svg-icon="./assets/feather/home.svg" page="home">
|
||||
</sidebar-library-item>
|
||||
<div class="app-sidebar-header-text">
|
||||
{{$root.getLz('term.appleMusic')}}
|
||||
</div>
|
||||
<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>
|
||||
<div class="app-sidebar-header-text">
|
||||
{{$root.getLz('term.library')}}
|
||||
</div>
|
||||
<sidebar-library-item :name="$root.getLz('term.recentlyAdded')" svg-icon="./assets/feather/plus-circle.svg"
|
||||
page="library-recentlyadded"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.songs')" svg-icon="./assets/feather/music.svg"
|
||||
page="library-songs"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.albums')" svg-icon="./assets/feather/disc.svg"
|
||||
page="library-albums"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.artists')" svg-icon="./assets/feather/user.svg"
|
||||
page="library-artists"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.videos')" svg-icon="./assets/feather/video.svg" page="library-videos"></sidebar-library-item>
|
||||
<sidebar-library-item :name="$root.getLz('term.podcasts')" svg-icon="./assets/feather/mic.svg" page="podcasts">
|
||||
</sidebar-library-item>
|
||||
<div class="app-sidebar-header-text" @contextmenu="playlistHeaderContextMenu">
|
||||
{{ $root.getLz('term.playlists') }}
|
||||
</div>
|
||||
<sidebar-playlist v-for="item in getPlaylistFolderChildren('p.playlistsroot')" :item="item">
|
||||
</sidebar-playlist>
|
||||
</div>
|
||||
<transition name="wpfade">
|
||||
<div class="usermenu-container" v-if="chrome.menuOpened">
|
||||
<div class="usermenu-body">
|
||||
<button class="usermenu-item" @click="showWebRemoteQR()">
|
||||
<div class="row nopadding">
|
||||
<div class="col nopadding">
|
||||
<span class="usermenu-item-icon"><%- include("./svg/smartphone.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('action.showWebRemoteQR')}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</button>
|
||||
<button class="usermenu-item" v-if="cfg.advanced.AudioContext"
|
||||
@click="modals.audioSettings = true">
|
||||
<span class="usermenu-item-icon"><%- include("./svg/headphones.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('term.audioSettings')}}</span>
|
||||
</button>
|
||||
<button class="usermenu-item" @click="appRoute('about')">
|
||||
<span class="usermenu-item-icon"><%- include("./svg/info.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('term.about')}}</span>
|
||||
</button>
|
||||
<button class="usermenu-item" @click="appRoute('settings')">
|
||||
<span class="usermenu-item-icon"><%- include("./svg/settings.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('term.settings')}}</span>
|
||||
</button>
|
||||
<button class="usermenu-item" @click="unauthorize()">
|
||||
<span class="usermenu-item-icon" style="right:2.5px;"><%- include("./svg/log-out.svg") %></span>
|
||||
<span class="usermenu-item-name">{{$root.getLz('term.logout')}}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
<div class="app-sidebar-footer">
|
||||
|
||||
<div class="app-playback-controls display--small" 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"></button>
|
||||
<button class="playback-button--small shuffle active" v-else
|
||||
@click="mk.shuffleMode = 0"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button class="playback-button previous" @click="prevButton()"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button class="playback-button pause" @click="mk.pause()"
|
||||
v-if="mk.isPlaying"></button>
|
||||
<button class="playback-button play" @click="mk.play()" v-else></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button class="playback-button next" @click="mk.skipToNextItem()"></button>
|
||||
</div>
|
||||
<div class="app-chrome-item">
|
||||
<button class="playback-button--small repeat" v-if="mk.repeatMode == 0"
|
||||
@click="mk.repeatMode = 1"></button>
|
||||
<button class="playback-button--small repeat repeatOne" @click="mk.repeatMode = 2"
|
||||
v-else-if="mk.repeatMode == 1"></button>
|
||||
<button class="playback-button--small repeat active"
|
||||
@click="mk.repeatMode = 0" v-else-if="mk.repeatMode == 2"></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}"></button>
|
||||
<input type="range" class="" @wheel="volumeWheel" step="0.01" min="0" :max="cfg.audio.maxVolume"
|
||||
v-model="mk.volume" v-if="typeof mk.volume != 'undefined'"
|
||||
@change="checkMuteChange()">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button class="app-sidebar-button" style="width:100%" :class="{active: chrome.menuOpened}"
|
||||
@blur="setTimeout(()=>{chrome.menuOpened = false}, 100)"
|
||||
@click="(chrome.userinfo.id) ? chrome.menuOpened = !chrome.menuOpened : false">
|
||||
|
||||
<img class="sidebar-user-icon" loading="lazy"
|
||||
:src="getMediaItemArtwork(chrome.hideUserInfo ? 'http://localhost:9000/assets/logocut.png' : (chrome.userinfo.attributes['artwork'] ? chrome.userinfo.attributes['artwork']['url'] : ''), 26)"/>
|
||||
|
||||
<div class="sidebar-user-text" v-if="!chrome.hideUserInfo">
|
||||
<template v-if="chrome.userinfo.id || mk.isAuthorized">
|
||||
<div class="fullname text-overflow-elipsis">{{ (chrome.userinfo != null && chrome.userinfo.attributes != null) ? (chrome.userinfo.attributes.name ?? "") : ""
|
||||
}}
|
||||
</div>
|
||||
<div class="handle-text text-overflow-elipsis">{{
|
||||
(chrome.userinfo != null && chrome.userinfo.attributes != null) ? (chrome.userinfo.attributes.handle ?? "") : ""
|
||||
}}
|
||||
</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div @click="mk.authorize()">
|
||||
Sign In
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<div class="sidebar-user-text" v-else>
|
||||
Cider
|
||||
</div>
|
||||
</button>
|
||||
</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>
|
||||
</div>
|
||||
<div id="app-content">
|
||||
<div id="navigation-bar">
|
||||
<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>
|
||||
|
||||
<!-- Podcasts -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'podcasts'">
|
||||
<apple-podcasts></apple-podcasts>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Library - Library Videos -->
|
||||
<transition name="wpfade" >
|
||||
<template v-if="page == 'library-videos'">
|
||||
<cider-library-videos></cider-library-videos>
|
||||
</template>
|
||||
</transition>
|
||||
|
||||
<!-- Apple Setings Page -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'apple-account-settings'">
|
||||
<apple-account-settings></apple-account-settings>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- About -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'about'">
|
||||
<about-page></about-page>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Artist Page -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'artist-page' && artistPage.data.attributes">
|
||||
<cider-artist :data="artistPage.data"></cider-artist>
|
||||
</template>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<%- include('pages/zoo') %>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<%- include('pages/webview') %>
|
||||
</transition>
|
||||
<!-- Collection List -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'collection-list'">
|
||||
<cider-collection-list :data="collectionList.response" :type="collectionList.type"
|
||||
:title="collectionList.title"></cider-collection-list>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Home -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'home'">
|
||||
<cider-home></cider-home>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Home -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'artist-feed'">
|
||||
<cider-artist-feed></cider-artist-feed>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Playlist / Album page-->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('playlist_')">
|
||||
<cider-playlist :data="showingPlaylist"></cider-playlist>
|
||||
</template>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('album_')">
|
||||
<cider-playlist :data="showingPlaylist"></cider-playlist>
|
||||
</template>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('recordLabel_')">
|
||||
<cider-recordlabel :data="showingPlaylist"></cider-recordlabel>
|
||||
</template>
|
||||
</transition>
|
||||
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('curator_')">
|
||||
<cider-recordlabel :data="showingPlaylist"></cider-recordlabel>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Browse -->
|
||||
<transition v-on:enter="getBrowsePage(); console.log('browse')" name="wpfade">
|
||||
<template v-if="page == 'browse'">
|
||||
<!-- <div class="content-inner">
|
||||
|
||||
<button id="apple-music-authorize" class="md-btn md-btn-primary" @click="init()">Start
|
||||
MusicKit
|
||||
</button>
|
||||
<button id="apple-music-unauthorize" class="md-btn md-btn-primary"
|
||||
@click="unauthorize()">
|
||||
Stop
|
||||
MusicKit
|
||||
</button>
|
||||
<br>
|
||||
<template v-if="mk.nowPlayingItem">
|
||||
currentPlaybackProgress: {{ app.mk.currentPlaybackProgress }}
|
||||
<br>
|
||||
currentPlaybackDuration: {{ app.mk.currentPlaybackDuration }}
|
||||
</template>
|
||||
<div><input type="text" v-model="quickPlayQuery">
|
||||
<button @click="quickPlay(quickPlayQuery)">Play</button>
|
||||
</div>
|
||||
<h1 class="header-text">{{$root.getLz('term.browse')}}</h1>
|
||||
<p>
|
||||
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed euismod, urna eu
|
||||
tincidunt
|
||||
consectetur, nisl nunc euismod nisi, eu porttitor nisl nisi euismod nisi.
|
||||
</p>
|
||||
<div class="media-item--small">
|
||||
<div class="artwork">
|
||||
|
||||
</div>
|
||||
<div class="text">
|
||||
Text
|
||||
</div>
|
||||
<div class="subtext">
|
||||
Subtext
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
<h1 class="header-text">{{$root.getLz('term.listenNow')}}</h1>
|
||||
<div class="winbox">
|
||||
<div class="fancy">990kbps</div>
|
||||
<div class="">
|
||||
<button class="md-btn md-btn-primary">Audio Quality Settings</button>
|
||||
</div>
|
||||
</div>
|
||||
<button class="md-btn" @click="drawertest = !drawertest">Toggle Drawer</button>
|
||||
<button class="md-btn">Button</button>
|
||||
<button class="md-btn md-btn-primary">Button</button>
|
||||
</div> -->
|
||||
<cider-browse :data="browsepage"></cider-browse>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Listen Now -->
|
||||
<transition v-on:enter="getListenNow()" name="wpfade">
|
||||
<template v-if="page == 'listen_now'" @created="console.log('listennow')">
|
||||
<cider-listen-now :data="listennow"></cider-listen-now>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Radio -->
|
||||
<transition v-on:enter="getRadioStations()" name="wpfade">
|
||||
<template v-if="page == 'radio'" @created="console.log('radio')">
|
||||
<div class="content-inner">
|
||||
<h1 class="header-text">{{$root.getLz('term.radio')}}</h1>
|
||||
<h3>{{$root.getLz('term.recentStations')}}</h3>
|
||||
<mediaitem-square :item="item" v-for="item in radio.personal"></mediaitem-square>
|
||||
</div>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Settings -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'settings'">
|
||||
<cider-settings></cider-settings>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Search -->
|
||||
<transition name="wpfade">
|
||||
<template v-if="page == 'search'">
|
||||
<cider-search :search="search"></cider-search>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Library - Recently Added -->
|
||||
<transition name="wpfade" v-on:enter="getLibraryAlbumsFull(null, 0); searchLibraryAlbums(0);">
|
||||
<%- include('pages/library-recentlyadded') %>');
|
||||
</transition>
|
||||
<!-- Library - Songs -->
|
||||
<transition name="wpfade" v-on:enter="getLibrarySongsFull()">
|
||||
<template v-if="page == 'library-songs'">
|
||||
<cider-library-songs :data="library.songs"></cider-library-songs>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Library - Albums -->
|
||||
<transition name="wpfade" v-on:enter="getLibraryAlbumsFull(null, 1); searchLibraryAlbums(1);">
|
||||
<%- include('pages/library-albums') %>');
|
||||
%>
|
||||
</transition>
|
||||
<!-- Library - Made For You -->
|
||||
<transition name="wpfade" v-on:enter="getMadeForYou()">
|
||||
<template v-if="page == 'library-madeforyou'">
|
||||
<%- include('pages/madeforyou') %>');
|
||||
%>
|
||||
</template>
|
||||
</transition>
|
||||
<!-- Library - Artists-->
|
||||
<transition name="wpfade" v-on:enter="getLibraryArtistsFull(null, 0);">
|
||||
<template v-if="page == 'library-artists'">
|
||||
<%- include('pages/library-artists') %>');
|
||||
%>
|
||||
</template>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<template v-if="page.includes('appleCurator')">
|
||||
<cider-applecurator :data="appleCurator"></cider-applecurator>
|
||||
</template>
|
||||
</transition>
|
||||
|
||||
</div>
|
||||
<transition name="drawertransition">
|
||||
<div class="app-drawer"
|
||||
v-if="drawer.open && drawer.panel == 'lyrics' && lyrics && lyrics != [] && lyrics.length > 0">
|
||||
<div class="bgArtworkMaterial">
|
||||
<div class="bg-artwork-container">
|
||||
<img class="bg-artwork a" :src="$store.state.artwork.playerLCD">
|
||||
<img class="bg-artwork b" :src="$store.state.artwork.playerLCD">
|
||||
</div>
|
||||
</div>
|
||||
<lyrics-view v-if="drawer.panel == 'lyrics'" :time="lyriccurrenttime" :lyrics="lyrics"
|
||||
:richlyrics="richlyrics"></lyrics-view>
|
||||
<div v-if="drawer.panel == 'lyrics'" class="lyric-footer">
|
||||
<button class="md-btn" @click="modularUITest(!fullscreenLyrics)">{{fullscreenLyrics ?
|
||||
$root.getLz('term.defaultView'): $root.getLz('term.fullscreenView')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
<transition name="drawertransition">
|
||||
<div class="app-drawer" v-if="drawer.open && drawer.panel == 'queue'">
|
||||
<cider-queue ref="queue" v-if="drawer.panel == 'queue'"></cider-queue>
|
||||
</div>
|
||||
</transition>
|
||||
</div>
|
||||
</div>
|
||||
</transition>
|
||||
<%- include('app/panels'); %>
|
||||
<cider-menu-panel v-if="menuPanel.visible">
|
||||
</cider-menu-panel>
|
||||
<transition name="fsModeSwitch">
|
||||
<div class="fullscreen-view-container" v-if="appMode == 'fullscreen'">
|
||||
<fullscreen-view :image="currentArtUrl.replace('50x50', '600x600')" :time="lyriccurrenttime"
|
||||
:lyrics="lyrics" :richlyrics="richlyrics"></fullscreen-view>
|
||||
</div>
|
||||
</transition>
|
||||
<transition name="fsModeSwitch">
|
||||
<div class="fullscreen-view-container" v-if="appMode == 'mini'">
|
||||
<mini-view :image="currentArtUrl.replace('50x50', '600x600')" :time="lyriccurrenttime"
|
||||
:lyrics="lyrics" :richlyrics="richlyrics"></mini-view>
|
||||
</div>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<div class="bg-artwork-container" v-if="cfg.visual.window_background_style == 'artwork'"
|
||||
:class="{noanimation: (!cfg.visual.bg_artwork_rotation || !animateBackground)}">
|
||||
<img @load="chrome.artworkReady = true" class="bg-artwork a ">
|
||||
<img class="bg-artwork b">
|
||||
</div>
|
||||
</transition>
|
||||
<transition name="wpfade">
|
||||
<div class="bg-artwork--placeholder"></div>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<add-to-playlist :playlists="playlists.listing" v-if="modals.addToPlaylist"></add-to-playlist>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<spatial-properties v-if="modals.spatialProperties"></spatial-properties>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<audio-settings v-if="modals.audioSettings"></audio-settings>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<eq-view v-if="modals.equalizer"></eq-view>
|
||||
</transition>
|
||||
<transition name="modal">
|
||||
<qrcode-modal v-if="modals.qrcode" :src="webremoteqr" :url="webremoteurl"></qrcode-modal>
|
||||
</transition>
|
||||
<div id="apple-music-video-container">
|
||||
<div id="apple-music-video-player-controls">
|
||||
<div id="player-exit" title="Close" @click="exitMV()">
|
||||
<svg fill="white" xmlns="http://www.w3.org/2000/svg" width="21" height="21" viewBox="0 0 21 21"
|
||||
aria-role="presentation" focusable="false">
|
||||
<path
|
||||
d="M10.5 21C4.724 21 0 16.275 0 10.5S4.724 0 10.5 0 21 4.725 21 10.5 16.276 21 10.5 21zm-3.543-5.967a.96.96 0 00.693-.295l2.837-2.842 2.85 2.842c.167.167.41.295.693.295.552 0 1.001-.461 1.001-1.012 0-.281-.115-.512-.295-.704L11.899 10.5l2.85-2.855a.875.875 0 00.295-.68c0-.55-.45-.998-1.001-.998a.871.871 0 00-.668.295l-2.888 2.855-2.862-2.843a.891.891 0 00-.668-.281.99.99 0 00-1.001.986c0 .269.116.512.295.678L9.088 10.5l-2.837 2.843a.926.926 0 00-.295.678c0 .551.45 1.012 1.001 1.012z"
|
||||
fill-rule="nonzero"/>
|
||||
</svg>
|
||||
</div>
|
||||
<div id="captions">{{((lyricon) ? ((lyrics.length > 0 && lyrics[currentLyricsLine] &&
|
||||
lyrics[currentLyricsLine].line ) ?
|
||||
lyrics[currentLyricsLine].line.replace('lrcInstrumental','') : "") : '') + ((lyricon) ?
|
||||
((lyrics.length
|
||||
> 0 && lyrics[currentLyricsLine] && lyrics[currentLyricsLine].line ) ?
|
||||
(lyrics[currentLyricsLine].translation ? ('\n\r' + lyrics[currentLyricsLine].translation) : ""): "")
|
||||
:
|
||||
'')}}
|
||||
</div>
|
||||
<div id="player-pip"
|
||||
@click="document.querySelector('video#apple-music-video-player').requestPictureInPicture()"
|
||||
title="Picture-in-Picture">
|
||||
<%- include("svg/pip.svg") %>
|
||||
</div>
|
||||
<div id="player-fullscreen"
|
||||
@click="document.querySelector('video#apple-music-video-player').requestFullscreen()"
|
||||
title="Fullscreen">
|
||||
<%- include("svg/fullscreen.svg") %>
|
||||
</div>
|
||||
</div>
|
||||
<div id="apple-music-video-player"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<% for(var i=0; i < Object.keys(env.components).length ; i++) {%>
|
||||
<%- include(env.components[i]); %>
|
||||
<% } %>
|
||||
|
||||
<!-- Apple Settings Page -->
|
||||
<%- include('pages/podcasts') %>
|
||||
<!-- Apple Settings Page -->
|
||||
<%- include('pages/apple-account-settings') %>
|
||||
<!-- Library - Songs -->
|
||||
<%- include('pages/library-songs') %>
|
||||
|
||||
<!-- Media Item Artwork-->
|
||||
<%- include("components/mediaitem-artwork"); %>
|
||||
<!-- Browse -->
|
||||
<%- include('pages/browse') %>
|
||||
|
||||
<!-- Settings -->
|
||||
<%- include('pages/settings') %>
|
||||
|
||||
<!-- Listen Now -->
|
||||
<%- include('pages/listen_now') %>
|
||||
|
||||
<!-- Home -->
|
||||
<%- include('pages/home') %>
|
||||
|
||||
<!-- Artist Feed -->
|
||||
<%- include('pages/artist-feed') %>
|
||||
|
||||
<!-- Playlists / Albums -->
|
||||
<%- include('pages/cider-playlist') %>
|
||||
|
||||
<!-- Record Label -->
|
||||
<%- include('pages/recordLabel') %>
|
||||
|
||||
<!-- Collection List -->
|
||||
<%- include('pages/collection-list') %>
|
||||
|
||||
<!-- Apple Curator -->
|
||||
<%- include('pages/apple-curator') %>
|
||||
|
||||
<!-- Artist Page -->
|
||||
<%- include('pages/artist') %>
|
||||
|
||||
<!-- Search -->
|
||||
<%- include('pages/search') %>
|
||||
|
||||
<!-- About -->
|
||||
<%- include('pages/about') %>
|
||||
|
||||
|
||||
<%- include('pages/library-videos') %>
|
||||
|
||||
<script type="text/x-template"
|
||||
id="am-musiccovershelf">
|
||||
|
@ -63,6 +713,83 @@
|
|||
</button>
|
||||
</script>
|
||||
|
||||
<!-- Artwork Material -->
|
||||
<%- include('components/artwork-material') %>
|
||||
<!-- Menu Panel -->
|
||||
<%- include('components/menu-panel') %>
|
||||
<!-- Playlist Listing -->
|
||||
<%- include('components/sidebar-playlist')
|
||||
%>
|
||||
<!-- Spatial Properties -->
|
||||
<%- include('components/spatial-properties')
|
||||
%>
|
||||
<!-- Audio Settings -->
|
||||
<%- include('components/audio-settings')
|
||||
%>
|
||||
<!-- QRCode Modal -->
|
||||
<%- include('components/qrcode-modal')
|
||||
%>
|
||||
<!-- Equalizer -->
|
||||
<%- include('components/equalizer')
|
||||
%>
|
||||
<!-- Add to playlist -->
|
||||
<%- include('components/add-to-playlist')
|
||||
%>
|
||||
<!-- Queue -->
|
||||
<%- include('components/queue')
|
||||
%>
|
||||
<!-- Queue Item -->
|
||||
<%- include('components/queue-item')
|
||||
%>
|
||||
<!-- Horizontal MediaItem Scroller -->
|
||||
<%- include('components/mediaitem-scroller-horizontal')
|
||||
%>
|
||||
<!-- Horizontal MediaItem Scroller (Large) -->
|
||||
<%- include('components/mediaitem-scroller-horizontal-large')
|
||||
%>
|
||||
<!-- Horizontal MediaItem Scroller (SP : Special) -->
|
||||
<%- include('components/mediaitem-scroller-horizontal-sp')
|
||||
%>
|
||||
<!-- Horizontal MediaItem Scroller (MV) -->
|
||||
<%- include('components/mediaitem-scroller-horizontal-mvview')
|
||||
%>
|
||||
<!-- MediaItem List Item -->
|
||||
<%- include('components/mediaitem-list-item')
|
||||
%>
|
||||
<!-- MediaItem Horizontal Rectangle -->
|
||||
<%- include('components/mediaitem-hrect')
|
||||
%>
|
||||
<!-- MediaItem Square -->
|
||||
<%- include('components/mediaitem-square')
|
||||
%>
|
||||
<!-- MediaItem Square SP -->
|
||||
<%- include('components/mediaitem-square-sp')
|
||||
%>
|
||||
<!-- MediaItem MusicVideo -->
|
||||
<%- include('components/mediaitem-mvview')
|
||||
%>
|
||||
<!-- MediaItem MusicVideo -->
|
||||
<%- include('components/libraryartist-item')
|
||||
%>
|
||||
<%- include('components/listennow-child')
|
||||
%>
|
||||
<!-- MediaItem MusicVideo SP -->
|
||||
<%- include('components/mediaitem-mvview-sp')
|
||||
%>
|
||||
<!-- Animated Artwork View -->
|
||||
<%- include('components/animatedartwork-view')
|
||||
%>
|
||||
<!-- Lyrics View -->
|
||||
<%- include('components/lyrics-view')
|
||||
%>
|
||||
<!-- Fullscreen View -->
|
||||
<%- include('components/fullscreen')
|
||||
%>
|
||||
|
||||
<!-- Miniplayer View -->
|
||||
<%- include('components/miniplayer')
|
||||
%>
|
||||
|
||||
<script
|
||||
src="musickit.js?v=1"></script>
|
||||
<script>
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
<button onclick="window.open('https://opencollective.com/ciderapp')" class="md-btn sponsorBtn"><img src="./assets/open_collective.svg"/>Open Collective</button>
|
||||
<h3>{{$root.getLz('term.socials')}}</h3>
|
||||
<button onclick="window.open('https://discord.gg/applemusic')" class="md-btn sponsorBtn"><img src="./assets/discord.svg"/>{{$root.getLz('term.discord')}}</button>
|
||||
<button onclick="window.open('https://twitter.com/UseCider')" class="md-btn sponsorBtn"><img style="width: 20.5px;" src="./assets/twitter.svg"/>Twitter</button>
|
||||
|
||||
</div>
|
||||
<div class="col">
|
||||
|
|
|
@ -3,14 +3,7 @@
|
|||
<div v-if="page == 'main'">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="row nopadding">
|
||||
<div class="col nopadding">
|
||||
<h3>{{app.getLz('home.recentlyPlayed')}}</h3>
|
||||
</div>
|
||||
<div class="col-auto nopadding flex-center">
|
||||
<button class="cd-btn-seeall" @click="seeAllHistory()">{{app.getLz('term.seeAll')}}</button>
|
||||
</div>
|
||||
</div>
|
||||
<h3>{{app.getLz('home.recentlyPlayed')}}</h3>
|
||||
<div class="well artistfeed-well">
|
||||
<template v-if="isSectionReady('recentlyPlayed')">
|
||||
<mediaitem-list-item v-for="item in recentlyPlayed.limit(6)"
|
||||
|
@ -111,10 +104,6 @@
|
|||
await this.getFavorites()
|
||||
},
|
||||
methods: {
|
||||
async seeAllHistory() {
|
||||
let hist = await app.mk.api.v3.music(`/v1/me/recent/played/tracks`)
|
||||
app.showCollection(hist.data, app.getLz('term.history'))
|
||||
},
|
||||
isSectionReady(section) {
|
||||
return this.sectionsReady.includes(section)
|
||||
},
|
||||
|
|
|
@ -1,555 +0,0 @@
|
|||
<script type="text/x-template" id="playlist-inline">
|
||||
<div class="content-inner playlist-page inline-playlist" @click.self="$root.resetState()">
|
||||
<div class="playlist-inner" v-if="data != [] && data.attributes != null">
|
||||
<div class="close-btn" title="Close" @click="$root.resetState()">
|
||||
<svg fill="white" xmlns="http://www.w3.org/2000/svg" width="21" height="21" viewBox="0 0 21 21"
|
||||
aria-role="presentation" focusable="false">
|
||||
<path
|
||||
d="M10.5 21C4.724 21 0 16.275 0 10.5S4.724 0 10.5 0 21 4.725 21 10.5 16.276 21 10.5 21zm-3.543-5.967a.96.96 0 00.693-.295l2.837-2.842 2.85 2.842c.167.167.41.295.693.295.552 0 1.001-.461 1.001-1.012 0-.281-.115-.512-.295-.704L11.899 10.5l2.85-2.855a.875.875 0 00.295-.68c0-.55-.45-.998-1.001-.998a.871.871 0 00-.668.295l-2.888 2.855-2.862-2.843a.891.891 0 00-.668-.281.99.99 0 00-1.001.986c0 .269.116.512.295.678L9.088 10.5l-2.837 2.843a.926.926 0 00-.295.678c0 .551.45 1.012 1.001 1.012z"
|
||||
fill-rule="nonzero"/>
|
||||
</svg>
|
||||
</div>
|
||||
<template v-if="app.playlists.loadingState == 0">
|
||||
<div class="content-inner centered">
|
||||
<div class="spinner"></div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="app.playlists.loadingState == 1">
|
||||
<div class="playlist-display"
|
||||
:style="{
|
||||
'--bgColor': (data.attributes.artwork != null && data.attributes.artwork['bgColor'] != null) ? ('#' + data.attributes.artwork.bgColor) : '',
|
||||
'--textColor': (data.attributes.artwork != null && data.attributes.artwork['textColor1'] != null) ? ('#' + data.attributes.artwork.textColor1) : ''
|
||||
}">
|
||||
<div class="playlistInfo">
|
||||
<div class="row">
|
||||
<div class="col-auto flex-center">
|
||||
<div style="width: 260px;height:260px;">
|
||||
<mediaitem-artwork
|
||||
shadow="large"
|
||||
:video-priority="true"
|
||||
:url="(data.attributes != null && data.attributes.artwork != null) ? data.attributes.artwork.url : ((data.relationships != null && data.relationships.tracks.data.length > 0 && data.relationships.tracks.data[0].attributes != null) ? ((data.relationships.tracks.data[0].attributes.artwork != null)? data.relationships.tracks.data[0].attributes.artwork.url : ''):'')"
|
||||
:video="(data.attributes != null && data.attributes.editorialVideo != null) ? (data.attributes.editorialVideo.motionDetailSquare ? data.attributes.editorialVideo.motionDetailSquare.video : (data.attributes.editorialVideo.motionSquareVideo1x1 ? data.attributes.editorialVideo.motionSquareVideo1x1.video : '')) : '' "
|
||||
size="260"
|
||||
></mediaitem-artwork>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col playlist-info">
|
||||
<template v-if="!editorialNotesExpanded">
|
||||
<div>
|
||||
<div class="playlist-name" @click="editPlaylistName()" v-show="!nameEditing">
|
||||
{{data.attributes ? (data.attributes.name ??
|
||||
(data.attributes.title ?? '') ?? '') : ''}}
|
||||
</div>
|
||||
<div class="playlist-name" v-show="nameEditing"><input type="text"
|
||||
spellcheck="false"
|
||||
class="nameEdit"
|
||||
v-model="data.attributes.name"
|
||||
@blur="editPlaylist"
|
||||
@change="editPlaylist"
|
||||
@keydown.enter="editPlaylist"/>
|
||||
</div>
|
||||
<div class="playlist-artist item-navigate"
|
||||
v-if="getArtistName(data) != ''"
|
||||
@click="data.attributes && data.attributes.artistName ? app.searchAndNavigate(data,'artist') : ''">
|
||||
{{getArtistName(data)}}
|
||||
</div>
|
||||
<div class="playlist-desc"
|
||||
v-if="data.attributes.description && (data.attributes.description.standard || data.attributes.description.short)">
|
||||
<div v-if="data.attributes.description.short" class="content"
|
||||
v-html="data.attributes.description.short"></div>
|
||||
<div v-else-if="data.attributes.description.standard" class="content"
|
||||
v-html="data.attributes.description.standard"></div>
|
||||
<button v-if="data.attributes.description.short" class="more-btn"
|
||||
@click="editorialNotesExpanded = !editorialNotesExpanded">
|
||||
{{app.getLz('term.showMore')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-if="editorialNotesExpanded">
|
||||
<div class="playlist-desc-expanded">
|
||||
<div class="content"
|
||||
v-html="((data.attributes.editorialNotes) ? (data.attributes.editorialNotes.standard ?? (data.attributes.editorialNotes.short ?? '') ) : (data.attributes.description ? (data.attributes.description.standard ?? (data.attributes.description.short ?? '')) : ''))"></div>
|
||||
<button class="more-btn"
|
||||
@click="editorialNotesExpanded = !editorialNotesExpanded">
|
||||
{{app.getLz('term.showLess')}}
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
<div class="playlist-controls" v-observe-visibility="{callback: isHeaderVisible}">
|
||||
<button class="md-btn md-btn-primary md-btn-icon" style="min-width: 100px;"
|
||||
@click="app.mk.shuffleMode = 0; play()"><img class="md-ico-play">
|
||||
{{app.getLz('term.play')}}
|
||||
</button>
|
||||
<button class="md-btn md-btn-primary md-btn-icon" style="min-width: 100px;"
|
||||
@click="app.mk.shuffleMode = 1;play()"><img class="md-ico-shuffle">
|
||||
{{app.getLz('term.shuffle')}}
|
||||
</button>
|
||||
<button class="md-btn md-btn-icon" style="min-width: 180px;"
|
||||
v-if="inLibrary!=null && confirm!=true"
|
||||
@click="confirmButton()"><img
|
||||
:class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'">
|
||||
{{ (!inLibrary) ? app.getLz('action.addToLibrary') :
|
||||
app.getLz("action.removeFromLibrary") }}
|
||||
</button>
|
||||
<button class="md-btn md-btn-icon" style="min-width: 180px;" v-if="confirm==true"
|
||||
@click="(!inLibrary) ? addToLibrary(data.attributes.playParams.id.toString()) : removeFromLibrary(data.attributes.playParams.id.toString()) ">
|
||||
<img :class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'">
|
||||
{{app.getLz('term.confirm')}}
|
||||
</button>
|
||||
<button class="more-btn-round" style="float:right;" @click="menu">
|
||||
<div class="svg-icon"></div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="artworkContainer" v-if="data.attributes.artwork != null">
|
||||
<artwork-material :url="data.attributes.artwork.url" size="260" images="1"></artwork-material>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="floating-header"
|
||||
:style="{opacity: (headerVisible ? 0 : 1),'pointer-events': (headerVisible ? 'none' : '')}">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3>{{data.attributes ? (data.attributes.name ??
|
||||
(data.attributes.title ?? '') ?? '') : ''}}</h3>
|
||||
</div>
|
||||
<div class="col-auto flex-center">
|
||||
<div>
|
||||
<button class="md-btn md-btn-primary md-btn-icon" style="min-width: 100px;"
|
||||
@click="app.mk.shuffleMode = 0; play()"><img class="md-ico-play">
|
||||
{{app.getLz('term.play')}}
|
||||
</button>
|
||||
<button class="md-btn md-btn-primary md-btn-icon" style="min-width: 100px;"
|
||||
@click="app.mk.shuffleMode = 1;play()"><img class="md-ico-shuffle">
|
||||
{{app.getLz('term.shuffle')}}
|
||||
</button>
|
||||
<button class="md-btn md-btn-icon" style="min-width: 180px;"
|
||||
v-if="inLibrary!=null && confirm!=true"
|
||||
@click="confirmButton()"><img
|
||||
:class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'">
|
||||
{{ (!inLibrary) ? app.getLz('action.addToLibrary') :
|
||||
app.getLz("action.removeFromLibrary") }}
|
||||
</button>
|
||||
<button class="md-btn md-btn-icon" style="min-width: 180px;" v-if="confirm==true"
|
||||
@click="(!inLibrary) ? addToLibrary(data.attributes.playParams.id.toString()) : removeFromLibrary(data.attributes.playParams.id.toString()) ">
|
||||
<img :class="(!inLibrary) ? 'md-ico-add' : 'md-ico-remove'">
|
||||
{{app.getLz('term.confirm')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto flex-center">
|
||||
<button class="more-btn-round" style="float:right;" @click="menu">
|
||||
<div class="svg-icon"></div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="playlist-body">
|
||||
<div class="well">
|
||||
<div style="width:100%">
|
||||
<draggable :sort="data.attributes.canEdit && data.type == 'library-playlists'"
|
||||
v-model="data.relationships.tracks.data" @start="drag=true"
|
||||
@end="drag=false;put()">
|
||||
<mediaitem-list-item :item="item" :parent="getItemParent(data)" :index="index"
|
||||
:showIndex="true"
|
||||
:showIndexPlaylist="(data.attributes.playParams.kind ?? data.type ?? '').includes('playlist')"
|
||||
:context-ext="buildContextMenu()"
|
||||
v-for="(item,index) in data.relationships.tracks.data"></mediaitem-list-item>
|
||||
</draggable>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div class="friends-info" v-if="itemBadges.length != 0">
|
||||
<div class="well">
|
||||
<div class="badge-container">
|
||||
<div class="socialBadge"
|
||||
:title="`${badge.attributes.name} - @${badge.attributes.handle}`"
|
||||
v-for="badge in itemBadges">
|
||||
<mediaitem-artwork
|
||||
:url="badge.attributes.artwork.url"
|
||||
:size="60"></mediaitem-artwork>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="playlist-time">
|
||||
{{getFormattedDate()}}
|
||||
</div>
|
||||
<div class="playlist-time total">{{app.getTotalTime()}}</div>
|
||||
<div class="playlist-time item-navigate" @click="app.searchAndNavigate(data,'recordLabel') "
|
||||
style="width: 50%;">
|
||||
{{data.attributes.copyright}}
|
||||
</div>
|
||||
<template
|
||||
v-if="(data.attributes?.playParams?.kind ?? data.type ?? '').includes('album') && data.relationships.catalog != null && data.relationships.catalog != null && data.relationships.catalog.data.length > 0">
|
||||
<div class="playlist-time showExtended item-navigate" style="color:#fa586a; font-weight: bold"
|
||||
@click="app.routeView(data.relationships.catalog.data[0])">
|
||||
{{$root.getLz("action.showAlbum")}}
|
||||
</div>
|
||||
</template>
|
||||
<hr>
|
||||
<template v-if="typeof data.meta != 'undefined'">
|
||||
<div v-for="view in data.meta.views.order" v-if="data.views[view].data.length != 0">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3>{{ data.views[view].attributes.title }}</h3>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<mediaitem-scroller-horizontal
|
||||
:items="data.views[view].data"></mediaitem-scroller-horizontal>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
<div class="playlist-inner" v-else>
|
||||
<div class="close-btn" title="Close" @click="$root.resetState()">
|
||||
<svg fill="white" xmlns="http://www.w3.org/2000/svg" width="21" height="21" viewBox="0 0 21 21"
|
||||
aria-role="presentation" focusable="false">
|
||||
<path
|
||||
d="M10.5 21C4.724 21 0 16.275 0 10.5S4.724 0 10.5 0 21 4.725 21 10.5 16.276 21 10.5 21zm-3.543-5.967a.96.96 0 00.693-.295l2.837-2.842 2.85 2.842c.167.167.41.295.693.295.552 0 1.001-.461 1.001-1.012 0-.281-.115-.512-.295-.704L11.899 10.5l2.85-2.855a.875.875 0 00.295-.68c0-.55-.45-.998-1.001-.998a.871.871 0 00-.668.295l-2.888 2.855-2.862-2.843a.891.891 0 00-.668-.281.99.99 0 00-1.001.986c0 .269.116.512.295.678L9.088 10.5l-2.837 2.843a.926.926 0 00-.295.678c0 .551.45 1.012 1.001 1.012z"
|
||||
fill-rule="nonzero"/>
|
||||
</svg>
|
||||
</div>
|
||||
<template v-if="app.playlists.loadingState == 0">
|
||||
<div class="content-inner centered">
|
||||
<div class="spinner"></div>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script>
|
||||
Vue.component('playlist-inline', {
|
||||
template: "#playlist-inline",
|
||||
props: ["data"],
|
||||
|
||||
data: function () {
|
||||
return {
|
||||
editorialNotesExpanded: false,
|
||||
drag: false,
|
||||
nameEditing: false,
|
||||
inLibrary: null,
|
||||
confirm: false,
|
||||
app: this.$root,
|
||||
itemBadges: [],
|
||||
badgesRequested: false,
|
||||
headerVisible: true
|
||||
}
|
||||
},
|
||||
mounted: function () {
|
||||
this.$nextTick(function () {
|
||||
this.isInLibrary()
|
||||
})
|
||||
},
|
||||
watch: {
|
||||
data: function () {
|
||||
this.isInLibrary()
|
||||
this.getBadges()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
isHeaderVisible(visible) {
|
||||
this.headerVisible = visible
|
||||
},
|
||||
getBadges() {
|
||||
return
|
||||
if (this.badgesRequested) {
|
||||
return
|
||||
}
|
||||
this.badgesRequested = true
|
||||
this.itemBadges = []
|
||||
let self = this
|
||||
var id = 0
|
||||
try {
|
||||
id = this.data.attributes.playParams.id
|
||||
} catch (e) {
|
||||
id = this.data.id
|
||||
}
|
||||
this.$root.getSocialBadges((badges) => {
|
||||
let friends = badges[id]
|
||||
if (friends) {
|
||||
friends.forEach(function (friend) {
|
||||
self.app.mk.api.v3.music(`/v1/social/${app.mk.storefrontId}/social-profiles/${friend}`).then(data => {
|
||||
self.itemBadges.push(data.data.data[0])
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
},
|
||||
confirmButton() {
|
||||
// Return button to normal state after 3 seconds
|
||||
|
||||
this.confirm = true
|
||||
setTimeout(() => this.confirm = false, 3000);
|
||||
},
|
||||
getArtistName(data) {
|
||||
console.log(data.attributes)
|
||||
if (data.attributes.artistName) {
|
||||
return data.attributes.artistName
|
||||
} else if (data.attributes.artist) {
|
||||
return data.attributes.artist.attributes.name
|
||||
} else if (data.attributes.curatorName) {
|
||||
return data.attributes.curatorName
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
},
|
||||
async isInLibrary() {
|
||||
if (this.data.type && !this.data.type.includes("library")) {
|
||||
// please keep using vars here
|
||||
const params = {
|
||||
"fields[playlists]": "inLibrary",
|
||||
"fields[albums]": "inLibrary",
|
||||
"relate": "library"
|
||||
};
|
||||
const res = await app.mkapi(this.data.attributes.playParams.kind ?? this.data.type, this.data.attributes.playParams.isLibrary ?? false, this.data.attributes.playParams.id ?? this.data.id, params);
|
||||
this.inLibrary = (res.data.data[0] && res.data.data[0].attributes && res.data.data[0].attributes.inLibrary) ? res.data.data[0].attributes.inLibrary : false
|
||||
console.log(res)
|
||||
} else {
|
||||
this.inLibrary = true
|
||||
}
|
||||
},
|
||||
editPlaylist() {
|
||||
this.app.editPlaylist(this.data.id, this.data.attributes.name);
|
||||
this.app.playlists.listing.forEach(playlist => {
|
||||
if (playlist.id === this.data.id) {
|
||||
playlist.attributes.name = this.data.attributes.name
|
||||
}
|
||||
})
|
||||
this.nameEditing = false
|
||||
},
|
||||
addToLibrary(id) {
|
||||
app.mk.addToLibrary(id)
|
||||
this.inLibrary = true
|
||||
this.confirm = false
|
||||
},
|
||||
async removeFromLibrary(id) {
|
||||
const params = {"fields[somgs]": "inLibrary", "fields[albums]": "inLibrary", "relate": "library"};
|
||||
var id = this.data.id ?? this.data.attributes.playParams.id
|
||||
const res = await app.mkapi(this.data.attributes.playParams.kind ?? this.data.type, this.data.attributes.playParams.isLibrary ?? false, this.data.attributes.playParams.id ?? this.data.id, params);
|
||||
if (res.data.data[0] && res.data.data[0].relationships && res.data.data[0].relationships.library && res.data.data[0].relationships.library.data && res.data.data[0].relationships.library.data.length > 0) {
|
||||
id = res.data.data[0].relationships.library.data[0].id
|
||||
}
|
||||
let kind = this.data.attributes.playParams.kind ?? this.data.type ?? '';
|
||||
const truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
|
||||
app.mk.api.v3.music(`v1/me/library/${truekind}/${id.toString()}`, {},
|
||||
{
|
||||
fetchOptions: {
|
||||
method: "DELETE"
|
||||
}
|
||||
})
|
||||
this.inLibrary = false
|
||||
this.confirm = false
|
||||
},
|
||||
editPlaylistName() {
|
||||
if (this.data.attributes.canEdit && this.data.type === "library-playlists") {
|
||||
this.nameEditing = true
|
||||
setTimeout(() => {
|
||||
document.querySelector(".nameEdit").focus()
|
||||
}, 100)
|
||||
}
|
||||
},
|
||||
buildContextMenu(index) {
|
||||
let self = this
|
||||
if (!this.data.attributes.canEdit) {
|
||||
return
|
||||
}
|
||||
return {
|
||||
normal: [
|
||||
{
|
||||
name: app.getLz('action.removeFromPlaylist'),
|
||||
action: () => {
|
||||
self.remove()
|
||||
}
|
||||
},
|
||||
],
|
||||
multiple: [
|
||||
{
|
||||
name: app.getLz('action.removeFromPlaylist'),
|
||||
action: () => {
|
||||
self.remove()
|
||||
}
|
||||
},
|
||||
]
|
||||
}
|
||||
},
|
||||
async put() {
|
||||
if (!this.data.attributes.canEdit) {
|
||||
return
|
||||
}
|
||||
console.log('sds', this.convert())
|
||||
await app.mk.api.v3.music(
|
||||
`/v1/me/library/playlists/${this.data.attributes.playParams.id}/tracks`,
|
||||
{},
|
||||
{
|
||||
fetchOptions: {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({
|
||||
data: this.convert()
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
},
|
||||
async remove() {
|
||||
if (!this.data.attributes.canEdit) {
|
||||
return
|
||||
}
|
||||
// for each app.selectedMediaItems splice the items from the playlist
|
||||
for (let i = 0; i < app.selectedMediaItems.length; i++) {
|
||||
let item = app.selectedMediaItems[i]
|
||||
let index = this.data.relationships.tracks.data.findIndex(x => x.id == item.id)
|
||||
if (index > -1) {
|
||||
this.data.relationships.tracks.data.splice(index, 1)
|
||||
}
|
||||
}
|
||||
await this.put()
|
||||
},
|
||||
convert() {
|
||||
let pl_tracks = []
|
||||
for (let i = 0; i < this.data.relationships.tracks.data.length; i++) {
|
||||
pl_tracks.push({
|
||||
id: this.data.relationships.tracks.data[i].id,
|
||||
type: this.data.relationships.tracks.data[i].type
|
||||
})
|
||||
}
|
||||
return pl_tracks
|
||||
},
|
||||
getRecursive(url) {
|
||||
app.apiCall(app.musicBaseUrl + "/v1/me/library/playlists/p.V7VYlrDso6kkYY/tracks?offset=100", res => {
|
||||
this.data.relationships.tracks.data = this.data.relationships.tracks.data.concat(res.data.data)
|
||||
if (res.data.next) {
|
||||
this.getRecursive(res.data.next)
|
||||
}
|
||||
})
|
||||
},
|
||||
menu(event) {
|
||||
app.showMenuPanel({
|
||||
items: {
|
||||
"share": {
|
||||
name: app.getLz('term.share'),
|
||||
icon: "./assets/feather/share.svg",
|
||||
action: () => {
|
||||
let route = ""
|
||||
switch (this.data.type) {
|
||||
case 'albums':
|
||||
route = `/v1/catalog/${app.mk.storefrontId}/albums/${this.data.id}`
|
||||
break;
|
||||
case 'playlists':
|
||||
route = `/v1/catalog/${app.mk.storefrontId}/playlists/${this.data.id}`
|
||||
break;
|
||||
case "library-playlists":
|
||||
route = `/v1/me/library/playlists/${this.data.id}/catalog`
|
||||
break
|
||||
case "library-albums":
|
||||
route = `/v1/me/library/albums/${this.data.id}/catalog`
|
||||
break
|
||||
}
|
||||
if (route === '') {
|
||||
return
|
||||
}
|
||||
app.mk.api.v3.music(route).then(res => {
|
||||
console.log(res.data.data[0].attributes.url)
|
||||
app.copyToClipboard(res.data.data[0].attributes.url)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}, event)
|
||||
},
|
||||
getItemParent: function (data) {
|
||||
kind = data.attributes.playParams.kind;
|
||||
id = data.attributes.playParams.id;
|
||||
return `${kind}:${id}`
|
||||
},
|
||||
getFormattedDate: function () {
|
||||
let date = (this.data.attributes.releaseDate ?? (this.data.attributes.lastModifiedDate ?? (this.data.attributes.dateAdded ?? '')))
|
||||
let prefix = '';
|
||||
if (date == null || date === "") return "";
|
||||
switch (date) {
|
||||
case this.data.attributes.releaseDate:
|
||||
prefix = this.app.getLz('term.time.released') + ' '
|
||||
break;
|
||||
case this.data.attributes.lastModifiedDate:
|
||||
prefix = this.app.getLz('term.time.updated') + ' '
|
||||
break;
|
||||
case this.data.attributes.dateAdded:
|
||||
prefix = this.app.getLz('term.time.added') + ' '
|
||||
break;
|
||||
}
|
||||
let month, year;
|
||||
try {
|
||||
const releaseDate = new Date(date);
|
||||
// month = new Intl.DateTimeFormat(this.app.cfg.general.language.replace('_','-'), {month: 'long'}).format(releaseDate);
|
||||
// date = releaseDate.getDate();
|
||||
// year = releaseDate.getFullYear();
|
||||
let formatted = ''
|
||||
try {
|
||||
formatted = new Intl.DateTimeFormat(this.app.cfg.general.language?.replace('_', '-') ?? 'en-US', {
|
||||
day: 'numeric',
|
||||
month: 'long',
|
||||
year: 'numeric'
|
||||
}).format(releaseDate);
|
||||
} catch (e) {
|
||||
// use the format in json instead
|
||||
if (this.app.getLz('date.format') != null) {
|
||||
formatted = new this.app.getLz('date.format').replace("${d}", releaseDate.getDate()).replace("${m}", releaseDate.getMonth()).replace("${y}", releaseDate.getFullYear());
|
||||
} else {
|
||||
formatted = new Intl.DateTimeFormat('en-US', {
|
||||
day: 'numeric',
|
||||
month: 'long',
|
||||
year: 'numeric'
|
||||
}).format(releaseDate);
|
||||
}
|
||||
}
|
||||
return prefix + formatted
|
||||
} catch (e) {
|
||||
return ""
|
||||
}
|
||||
},
|
||||
play() {
|
||||
function shuffleArray(array) {
|
||||
for (var i = array.length - 1; i > 0; i--) {
|
||||
var j = Math.floor(Math.random() * (i + 1));
|
||||
var temp = array[i];
|
||||
array[i] = array[j];
|
||||
array[j] = temp;
|
||||
}
|
||||
}
|
||||
|
||||
const id = this.data.attributes.playParams.id ?? this.data.id;
|
||||
//console.log("1")
|
||||
const kind = this.data.attributes.playParams.kind ?? this.data.type ?? '';
|
||||
//console.log("1")
|
||||
const truekind = (!kind.endsWith("s")) ? (kind + "s") : kind;
|
||||
|
||||
let query = (this.data ?? app.showingPlaylist).relationships.tracks.data.map(item => new MusicKit.MediaItem(item));
|
||||
app.mk.stop().then(function () {
|
||||
app.mk.setQueue({[truekind]: [id]}).then(function () {
|
||||
app.mk.play().then(function () {
|
||||
if (query.length > 100) {
|
||||
let u = query.slice(100);
|
||||
if (app.mk.shuffleMode == 1) {
|
||||
shuffleArray(u)
|
||||
}
|
||||
app.mk.queue.append(u)
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
})
|
||||
</script>
|
|
@ -87,7 +87,7 @@
|
|||
<button class="md-btn md-btn-block meta-btn" @click="openUrl(selected.attributes.websiteUrl)">{{$root.getLz('podcast.website')}}</button>
|
||||
</div>
|
||||
<div class="col">
|
||||
<button class="md-btn md-btn-block meta-btn" @click="$root.share(selected.attributes.websiteUrl)">{{$root.getLz('action.share')}}</button>
|
||||
<button class="md-btn md-btn-block meta-btn">{{$root.getLz('action.share')}}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
<script type="text/x-template" id="remote-pair">
|
||||
<div style="display:flex;width:100%;height:100%;padding-top: var(--navigationBarHeight);position:absolute;top:0;left:0;">
|
||||
<webview id="foo" src="https://music.apple.com/includes/commerce/account/settings?product=music&isFullscreen=true&isModal=false" style="display:inline-flex; width:100%;"></webview>
|
||||
</div>
|
||||
</script>
|
||||
<script>
|
||||
Vue.component('apple-account-settings', {
|
||||
template: '#apple-account-settings',
|
||||
async mounted() {
|
||||
ipcRenderer.send('get-remote-pair-url')
|
||||
ipcRenderer.on('send-remote-pair-url', (event, url) => {
|
||||
this.url = url
|
||||
app.webview.src = url
|
||||
document.getElementById('foo').src = url;
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
});
|
||||
</script>
|
|
@ -4,7 +4,7 @@
|
|||
<div class="row">
|
||||
<div class="col-sm" style="width: auto;" v-if="getTopResult()">
|
||||
<template>
|
||||
<h3>{{app.getLz('term.topResult')}}</h3>
|
||||
<h3>Top Result</h3>
|
||||
<mediaitem-square :item="getTopResult()"></mediaitem-square>
|
||||
</template>
|
||||
</div>
|
||||
|
@ -15,7 +15,7 @@
|
|||
<div class="col" v-if="search.results.song">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3>{{app.getLz('term.songs')}}</h3>
|
||||
<h3>Songs</h3>
|
||||
</div>
|
||||
<div class="col-auto flex-center"
|
||||
@click="app.showSearchView(app.search.term, 'song', app.friendlyTypes('song'))"
|
||||
|
@ -41,7 +41,8 @@
|
|||
</div>
|
||||
<div class="col-auto flex-center" v-if="search.results[section].data.length >= 10">
|
||||
<button class="cd-btn-seeall"
|
||||
@click="app.showSearchView(app.search.term, section, app.friendlyTypes(section))">{{app.getLz('term.seeAll')}}
|
||||
@click="app.showSearchView(app.search.term, section, app.friendlyTypes(section))">See
|
||||
All
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -58,7 +59,7 @@
|
|||
<template v-if="search.resultsSocial.playlist">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3>{{app.getLz('term.sharedPlaylists')}}</h3>
|
||||
<h3>Shared Playlists</h3>
|
||||
</div>
|
||||
<div class="col-auto flex-center" v-if="search.resultsSocial.playlist.data.length >= 10">
|
||||
<button class="cd-btn-seeall"
|
||||
|
@ -72,7 +73,7 @@
|
|||
<template v-if="search.resultsSocial.profile">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3>{{app.getLz('term.people')}}</h3>
|
||||
<h3>People</h3>
|
||||
</div>
|
||||
<div class="col-auto flex-center" v-if="search.resultsSocial.profile.data.length >= 10">
|
||||
<button class="cd-btn-seeall"
|
||||
|
|
|
@ -6,9 +6,6 @@
|
|||
</div>
|
||||
<div class="settings-option-body">
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('term.accountSettings')}}
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<button class="md-btn" @click="app.appRoute('apple-account-settings')">
|
||||
{{$root.getLz('term.accountSettings')}}
|
||||
|
@ -35,8 +32,7 @@
|
|||
<div class="md-option-segment md-option-segment_auto">
|
||||
<select class="md-select" style="width:180px;" v-model="app.cfg.audio.quality"
|
||||
v-on:change="changeAudioQuality">
|
||||
<!-- // <option value="9216">{{$root.getLz('settings.header.audio.quality.hireslossless')}}</option> -->
|
||||
<option value="2304">{{$root.getLz('settings.header.audio.quality.lossless')}}</option>
|
||||
<!-- // <option value="990">Extreme</option> -->
|
||||
<option value="256">{{$root.getLz('settings.header.audio.quality.high')}}</option>
|
||||
<option value="64">{{$root.getLz('settings.header.audio.quality.low')}}</option>
|
||||
<option value="auto">{{$root.getLz('settings.header.audio.quality.auto')}}</option>
|
||||
|
@ -62,16 +58,6 @@
|
|||
switch/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.decryptLLPW')}}
|
||||
<br>
|
||||
<small>{{$root.getLz('settings.option.audio.enableAdvancedFunctionality.decryptLLPW.description')}}</small>
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<input type="checkbox" v-model="app.cfg.advanced.decryptLLPW" switch/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line" v-show="app.cfg.advanced.AudioContext">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('term.equalizer')}}
|
||||
|
@ -108,18 +94,6 @@
|
|||
<span>{{$root.getLz('settings.header.visual')}}</span>
|
||||
</div>
|
||||
<div class="settings-option-body">
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('settings.header.visual.theme')}}
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<select class="md-select" @change="$root.setTheme($root.cfg.visual.theme)" v-model="$root.cfg.visual.theme">
|
||||
<option value="default.less">{{$root.getLz('settings.option.visual.theme.default')}}</option>
|
||||
<option value="dark.less">{{$root.getLz('settings.option.visual.theme.dark')}}</option>
|
||||
<option v-for="theme in themes" :value="theme">{{ theme }}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('settings.option.visual.windowBackgroundStyle')}}
|
||||
|
@ -607,15 +581,6 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('settings.option.experimental.inline_playlists')}}
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<input type="checkbox" v-model="app.cfg.advanced.experiments.includes('inline-playlists')" @click="app.cfg.advanced.experiments.includes('inline-playlists') ? removeExperiment('inline-playlists') : addExperiment('inline-playlists')" switch/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('term.language')}}
|
||||
|
@ -649,23 +614,22 @@
|
|||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
{{$root.getLz('settings.option.experimental.copy_log')}}
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<button class="md-btn" @click="copyLogs">
|
||||
{{$root.getLz('action.copy')}}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="opacity: 0.5; pointer-events: none">
|
||||
<div class="md-option-header">
|
||||
<span>{{$root.getLz('settings.header.unfinished')}}</span>
|
||||
</div>
|
||||
<div class="settings-option-body">
|
||||
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
Theme
|
||||
</div>
|
||||
<div class="md-option-segment md-option-segment_auto">
|
||||
<select class="md-select">
|
||||
<option value="0">Cider</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-option-line">
|
||||
<div class="md-option-segment">
|
||||
Theme Options
|
||||
|
@ -727,8 +691,7 @@
|
|||
props: [],
|
||||
data: function () {
|
||||
return {
|
||||
app: this.$root,
|
||||
themes: ipcRenderer.sendSync("get-themes")
|
||||
app: this.$root
|
||||
}
|
||||
},
|
||||
mounted: function () {
|
||||
|
@ -741,10 +704,6 @@
|
|||
}
|
||||
},
|
||||
methods: {
|
||||
copyLogs() {
|
||||
ipcRenderer.send('fetch-log')
|
||||
notyf.success(app.getLz('term.share.success'));
|
||||
},
|
||||
getLanguages: function () {
|
||||
let langs = this.$root.lzListing
|
||||
let categories = {
|
||||
|
@ -779,7 +738,6 @@
|
|||
CiderAudio.spatialOn()
|
||||
}
|
||||
} else {
|
||||
app.cfg.advanced.decryptLLPW = false;
|
||||
CiderAudio.off();
|
||||
}
|
||||
},
|
||||
|
|
|
@ -193,7 +193,6 @@ input[type=range].web-slider::-webkit-slider-runnable-track {
|
|||
}
|
||||
|
||||
.lossless-badge {
|
||||
background-image: url("./assets/lossless.svg");
|
||||
background: rgb(150 150 150);
|
||||
border-radius: 6px;
|
||||
padding: 0px 6px;
|
||||
|
|
|
@ -18,6 +18,8 @@
|
|||
]
|
||||
},
|
||||
"include": [
|
||||
"src/main/**/*",
|
||||
"src/main/*",
|
||||
"src/main/plugins/*",
|
||||
"src/main/plugins/Extras/*"
|
||||
]
|
||||
}
|
||||
|
|