Merge branch 'main' into enhancement/lastfm

This commit is contained in:
Core 2022-06-28 11:37:05 +01:00
commit 2c9bf5eb7e
No known key found for this signature in database
GPG key ID: FE9BF1B547F8F3C6
22 changed files with 3066 additions and 1057 deletions

View file

@ -10,6 +10,7 @@
"notification.updatingLibrarySongs": "Memperbarui Pustaka lagu...",
"notification.updatingLibraryAlbums": "Memperbarui Pustaka album...",
"notification.updatingLibraryArtists": "Memperbarui Pustaka artis...",
"term.variables": "Variabel",
"term.appleInc": "Apple Inc.",
"term.appleMusic": "Apple Music",
"term.applePodcasts": "Apple Podcasts",
@ -20,9 +21,12 @@
"term.accountSettings": "Pengaturan Akun",
"term.logout": "Keluar",
"term.login": "Masuk",
"term.quickNav": "Navigasi Cepat",
"term.about": "Tentang",
"term.privateSession": "Sesi Pribadi",
"term.disablePrivateSession": "Matikan Mode Pribadi",
"term.queue": "Antrian",
"term.autoplay": "Pemutar Otomatis",
"term.lyrics": "Lirik",
"term.miniplayer": "Pemutar Kecil",
"term.history": "Riwayat",
@ -37,18 +41,28 @@
"term.artists": "Artis",
"term.podcasts": "Podcasts",
"term.playlists": "Playlist",
"term.charts": "Tangga Lagu",
"term.playlist": "Playlist",
"term.newPlaylist": "Playlist Baru",
"term.newPlaylistFolder": "Folder Playlist Baru",
"term.createNewPlaylist": "Buat Playlist Baru",
"term.createNewPlaylistFolder": "Buat Folder Playlist Baru",
"term.deletePlaylist": "Yakin ingin menghapus playlist ini?",
"term.navigateBack": "Navigasi kembali",
"term.navigateForward": "Navigasi kedepan",
"term.play": "Mainkan",
"term.playpause": "Mainkan/Jeda",
"term.pause": "Jeda",
"term.stop": "Berhenti",
"term.previous": "Sebelumnya",
"term.next": "Selanjutnya",
"term.shuffle": "Acak",
"term.enableShuffle": "Nyalakan pemutaran acak",
"term.disableShuffle": "Matikan pemutaran acak",
"term.repeat": "Ulangi",
"term.enableRepeatOne": "Aktifkan ulangi sekali",
"term.disableRepeatOne": "Matikan ulangi sekali",
"term.disableRepeat": "Matikan ulangi",
"term.volume": "Volume",
"term.mute": "Bisu",
"term.unmute": "Bunyikan",
@ -70,6 +84,7 @@
"term.viewAs": "Lihat Sebagai",
"term.viewAs.coverArt": "Cover Art",
"term.viewAs.list": "Daftar",
"term.dynamic": "Dinamis",
"term.size": "Ukuran",
"term.size.normal": "Normal",
"term.size.compact": "Kompak",
@ -117,6 +132,9 @@
"term.audioControls": "Kontrol Volume",
"term.clearAll": "Bersihkan Semua",
"term.recentStations": "Stasiun Terbaru",
"term.personalStations": "Stasiun Pribadi",
"term.amLive": "Apple Music Live",
"term.live": "LIVE",
"term.language": "Bahasa",
"term.funLanguages": "Senang-senang",
"term.noLyrics": "Memuat... / Lirik tidak ditermukan./ Instrumental.",
@ -137,6 +155,7 @@
},
"term.videos": "Video",
"term.menu": "Menu",
"term.themeManaged": "Diatur oleh tema",
"term.check": "Cek",
"term.aboutArtist": "Tentang {{artistName}}",
"term.topResult": "Hasil Teratas",
@ -175,6 +194,19 @@
"term.topGenres": "Genre Teratas",
"term.confirmLogout": "Apakah Anda yakin ingin keluar??",
"term.creditDesignedBy": "Dirancang oleh ${authorUsername}",
"term.discNumber": "Kaset ${discNumber}",
"term.reload" : "Muat ulang Cider?",
"term.toggleprivate" : "Nyalakan Sesi Pribadi",
"term.webremote" : "Remot Web",
"term.cast" : "Transmisi",
"term.cast2" : "Transmisikan ke Perangkat",
"term.quit" : "Keluar",
"term.zoomin" : "Perbesar",
"term.zoomout" : "Perkecil",
"term.zoomreset" : "Atur Ulang",
"term.fullscreen" : "Layar Penuh",
"home.syncFavorites": "Sinkronkan Favorit",
"home.syncFavorites.gettingArtists": "Mendapatkan artis favorit",
"home.title": "Beranda",
"home.recentlyPlayed": "Baru Dimainkan",
"home.recentlyAdded": "Baru Ditambahkan",
@ -187,14 +219,25 @@
"error.connectionError": "Terjadi masalah saat menyambungkan ke Apple Music.",
"error.noResults": "Tidak ada hasil.",
"error.noResults.description": "Coba pencarian baru.",
"podcast.followOnCider": "Ikuti Di Cider",
"podcast.followedOnCider": "Mengikuti Di Cider",
"podcast.subscribeOnItunes": "Langganan Di iTunes",
"podcast.subscribedOnItunes": "Berlangganan Di iTunes",
"podcast.followOnCider": "Ikuti di Cider",
"podcast.followedOnCider": "Mengikuti di Cider",
"podcast.subscribeOnItunes": "Langganan di iTunes",
"podcast.subscribedOnItunes": "Telah Berlangganan di iTunes",
"podcast.itunesStore": "iTunes Store",
"podcast.episodes": "Episode",
"podcast.playEpisode": "Mainkan Episode",
"podcast.website": "Website Podcast",
"action.favorite": "Favorit",
"action.removeFavorite": "Hapus Favorit",
"action.hideLibrary": "Sembunyikan Pustaka",
"action.showLibrary": "Tampilkan Pustaka",
"action.cut": "Cut",
"action.paste": "Paste",
"action.selectAll": "Pilih Semua",
"action.delete": "Hapus",
"action.edit": "Ubah",
"action.done": "Selesai",
"action.editTracklist": "Edit Daftar Lagu",
"action.addToLibrary": "Tambahkan ke Pustaka",
"action.addToLibrary.success": "Ditambahkan ke Pustaka",
"action.addToLibrary.error": "Terjadi Kesalahan Saat Menambahkan Pustaka",
@ -240,12 +283,45 @@
"action.tray.minimize": "Sembunyikan ke Tray",
"action.tray.quit": "Keluar",
"action.update": "Perbarui",
"action.tray.listento": "Dengarkan:",
"action.install": "Pasang",
"action.copy": "Salin",
"action.newpreset": "Preset Baru...",
"action.deletepreset": "Hapus Preset",
"action.open": "Buka",
"action.close": "Close",
"action.relaunch.confirm": "Apakah Anda ingin memulai ulang Cider?",
"action.cast.chromecast": "Chromecast",
"action.cast.todevices": "Transmisi ke Perangkat",
"action.cast.stop": "Stop transmisi ke semua perangkat",
"action.cast.airplay": "AirPlay",
"action.cast.airplay.underdevelopment": "AirPlay masih dalam tahap pengembangan",
"action.cast.scan": "Pindai",
"action.cast.scanning": "Pindai...",
"action.createNew": "Buat Baru...",
"action.openArtworkInBrowser": "Buka artwork di browser",
"action.scrollToTop": "Gulir ke atas",
"action.refresh": "Muat ulang",
"menubar.options.view": "Tampilan",
"menubar.options.reload": "Muat Ulang",
"menubar.options.forcereload": "Paksa Muat Ulang",
"menubar.options.toggledevtools": "Aktfikan Alat Developer",
"menubar.options.window": "Jendela",
"menubar.options.minimize": "Perkecil",
"menubar.options.plugins": "Menu Plu-gins",
"menubar.options.controls": "Kontrol",
"menubar.options.volumeup": "Keraskan Volume",
"menubar.options.volumedown": "Kecilkan Volume",
"menubar.options.account": "Akun",
"menubar.options.signout": "Keluar",
"menubar.options.support": "Bantuan",
"menubar.options.report": "Laporkan...",
"menubar.options.bug": "Bug",
"menubar.options.feature": "Permintaan Fitur",
"menubar.options.trans": "Laporkan/Minta Terjemahan",
"menubar.options.license": "Lihat Lisensi",
"menubar.options.conf": "Bukan File Konfigurasi pada Editor",
"menubar.options.zoom": "Zoom",
"settings.header.general": "Umum",
"settings.header.general.description": "Sesuaikan pengaturan umum untuk Cider.",
"settings.option.general.language": "Bahasa",
@ -254,17 +330,53 @@
"settings.option.general.resumebehavior.locally": "Lokal",
"settings.option.general.resumebehavior.locally.description": "Cider akan melanjutkan sesi terakhir Anda di perangkat ini.",
"settings.option.general.resumebehavior.history": "Riwayat",
"settings.option.general.resumebehavior.history.description": "Cider akan menambahkan lagu terakhir dari keseluruhan riwayat Apple Music Anda ke dalam antrian di seluruh perangkat.",
"settings.option.general.resumebehavior.history.description": "Cider akan melanjutkan lagu terakhir dari riwayat Apple Music di seluruh perangkat Anda.",
"settings.option.general.resumetabs" : "Buka Tab ketika Diluncurkan",
"settings.option.general.resumetabs.description" : "Anda dapat memilih tab apa yang akan dibuka ketika Anda membuka Cider.",
"settings.option.general.resumetabs.dynamic" : "Dinamis",
"settings.option.general.resumetabs.dynamic.description" : "Cider akan membuka tab yang terakhir digunakan",
"settings.option.general.language.main": "Bahasa",
"settings.option.general.language.fun": "Bahasa Candaan",
"settings.option.general.language.unsorted": "Tidak disortir",
"settings.option.general.customizeSidebar": "Sesuaikan Item Sidebar",
"settings.option.general.customizeSidebar.customize": "Sesuaikan",
"settings.option.general.keybindings": "Kombinasi Keyboard",
"settings.option.general.keybindings.library": "Pustaka",
"settings.option.general.keybindings.session": "Sesi",
"settings.option.general.keybindings.control": "Kontrol",
"settings.option.general.keybindings.interface": "Tampilan",
"settings.option.general.keybindings.advanced": "Lebih Lanjut",
"settings.option.general.keybindings.pressCombination": "Tekan kombinasi dua tombol untuk memperbarui",
"settings.option.general.keybindings.pressEscape": "Tekan ESC untuk kembali",
"settings.notyf.general.keybindings.update.success": "Kombinasi Keyboard telah diperbarui",
"settings.prompt.general.keybindings.update.success": "Kombinasi keyboard telah diperbarui",
"settings.option.general.themeUpdateNotification": "Perbarui tema secara otomatis",
"settings.option.general.showLovedTracksInline": "Tampilkan lagu yang di-love sejajar",
"settings.description.search": "Cari",
"settings.description.albums": "Pustaka Album",
"settings.description.artists": "Pustaka Artis",
"settings.description.browse": "Jelajahi",
"settings.description.private": "Nyalakan Sesi Pribadi",
"settings.description.remote": "Remote Web",
"settings.description.audio": "Peraturan Audio",
"settings.description.plugins": "Menu Plugins",
"settings.description.cast": "Transmisikan ke Perangkat",
"settings.description.settings": "Pengaturan",
"settings.description.developer": "Alat Developer",
"settings.description.listnow": "Dengarkan Sekarang",
"settings.description.recentAdd": "Baru Ditambahkan",
"settings.description.songs": "Lagu",
"settings.notyf.updateCider.update-not-available": "Tidak ada pembaruan tersedia",
"settings.notyf.updateCider.update-downloaded": "Pembaruan sudah didownload, mulai ulang untuk menginstall pembaruan",
"settings.notyf.updateCider.update-timeout": "Waktu pembaruan habis",
"settings.header.audio": "Audio",
"settings.header.audio.description": "Sesuaikan pengaturan audio untuk Cider.",
"settings.option.audio.volumeStep": "Jangkah Volume",
"settings.option.audio.advanced": "Kontrol Volume Lanjut",
"settings.option.audio.maxVolume": "Volume Maksimal",
"settings.option.audio.changePlaybackRate": "Ubah Tingkat Pemutaran",
"settings.option.audio.playbackRate": "Tingkat Pemutaran",
"settings.option.audio.playbackRate.change": "Ganti",
"settings.option.audio.quality": "Kualitas Audio",
"settings.header.audio.quality.hireslossless": "Hi-Res Lossless",
"settings.header.audio.quality.hireslossless.description": "sampai dari 24-bit/192 kHz",
@ -277,20 +389,41 @@
"settings.option.audio.seamlessTransition": "Transisi Audio Mulus",
"settings.option.audio.enableAdvancedFunctionality": "Aktifkan Fungsi Lanjutan",
"settings.option.audio.enableAdvancedFunctionality.description": "Mengaktifkan fungsionalitas AudioContext memungkinkan fitur audio lanjutan seperti Normalisasi Audio, Equalizer dan Visualizer. Namun pada beberapa perangkat dapat menyebabkan tersendatnya audio.",
"settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider memperkirakan bahwa PC Anda tidak dapat menggunakan fitur ini. Apakah Anda yakin ingin melanjutkan?",
"settings.option.audio.audioLab": "Lab Audio Cider",
"settings.option.audio.audioLab.description": "Macam-macam efek audio yang dikembangkan sendiri untuk Cider.",
"settings.option.audio.audioLab.subheader": "Dibuat oleh Cider Acoustic Technologies di California",
"settings.warn.audioLab.withoutAF": "AudioContext (Fungsi Lanjutan) perlu diaktifkan untuk menggunakan Lab Audio Cider.",
"settings.warn.enableAdvancedFunctionality": "AudioContext (Advanced Functionality) dibutuhkan untuk menyalakan fitur ini.",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Analog Warmth",
"settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Mensimulasikan kehangatan analog yang dimodelkan setelah Korg Nutube 6P1",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Analog Warmth intensity",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Mengubah intensitas pemrosesan modul Analog Warmth.",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Halus",
"settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Hangat",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Membuat atmosfir musik yang berbeda setelah penyesuaian audio tingkat modern dan terbaru",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™ Mode",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Ubah mode operasi dari modul Atmosphere Realizer.",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_STANDARD": "Hōjicha Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.NATURAL_PLUS": "Genmaicha Tapioca Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_1": "Rock Salt Cheese Foam Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Uji Matcha Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jasmine Macchiato",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Moonlight Softcake",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis aux Cerises",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Brown Sugar Creme Brûlée Milk",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Cuddle Warmth",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Meningkatkan kualitas audio AAC secara 'realtime' dengan algoritma yang memanfaatkan model psychoacoustic manusia dan karakteristik encoding AAC",
"settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP tidak cocok dengan Spatialisasi. Matikan Spasialisasi untuk menggunakan.",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Kekuatan CAP",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Mengubah kekuatan pemrosesan yang dilakukan pada audio. (Agresif dapat menghasilkan hasil yang tidak diinginkan)",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Standar",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.adaptive": "Adaptif",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.legacy": "Legacy",
"settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agresif",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalisasi Audio",
"settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Menormalkan puncak volume untuk masing-masing lagu demi menciptakan pengalaman mendengarkan yang lebih seragam.",
@ -300,14 +433,30 @@
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Profil Spasialisasi Cider",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Mengubah Profil Tuning Spasialisasi. (Memerlukan Restart Aplikasi)",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standar",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.soundstage": "Soundstage",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.separation": "Separation",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.minimal": "Minimal",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.diffused": "Diffused",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.bplk": "Encore",
"settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.hw2k": "Expanded Encore",
"settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Spatialization tidak cocok dengan CAP. Matikan CAP untuk menggunakan.",
"settings.option.audio.dbspl.display": "dB SPL Display",
"settings.option.audio.dbspl.description": "(Untuk pengguna ahli) Tampilkan dB SPL daripada dBFS pada penggeser volume.",
"settings.option.audio.dbfs.calibration": "0 dBFS Calibration",
"settings.option.audio.dbfs.description": "Masukkan puncak Z-weighted dB SPL saat Cider berada pada 0 dBFS.",
"settings.header.visual": "Visual",
"settings.header.visual.description": "Sesuaikan pengaturan visual untuk Cider.",
"settings.option.visual.windowStyle": "Gaya Jendela",
"settings.option.visual.customAccentColor": "Warna Pilihan",
"settings.option.visual.accentColor": "Warna",
"settings.option.visual.purplePodcastPlaybackBar": "Bilah Pemutaran Ungu untuk Podcast",
"settings.option.visual.windowColor": "Warna Jendela",
"settings.option.visual.windowBackgroundStyle": "Gaya Latar Belakang Jendela",
"settings.header.visual.windowBackgroundStyle.none": "Tidak Ada",
"settings.header.visual.windowBackgroundStyle.artwork": "Artwork",
"settings.header.visual.windowBackgroundStyle.image": "Gambar",
"settings.header.visual.windowBackgroundStyle.color": "Warna-warna",
"settings.option.visual.animatedArtwork": "Artwork Bergerak",
"settings.header.visual.animatedArtwork.always": "Selalu",
"settings.header.visual.animatedArtwork.limited": "Terbatas untuk halaman dan entri khusus",
@ -323,12 +472,21 @@
"settings.option.visual.hardwareAcceleration.description": "Membutuhkan dibuka ulang",
"settings.header.visual.hardwareAcceleration.default": "Default",
"settings.header.visual.hardwareAcceleration.webGPU": "WebGPU",
"settings.option.visual.uiscale": "Skala UI",
"settings.header.visual.theme": "Tema",
"settings.option.visual.theme.github.download": "Pasang dari URL GitHub",
"settings.option.visual.theme.github.openfolder": "Buka Folder Tema",
"settings.option.visual.theme.github.explore": "Jelajahi Tema di GitHub",
"settings.header.visual.theme.github.page": "Tema dari GitHub",
"settings.option.visual.theme.github.install.confirm": "Apakah anda yakin untuk memasang {{ repo }}?",
"settings.prompt.visual.theme.github.URL": "Masukan URL tema yang ingin Anda pasang",
"settings.prompt.visual.theme.uninstallTheme": "Apakah Anda yakin untuk untuk mencopot {{ theme }}?",
"settings.option.visual.theme.checkForUpdates": "Cek Pembaruan",
"settings.option.visual.theme.manageStyles": "Kelola Gaya",
"settings.option.visual.theme.uninstall": "Copot",
"settings.option.visual.theme.viewInfo": "Lihat Info",
"settings.option.visual.theme.github.available": "Tersedia",
"settings.option.visual.theme.github.applied": "Diterapkan",
"settings.notyf.visual.theme.install.success": "Tema berhasil dipasang",
"settings.notyf.visual.theme.install.error": "Pemasangan tema gagal",
"settings.header.visual.plugin": "Plugin",
@ -347,17 +505,29 @@
"settings.header.window.description": "Atur pengaturan jendela pada Cider.",
"settings.option.window.openOnStartup": "Buka Cider Ketika Perangkat Dinyalakan",
"settings.option.window.openOnStartup.hidden": "Buka dalam mode tersembunyi",
"settings.option.window.useNativeTitleBar": "Gunakan Title Bar Native",
"settings.option.window.windowControlStyle": "Pengontrol Style Jendela",
"settings.option.window.windowControlStyle.right": "Kanan",
"settings.option.window.windowControlStyle.left": "Kiri",
"settings.header.lyrics": "Lirik",
"settings.header.lyrics.description": "Sesuaikan pengaturan lirik untuk Cider.",
"settings.option.lyrics.enableMusixmatch": "Aktifkan Lirik Musixmatch",
"settings.option.lyrics.enableMusixmatchKaraoke": "Aktifkan Mode Karaoke (khusus Musixmatch)",
"settings.option.lyrics.musixmatchPreferredLanguage": "Bahasa Terjemahan Musixmatch",
"settings.option.lyrics.enableYoutubeLyrics": "Aktifkan Lirik Youtube untuk Video Musik",
"settings.option.lyrics.enableQQLyrics": "Aktifkan QQ Lyrics",
"settings.header.connectivity": "Konektivitas",
"settings.header.connectivity.description": "Sesuaikan pengaturan konektivitas untuk Cider.",
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
"settings.option.connectivity.playbackNotifications": "Pemberitahuan Pemutaran",
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
"settings.option.connectivity.discordRPC.clientName": "Nama Client",
"settings.option.connectivity.discordRPC.clearOnPause": "Sembunyikan Discord Rich Presence Saat Dijeda",
"settings.option.connectivity.discordRPC.hideButtons": "Sembunyikan tombol pada Discord Rich Presence",
"settings.option.connectivity.discordRPC.hideTimestamp": "Sembunyikan tanda waktu pada Discord Rich Presence",
"settings.option.connectivity.discordRPC.detailsFormat": "Format Detail",
"settings.option.connectivity.discordRPC.stateFormat": "Format State",
"settings.option.connectivity.discordRPC.reload": "Muat Ulang DiscordRPC",
"settings.option.connectivity.discordRPC.reconnectedToUser": "DiscordRPC terhubung ke pengguna: {{user}} ({{userid}})",
"settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling",
"settings.option.connectivity.lastfmScrobble.delay": "Delay Last.fm Scrobble (%)",
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Aktifkan Last.fm Now Playing",
@ -368,6 +538,8 @@
"settings.option.debug.openAppData": "Buka Folder Cider",
"settings.header.experimental": "Eksperimental",
"settings.header.experimental.description": "Sesuaikan pengaturan eksperimental untuk Cider.",
"settings.option.experimental.reinstallwidevine": "Pasang Ulang WidevineCDM",
"settings.option.experimental.reinstallwidevine.confirm": "Apakah Anda yakin untuk memasang ulang Widevine?",
"settings.option.experimental.unknownPlugin": "Sumber Tidak Diketahui",
"settings.option.experimental.unknownPlugin.description": "Izinkan pemasangan plugin dari repo selain Cider Plugin Repository",
"settings.option.experimental.compactUI": "UI Kompak",
@ -377,6 +549,10 @@
"settings.option.advanced.playlistTrackMapping.description": "Mengaktifkan pemindaian daftar putar yang mendalam untuk menentukan trek mana yang ada di daftar putar. Waktu pembuatan cache daftar putar dapat meningkat secara signifikan.",
"settings.option.visual.transparent": "Frame transparan",
"settings.option.visual.transparent.description": "membutuhkan tema yang mendukung, membutuhkan dibuka ulang",
"settings.header.advanced": "Lanjutan",
"settings.header.connect": "Sinkron",
"settings.option.connect.link_account": "Sikronisasikan dengan Cider Connect",
"settings.option.connect.link_account.description": "Menghubungkan akun Discord Anda dengan Cider Connect memungkinkan Anda untuk menyimpan data pengguna termasuk Pengaturan, EQ, dan lebih banyak lagi setelah selesai. (Pekerjaan Dalam Proses)",
"spatial.notTurnedOn": "Spasialisasi Audio dinonaktifkan. Untuk menggunakan, aktifkan terlebih dahulu.",
"spatial.spatialProperties": "Spatial Properties",
"spatial.width": "Lebar",
@ -399,5 +575,54 @@
"settings.header.unfinished": "Belum Diselesaikan",
"remote.web.title": "Remote Cider",
"remote.web.description": "Pindai kode QR untuk memasangkan ponsel Anda dengan Cider.",
"about.thanks": "Terima kasih yang sebesar-besarnya kepada Cider Collective Team dan semua kontributor kami."
"share.platform.twitter.tweet": "Dengarkan {{song}} di Apple Music.\n\n{{url}}\n\n#AppleMusic #Cider",
"share.platform.twitter": "Twitter",
"share.platform.facebook": "Facebook",
"share.platform.reddit": "Reddit",
"share.platform.telegram": "Telegram",
"share.platform.whatsapp": "WhatsApp",
"share.platform.messenger": "Messenger",
"share.platform.email": "Email",
"share.platform.songLink": "Salin dengan song.link",
"share.platform.clipboard": "Salin Link",
"about.thanks": "Terima kasih yang sebesar-besarnya kepada Cider Collective Team dan semua kontributor kami.",
"oobe.yes": "Ya",
"oobe.no": "Tidak",
"oobe.next": "Berikutnya",
"oobe.previous": "Sebelumnya",
"oobe.done": "Selesai",
"oobe.amupsell.title": "Sebelum kita mulai",
"oobe.amupsell.text": "Cider memerlukan langganan Apple Music yang aktif\nCider tidak akan berfungsi dengan Apple Music Voice Plan atau beberapa langganan uji coba promosi. Jika Anda sudah berlangganan Apple Music yang memenuhi syarat, klik Berikutnya untuk melanjutkan.",
"oobe.amupsell.subscribeBtn": "Berlangganan Apple Music",
"oobe.amupsell.explainBtn": "Jelaskan",
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
"oobe.amupsell.promoExplained": "Beberapa promosi uji coba Apple Music dan akun non AS tidak memiliki akses ke Apple Music Web Player API yang diperlukan agar Cider berfungsi. Untuk memverifikasi apakah uji coba aktif Anda akan berfungsi dengan Cider, buka <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> masuk dan coba putar musik. Jika berhasil, bagus! Anda siap menggunakan Cider, namun jika tidak mempertimbangkan untuk berlangganan Apple Music di sini: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
"oobe.intro.title": "Selamat Datang di Cider",
"oobe.intro.subtitle": "",
"oobe.intro.text": "Mari kita siapkan beberapa hal agar Anda dapat menggunakan Cider sesuai keinginan Anda. Anda selalu dapat mengubah setelan ini nanti.",
"oobe.general.title": "Umum",
"oobe.general.subtitle": "",
"oobe.general.text": "",
"oobe.audio.title": "Audio",
"oobe.audio.subtitle": "",
"oobe.audio.text": "Cider menghadirkan tumpukan audio yang disesuaikan dan dirancang khusus. Serta menghadirkan pengalaman audio berkualitas tinggi yang baik.\nDengan fitur seperti Cider Adrenaline, Atmosphere Realizer, dan Spatialized Audio.\nUntuk mengaktifkan fungsi ini \"Pengaturan Audio Tingkat Lanjut\" harus dinyalakan.\nMengaktifkan Pengaturan Audio Tingkat Lanjut akan memberi Anda akses ke peningkatan ini di Lab Audio Cider, yang ditemukan di pengaturan aplikasi",
"oobe.audio.advancedFunctionality": "",
"oobe.visual.title": "Visual",
"oobe.visual.subtitle": "",
"oobe.visual.text": "",
"oobe.visual.layout.text": "Cider menampilkan dua jendela tata letak yang berbeda.\nMaverick adalah tata letak seperti iTunes dengan pemutar di bagian atas jendela.\nMojave adalah putaran baru yang dibuat oleh tim Cider Collective.\n\nAnda dapat mengubah tata letak kapan saja di setelan.",
"oobe.visual.suggestingThemes": "Tema adalah cara terbaik untuk mempersonalisasi pengalaman Anda. Berikut adalah beberapa yang kami sarankan:",
"oobe.visual.suggestingThemes.subtext": "(Tema-tema ini akan diunduh dari GitHub)",
"oobe.visual.suggestingThemes.default": "Cider",
"oobe.visual.suggestingThemes.default.text": "Tema classic Cider.",
"oobe.visual.suggestingThemes.dark": "Gelap",
"oobe.visual.suggestingThemes.dark.text": "Kegelapan.",
"oobe.visual.suggestingThemes.community1": "Groovy",
"oobe.visual.suggestingThemes.community1.text": "A WinUI influenced theme",
"oobe.visual.suggestingThemes.community2": "iTheme",
"oobe.visual.suggestingThemes.community2.text": "The classic big fruit layout.",
"oobe.visual.suggestingThemes.community3": "Dracula",
"oobe.visual.suggestingThemes.community3.text": "The iconic Dracula color scheme.",
"oobe.amsignin.title": ""
}

View file

@ -19,6 +19,7 @@
"term.accountSettings": "帳戶設定",
"term.logout": "登出",
"term.login": "登入",
"term.quit" : "結束",
"term.about": "關於",
"term.privateSession": "私人時間",
"term.queue": "待播清單",
@ -144,6 +145,8 @@
"home.recentlyAdded": "最近加入",
"home.artistsFeed": "藝人追蹤",
"home.artistsFeed.noArtist": "追蹤你喜愛的藝人來取得他們的最新發行歌曲。",
"home.syncFavorites" : "同步追蹤" ,
"home.syncFavorites.gettingArtists" : "取得追蹤的藝人歌手列表... " ,
"home.madeForYou": "為您推薦",
"home.friendsListeningTo": "朋友正在聆聽",
"home.followedArtists": "追蹤的藝人",
@ -304,6 +307,11 @@
"settings.option.visual.uiscale": "介面顯示大小",
"settings.header.visual": "外觀",
"settings.header.visual.description": "調整 Cider 的外觀",
"settings.option.visual.windowStyle": "視窗布局風格",
"settings.option.visual.customAccentColor": "自訂強調色",
"settings.option.visual.accentColor": "強調色",
"settings.option.visual.purplePodcastPlaybackBar": "Podcasts 功能的紫色播放列",
"settings.option.visual.windowColor": "視窗色調顏色",
"settings.option.visual.windowBackgroundStyle": "視窗背景樣式",
"settings.header.visual.windowBackgroundStyle.none": "空白",
"settings.header.visual.windowBackgroundStyle.artwork": "專輯插圖",

View file

@ -1,9 +1,9 @@
import {join} from "path";
import {app, BrowserWindow as bw, ipcMain, ShareMenu, shell, screen} from "electron";
import { join } from "path";
import { app, BrowserWindow as bw, ipcMain, ShareMenu, shell, screen } from "electron";
import * as windowStateKeeper from "electron-window-state";
import * as express from "express";
import * as getPort from "get-port";
import {search} from "youtube-search-without-api-key";
import { search } from "youtube-search-without-api-key";
import {
existsSync,
rmSync,
@ -16,14 +16,14 @@ import {
rmdirSync,
lstatSync,
} from "fs";
import {Stream} from "stream";
import {networkInterfaces} from "os";
import { Stream } from "stream";
import { networkInterfaces } from "os";
import * as mm from 'music-metadata';
import fetch from 'electron-fetch'
import {wsapi} from "./wsapi";
import {utils} from './utils';
import {Plugins} from "./plugins";
import {watch} from "chokidar";
import { wsapi } from "./wsapi";
import { utils } from './utils';
import { Plugins } from "./plugins";
import { watch } from "chokidar";
import * as os from "os";
import wallpaper from "wallpaper";
import * as AdmZip from "adm-zip";
@ -123,6 +123,7 @@ export class BrowserWindow {
"components/artist-chip",
"components/hello-world",
"components/inline-collection-list",
"components/settings-window",
],
appRoutes: [
{
@ -201,12 +202,12 @@ export class BrowserWindow {
component: `<cider-browse :data="browsepage"></cider-browse>`,
condition: `page == 'browse'`,
onEnter: ``
},{
}, {
page: "groupings",
component: `<cider-groupings :data="browsepage"></cider-groupings>`,
condition: `page == 'groupings'`,
onEnter: ``
},{
}, {
page: "charts",
component: `<cider-charts :data="browsepage"></cider-charts>`,
condition: `page == 'charts'`,
@ -292,7 +293,7 @@ export class BrowserWindow {
show: false,
// backgroundColor: "#1E1E1E",
titleBarStyle: 'hidden',
trafficLightPosition: {x: 15, y: 20},
trafficLightPosition: { x: 15, y: 20 },
webPreferences: {
experimentalFeatures: true,
nodeIntegration: true,
@ -358,7 +359,7 @@ export class BrowserWindow {
* @yields {object} Electron browser window
*/
async createWindow(): Promise<Electron.BrowserWindow> {
this.clientPort = await getPort({port: 9000});
this.clientPort = await getPort({ port: 9000 });
BrowserWindow.verifyFiles();
this.StartWatcher(utils.getPath('themes'));
@ -495,9 +496,9 @@ export class BrowserWindow {
app.get("/cideraudio/impulses/:file", (req, res) => {
const impulseExternals = join(utils.getPath("externals"), "/impulses/")
const impulseFile = join(impulseExternals, req.params.file)
if(existsSync(impulseFile)) {
if (existsSync(impulseFile)) {
res.sendFile(impulseFile)
}else{
} else {
res.sendFile(join(utils.getPath('srcPath'), "./renderer/audio/impulses/" + req.params.file))
}
})
@ -550,11 +551,13 @@ export class BrowserWindow {
app.get("/ciderlocal/:songs", (req, res) => {
const audio = atob(req.params.songs.replace(/_/g, '/').replace(/-/g, '+'));
console.log('auss', audio)
let data = {data:
this.localSongs.filter((f: any) => audio.split(',').includes(f.id))};
let data = {
data:
this.localSongs.filter((f: any) => audio.split(',').includes(f.id))
};
res.send(data);
});
app.get("/themes/:theme/*", (req: { params: { theme: string, 0: string } }, res) => {
const theme = req.params.theme;
@ -637,7 +640,7 @@ export class BrowserWindow {
remote.use(express.static(join(utils.getPath('srcPath'), "./web-remote/")))
remote.set("views", join(utils.getPath('srcPath'), "./web-remote/views"));
remote.set("view engine", "ejs");
getPort({port: 6942}).then((port: number) => {
getPort({ port: 6942 }).then((port: number) => {
this.remotePort = port;
// Start Remote Discovery
this.broadcastRemote()
@ -670,11 +673,11 @@ export class BrowserWindow {
});
} else if (details.url.includes("ciderlocal")) {
let text = details.url.toString().includes('ids=') ? decodeURIComponent(details.url.toString()).split("?ids=")[1] : decodeURIComponent(details.url.toString().substring(details.url.toString().lastIndexOf('/') + 1));
console.log('localurl',text)
console.log('localurl', text)
callback({
redirectURL: `http://localhost:${this.clientPort}/ciderlocal/${Buffer.from(text).toString('base64url')}`,
});
}else {
} else {
callback({
cancel: false,
});
@ -716,7 +719,7 @@ export class BrowserWindow {
'KHTML, like Gecko) Mobile/17D50 UCBrowser/12.8.2.1268 Mobile AliApp(TUnionSDK/0.1.20.3) '
details.requestHeaders['Referer'] = "https://y.qq.com/portal/player.html"
}
callback({requestHeaders: details.requestHeaders});
callback({ requestHeaders: details.requestHeaders });
}
);
@ -773,7 +776,7 @@ export class BrowserWindow {
const Jimp = require("jimp")
const img = await Jimp.read(wpPath)
const blurAmount = args.blurAmount ?? 256
if(blurAmount) {
if (blurAmount) {
img.blur(blurAmount)
}
const screens = await screen.getAllDisplays()
@ -810,7 +813,7 @@ export class BrowserWindow {
}
// if path is directory, delete it
if (lstatSync(path).isDirectory()) {
await rmdirSync(path, {recursive: true});
await rmdirSync(path, { recursive: true });
} else {
// if path is file, delete it
await unlinkSync(path);
@ -841,7 +844,7 @@ export class BrowserWindow {
// remove WidevineCDM from appdata folder
const widevineCdmPath = join(app.getPath("userData"), "./WidevineCdm");
if (existsSync(widevineCdmPath)) {
rmSync(widevineCdmPath, {recursive: true, force: true})
rmSync(widevineCdmPath, { recursive: true, force: true })
}
// reinstall WidevineCDM
app.relaunch()
@ -1133,7 +1136,7 @@ export class BrowserWindow {
// Move window
ipcMain.on("windowmove", (_event, x, y) => {
BrowserWindow.win.setBounds({x, y});
BrowserWindow.win.setBounds({ x, y });
});
//Fullscreen
@ -1148,7 +1151,7 @@ export class BrowserWindow {
//Fullscreen
ipcMain.on('detachDT', (_event, _) => {
BrowserWindow.win.webContents.openDevTools({mode: 'detach'});
BrowserWindow.win.webContents.openDevTools({ mode: 'detach' });
})
ipcMain.handle('relaunchApp', (_event, _) => {
@ -1186,76 +1189,76 @@ export class BrowserWindow {
ipcMain.on("scanLibrary", async (event, folders) => {
async function getFiles(dir : any) {
async function getFiles(dir: any) {
const dirents = await readdir(dir, { withFileTypes: true });
const files = await Promise.all(dirents.map((dirent: any) => {
const res = path.resolve(dir, dirent.name);
return dirent.isDirectory() ? getFiles(res) : res;
const res = path.resolve(dir, dirent.name);
return dirent.isDirectory() ? getFiles(res) : res;
}));
return Array.prototype.concat(...files);
}
if (folders == null || folders.length == null || folders.length == 0) folders = ["D:\\Music"]
console.log('folders', folders)
let files: any[] = []
for (var folder of folders){
// get files from the Music folder
files = files.concat(await getFiles(folder))
}
//console.log("cider.files", files2);
let supporttedformats = ["mp3", "aac", "webm", "flac", "m4a", "ogg", "wav", "opus"]
let audiofiles = files.filter(f => supporttedformats.includes(f.substring(f.lastIndexOf('.') + 1)));
// console.log("cider.files2", audiofiles, audiofiles.length);
let metadatalist = []
let numid = 0;
for (var audio of audiofiles) {
try{
const metadata = await mm.parseFile(audio);
if (metadata != null){
let form = {
"id": "ciderlocal" + numid,
"type": "podcast-episodes",
"href": audio,
"attributes": {
"artwork": {
"width": 3000,
"height": 3000,
"url": metadata.common.picture != undefined ? "data:image/png;base64,"+metadata.common.picture[0].data.toString('base64')+"" : "",
},
"topics": [],
"url": "",
"subscribable": true,
"mediaKind": "audio",
"genreNames": [
""
],
// "playParams": {
// "id": "ciderlocal" + numid,
// "kind": "podcast",
// "isLibrary": true,
// "reporting": false },
"trackNumber": metadata.common.track?.no ?? 0,
"discNumber": metadata.common.disk?.no ?? 0,
"name": metadata.common.title ?? audio.substring(audio.lastIndexOf('\\') + 1),
"albumName": metadata.common.album,
"artistName": metadata.common.artist,
"copyright": metadata.common.copyright ?? "",
"assetUrl": "file:///" +audio,
"contentAdvisory": "",
"releaseDateTime": "2022-05-13T00:23:00Z",
"durationInMilliseconds": Math.floor((metadata.format.duration?? 0) * 1000),
"offers": [
{
"kind": "get",
"type": "STDQ"
}
],
"contentRating": "clean"
}
};
numid += 1;
}
if (folders == null || folders.length == null || folders.length == 0) folders = ["D:\\Music"]
console.log('folders', folders)
let files: any[] = []
for (var folder of folders) {
// get files from the Music folder
files = files.concat(await getFiles(folder))
}
//console.log("cider.files", files2);
let supporttedformats = ["mp3", "aac", "webm", "flac", "m4a", "ogg", "wav", "opus"]
let audiofiles = files.filter(f => supporttedformats.includes(f.substring(f.lastIndexOf('.') + 1)));
// console.log("cider.files2", audiofiles, audiofiles.length);
let metadatalist = []
let numid = 0;
for (var audio of audiofiles) {
try {
const metadata = await mm.parseFile(audio);
if (metadata != null) {
let form = {
"id": "ciderlocal" + numid,
"type": "podcast-episodes",
"href": audio,
"attributes": {
"artwork": {
"width": 3000,
"height": 3000,
"url": metadata.common.picture != undefined ? "data:image/png;base64," + metadata.common.picture[0].data.toString('base64') + "" : "",
},
"topics": [],
"url": "",
"subscribable": true,
"mediaKind": "audio",
"genreNames": [
""
],
// "playParams": {
// "id": "ciderlocal" + numid,
// "kind": "podcast",
// "isLibrary": true,
// "reporting": false },
"trackNumber": metadata.common.track?.no ?? 0,
"discNumber": metadata.common.disk?.no ?? 0,
"name": metadata.common.title ?? audio.substring(audio.lastIndexOf('\\') + 1),
"albumName": metadata.common.album,
"artistName": metadata.common.artist,
"copyright": metadata.common.copyright ?? "",
"assetUrl": "file:///" + audio,
"contentAdvisory": "",
"releaseDateTime": "2022-05-13T00:23:00Z",
"durationInMilliseconds": Math.floor((metadata.format.duration ?? 0) * 1000),
"offers": [
{
"kind": "get",
"type": "STDQ"
}
],
"contentRating": "clean"
}
};
numid += 1;
// let form = {"id": "/ciderlocal?" + audio,
// "type": "library-songs",
// "href": "/ciderlocal?" + audio,
@ -1272,15 +1275,16 @@ export class BrowserWindow {
// "name": metadata.common.title,
// "albumName": metadata.common.album,
// "artistName": metadata.common.artist}}
metadatalist.push(form)}
} catch (e){}
}
// console.log('metadatalist', metadatalist);
this.localSongs = metadatalist;
BrowserWindow.win.webContents.send('getUpdatedLocalList', metadatalist);
metadatalist.push(form)
}
} catch (e) { }
}
// console.log('metadatalist', metadatalist);
this.localSongs = metadatalist;
BrowserWindow.win.webContents.send('getUpdatedLocalList', metadatalist);
}
)
)
ipcMain.on('writeWAV', (event, leftpcm, rightpcm, bufferlength) => {
@ -1448,8 +1452,8 @@ export class BrowserWindow {
console.log('sc', SoundCheckTag)
BrowserWindow.win.webContents.send('SoundCheckTag', SoundCheckTag)
}).catch(err => {
console.log(err)
});
console.log(err)
});
});
@ -1501,35 +1505,38 @@ export class BrowserWindow {
/* *********************************************************************************************
* Window Events
* **********************************************************************************************/
if (process.platform === "win32") {
let WND_STATE = {
MINIMIZED: 0,
NORMAL: 1,
MAXIMIZED: 2,
FULL_SCREEN: 3,
};
let wndState = WND_STATE.NORMAL;
let WND_STATE = {
MINIMIZED: 0,
NORMAL: 1,
MAXIMIZED: 2,
FULL_SCREEN: 3,
};
let wndState = WND_STATE.NORMAL;
BrowserWindow.win.on("resize", (_: any) => {
const isMaximized = BrowserWindow.win.isMaximized();
const isMinimized = BrowserWindow.win.isMinimized();
const isFullScreen = BrowserWindow.win.isFullScreen();
const state = wndState;
if (isMinimized && state !== WND_STATE.MINIMIZED) {
wndState = WND_STATE.MINIMIZED;
BrowserWindow.win.webContents.send('window-state-changed', 'minimized');
} else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) {
wndState = WND_STATE.FULL_SCREEN;
BrowserWindow.win.webContents.send('window-state-changed', 'fullscreen')
} else if (isMaximized && state !== WND_STATE.MAXIMIZED) {
wndState = WND_STATE.MAXIMIZED;
BrowserWindow.win.webContents.send('window-state-changed', 'maximized')
BrowserWindow.win.webContents.executeJavaScript(`app.chrome.maximized = true`);
} else if (state !== WND_STATE.NORMAL) {
wndState = WND_STATE.NORMAL;
BrowserWindow.win.webContents.send('window-state-changed', 'normal')
BrowserWindow.win.webContents.executeJavaScript(
`app.chrome.maximized = false`
);
}
});
BrowserWindow.win.on("resize", (_: any) => {
const isMaximized = BrowserWindow.win.isMaximized();
const isMinimized = BrowserWindow.win.isMinimized();
const isFullScreen = BrowserWindow.win.isFullScreen();
const state = wndState;
if (isMinimized && state !== WND_STATE.MINIMIZED) {
wndState = WND_STATE.MINIMIZED;
} else if (isFullScreen && state !== WND_STATE.FULL_SCREEN) {
wndState = WND_STATE.FULL_SCREEN;
} else if (isMaximized && state !== WND_STATE.MAXIMIZED) {
wndState = WND_STATE.MAXIMIZED;
BrowserWindow.win.webContents.executeJavaScript(`app.chrome.maximized = true`);
} else if (state !== WND_STATE.NORMAL) {
wndState = WND_STATE.NORMAL;
BrowserWindow.win.webContents.executeJavaScript(
`app.chrome.maximized = false`
);
}
});
}
let isQuiting = false
@ -1572,10 +1579,10 @@ export class BrowserWindow {
// Set window Handler
BrowserWindow.win.webContents.setWindowOpenHandler((x: any) => {
if (x.url.includes("apple") || x.url.includes("localhost")) {
return {action: "allow"};
return { action: "allow" };
}
shell.openExternal(x.url).catch(console.error);
return {action: "deny"};
return { action: "deny" };
});
}
@ -1631,7 +1638,7 @@ export class BrowserWindow {
"CtlN": "Cider",
"iV": "196623"
};
let server2 = mdns.createAdvertisement(x, `${await getPort({port: 3839})}`, {
let server2 = mdns.createAdvertisement(x, `${await getPort({ port: 3839 })}`, {
name: encoded,
txt: txt_record
});

View file

@ -37,7 +37,7 @@ export default class Thumbar {
{
label: utils.getLocale(utils.getStoreValue('general.language'), 'term.settings'),
accelerator: utils.getStoreValue("general.keybindings.settings").join('+'),
click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('settings')`)
click: () => utils.getWindow().webContents.executeJavaScript(`app.openSettingsPage()`)
},
...(this.isMac ? [
{type: 'separator'},

View file

@ -2432,10 +2432,9 @@ fieldset:disabled .btn {
.nav-pills .nav-link {
background-color: transparent;
border: 0;
border-radius: 50px;
border-radius: 6px;
color: #eee;
-webkit-user-drag: none;
// transition: transform .35s var(--appleEase), background-color .35s var(--appleEase);
font-weight: 500;
margin: 0px 4px;
&:hover {
@ -2447,7 +2446,7 @@ fieldset:disabled .btn {
.nav-pills .show > .nav-link {
color: #fff;
background-color: var(--selected);
outline:2px solid var(--keyColor);
// outline:2px solid var(--keyColor);
}
.nav-fill > .nav-link,

View file

@ -2168,107 +2168,116 @@ input[type=checkbox][switch]:checked:active::before {
}
// fancy pills
.nav-pills {
position: relative;
.nav-link {
transition: transform .3s var(--appleEase);
.fancy-pills {
.nav-pills {
position: relative;
&:after {
--dist: 1px;
content: "";
position: absolute;
top: var(--dist);
bottom: var(--dist);
left: var(--dist);
right: var(--dist);
// width : 100%;
// height : 100%;
.nav-link {
transition: transform .3s var(--appleEase);
position: relative;
background-color: transparent;
border: 0;
border-radius: 50px;
z-index: -1;
opacity: 0;
transition: background-color .5s var(--appleEase), opacity 0.25s var(--appleEase), border-radius .32s var(--appleEase);
}
&:hover {
outline: none;
transform: scale(1.1);
// background: #eee;
background: transparent;
color: #333;
&:after {
opacity: 1;
background-color: #eee;
transition: background-color .25s var(--appleEase),
border-radius .25s var(--appleEase),
color .0s var(--appleEase),
opacity 0.0s var(--appleEase);
}
}
&.active {
outline: none;
transform: scale(1.1);
// background: #eee;
background: transparent;
color: #333;
font-weight: 600;
&:after {
opacity: 1;
background-color: #eee;
}
}
}
&:hover {
.nav-link.active {
outline: none;
transform: scale(1.0);
background: transparent;
color: #eee;
transform: scale(1.0);
-webkit-user-drag: none;
font-weight: 500;
margin: 0px 4px;
&:after {
background: rgb(200 200 200 / 15%);
opacity: 1;
transition: color 0s;
// border-radius: 5px;
--dist: 4px;
--dist: 1px;
content: "";
position: absolute;
top: var(--dist);
bottom: var(--dist);
left: var(--dist);
right: var(--dist);
// width : 100%;
// height : 100%;
background-color: transparent;
border-radius: 50px;
z-index: -1;
opacity: 0;
transition: background-color .5s var(--appleEase), opacity 0.25s var(--appleEase), border-radius .32s var(--appleEase);
}
&:hover {
outline: none;
transform: scale(1.1);
z-index: 1;
// background: #eee;
background: transparent;
color: #333;
&:after {
background: #eee;
border-radius: inherit;
--dist: 1px;
opacity: 1;
background-color: #eee;
transition: background-color .25s var(--appleEase),
border-radius .25s var(--appleEase),
color .0s var(--appleEase),
opacity 0.0s var(--appleEase);
}
}
&.active {
outline: none;
transform: scale(1.1);
// background: #eee;
background: transparent;
color: #333;
font-weight: 600;
&:after {
opacity: 1;
background-color: #eee;
}
}
}
&:hover {
.nav-link.active {
outline: none;
transform: scale(1.0);
background: transparent;
color: #eee;
transform: scale(1.0);
&:after {
background: rgb(200 200 200 / 15%);
opacity: 1;
transition: color 0s;
// border-radius: 5px;
--dist: 4px;
}
&:hover {
transform: scale(1.1);
z-index: 1;
color: #333;
&:after {
background: #eee;
border-radius: inherit;
--dist: 1px;
}
}
}
}
}
&:after {
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background: rgb(200 200 200 / 10%);
border-radius: 50px;
z-index: 0;
pointer-events: none;
&:after {
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background: rgb(200 200 200 / 10%);
border-radius: 50px;
z-index: 0;
pointer-events: none;
}
}
}

View file

@ -6,6 +6,7 @@ body[platform="darwin"] {
&.notransparency::before {
display: none;
}
#app {
&.simplebg {
background: transparent;
@ -33,6 +34,16 @@ body[platform="darwin"] {
background-color: var(--macOSChromeColor);
}
}
// &::after {
// position: fixed;
// top:0;left:0;right:0;bottom:0;
// box-shadow: inset 0px 0px .5px 1px rgb(200 200 200 / 40%);
// border-radius: 10px;
// content: " ";
// z-index: 999999;
// pointer-events: none;
// }
}
#app-main {
@ -43,7 +54,12 @@ body[platform="darwin"] {
}
#app-content {
background-color: var(--baseColor);
background-color: #1e1e1e6b;
}
}
#apple-music-video-player-controls #player-exit {
margin-top: 18px;
left: 70px;
}
}

File diff suppressed because it is too large Load diff

View file

@ -168,6 +168,7 @@ const app = new Vue({
location: "",
info: {}
},
windowState: "normal",
desiredPageTransition: "wpfade_transform",
hideUserInfo: ipcRenderer.sendSync("is-dev") || false,
artworkReady: false,
@ -217,6 +218,7 @@ const app = new Vue({
castMenu: false,
moreInfo: false,
airplayPW: false,
settings: false
},
socialBadges: {
badgeMap: {},
@ -853,6 +855,10 @@ const app = new Vue({
this.library.localsongs = data;
})
ipcRenderer.on('window-state-changed', (event, data) => {
this.chrome.windowState = data
})
ipcRenderer.on('SoundCheckTag', (event, tag) => {
// let replaygain = self.parseSCTagToRG(tag)
try {
@ -926,10 +932,10 @@ const app = new Vue({
app.mk.nowPlayingItem.attributes.name = e.title
app.mk.nowPlayingItem.attributes.artistName = e.performer
app.mk.nowPlayingItem.attributes.albumName = e.album
if(e.links[1]) {
if (e.links[1]) {
app.currentArtUrl = e.links[1].url
app.currentArtUrlRaw = e.links[1].url
}else{
} else {
app.currentArtUrl = e.links[0].url
app.currentArtUrlRaw = e.links[0].url
}
@ -942,7 +948,7 @@ const app = new Vue({
self.$refs.queue.updateQueue();
}
this.currentSongInfo = a
if (this.currentSongInfo === null || this.currentSongInfo === undefined) {return;} // EVIL EMPTY OBJECTS BE GONE
if (this.currentSongInfo === null || this.currentSongInfo === undefined) { return; } // EVIL EMPTY OBJECTS BE GONE
console.debug("songinfo: " + JSON.stringify(a))
if (app.cfg.advanced.AudioContext) {
@ -957,7 +963,7 @@ const app = new Vue({
} catch (e) {
localStorage.setItem("playingBitrate", "256")
}
if (!app.cfg.audio.normalization) {CiderAudio.hierarchical_loading();}
if (!app.cfg.audio.normalization) { CiderAudio.hierarchical_loading(); }
}
@ -974,16 +980,16 @@ const app = new Vue({
previewURL = response.data.data[0].attributes.previews[0].url
if (previewURL)
console.debug("[Cider][MaikiwiSoundCheck] previewURL response.data.data[0].attributes.previews[0].url: " + previewURL)
ipcRenderer.send('getPreviewURL', previewURL)
ipcRenderer.send('getPreviewURL', previewURL)
})
} else {
if (previewURL)
console.debug("[Cider][MaikiwiSoundCheck] previewURL in app.mk.nowPlayingItem.previewURL: " + previewURL)
ipcRenderer.send('getPreviewURL', previewURL)
ipcRenderer.send('getPreviewURL', previewURL)
}
} catch (e) {
if (e instanceof TypeError === false) {console.debug("[Cider][MaikiwiSoundCheck] normalizer function err: " + e)}
if (e instanceof TypeError === false) { console.debug("[Cider][MaikiwiSoundCheck] normalizer function err: " + e) }
}
}
@ -1298,7 +1304,7 @@ const app = new Vue({
results.forEach(result => {
try {
if (result.relationships?.catalog?.data[0]?.attributes?.inFavorites) {
if(!favs.includes(result.relationships?.catalog?.data[0].id)) {
if (!favs.includes(result.relationships?.catalog?.data[0].id)) {
favs.push(result.relationships?.catalog?.data[0].id)
}
}
@ -1311,8 +1317,8 @@ const app = new Vue({
return favs
},
async setArtistFavorite(id, val = true) {
if(val) {
if(!app.cfg.home.followedArtists.includes(id)) {
if (val) {
if (!app.cfg.home.followedArtists.includes(id)) {
app.cfg.home.followedArtists.push(id)
}
await app.mk.api.v3.music(`/v1/me/favorites`, {
@ -1325,8 +1331,8 @@ const app = new Vue({
method: "POST"
}
})
}else{
if(app.cfg.home.followedArtists.includes(id)) {
} else {
if (app.cfg.home.followedArtists.includes(id)) {
app.cfg.home.followedArtists.splice(app.cfg.home.followedArtists.indexOf(id), 1)
}
await app.mk.api.v3.music(`/v1/me/favorites`, {
@ -1458,7 +1464,7 @@ const app = new Vue({
},
{
name: app.getLz("action.refresh"),
action: ()=>{
action: () => {
this.refreshPlaylists()
}
}
@ -2016,8 +2022,8 @@ const app = new Vue({
async getNowPlayingItemDetailed(target) {
let nowPlayingItem = JSON.parse(JSON.stringify(this.mk.nowPlayingItem))
if(nowPlayingItem.type === "radioStation" && app.mk.nowPlayingItem.id !== -1) {
nowPlayingItem.playParams = {kind: "songs"}
if (nowPlayingItem.type === "radioStation" && app.mk.nowPlayingItem.id !== -1) {
nowPlayingItem.playParams = { kind: "songs" }
nowPlayingItem.attributes.playParams.catalogId = app.mk.nowPlayingItem.id
nowPlayingItem.attributes.playParams.id = app.mk.nowPlayingItem.id
nowPlayingItem.id = app.mk.nowPlayingItem.id
@ -4329,7 +4335,7 @@ const app = new Vue({
"name": app.getLz('settings.option.audio.audioLab'),
"hidden": true,
"action": function () {
app.appRoute('audiolabs')
app.openSettingsPage('audiolabs')
}
},
]
@ -4355,7 +4361,7 @@ const app = new Vue({
try {
// if its a radio station, then change the attributes to match a song
const nowPlayingItem = JSON.parse(JSON.stringify(this.mk.nowPlayingItem))
if(nowPlayingItem.type == "radioStation" && app.mk.nowPlayingItem.id != -1) {
if (nowPlayingItem.type == "radioStation" && app.mk.nowPlayingItem.id != -1) {
nowPlayingItem.type = "song"
nowPlayingItem.attributes.playParams.catalogId = app.mk.nowPlayingItem.id
nowPlayingItem.attributes.playParams.id = app.mk.nowPlayingItem.id
@ -4388,6 +4394,32 @@ const app = new Vue({
}
},
openSettingsPage(page) {
switch (page) {
case "general":
this.$store.state.pageState.settings.currentTabIndex = 0
break;
case "audio":
this.$store.state.pageState.settings.currentTabIndex = 1
break;
case "audiolabs":
this.$store.state.pageState.settings.currentTabIndex = 2
break;
case "visual":
this.$store.state.pageState.settings.currentTabIndex = 3
break;
case "lyrics":
this.$store.state.pageState.settings.currentTabIndex = 4
break;
case "connectivity":
this.$store.state.pageState.settings.currentTabIndex = 5
break;
case "advanced":
this.$store.state.pageState.settings.currentTabIndex = 6
break;
}
app.modals.settings = true
},
fullscreen(flag) {
this.fullscreenState = flag;
if (flag) {
@ -4615,7 +4647,7 @@ const app = new Vue({
label: app.getLz('dialog.ok'),
},
cancel: {
label: app.getLz('dialog.cancel'),
label: app.getLz('dialog.cancel'),
},
},
callback: function (result) {

View file

@ -12,6 +12,10 @@ const store = new Vuex.Store({
nextUrl: null,
items: [],
size: "normal"
},
settings: {
currentTabIndex: 0,
fullscreen: false
}
},
artwork: {

View file

@ -15,6 +15,7 @@
:root {
--appleEase: cubic-bezier(0.42, 0, 0.58, 1);
--borderColor: rgb(200 200 200 / 16%);
--mediaItemShadow: inset 0px 0px 0px 1px rgb(200 200 200 / 16%);
--mediaItemShadow-Shadow: 0 8px 40px rgb(0 0 0 / 0.55);
--mediaItemShadow-ShadowSubtle: 0 4px 14px rgb(0 0 0 / 10%);
@ -50,6 +51,7 @@
--textColor: #eee;
--replayGradient: linear-gradient(45deg, hsl(248deg 58% 29%), hsl(13deg 41% 42%));
--glassFilter: blur(16px) saturate(180%);
--glassFilterHeavy: blur(64px) saturate(280%);
--sidebarWidth: 260px;
}
@ -3247,7 +3249,10 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
z-index: 100001;
float: left;
width: 100%;
margin: 10px;
margin-left: 10px;
margin-right: 10px;
margin-top: 10px;
margin-bottom: 10px;
cursor: pointer;
}

View file

@ -105,7 +105,7 @@
$root.getLz("term.about")
}}</span>
</button>
<button class="usermenu-item" @click="appRoute('settings')">
<button class="usermenu-item" @click="modals.settings = true">
<span class="usermenu-item-icon">
<%- include("../svg/settings.svg") %>
</span>

View file

@ -31,6 +31,9 @@
<transition name="modal">
<plugin-menu v-if="modals.pluginMenu"></plugin-menu>
</transition>
<transition name="modal">
<settings-window v-if="modals.settings"></settings-window>
</transition>
<transition name="modal">
<eq-view v-if="modals.equalizer"></eq-view>
</transition>

View file

@ -1,10 +1,10 @@
<script type="text/x-template" id="audio-controls">
<div class="modal-fullscreen addtoplaylist-panel" @click.self="app.resetState()"
@contextmenu.self="app.resetState()">
<div class="modal-fullscreen addtoplaylist-panel" @click.self="app.modals.audioControls = false"
@contextmenu.self="app.modals.audioControls = false">
<div class="modal-window">
<div class="modal-header">
<div class="modal-title">{{app.getLz('term.audioControls')}}</div>
<button class="close-btn" @click="app.resetState()" :aria-label="app.getLz('action.close')"></button>
<button class="close-btn" @click="app.modals.audioControls = false" :aria-label="app.getLz('action.close')"></button>
</div>
<div class="modal-content">
<div class="md-option-line">

View file

@ -1,10 +1,10 @@
<script type="text/x-template" id="audio-playbackrate">
<div class="modal-fullscreen addtoplaylist-panel" @click.self="app.resetState()"
@contextmenu.self="app.resetState()">
<div class="modal-fullscreen addtoplaylist-panel" @click.self="app.modals.audioPlaybackRate = false"
@contextmenu.self="app.modals.audioPlaybackRate = false">
<div class="modal-window">
<div class="modal-header">
<div class="modal-title">{{app.getLz('settings.option.audio.changePlaybackRate')}}</div>
<button class="close-btn" @click="app.resetState()" :aria-label="app.getLz('action.close')"></button>
<button class="close-btn" @click="app.modals.audioPlaybackRate = false" :aria-label="app.getLz('action.close')"></button>
</div>
<div class="modal-content">
<div class="md-option-line">

View file

@ -1,10 +1,10 @@
<script type="text/x-template" id="audio-settings">
<template>
<div class="modal-fullscreen addtoplaylist-panel" @click.self="app.resetState()" @contextmenu.self="app.resetState()">
<div class="modal-fullscreen addtoplaylist-panel" @click.self="app.modals.audioSettings = false" @contextmenu.self="app.modals.audioSettings = false">
<div class="modal-window">
<div class="modal-header">
<div class="modal-title">{{app.getLz('term.audioSettings')}}</div>
<button class="close-btn" @click="app.resetState()" :aria-label="app.getLz('action.close')"></button>
<button class="close-btn" @click="app.modals.audioSettings = false" :aria-label="app.getLz('action.close')"></button>
</div>
<div class="modal-content">
<button class="playlist-item"
@ -23,7 +23,7 @@
<div class="name">{{app.getLz('settings.option.audio.changePlaybackRate')}}</div>
</button>
<button class="playlist-item"
@click="$root.appRoute('audiolabs')" style="width:100%;">
@click="$root.openSettingsPage('audiolabs')" style="width:100%;">
<div class="icon"><%- include("../svg/speaker.svg") %></div>
<div class="name">{{app.getLz('settings.option.audio.audioLab')}}</div>
</button>

View file

@ -291,7 +291,7 @@
})
},
close() {
app.resetState()
app.modals.equalizer = false
},
changeVibrantBass() {
if (app.cfg.audio.equalizer.vibrantBass !== '0') {

View file

@ -67,7 +67,7 @@
</template>
</div>
</div>
<div class="heart-icon" v-if="!(app.mk.isPlaying && (((app.mk.nowPlayingItem._songId ?? (app.mk.nowPlayingItem.songId ?? app.mk.nowPlayingItem.id )) == itemId) || (app.mk.nowPlayingItem.id == item.id)))">
<div class="heart-icon">
<!-- <div class="heart-unfilled" v-if="isLoved == false" :style="{'--url': 'url(./assets/feather/heart.svg)'}" /> -->
<div class="heart-filled" v-if="isLoved == true" :style="{'--url': 'url(./assets/feather/heart-fill.svg)'}" />
</div>

File diff suppressed because it is too large Load diff

View file

@ -71,7 +71,9 @@
<div id="LOADER">
<%- include("../assets/cider-round.svg") %>
</div>
<div id="app" :class="getAppClasses()" :style="getAppStyle()" :library-visible="(chrome.sidebarCollapsed ? 0 : 1)" :window-style="cfg.visual.directives.windowLayout">
<div id="app" :class="getAppClasses()"
:window-state="chrome.windowState"
:style="getAppStyle()" :library-visible="(chrome.sidebarCollapsed ? 0 : 1)" :window-style="cfg.visual.directives.windowLayout">
<transition name="fsModeSwitch">
<div id="app-main" v-show="appMode == 'player'">
<%- include('app/chrome-top'); %>

View file

@ -1,5 +1,5 @@
<script type="text/x-template" id="audiolabs-page">
<div class="content-inner audiolabs-page ">
<div class="audiolabs-page">
<div class="md-option-container">
<div class="settings-option-body">
<div class="md-option-line">
@ -120,7 +120,7 @@
</select>
</div>
</div>
<div style="opacity: 0.5; pointer-events: none">
<div style="opacity: 0.5; pointer-events: none" v-if="false">
<div class="md-option-header">
<span>{{$root.getLz('settings.header.unfinished')}}</span>
</div>

View file

@ -178,7 +178,7 @@
</div>
</div>
<div class="playlist-body scrollbody">
<b-tabs pills class="track-pills pilldim" align="center" content-class="mt-3" :nav-wrapper-class="navClass(data)">
<b-tabs pills class="track-pills pilldim fancy-pills" align="center" content-class="mt-3" :nav-wrapper-class="navClass(data)">
<b-tab :title="$root.getLz('term.tracks')">
<div @wheel="minClass(true)" @scroll="minClass(true)">
<div class="">