diff --git a/src/i18n/ja_JP.json b/src/i18n/ja_JP.json index a8d0eafa..60531a5b 100644 --- a/src/i18n/ja_JP.json +++ b/src/i18n/ja_JP.json @@ -1,283 +1,486 @@ -{ - "i18n.languageName": "日本語", - "i18n.languageNameEnglish": "Japanese", - "i18n.category": "main", - "i18n.authors": "@maikirakiwi", - "app.name": "Cider", - "date.format": "${y}年${m}月${d}日", - "dialog.cancel": "キャンセル", - "dialog.ok": "OK", - "notification.updatingLibrarySongs": "ライブラリの更新中...", - "notification.updatingLibraryAlbums": "ライブラリの更新中...", - "notification.updatingLibraryArtists": "ライブラリの更新中...", - "term.appleMusic": "Apple Music", - "term.applePodcasts": "Apple Podcasts", - "term.itunes": "iTunes", - "term.github": "GitHub", - "term.discord": "Discord", - "term.learnMore": "詳しい情報", - "term.accountSettings": "アカウント設定", - "term.logout": "サインアウト", - "term.login": "サインイン", - "term.about": "Ciderについて", - "term.privateSession": "プライベートセッション", - "term.queue": "次はこちら", - "term.search": "検索", - "term.library": "ライブラリ", - "term.listenNow": "今すぐ聴く", - "term.browse": "見つける", - "term.radio": "ラジオ", - "term.recentlyAdded": "最近追加した項目", - "term.songs": "曲", - "term.albums": "アルバム", - "term.artists": "アーティスト", - "term.podcasts": "Podcast", - "term.playlists": "プレイリスト", - "term.playlist": "プレイリスト", - "term.play": "再生", - "term.pause": "停止", - "term.previous": "戻る", - "term.next": "次へ", - "term.shuffle": "シャッフル", - "term.repeat": "リピート", - "term.volume": "音量", - "term.mute": "ミュート", - "term.unmute": "ミュート解除", - "term.share": "共有", - "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.sortBy.dateAdded": "追加日", - "term.sortOrder": "並べ替え", - "term.sortOrder.ascending": "昇順", - "term.sortOrder.descending": "降順", - "term.viewAs": "表示", - "term.viewAs.coverArt": "カバーアート", - "term.viewAs.list": "リスト", - "term.size": "サイズ", - "term.size.normal": "普通", - "term.size.compact": "コンパクト", - "term.enable": "ON", - "term.disable": "OFF", - "term.enabled": "ON", - "term.disabled": "OFF", - "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.spacializedAudioSetting": "オーディオ空間化設定", - "term.clearAll": "消去", - "term.recentStations": "最近の再生", - "term.language": "言語", - "term.noLyrics": "ローディング。。 / 歌詞が見つからない / 器楽曲.", - "term.copyright": "著作権", - "term.rightsReserved": "All Rights Reserved.", - "term.sponsor": "スポンサーになりましょう", - "term.ciderTeam": "Cider チーム", - "term.developer": "開発者", - "term.socialTeam": "ソーシャル チーム", - "term.contributors": "貢献者", - "term.equalizer": "イコライザー", - "term.reset": "リセット", - "term.track": { - "one": "曲", - "other": "曲" - }, - "term.tracks": "曲", - "term.videos": "ビデオ", - "term.menu": "メニュー", - "term.check": "確認", - "term.aboutArtist": "{{artistName}}について", - "term.version": "バージョン", - "home.title": "ホーム", - "home.recentlyPlayed": "最近の再生", - "home.recentlyAdded": "最近追加した項目", - "home.artistsFeed": "アーティストのフィード", - "home.artistsFeed.noArtist": "自分の好きなアーティストをフォローしましょう・", - "home.madeForYou": "あなたにおすすめ", - "home.friendsListeningTo": "友達が聴いている", - "home.followedArtists": "フォローしているアーティスト", - "error.appleMusicSubRequired": "Apple Musicのサブスクリプションが必要です。", - "error.connectionError": "Apple Musicに接続できません。", - "error.noResults": "見つかりませんでした", - "error.noResults.description": "もう一度お試しください。", - "podcast.followOnCider": "Ciderでフォロー", - "podcast.followedOnCider": "フォロー中", - "podcast.subscribeOnItunes": "iTunesで購読", - "podcast.subscribedOnItunes": "購読中", - "podcast.itunesStore": "iTunes Store", - "podcast.episodes": "番組", - "podcast.playEpisode": "再生", - "podcast.website": "Podcast ウェブ", - "action.addToLibrary": "ライブラリに追加", - "action.addToLibrary.success": "ライブラリに追加されました", - "action.addToLibrary.error": "ライブラリへの追加に失敗しました", - "action.removeFromLibrary": "ライブラリから削除", - "action.removeFromLibrary.success": "ライブラリから削除されました", - "action.addToQueue": "「次はこちら」に項目を追加", - "action.addToQueue.success": "「次はこちら」に項目を追加されました", - "action.addToQueue.error": "操作を完了できませんでした", - "action.addToPlaylist": "プレイリストに追加", - "action.removeFromPlaylist": "プレイリストから削除", - "action.addToFavorites": "ラブに追加", - "action.removeFromQueue": "「次はこちら」から項目を削除", - "action.removeFromQueue.success": "「次はこちら」から項目を削除されました", - "action.removeFromQueue.error": "操作を完了できませんでした", - "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": "WEBリモコンQRコードを表示", - "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.update": "アップデート", - "action.copy": "コピー", - "action.newpreset": "ニュープリセット", - "action.deletepreset": "プリセットを削除", - "settings.header.general": "一般", - "settings.header.general.description": "Ciderの一般設定", - "settings.option.general.language.main": "メイン", - "settings.option.general.language.fun": "荒らし", - "settings.option.general.language.unsorted": "未分類", - "settings.option.general.updateCider": "Cider 更新", - "settings.header.audio": "オーディオ", - "settings.header.audio.description": "Ciderのオーディオ設定", - "settings.option.audio.volumeStep": "音量調整のステップ", - "settings.option.audio.maxVolume": "最大音量", - "settings.option.audio.quality": "音質", - "settings.header.audio.quality.hireslossless": "ハイレゾロスレス", - "settings.header.audio.quality.hireslossless.description": "(最大解像度 24 ビット/192 kHz)", - "settings.header.audio.quality.lossless": "ロスレス", - "settings.header.audio.quality.lossless.description": "(最大解像度 24 ビット/48 kHz)", - "settings.header.audio.quality.enhanced": "エンハンスド", - "settings.header.audio.quality.high": "高品質", - "settings.header.audio.quality.standard": "高効率", - "settings.header.audio.quality.auto": "自動", - "settings.option.audio.seamlessTransition": "曲間なしで再生", - "settings.option.audio.enableAdvancedFunctionality": "先進的な機能", - "settings.option.audio.enableAdvancedFunctionality.description": "AudioContext 機能を有効にすると、オーディオノーマライズ、空間オーディオ、イコライザーなどの機能を使用できますが、音が途切れるかもしれません。", - "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", - - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAPの強さ", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Changes the strength of the processing done to the audio. (Aggressive may yield undesirable results)", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "標準", - "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "高", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "オーディオノーマライズ", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "さまざまな曲の音量を均一にし、より整った音を楽しめるようにする機能です。", - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "オーディオ空間化", - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "オーディオを空間に分散させる機能です。 (ドルビーアトモスではありません)", - "settings.header.visual": "ビジュアル", - "settings.header.visual.description": "Ciderのビジュアル設定", - "settings.option.visual.windowBackgroundStyle": "アプリウインドウの背景スタイル", - "settings.header.visual.windowBackgroundStyle.none": "なし", - "settings.header.visual.windowBackgroundStyle.artwork": "アートワーク", - "settings.option.visual.animatedArtwork": "アニメーションアートワーク", - "settings.header.visual.animatedArtwork.always": "常に表示", - "settings.header.visual.animatedArtwork.limited": "アーティストページのみ表示", - "settings.header.visual.animatedArtwork.disable": "オフ", - "settings.option.visual.animatedArtworkQuality": "アニメーションアートワークの品質", - "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": "アプリウィンドウの背景をアニメーション化", - "settings.option.visual.hardwareAcceleration": "ハードウェア アクセラレーション", - "settings.option.visual.hardwareAcceleration.description": "アプリを再起動する必要があります", - "settings.header.visual.hardwareAcceleration.default": "既定", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", - "settings.header.visual.theme": "テーマ", - "settings.option.visual.theme.default": "Cider", - "settings.option.visual.theme.dark": "ダーク", - "settings.option.visual.showPersonalInfo": "プロフィールを表示", - "settings.header.lyrics": "歌詞", - "settings.header.lyrics.description": "歌詞の表示設定", - "settings.option.lyrics.enableMusixmatch": "Musixmatchで歌詞を表示する", - "settings.option.lyrics.enableMusixmatchKaraoke": "カラオケモードを有効にする (Musixmatchのみ)", - "settings.option.lyrics.musixmatchPreferredLanguage": "歌詞の優先言語", - "settings.option.lyrics.enableYoutubeLyrics": "YouTubeの歌詞をミュージックビデオに使用する", - "settings.header.connectivity": "アプリと連携", - "settings.header.connectivity.description": "Ciderの連携設定", - "settings.option.connectivity.discordRPC": "Discord Rich Presence", - "settings.header.connectivity.discordRPC.cider": "'Cider' を表示する", - "settings.header.connectivity.discordRPC.appleMusic": "'Apple Music' を表示する", - "settings.option.connectivity.discordRPC.clearOnPause": "一時停止時にDiscord Rich Presenceをクリアする", - "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", - "settings.option.connectivity.lastfmScrobble.delay": "LastFM Scrobble Delay (%)", - "settings.option.connectivity.lastfmScrobble.nowPlaying": "Enable LastFM Now Playing", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remove featuring artists from song title (LastFM)", - "settings.header.experimental": "試験的な機能", - "settings.header.experimental.description": "開発中の実験的な機能は不完全で不安定である可能性があります", - "settings.option.experimental.compactUI": "コンパクトインターフェース", - "settings.option.window.close_button_hide": "「閉じる」ボタンでアプリを隠します", - "settings.option.experimental.copy_log": "ログをコピーする", - "settings.option.experimental.inline_playlists": "プレイリストをインラインで表示", - "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.header.unfinished": "未完成", - "remote.web.title": "Cider リモート", - "remote.web.description": "QRコードを使用して、Ciderとスマートフォンをペアリングする", - "about.thanks": "Cider Collective とご協力いただいた貢献者様に感謝申し上げます。" -} \ No newline at end of file +{ + "i18n.languageName": "日本語", + "i18n.languageNameEnglish": "Japanese", + "i18n.category": "main", + "i18n.authors": "@maikirakiwi @aduki_0628", + "app.name": "Cider", + "date.format": "${y}年${m}月${d}日", + "dialog.cancel": "キャンセル", + "dialog.ok": "完了", + "notification.updatingLibrarySongs": "ライブラリの更新中...", + "notification.updatingLibraryAlbums": "ライブラリの更新中...", + "notification.updatingLibraryArtists": "ライブラリの更新中...", + "term.variables": "Variables", + "term.appleInc": "Apple Inc.", + "term.appleMusic": "Apple Music", + "term.applePodcasts": "Apple Podcasts", + "term.itunes": "iTunes", + "term.github": "GitHub", + "term.discord": "Discord", + "term.learnMore": "詳しい情報", + "term.accountSettings": "アカウント設定", + "term.logout": "サインアウト", + "term.login": "サインイン", + "term.cast": "Cast", + "term.about": "Ciderについて", + "term.privateSession": "プライベートセッション", + "term.disablePrivateSession": "プライベートセッションを無効にする", + "term.queue": "次はこちら", + "term.lyrics": "歌詞", + "term.miniplayer": "MiniPlayer", + "term.history": "History", + "term.search": "検索", + "term.library": "ライブラリ", + "term.listenNow": "今すぐ聴く", + "term.browse": "見つける", + "term.radio": "ラジオ", + "term.recentlyAdded": "最近追加した項目", + "term.songs": "曲", + "term.albums": "アルバム", + "term.artists": "アーティスト", + "term.podcasts": "Podcasts", + "term.playlists": "プレイリスト", + "term.playlist": "プレイリスト", + "term.newPlaylist": "New Playlist", + "term.newPlaylistFolder": "New Playlist Folder", + "term.createNewPlaylist": "Create New Playlist", + "term.createNewPlaylistFolder": "Create New Playlist Folder", + "term.deletePlaylist": "Are you sure you want to delete this playlist?", + "term.play": "再生", + "term.pause": "停止", + "term.previous": "戻る", + "term.next": "次へ", + "term.shuffle": "シャッフル", + "term.repeat": "リピート", + "term.volume": "音量", + "term.mute": "ミュート", + "term.unmute": "ミュート解除", + "term.share": "共有", + "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.sortBy.dateAdded": "追加日", + "term.sortOrder": "並べ替え", + "term.sortOrder.ascending": "昇順", + "term.sortOrder.descending": "降順", + "term.viewAs": "表示", + "term.viewAs.coverArt": "カバーアート", + "term.viewAs.list": "リスト", + "term.size": "サイズ", + "term.size.normal": "普通", + "term.size.compact": "コンパクト", + "term.enabled": "ON", + "term.disable": "OFF", + "term.disabled": "OFF", + "term.enable": "ON", + "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.days": "日", + "term.time.day": { + "one": "日", + "other": "日" + }, + "term.time.hours": "時間", + "term.time.hour": { + "one": "時間", + "other": "時間" + }, + "term.time.minutes": "分", + "term.time.minute": { + "one": "分", + "other": "分" + }, + "term.time.seconds": "秒", + "term.time.second": { + "one": "秒", + "other": "秒" + }, + "term.fullscreenView": "全画面表示", + "term.defaultView": "ウィンドウ表示", + "term.audioSettings": "オーディオ設定", + "term.audioControls": "Volume Controls", + "term.clearAll": "消去", + "term.recentStations": "最近の再生", + "term.language": "言語", + "term.funLanguages": "Fun", + "term.noLyrics": "ローディング。。 / 歌詞が見つからない / 器楽曲.", + "term.copyright": "Copyright", + "term.rightsReserved": "All Rights Reserved.", + "term.sponsor": "スポンサーになりましょう", + "term.ciderTeam": "Cider チーム", + "term.developer": "開発者", + "term.socialTeam": "ソーシャル チーム", + "term.socials": "Socials", + "term.contributors": "貢献者", + "term.equalizer": "イコライザー", + "term.reset": "リセット", + "term.tracks": "曲", + "term.track": { + "one": "曲", + "other": "曲" + }, + "term.videos": "ビデオ", + "term.menu": "メニュー", + "term.check": "確認", + "term.aboutArtist": "{{artistName}}について", + "term.topResult": "Top Result", + "term.sharedPlaylists": "プレイリストを共有", + "term.people": "ユーサ", + "term.newpreset.name": "名前を入力", + "term.addedpreset": "Added Preset", + "term.deletepreset.warn": "Are you sure you want to delete this preset?", + "term.deletedpreset": "Removed preset", + "term.defaultPresets": "Default Presets", + "term.userPresets": "User Presets", + "term.requestError": "There was a problem with the request.", + "term.song.link.generate": "Getting song.link share URL...", + "term.musicVideos": "ミュージックビデオ", + "term.stations": "ステーション", + "term.curators": "Curators", + "term.appleCurators": "Apple Curators", + "term.radioShows": "Radio Shows", + "term.recordLabels": "Record Labels", + "term.videoExtras": "Video Extras", + "term.top": "Top", + "term.version": "バージョン", + "term.noVideos": "No videos found.", + "term.plugin": "Plug-in", + "term.pluginMenu": "Plug-in Menu", + "term.pluginMenu.none": "プラグインが見つかりませんでした", + "term.replay": "リプレイ", + "term.uniqueAlbums": "Unique Albums", + "term.uniqueArtists": "Unique Artists", + "term.uniqueSongs": "Unique Songs", + "term.topArtists": "Top Artists", + "term.listenedTo": "Listened to:", + "term.times": "times", + "term.topAlbums": "Top Albums", + "term.plays": "Plays", + "term.topGenres": "Top Genres", + "term.confirmLogout": "本当にログアウトしますか?", + "term.creditDesignedBy": "${authorUsername}によってデザインされました", + "term.discNumber": "Disc ${discNumber}", + "home.title": "ホーム", + "home.recentlyPlayed": "最近の再生", + "home.recentlyAdded": "最近追加した項目", + "home.artistsFeed": "アーティストのフィード", + "home.artistsFeed.noArtist": "アーティストをフォローすると最新情報を手に入れられます", + "home.madeForYou": "あなたにおすすめ", + "home.friendsListeningTo": "友達が聴いている", + "home.followedArtists": "フォローしているアーティスト", + "error.appleMusicSubRequired": "Apple Musicのサブスクリプションが必要です。", + "error.connectionError": "Apple Musicに接続できません。", + "error.noResults": "見つかりませんでした", + "error.noResults.description": "もう一度お試しください。", + "podcast.followOnCider": "Ciderでフォロー", + "podcast.followedOnCider": "フォロー中", + "podcast.subscribeOnItunes": "iTunesで購読", + "podcast.subscribedOnItunes": "Subscribed On iTunes", + "podcast.itunesStore": "iTunes Store", + "podcast.episodes": "番組", + "podcast.playEpisode": "再生", + "podcast.website": "Podcastウェブ", + "action.edit": "Edit", + "action.done": "Done", + "action.editTracklist": "Edit Tracklist", + "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": "Create a New Playlist", + "action.addToPlaylist": "Add to Playlist", + "action.removeFromPlaylist": "Remove from Playlist", + "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": "WEBリモコンQRコードを表示", + "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": "Show Cider", + "action.update": "アップデート", + "action.install": "インストール", + "action.copy": "コピー", + "action.newpreset": "新しいプリセット", + "action.deletepreset": "プリセットを削除", + "action.open": "開く", + "action.relaunch.confirm": "Ciderを再開しますか?", + "action.cast.chromecast": "Chromecast", + "action.cast.todevices": "Cast to Devices", + "action.cast.stop": "Stop casting to all devices", + "action.cast.airplay": "AirPlay", + "action.cast.airplay.underdevelopment": "AirPlay is still under development", + "action.cast.scan": "Scan", + "action.cast.scanning": "Scanning...", + "action.createNew": "Create New...", + "action.openArtworkInBrowser": "Open artwork in browser", + "settings.header.general": "一般", + "settings.header.general.description": "Ciderの一般設定", + "settings.option.general.language": "言語", + "settings.option.general.resumebehavior": "Resume behavior", + "settings.option.general.resumebehavior.description": "Resume behavior affects how Cider will resume your session when you return to the app.", + "settings.option.general.resumebehavior.locally": "Locally", + "settings.option.general.resumebehavior.locally.description": "このコンピューターでの最終セッションを復元", + "settings.option.general.resumebehavior.history": "History", + "settings.option.general.resumebehavior.history.description": "Apple Musicの履歴から曲を復元", + "settings.option.general.resumetabs" : "Open Tab on Launch", + "settings.option.general.resumetabs.description" : "You can choose what tab you want to open when you launch Cider.", + "settings.option.general.resumetabs.dynamic" : "Dynamic", + "settings.option.general.resumetabs.dynamic.description" : "Cider will open the tab that you last used.", + "settings.option.general.language.main": "メイン", + "settings.option.general.language.fun": "荒らし", + "settings.option.general.language.unsorted": "未分類", + "settings.option.general.updateCider": "アップデート", + "settings.option.general.updateCider.branch": "Cider Update Branch", + "settings.option.general.updateCider.branch.description": "Select the branch to update Cider to", + "settings.option.general.updateCider.branch.main": "Stable", + "settings.option.general.updateCider.branch.develop": "Development", + "settings.option.general.customizeSidebar": "Customize Sidebar Items", + "settings.option.general.customizeSidebar.customize": "Customize", + "settings.option.general.keybindings": "Keybindings", + "settings.notyf.general.keybindings.update.success": "Keybind updated successfully", + "settings.prompt.general.keybindings.update.success": "Keybind updated successfully. Press OK to relaunch Cider", + "settings.option.general.keybindings.open": "Open", + "settings.description.search": "Search", + "settings.description.albums": "Library Albums", + "settings.description.artists": "Library Artists", + "settings.description.browse": "Browse", + "settings.description.private": "Toggle Private Session", + "settings.description.remote": "Web Remote", + "settings.description.audio": "Audio Settings", + "settings.description.plugins": "Plugins Menu", + "settings.description.cast": "Cast to Devices", + "settings.description.settings": "Settings", + "settings.description.developer": "Developer Tools", + "settings.notyf.updateCider.update-not-available": "現在最新版です", + "settings.notyf.updateCider.update-downloaded": "アップデートは再起動後に適用されます", + "settings.notyf.updateCider.update-error": "アップデートに失敗しました", + "settings.notyf.updateCider.update-timeout": "アップデートはタイムアウトしました", + "settings.header.audio": "オーディオ", + "settings.header.audio.description": "Ciderのオーディオ設定", + "settings.option.audio.volumeStep": "音量調整のステップ", + "settings.option.audio.maxVolume": "最大音量", + "settings.option.audio.changePlaybackRate": "Change Playback Rate", + "settings.option.audio.playbackRate": "Playback Rate", + "settings.option.audio.playbackRate.change": "Change", + "settings.option.audio.quality": "音質", + "settings.header.audio.quality.hireslossless": "ハイレゾロスレス", + "settings.header.audio.quality.hireslossless.description": "(最大解像度 24 ビット/192 kHz)", + "settings.header.audio.quality.lossless": "ロスレス", + "settings.header.audio.quality.lossless.description": "(最大解像度 24 ビット/48 kHz)", + "settings.header.audio.quality.enhanced": "エンハンスド", + "settings.header.audio.quality.high": "高品質", + "settings.header.audio.quality.standard": "高効率", + "settings.option.audio.seamlessTransition": "曲間なしで再生", + "settings.option.audio.enableAdvancedFunctionality": "先進的な機能", + "settings.option.audio.enableAdvancedFunctionality.description": "AudioContextを有効にすると、オーディオノーマライズ、空間オーディオ、イコライザーなどの機能を使用できますが、音が途切れるかもしれません。", + "settings.warn.audio.enableAdvancedFunctionality.lowcores": "Cider thinks your PC can't handle these features. Are you sure you want to continue?", + "settings.option.audio.audioLab": "Cider Audio Lab", + "settings.option.audio.audioLab.description": "An assortment of in-house developed audio effects for Cider.", + "settings.warn.audioLab.withoutAF": "AudioContext (Advanced Functionality) is required to enable Cider Audio Laboratory.", + "settings.option.audio.enableAdvancedFunctionality.analogWarmth": "Analog Warmth", + "settings.option.audio.enableAdvancedFunctionality.analogWarmth.description": "Korg Nutube 6P1をモデルにしたオーディオをシミュレートします", + "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity": "Analog Warmth intensity", + "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.description": "Changes the intensity of the Analog Warmth Module processing.", + "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.smooth": "Smooth", + "settings.option.audio.enableAdvancedFunctionality.analogWarmthIntensity.warm": "Warm", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer": "Cider Atmosphere Realizer™️", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizer.description": "Realizes a different musical atmosphere modelled after the state of the art audio setups.", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode": "Cider Atmosphere Realizer™️ Mode", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.description": "Changes the mode of operation of the Atmosphere Realizer module.", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.natural1": "Natural (Standard)", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.natural2": "Natural (High)", + "settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.natural3": "Natural (Plus)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "音楽をより豊かに、生き生きとさせます", + "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAPはSpatializationと互換性がありません", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "CAPの強さ", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "音に施す処理の強さを設定します (強くしすぎると望ましい結果が得られないかもしれません)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "標準", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "高", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "オーディオノーマライズ", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "さまざまな曲の音量を均一にし、より整った音を楽しめるようにする機能です。", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization.disabled": "Managed by Audio Lab", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "オーディオ空間化", + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "音声を空間化しすることで、より立体的にできます(Dolby Atmosではありません)", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization": "Cider Tuned Spatialization", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.description": "開発チームがチューニングした設定を使用することができます。(オーディオ空間化を有効にする必要があります)", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile": "Cider Spatialization Profile", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.description": "Changes the Tuning Profile of the Spatialization.", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "Standard", + "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "Audiophile", + "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "オーディオ空間化はCAPと互換性がありません", + "settings.header.visual": "ビジュアル", + "settings.header.visual.description": "Ciderのビジュアル設定", + "settings.option.visual.windowStyle": "Window Style", + "settings.option.visual.windowBackgroundStyle": "背景の設定", + "settings.header.visual.windowBackgroundStyle.none": "なし", + "settings.header.visual.windowBackgroundStyle.artwork": "アートワーク", + "settings.header.visual.windowBackgroundStyle.image": "画像", + "settings.option.visual.animatedArtwork": "アニメーションアートワーク", + "settings.header.visual.animatedArtwork.always": "常に表示", + "settings.header.visual.animatedArtwork.limited": "アーティストページのみ表示", + "settings.header.visual.animatedArtwork.disable": "オフ", + "settings.option.visual.animatedArtworkQuality": "アニメーションアートワークの品質", + "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": "背景のアニメーション", + "settings.option.visual.hardwareAcceleration": "ハードウェアアクセラレーション", + "settings.option.visual.hardwareAcceleration.description": "再起動してください", + "settings.header.visual.hardwareAcceleration.default": "既定", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.option.visual.uiscale": "UI Scale", + "settings.header.visual.theme": "テーマ", + "settings.option.visual.theme.github.download": "GitHub URLからインストール", + "settings.option.visual.theme.github.openfolder": "Open Themes Folder", + "settings.option.visual.theme.github.explore": "GitHubで探す", + "settings.header.visual.theme.github.page": "GitHub", + "settings.option.visual.theme.github.install.confirm": "本当に {{ repo }} をインストールしますか?", + "settings.prompt.visual.theme.github.URL": "インストールしたいテーマのURLを入力してください", + "settings.notyf.visual.theme.install.success": "テーマのインストールが完了しました", + "settings.notyf.visual.theme.install.error": "テーマのインストールに失敗しました", + "settings.header.visual.plugin": "プラグイン", + "settings.option.visual.plugin.github.download": "GitHub URLからインストール", + "settings.option.visual.plugin.github.explore": "GitHubで探す", + "settings.header.visual.plugin.github.page": "GitHub", + "settings.option.visual.plugin.github.install.confirm": "本当に {{ repo }} をインストールしますか?", + "settings.prompt.visual.plugin.github.URL": "インストールしたいプラグインのURLを入力してください", + "settings.prompt.visual.plugin.github.success": "プラグインのインストールを完了させるには「完了」を押した後にCiderを再起動してください", + "settings.notyf.visual.plugin.install.success": "プラグインのインストールが完了しました", + "settings.notyf.visual.plugin.install.error": "プラグインのインストールに失敗しました", + "settings.option.visual.theme.default": "Cider", + "settings.option.visual.theme.dark": "Dark", + "settings.option.visual.showPersonalInfo": "個人情報を表示する", + "settings.header.window": "ウィンドウ", + "settings.header.window.description": "ウィンドウの設定", + "settings.option.window.openOnStartup": "Ciderをスタートアップに設定する", + "settings.option.window.openOnStartup.hidden": "パソコン起動時にCiderをトレイに最小化", + "settings.option.window.useNativeTitleBar": "Use Native Title Bar", + "settings.option.window.windowControlStyle": "Window Control Style", + "settings.option.window.windowControlStyle.right": "右側", + "settings.option.window.windowControlStyle.left": "左側", + "settings.header.lyrics": "歌詞", + "settings.header.lyrics.description": "Adjust the lyrics settings for Cider.", + "settings.option.lyrics.enableMusixmatch": "Musixmatchが提供する歌詞を表示する", + "settings.option.lyrics.enableMusixmatchKaraoke": "カラオケモードを有効にする (Musixmatchのみで利用できます)", + "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatchで表示する歌詞の言語", + "settings.option.lyrics.enableYoutubeLyrics": "YouTubeの歌詞をミュージックビデオで使用する", + "settings.option.lyrics.enableQQLyrics": "Enable QQ Lyrics", + "settings.header.connectivity": "接続", + "settings.header.connectivity.description": "Ciderの接続設定", + "settings.option.connectivity.playbackNotifications": "再生している曲を通知する", + "settings.option.connectivity.discordRPC": "Discord Rich Presence", + "settings.option.connectivity.discordRPC.clientName": "Client Name", + "settings.option.connectivity.discordRPC.clearOnPause": "Clear Discord Rich Presence on Pause", + "settings.option.connectivity.discordRPC.hideButtons": "Hide buttons on Discord Rich Presence", + "settings.option.connectivity.discordRPC.detailsFormat": "Details Format", + "settings.option.connectivity.discordRPC.stateFormat": "State Format", + "settings.option.connectivity.lastfmScrobble": "Last.fm に接続する", + "settings.option.connectivity.lastfmScrobble.delay": "遅延 (%)", + "settings.option.connectivity.lastfmScrobble.nowPlaying": "Last.fm Now Playingを有効化する", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "曲名からフューチャリングいているアーティストの名前を削除する (Last.fm)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "ループトラックのフィルター(Last.fm)", + "settings.header.debug": "デバッグ", + "settings.option.debug.copy_log": "Copy logs to clipboard", + "settings.option.debug.openAppData": "Open Cider Folder", + "settings.header.experimental": "試験的な機能", + "settings.header.experimental.description": "試験的な設定", + "settings.option.experimental.reinstallwidevine": "Reinstall WidevineCDM", + "settings.option.experimental.reinstallwidevine.confirm": "Are you sure you want to reinstall Widevine?", + "settings.option.experimental.unknownPlugin": "未知のダウンロード元", + "settings.option.experimental.unknownPlugin.description": "外部からプラグインをインストールできるようにする", + "settings.option.experimental.compactUI": "コンパクトUI", + "settings.option.window.close_button_hide": "Ciderを閉じるとタスクに最小化する", + "settings.option.experimental.inline_playlists": "プレイリストをインラインに表示する", + "settings.option.advanced.playlistTrackMapping": "プレイリストをマッピング", + "settings.option.advanced.playlistTrackMapping.description": "プレイリストをスキャンすることで含まれる曲をより識別しやすくなります", + "settings.option.visual.transparent": "背景の透過", + "settings.option.visual.transparent.description": "(テーマがこの機能をサポートしている必要があります)", + "settings.header.advanced": "Advanced", + "settings.header.connect": "Sync", + "settings.option.connect.link_account": "Enable Sync with Cider Connect", + "settings.option.connect.link_account.description": "Linking your Discord account with Cider Connect allows you to store userdata including Settings, EQ's, and eventually more once finished. (Work In Progress)", + "spatial.notTurnedOn": "オーディオ空間化が無効になっています。この機能を使用するには有効にしてください!", + "spatial.spatialProperties": "空間化のプロパティ", + "spatial.width": "幅", + "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.header.unfinished": "未完了", + "remote.web.title": "Cider リモート", + "remote.web.description": "QRコードを使用して、Ciderとスマートフォンをペアリングする", + "share.platform.twitter.tweet": "{{song}}を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": "song.linkのURLをコピーする", + "share.platform.clipboard": "URLをコピーする", + "about.thanks": "Cider Collective とご協力いただいた貢献者様に感謝申し上げます。" + } + \ No newline at end of file diff --git a/src/i18n/zh_HK.json b/src/i18n/zh_HK.json index 64f05a03..3717198f 100644 --- a/src/i18n/zh_HK.json +++ b/src/i18n/zh_HK.json @@ -115,7 +115,7 @@ "term.contributors": "貢獻者", "term.equalizer": "均衡器", "term.reset": "重設", - "term.tracks": "首歌曲", + "term.tracks": "歌曲", "term.videos": "MV", "term.menu": "選項", "term.check": "檢查", @@ -225,6 +225,10 @@ "settings.option.general.resumebehavior.locally.description": "Cider 將還原你在這台電腦上的最後一次操作。", "settings.option.general.resumebehavior.history": "歷史", "settings.option.general.resumebehavior.history.description": "Cider 將跨裝置將你的整個 Apple Music 歷史記錄中的最後一首歌曲排隊入列。", + "settings.option.general.resumetabs" : "啟動時打開的選項", + "settings.option.general.resumetabs.description" : "你可以選擇啟動 Cider 時要打開的選項。", + "settings.option.general.resumetabs.dynamic" : "動態", + "settings.option.general.resumetabs.dynamic.description" : "Cider 將打開你上次停留的選項。", "settings.option.general.language": "語言", "settings.option.general.language.main": "語言", "settings.option.general.language.fun": "惡搞語言", @@ -236,6 +240,8 @@ "settings.option.general.updateCider.branch.develop": "測試", "settings.option.general.customizeSidebar": "自訂側邊欄的功能", "settings.option.general.customizeSidebar.customize": "自訂", + "settings.option.general.keybindings": "快捷操作鍵", + "settings.option.general.keybindings.open": "開啟", "settings.notyf.updateCider.update-not-available": "沒有可用的更新", "settings.notyf.updateCider.update-downloaded": "更新已成功下載,重啟後進行更新", "settings.notyf.updateCider.update-error": "更新時,發生錯誤", @@ -281,6 +287,7 @@ "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.standard": "標準", "settings.option.audio.enableAdvancedFunctionality.tunedAudioSpatialization.profile.audiophile": "發燒友", "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "空間音訊無法與 CAP 相容,請關閉 CAP 再進行操作。", + "settings.option.visual.uiscale": "介面顯示大小", "settings.header.visual": "外觀", "settings.header.visual.description": "調整 Cider 的外觀", "settings.option.visual.windowBackgroundStyle": "視窗背景樣式", @@ -335,14 +342,18 @@ "settings.option.lyrics.enableMusixmatchKaraoke": "開啟卡拉OK模式(僅限Musixmatch)", "settings.option.lyrics.musixmatchPreferredLanguage": "Musixmatch 歌詞語言偏好", "settings.option.lyrics.enableYoutubeLyrics": "播放 MV 時,使用 YouTube 歌詞", + "settings.option.lyrics.enableQQLyrics": "開啟 QQ 音樂的歌詞", "settings.header.connectivity": "外部連結", "settings.header.connectivity.description": "調整 Cider 與外部的連結", "settings.option.connectivity.discordRPC": "Discord 狀態", "settings.option.connectivity.playbackNotifications": "播放通知", + "settings.option.connectivity.discordRPC.clientName": "應用程式名稱", "settings.header.connectivity.discordRPC.cider": "顯示為'Cider'", "settings.header.connectivity.discordRPC.appleMusic": "顯示為'Apple Music'", "settings.option.connectivity.discordRPC.clearOnPause": "暫停時清除 Discord 狀態", "settings.option.connectivity.discordRPC.hideButtons": "隱藏 Discord 狀態上的按鈕", + "settings.option.connectivity.discordRPC.detailsFormat": "詳細資訊格式", + "settings.option.connectivity.discordRPC.stateFormat": "狀態格式", "settings.option.connectivity.lastfmScrobble": "Last.fm Scrobbling 記錄", "settings.option.connectivity.lastfmScrobble.delay": "Last.fm Scrobble 延遲 (%)", "settings.option.connectivity.lastfmScrobble.nowPlaying": "開啟 Last.fm 正在播放", @@ -366,6 +377,9 @@ "settings.option.visual.transparent": "透明視窗框架", "settings.option.visual.transparent.description": "需主題有支援透明框架,且須重新啟動才會套用。", "settings.header.advanced": "進階", + "settings.header.connect": "同步", + "settings.option.connect.link_account": "開啟與 Cider Connect 同步", + "settings.option.connect.link_account.description": "將您的 Discord 帳戶與 Cider Connect 連接後,你可以儲存使用者資料,包括設定、等化器,並最終在完成後儲存更多資料。(正在進行中)", "spatial.notTurnedOn": "請先在設定中開啟空間音訊。", "spatial.spatialProperties": "空間音訊屬性", "spatial.width": "闊度", diff --git a/src/i18n/zh_TW.json b/src/i18n/zh_TW.json index 471070ef..8c5083cc 100644 --- a/src/i18n/zh_TW.json +++ b/src/i18n/zh_TW.json @@ -119,7 +119,7 @@ "one": "首歌曲", "other": "首歌曲" }, - "term.tracks": "首歌曲", + "term.tracks": "歌曲", "term.videos": "音樂錄影帶", "term.menu": "選單", "term.check": "檢查", diff --git a/src/main/base/store.ts b/src/main/base/store.ts index 59567017..1ffbc502 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -49,7 +49,7 @@ export class Store { "tab": "home", "dynamicData": "" }, - "keybind": { + "keybindings": { "search": [ process.platform == "darwin" ? "Command" : "Control", "S" diff --git a/src/main/base/utils.ts b/src/main/base/utils.ts index a7ce2760..9889c4ff 100644 --- a/src/main/base/utils.ts +++ b/src/main/base/utils.ts @@ -6,6 +6,7 @@ import {app, dialog, ipcMain, Notification, shell } from "electron"; import fetch from "electron-fetch"; import {AppImageUpdater, NsisUpdater} from "electron-updater"; import * as log from "electron-log"; +import ElectronStore from "electron-store"; export class utils { @@ -79,6 +80,14 @@ export class utils { return Store.cfg.store } + /** + * Get the store instance + * @returns {Store} + */ + static getStoreInstance(): ElectronStore { + return Store.cfg + } + /** * Sets a store value * @param key diff --git a/src/main/plugins/menubar.ts b/src/main/plugins/menubar.ts index 38ac4886..b47dcabe 100644 --- a/src/main/plugins/menubar.ts +++ b/src/main/plugins/menubar.ts @@ -2,12 +2,6 @@ import {app, Menu, shell} from "electron"; import {utils} from "../base/utils"; export default class Thumbar { - /** - * Private variables for interaction in plugins - */ - private _win: any; - private _app: any; - private _store: any; /** * Base Plugin Details (Eventually implemented into a GUI in settings) @@ -15,27 +9,225 @@ export default class Thumbar { public name: string = 'Menubar Plugin'; public description: string = 'Creates the menubar'; public version: string = '1.0.0'; - public author: string = 'Core / Quacksire'; - - /** - * Thumbnail Toolbar Assets - * NATIVE-IMAGE DOESN'T SUPPORT SVG - private icons: { [key: string]: Electron.NativeImage } = { - remoteIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/smartphone.svg')).toPNG(), - soundIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/headphones.svg')).toPNG(), - aboutIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/info.svg')).toPNG(), - settingsIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/settings.svg')).toPNG(), - logoutIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'views/svg/log-out.svg')).toPNG(), - ciderIcon: nativeImage.createFromPath(join(utils.getPath('rendererPath'), 'assets/logocute.png')).toPNG(), - } - */ + public author: string = 'Core'; + public contributors: string[] = ['Core', 'Qwack', 'Monochromish']; /** * Menubar Assets * @private */ private isMac: boolean = process.platform === 'darwin'; - private _menuTemplate: any; + private _menuTemplate: any = [ + { + label: app.getName(), + submenu: [ + { + label: 'About', + click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('about')`) + }, + {type: 'separator'}, + { + label: 'Settings', + accelerator: utils.getStoreValue("general.keybindings.settings").join('+'), + click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('settings')`) + }, + {type: 'separator'}, + {role: 'services'}, + {type: 'separator'}, + {role: 'hide'}, + {role: 'hideOthers'}, + {role: 'unhide'}, + {type: 'separator'}, + {role: 'quit'} + ] + }, + { + label: 'View', + submenu: [ + {role: 'reload'}, + {role: 'forceReload'}, + {role: 'toggleDevTools'}, + {type: 'separator'}, + {role: 'resetZoom'}, + {role: 'zoomIn'}, + {role: 'zoomOut'}, + {type: 'separator'}, + {role: 'togglefullscreen'}, + ] + }, + { + label: 'Window', + submenu: [ + {role: 'minimize'}, + { + label: 'Show', + click: () => utils.getWindow().show() + }, + {role: 'zoom'}, + ...(this.isMac ? [ + {type: 'separator'}, + {role: 'front'}, + {role: 'close'}, + ] : [ + {role: 'close'}, + ]), + + { + label: 'Edit', + submenu: [ + {role: 'undo'}, + {role: 'redo'}, + {type: 'separator'}, + {role: 'cut'}, + {role: 'copy'}, + {role: 'paste'}, + ] + }, + {type: 'separator'}, + { + label: 'Toggle Private Session', + accelerator: utils.getStoreValue("general.keybindings.togglePrivateSession").join('+'), + click: () => utils.getWindow().webContents.executeJavaScript(`app.cfg.general.privateEnabled = !app.cfg.general.privateEnabled`) + }, + {type: 'separator'}, + { + label: 'Web Remote', + accelerator: utils.getStoreValue("general.keybindings.webRemote").join('+'), + sublabel: 'Opens in external window', + click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('remote-pair')`) + }, + { + label: 'Audio Settings', + accelerator: utils.getStoreValue("general.keybindings.audioSettings").join('+'), + click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.audioSettings = true`) + }, + { + label: 'Plug-in Menu', + accelerator: utils.getStoreValue("general.keybindings.pluginMenu").join('+'), + click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.pluginMenu = true`) + } + ] + }, + { + label: 'Controls', + submenu: [ + { + label: 'Pause / Play', + accelerator: 'Space', + click: () => utils.getWindow().webContents.executeJavaScript(`app.SpacePause()`) + }, + { + label: 'Next', + accelerator: 'CommandOrControl+Right', + click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.next()`) + }, + { + label: 'Previous', + accelerator: 'CommandOrControl+Left', + click: () => utils.getWindow().webContents.executeJavaScript(`MusicKitInterop.previous()`) + }, + {type: 'separator'}, + { + label: 'Volume Up', + accelerator: 'CommandOrControl+Up', + click: () => utils.getWindow().webContents.executeJavaScript(`app.volumeUp()`) + }, + { + label: 'Volume Down', + accelerator: 'CommandOrControl+Down', + click: () => utils.getWindow().webContents.executeJavaScript(`app.volumeDown()`) + }, + { + label: 'Browse', + accelerator: utils.getStoreValue("general.keybindings.browse").join('+'), + click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('browse')`) + }, + {type: 'separator'}, + { + label: 'Artists', + accelerator: utils.getStoreValue("general.keybindings.artists").join('+'), + click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-artists')`) + }, + { + label: 'Search', + accelerator: utils.getStoreValue("general.keybindings.search").join('+'), + click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('search')`) + }, + {type: 'separator'}, + { + label: 'Album', + accelerator: utils.getStoreValue("general.keybindings.albums").join('+'), + click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('library-albums')`) + }, + {type: 'separator'}, + { + label: 'Cast To Devices', + accelerator: utils.getStoreValue("general.keybindings.castToDevices").join('+'), + click: () => utils.getWindow().webContents.executeJavaScript(`app.modals.castMenu = true`) + } + ] + }, + { + label: 'Account', + submenu: [ + { + label: 'Account Settings', + click: () => utils.getWindow().webContents.executeJavaScript(`app.appRoute('apple-account-settings')`) + }, + { + label: 'Sign Out', + click: () => utils.getWindow().webContents.executeJavaScript(`app.unauthorize()`) + } + ] + }, + { + label: 'Support', + role: 'help', + submenu: [ + { + label: 'Discord', + click: () => shell.openExternal("https://discord.gg/AppleMusic").catch(console.error) + }, + { + label: 'GitHub Wiki', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/wiki/Troubleshooting").catch(console.error) + }, + {type: 'separator'}, + { + label: 'Report a...', + submenu: [ + { + label: 'Bug', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=bug%2Ctriage&template=bug_report.yaml&title=%5BBug%5D%3A+").catch(console.error) + }, + { + label: 'Feature Request', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/discussions/new?category=feature-request").catch(console.error) + }, + { + label: 'Translation Report/Request', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=%F0%9F%8C%90+Translations&template=translation.yaml&title=%5BTranslation%5D%3A+").catch(console.error) + }, + ] + }, + {type: 'separator'}, + { + label: 'View License', + click: () => shell.openExternal("https://github.com/ciderapp/Cider/blob/main/LICENSE").catch(console.error) + }, + {type: 'separator'}, + { + label: 'Toggle Developer Tools', + accelerator: utils.getStoreValue("general.keybindings.openDeveloperTools").join('+'), + click: () => utils.getWindow().webContents.openDevTools() + }, + { + label: 'Open Configuration File in Editor', + click: () => utils.getStoreInstance().openInEditor() + } + ] + } + ]; /******************************************************************************************* * Public Methods @@ -44,230 +236,14 @@ export default class Thumbar { /** * Runs on plugin load (Currently run on application start) */ - constructor(utils: { getApp: () => any; getStore: () => any; getWindow: () => any; }) { - this._app = utils.getApp(); - this._store = utils.getStore(); - - this._menuTemplate = [ - { - label: app.getName(), - submenu: [ - { - label: 'About', - click: () => this._win.webContents.executeJavaScript(`app.appRoute('about')`) - }, - {type: 'separator'}, - { - label: 'Settings', - accelerator: this._store.general.keybind.settings.join('+'), - click: () => this._win.webContents.executeJavaScript(`app.appRoute('settings')`) - }, - {type: 'separator'}, - {role: 'services'}, - {type: 'separator'}, - {role: 'hide'}, - {role: 'hideOthers'}, - {role: 'unhide'}, - {type: 'separator'}, - {role: 'quit'} - ] - }, - { - label: 'View', - submenu: [ - {role: 'reload'}, - {role: 'forceReload'}, - {role: 'toggleDevTools'}, - {type: 'separator'}, - {role: 'resetZoom'}, - {role: 'zoomIn'}, - {role: 'zoomOut'}, - {type: 'separator'}, - {role: 'togglefullscreen'}, - ] - }, - { - label: 'Window', - submenu: [ - {role: 'minimize'}, - { - label: 'Show', - click: () => utils.getWindow().show() - }, - {role: 'zoom'}, - ...(this.isMac ? [ - {type: 'separator'}, - {role: 'front'}, - {role: 'close'}, - ] : [ - {role: 'close'}, - ]), - - { - label: 'Edit', - submenu: [ - {role: 'undo'}, - {role: 'redo'}, - {type: 'separator'}, - {role: 'cut'}, - {role: 'copy'}, - {role: 'paste'}, - ] - }, - {type: 'separator'}, - { - label: 'Toggle Private Session', - accelerator: this._store.general.keybind.togglePrivateSession.join('+'), - click: () => this._win.webContents.executeJavaScript(`app.cfg.general.privateEnabled = !app.cfg.general.privateEnabled`) - }, - {type: 'separator'}, - { - label: 'Web Remote', - accelerator: this._store.general.keybind.webRemote.join('+'), - sublabel: 'Opens in external window', - click: () => this._win.webContents.executeJavaScript(`app.appRoute('remote-pair')`) - }, - { - label: 'Audio Settings', - accelerator: this._store.general.keybind.audioSettings.join('+'), - click: () => this._win.webContents.executeJavaScript(`app.modals.audioSettings = true`) - }, - { - label: 'Plug-in Menu', - accelerator: this._store.general.keybind.pluginMenu.join('+'), - click: () => this._win.webContents.executeJavaScript(`app.modals.pluginMenu = true`) - } - ] - }, - { - label: 'Controls', - submenu: [ - { - label: 'Pause / Play', - accelerator: 'Space', - click: () => this._win.webContents.executeJavaScript(`app.SpacePause()`) - }, - { - label: 'Next', - accelerator: 'CommandOrControl+Right', - click: () => this._win.webContents.executeJavaScript(`MusicKitInterop.next()`) - }, - { - label: 'Previous', - accelerator: 'CommandOrControl+Left', - click: () => this._win.webContents.executeJavaScript(`MusicKitInterop.previous()`) - }, - {type: 'separator'}, - { - label: 'Volume Up', - accelerator: 'CommandOrControl+Up', - click: () => this._win.webContents.executeJavaScript(`app.volumeUp()`) - }, - { - label: 'Volume Down', - accelerator: 'CommandOrControl+Down', - click: () => this._win.webContents.executeJavaScript(`app.volumeDown()`) - }, - { - label: 'Browse', - accelerator: this._store.general.keybind.browse.join('+'), - click: () => this._win.webContents.executeJavaScript(`app.appRoute('browse')`) - }, - {type: 'separator'}, - { - label: 'Artists', - accelerator: this._store.general.keybind.artists.join('+'), - click: () => this._win.webContents.executeJavaScript(`app.appRoute('library-artists')`) - }, - { - label: 'Search', - accelerator: this._store.general.keybind.search.join('+'), - click: () => this._win.webContents.executeJavaScript(`app.appRoute('search')`) - }, - {type: 'separator'}, - { - label: 'Album', - accelerator: this._store.general.keybind.albums.join('+'), - click: () => this._win.webContents.executeJavaScript(`app.appRoute('library-albums')`) - }, - {type: 'separator'}, - { - label: 'Cast To Devices', - accelerator: this._store.general.keybind.castToDevices.join('+'), - click: () => this._win.webContents.executeJavaScript(`app.modals.castMenu = true`) - } - ] - }, - { - label: 'Account', - submenu: [ - { - label: 'Account Settings', - click: () => this._win.webContents.executeJavaScript(`app.appRoute('apple-account-settings')`) - }, - { - label: 'Sign Out', - click: () => this._win.webContents.executeJavaScript(`app.unauthorize()`) - } - ] - }, - { - label: 'Support', - role: 'help', - submenu: [ - { - label: 'Discord', - click: () => shell.openExternal("https://discord.gg/AppleMusic").catch(console.error) - }, - { - label: 'GitHub Wiki', - click: () => shell.openExternal("https://github.com/ciderapp/Cider/wiki/Troubleshooting").catch(console.error) - }, - {type: 'separator'}, - { - label: 'Report a...', - submenu: [ - { - label: 'Bug', - click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=bug%2Ctriage&template=bug_report.yaml&title=%5BBug%5D%3A+").catch(console.error) - }, - { - label: 'Feature Request', - click: () => shell.openExternal("https://github.com/ciderapp/Cider/discussions/new?category=feature-request").catch(console.error) - }, - { - label: 'Translation Report/Request', - click: () => shell.openExternal("https://github.com/ciderapp/Cider/issues/new?assignees=&labels=%F0%9F%8C%90+Translations&template=translation.yaml&title=%5BTranslation%5D%3A+").catch(console.error) - }, - ] - }, - {type: 'separator'}, - { - label: 'View License', - click: () => shell.openExternal("https://github.com/ciderapp/Cider/blob/main/LICENSE").catch(console.error) - }, - {type: 'separator'}, - { - label: 'Toggle Developer Tools', - accelerator: this._store.general.keybind.openDeveloperTools.join('+'), - click: () => this._win.webContents.openDevTools() - }, - { - label: 'Open Configuration File in Editor', - click: () => this._store.openInEditor() - } - ] - } - ]; - + constructor(_utils: utils) { console.debug(`[Plugin][${this.name}] Loading Complete.`); } /** * Runs on app ready */ - onReady(win: Electron.BrowserWindow): void { - this._win = win; + onReady(_win: Electron.BrowserWindow): void { const menu = Menu.buildFromTemplate(this._menuTemplate); Menu.setApplicationMenu(menu) } diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index 78ff5fef..c8c9c799 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -50,7 +50,7 @@ const CiderAudio = { }, connectContext: function (mediaElem) { if (!CiderAudio.context) { - CiderAudio.context = new window.AudioContext({sampleRate: 96000}); // Don't ever remove the sample rate arg. Ask Maikiwi. + CiderAudio.context = new window.AudioContext({ sampleRate: 96000 }); // Don't ever remove the sample rate arg. Ask Maikiwi. } if (!CiderAudio.source) { CiderAudio.source = CiderAudio.context.createMediaElementSource(mediaElem); @@ -62,7 +62,7 @@ const CiderAudio = { if (app.cfg.audio.normalization) { CiderAudio.normalizerOn() } - if (app.cfg.audio.spatial) { + if (app.cfg.audio.maikiwiAudio.spatial) { CiderAudio.spatialOn() } CiderAudio.hierarchical_loading(); @@ -127,57 +127,35 @@ const CiderAudio = { ], spatialOn: function () { CiderAudio.audioNodes.spatialNode = null; - if (app.cfg.audio.maikiwiAudio.spatial === true) { - CiderAudio.audioNodes.spatialNode = CiderAudio.context.createConvolver(); - CiderAudio.audioNodes.spatialNode.normalize = false; + CiderAudio.audioNodes.spatialNode = CiderAudio.context.createConvolver(); + CiderAudio.audioNodes.spatialNode.normalize = false; - let spatialProfile = CiderAudio.spatialProfiles.find(function (profile) { - return profile.id === app.cfg.audio.maikiwiAudio.spatialProfile; - }); - - if (spatialProfile === undefined) { - spatialProfile = CiderAudio.spatialProfiles[0]; - } - fetch(spatialProfile.file).then(async (impulseData) => { - let bufferedImpulse = await impulseData.arrayBuffer(); - CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); - }); + let spatialProfile = CiderAudio.spatialProfiles.find(function (profile) { + return profile.id === app.cfg.audio.maikiwiAudio.spatialProfile; + }); + if (spatialProfile === undefined) { + spatialProfile = CiderAudio.spatialProfiles[0]; } - else { - CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context); - let roomDimensions = { - width: 32, - height: 12, - depth: 32, - }; - let roomMaterials = { - // Room wall materials - left: 'metal', - right: 'metal', - front: 'brick-bare', - back: 'brick-bare', - down: 'acoustic-ceiling-tiles', - up: 'acoustic-ceiling-tiles', - }; - CiderAudio.audioNodes.spatialNode.setRoomProperties(roomDimensions, roomMaterials); - CiderAudio.audioNodes.spatialInput = CiderAudio.audioNodes.spatialNode.createSource(); - } + fetch(spatialProfile.file).then(async (impulseData) => { + let bufferedImpulse = await impulseData.arrayBuffer(); + CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); + }); }, spatialOff: function () { CiderAudio.hierarchical_loading(); }, intelliGainComp_h0_0: function () { let filters = []; const precisionHz = 12; - if (CiderAudio.audioNodes.audioBands !== null) {filters = filters.concat(CiderAudio.audioNodes.audioBands)} - if (CiderAudio.audioNodes.vibrantbassNode !== null) {filters = filters.concat(CiderAudio.audioNodes.vibrantbassNode)} - if (CiderAudio.audioNodes.llpw !== null && CiderAudio.audioNodes.llpw.length > 1) {filters = filters.concat(CiderAudio.audioNodes.llpw);} - if (CiderAudio.audioNodes.analogWarmth !== null) {filters = filters.concat(CiderAudio.audioNodes.analogWarmth)} + if (CiderAudio.audioNodes.audioBands !== null) { filters = filters.concat(CiderAudio.audioNodes.audioBands) } + if (CiderAudio.audioNodes.vibrantbassNode !== null) { filters = filters.concat(CiderAudio.audioNodes.vibrantbassNode) } + if (CiderAudio.audioNodes.llpw !== null && CiderAudio.audioNodes.llpw.length > 1) { filters = filters.concat(CiderAudio.audioNodes.llpw); } + if (CiderAudio.audioNodes.analogWarmth !== null) { filters = filters.concat(CiderAudio.audioNodes.analogWarmth) } if (!filters || filters.length === 0) { let filterlessGain = 1; - if (CiderAudio.audioNodes.llpw !== null && CiderAudio.audioNodes.llpw.length == 1) {filterlessGain = filterlessGain * 1.109174815262401} - if (app.cfg.audio.maikiwiAudio.atmosphereRealizer == true) {filterlessGain = filterlessGain * 1.096478196143185} + if (CiderAudio.audioNodes.llpw !== null && CiderAudio.audioNodes.llpw.length == 1) { filterlessGain = filterlessGain * 1.109174815262401 } + if (app.cfg.audio.maikiwiAudio.atmosphereRealizer == true) { filterlessGain = filterlessGain * 1.096478196143185 } if (app.cfg.audio.maikiwiAudio.spatial == true) { let spatialProfile = CiderAudio.spatialProfiles.find(function (profile) { return profile.id === app.cfg.audio.maikiwiAudio.spatialProfile; @@ -185,12 +163,13 @@ const CiderAudio = { if (spatialProfile === undefined) { spatialProfile = CiderAudio.spatialProfiles[0]; } - filterlessGain = filterlessGain * spatialProfile.gainComp} - filterlessGain = Math.pow(10, (-1 * (20 * Math.log10(filterlessGain))) / 20).toFixed(4); - filterlessGain > 1.0 ? CiderAudio.audioNodes.intelliGainComp.gain.exponentialRampToValueAtTime(1.0, CiderAudio.context.currentTime + 0.3) : CiderAudio.audioNodes.intelliGainComp.gain.exponentialRampToValueAtTime(filterlessGain, CiderAudio.context.currentTime + 0.3); + filterlessGain = filterlessGain * spatialProfile.gainComp + } + filterlessGain = Math.pow(10, (-1 * (20 * Math.log10(filterlessGain))) / 20).toFixed(4); + filterlessGain > 1.0 ? CiderAudio.audioNodes.intelliGainComp.gain.exponentialRampToValueAtTime(1.0, CiderAudio.context.currentTime + 0.3) : CiderAudio.audioNodes.intelliGainComp.gain.exponentialRampToValueAtTime(filterlessGain, CiderAudio.context.currentTime + 0.3); console.debug(`[Cider][Audio] IntelliGainComp: ${filterlessGain > 1.0 ? 0 : (20 * Math.log10(filterlessGain)).toFixed(2)} dB (${filterlessGain > 1.0 ? 1 : filterlessGain})`) return; - } + } filters.shift(); let steps = Math.ceil(96000 / precisionHz); @@ -221,8 +200,8 @@ const CiderAudio = { if (gain > maxGain) maxGain = gain; } - if (CiderAudio.audioNodes.llpw !== null && CiderAudio.audioNodes.llpw.length == 1) {maxGain = maxGain * 1.109174815262401} - if (app.cfg.audio.maikiwiAudio.atmosphereRealizer == true) {maxGain = maxGain * 1.096478196143185} + if (CiderAudio.audioNodes.llpw !== null && CiderAudio.audioNodes.llpw.length == 1) { maxGain = maxGain * 1.109174815262401 } + if (app.cfg.audio.maikiwiAudio.atmosphereRealizer == true) { maxGain = maxGain * 1.096478196143185 } if (app.cfg.audio.maikiwiAudio.spatial == true) { let spatialProfile = CiderAudio.spatialProfiles.find(function (profile) { return profile.id === app.cfg.audio.maikiwiAudio.spatialProfile; @@ -230,7 +209,8 @@ const CiderAudio = { if (spatialProfile === undefined) { spatialProfile = CiderAudio.spatialProfiles[0]; } - maxGain = maxGain * spatialProfile.gainComp} + maxGain = maxGain * spatialProfile.gainComp + } maxGain = Math.pow(10, (-1 * (20 * Math.log10(maxGain))) / 20).toFixed(4); maxGain > 1.0 ? CiderAudio.audioNodes.intelliGainComp.gain.exponentialRampToValueAtTime(1.0, CiderAudio.context.currentTime + 0.3) : CiderAudio.audioNodes.intelliGainComp.gain.exponentialRampToValueAtTime(maxGain, CiderAudio.context.currentTime + 0.3); console.debug(`[Cider][Audio] IntelliGainComp: ${maxGain > 1.0 ? 0 : (20 * Math.log10(maxGain)).toFixed(2)} dB (${maxGain > 1.0 ? 1 : maxGain})`); @@ -376,7 +356,7 @@ const CiderAudio = { } } CiderAudio.audioNodes.recorderNode.parameters.get('isRecording').setValueAtTime(1, CiderAudio.context.currentTime); - CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.recorderNode); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.recorderNode); }); clearInterval(searchInt); @@ -399,37 +379,46 @@ const CiderAudio = { } }, atmosphereRealizer_h2_4: function (status, hierarchy) { - if (status === true) { + if (status === true) { switch (app.cfg.audio.maikiwiAudio.atmosphereRealizer_value) { - case "NATURAL_STANDARD": + case "NATURAL_STANDARD": CiderAudio.audioNodes.atmosphereRealizer = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.atmosphereRealizer.normalize = false; fetch('./audio/impulses/AtmosphereRealizer_NaturalStandard.wav').then(async (impulseData) => { let bufferedImpulse = await impulseData.arrayBuffer(); CiderAudio.audioNodes.atmosphereRealizer.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); - }); + }); break; - - - case "NATURAL_HIGH": + + + case "NATURAL_HIGH": CiderAudio.audioNodes.atmosphereRealizer = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.atmosphereRealizer.normalize = false; fetch('./audio/impulses/AtmosphereRealizer_NaturalHigh.wav').then(async (impulseData) => { let bufferedImpulse = await impulseData.arrayBuffer(); CiderAudio.audioNodes.atmosphereRealizer.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); - }); + }); break; - case "NATURAL_PLUS": + case "NATURAL_PLUS": CiderAudio.audioNodes.atmosphereRealizer = CiderAudio.context.createConvolver(); CiderAudio.audioNodes.atmosphereRealizer.normalize = false; fetch('./audio/impulses/AtmosphereRealizer_Natural+.wav').then(async (impulseData) => { let bufferedImpulse = await impulseData.arrayBuffer(); CiderAudio.audioNodes.atmosphereRealizer.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); - }); + }); + break; + case "CRYPTO": + CiderAudio.audioNodes.atmosphereRealizer = CiderAudio.context.createConvolver(); + CiderAudio.audioNodes.atmosphereRealizer.normalize = false; + + fetch('./audio/impulses/AtmosphereRealizer_Cryptofyre.wav').then(async (impulseData) => { + let bufferedImpulse = await impulseData.arrayBuffer(); + CiderAudio.audioNodes.atmosphereRealizer.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); + }); break; default: @@ -439,16 +428,16 @@ const CiderAudio = { fetch('./audio/impulses/AtmosphereRealizer_Standard.wav').then(async (impulseData) => { let bufferedImpulse = await impulseData.arrayBuffer(); CiderAudio.audioNodes.atmosphereRealizer.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); - }); + }); app.cfg.audio.maikiwiAudio.atmosphereRealizer_value = "STANDARD"; break; } switch (hierarchy) { - case 4: - try{ - CiderAudio.audioNodes.atmosphereRealizer.connect(CiderAudio.audioNodes.analogWarmth[0]); - } catch (e) {} + case 4: + try { + CiderAudio.audioNodes.atmosphereRealizer.connect(CiderAudio.audioNodes.analogWarmth[0]); + } catch (e) { } break; case 3: try { @@ -485,7 +474,7 @@ const CiderAudio = { for (let i = 0; i < WARMTH_FREQUENCIES.length; i++) { CiderAudio.audioNodes.analogWarmth[i] = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.analogWarmth[i].type = 'peaking'; // 'peaking'; - CiderAudio.audioNodes.analogWarmth[i].frequency.value = WARMTH_FREQUENCIES[i] ; + CiderAudio.audioNodes.analogWarmth[i].frequency.value = WARMTH_FREQUENCIES[i]; CiderAudio.audioNodes.analogWarmth[i].Q.value = WARMTH_Q[i]; CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * 1.25; } @@ -495,7 +484,7 @@ const CiderAudio = { for (let i = 0; i < WARMTH_FREQUENCIES.length; i++) { CiderAudio.audioNodes.analogWarmth[i] = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.analogWarmth[i].type = 'peaking'; // 'peaking'; - CiderAudio.audioNodes.analogWarmth[i].frequency.value = WARMTH_FREQUENCIES[i] ; + CiderAudio.audioNodes.analogWarmth[i].frequency.value = WARMTH_FREQUENCIES[i]; CiderAudio.audioNodes.analogWarmth[i].Q.value = WARMTH_Q[i]; CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * 1.75; } @@ -505,7 +494,7 @@ const CiderAudio = { for (let i = 0; i < WARMTH_FREQUENCIES.length; i++) { CiderAudio.audioNodes.analogWarmth[i] = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.analogWarmth[i].type = 'peaking'; // 'peaking'; - CiderAudio.audioNodes.analogWarmth[i].frequency.value = WARMTH_FREQUENCIES[i] ; + CiderAudio.audioNodes.analogWarmth[i].frequency.value = WARMTH_FREQUENCIES[i]; CiderAudio.audioNodes.analogWarmth[i].Q.value = WARMTH_Q[i]; CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * 1.25; } @@ -605,7 +594,7 @@ const CiderAudio = { for (let i = 0; i < c_LLPW_FREQUENCIES.length; i++) { CiderAudio.audioNodes.llpw[i] = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.llpw[i].type = 'peaking'; // 'peaking'; - CiderAudio.audioNodes.llpw[i].frequency.value = c_LLPW_FREQUENCIES[i] ; + CiderAudio.audioNodes.llpw[i].frequency.value = c_LLPW_FREQUENCIES[i]; CiderAudio.audioNodes.llpw[i].Q.value = c_LLPW_Q[i]; CiderAudio.audioNodes.llpw[i].gain.value = c_LLPW_GAIN[i]; } @@ -666,7 +655,7 @@ const CiderAudio = { for (let i = 0; i < VIBRANTBASSBANDS.length; i++) { CiderAudio.audioNodes.vibrantbassNode[i] = CiderAudio.context.createBiquadFilter(); CiderAudio.audioNodes.vibrantbassNode[i].type = 'peaking'; // 'peaking'; - CiderAudio.audioNodes.vibrantbassNode[i].frequency.value = VIBRANTBASSBANDS[i] ; + CiderAudio.audioNodes.vibrantbassNode[i].frequency.value = VIBRANTBASSBANDS[i]; CiderAudio.audioNodes.vibrantbassNode[i].Q.value = VIBRANTBASSQ[i]; CiderAudio.audioNodes.vibrantbassNode[i].gain.value = VIBRANTBASSGAIN[i] * (app.cfg.audio.equalizer.vibrantBass / 10); } @@ -719,7 +708,7 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 4); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { // Vibrant Bass, CAP, Analog Warmth, Maikiwi Spatial app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -733,7 +722,7 @@ const CiderAudio = { console.debug('[Cider][Audio] Equalizer, Vibrant Bass, CAP, Analog Warmth, Spatial, Atmosphere Realizer') } } - else { + else { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] Equalizer, Vibrant Bass, CAP, Analog Warmth, Atmosphere Realizer') @@ -741,7 +730,7 @@ const CiderAudio = { } else { - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { // Vibrant Bass, CAP, Analog Warmth, Maikiwi Spatial app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -755,7 +744,7 @@ const CiderAudio = { console.debug('[Cider][Audio] Equalizer, Vibrant Bass, CAP, Analog Warmth, Spatial') } } - else { + else { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]); console.debug('[Cider][Audio] Equalizer, Vibrant Bass, CAP, Analog Warmth') @@ -766,7 +755,7 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 3) - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -780,14 +769,14 @@ const CiderAudio = { console.debug('[Cider][Audio] Equalizer, Vibrant Bass, CAP, Spatial, Atmosphere Realizer') } } - else { + else { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] Equalizer, Vibrant Bass, CAP, Atmosphere Realizer') } } - else { - if (app.cfg.audio.spatial === true) { + else { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -801,7 +790,7 @@ const CiderAudio = { console.debug('[Cider][Audio] Equalizer, Vibrant Bass, CAP, Spatial') } } - else { + else { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]); console.debug('[Cider][Audio] Equalizer, Vibrant Bass, CAP') @@ -816,7 +805,7 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 4) - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -830,15 +819,15 @@ const CiderAudio = { console.debug('[Cider][Audio] Equalizer, Vibrant Bass, Analog Warmth, Spatial, Atmosphere Realizer') } } - else { + else { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] Equalizer, Vibrant Bass, Analog Warmth, Atmosphere Realizer') } } - else { - if (app.cfg.audio.spatial === true) { + else { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -852,7 +841,7 @@ const CiderAudio = { console.debug('[Cider][Audio] Equalizer, Vibrant Bass, Analog Warmth, Spatial') } } - else { + else { CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]); console.debug('[Cider][Audio] Equalizer, Vibrant Bass, Analog Warmth') } @@ -862,8 +851,8 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 2) - if (app.cfg.audio.spatial === true) { - if (app.cfg.audio.maikiwiAudio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); @@ -881,11 +870,11 @@ const CiderAudio = { CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] Equalizer, Vibrant Bass, Atmosphere Realizer') } - } + } else { - if (app.cfg.audio.spatial === true) { - if (app.cfg.audio.maikiwiAudio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]); @@ -898,12 +887,12 @@ const CiderAudio = { console.debug('[Cider][Audio] Equalizer, Vibrant Bass, Spatial') } } - else { + else { CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]); console.debug('[Cider][Audio] Equalizer, Vibrant Bass') } } - + } } } @@ -918,7 +907,7 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 4); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -939,13 +928,13 @@ const CiderAudio = { } } - else { - - if (app.cfg.audio.spatial === true) { + else { + + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]); console.debug('[Cider][Audio] Equalizer, CAP, Analog Warmth, Maikiwi Spatial') } else { @@ -965,12 +954,12 @@ const CiderAudio = { else { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 3); - - if (app.cfg.audio.spatial === true) { + + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] Equalizer, CAP, Maikiwi Spatial, Atmosphere Realizer') } else { @@ -986,9 +975,9 @@ const CiderAudio = { console.debug('[Cider][Audio] Equalizer, CAP, Atmosphere Realizer') } } - + else { - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1017,7 +1006,7 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 4); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1038,8 +1027,8 @@ const CiderAudio = { } } - else { - if (app.cfg.audio.spatial === true) { + else { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1063,7 +1052,7 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 1); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1084,8 +1073,8 @@ const CiderAudio = { } } - else { - if (app.cfg.audio.spatial === true) { + else { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1121,7 +1110,7 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 4); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { // Vibrant Bass, CAP, Analog Warmth, Maikiwi Spatial app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1140,10 +1129,10 @@ const CiderAudio = { CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] Vibrant Bass, CAP, Analog Warmth, Atmosphere Realizer') } - - } - else { - if (app.cfg.audio.spatial === true) { + + } + else { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { // Vibrant Bass, CAP, Analog Warmth, Maikiwi Spatial app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1168,11 +1157,11 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 3); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] Vibrant Bass, CAP, Maikiwi Spatial, Atmosphere Realizer') } else { @@ -1190,11 +1179,11 @@ const CiderAudio = { } else { - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.llpw[0]); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.llpw[0]); console.debug('[Cider][Audio] Vibrant Bass, CAP, Maikiwi Spatial') } else { @@ -1209,7 +1198,7 @@ const CiderAudio = { CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]); console.debug('[Cider][Audio] Vibrant Bass, CAP') } - } + } } } else { @@ -1219,7 +1208,7 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 4); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1241,7 +1230,7 @@ const CiderAudio = { } else { - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1261,13 +1250,13 @@ const CiderAudio = { console.debug('[Cider][Audio] Vibrant Bass, Analog Warmth') } } - + } else { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 2); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1289,7 +1278,7 @@ const CiderAudio = { } else { - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1322,11 +1311,11 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 4); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] CAP, Analog Warmth, Maikiwi Spatial, Atmosphere Realizer') } else { @@ -1344,11 +1333,11 @@ const CiderAudio = { } else { - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]); console.debug('[Cider][Audio] CAP, Analog Warmth, Maikiwi Spatial') } else { @@ -1369,11 +1358,11 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 3); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] CAP, Maikiwi Spatial, Atmosphere Realizer') } else { @@ -1391,11 +1380,11 @@ const CiderAudio = { } else { - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.llpw[0]); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.llpw[0]); console.debug('[Cider][Audio] CAP, Maikiwi Spatial') } else { @@ -1420,7 +1409,7 @@ const CiderAudio = { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 4); - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); @@ -1442,11 +1431,11 @@ const CiderAudio = { } else { - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]); console.debug('[Cider][Audio] Analog Warmth, Maikiwi Spatial') } else { @@ -1461,17 +1450,17 @@ const CiderAudio = { CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]); console.debug('[Cider][Audio] Analog Warmth') } - } + } } else { if (app.cfg.audio.maikiwiAudio.atmosphereRealizer === true) { CiderAudio.atmosphereRealizer_h2_4(true, 0); - - if (app.cfg.audio.spatial === true) { + + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.atmosphereRealizer); console.debug('[Cider][Audio] Maikiwi Spatial, Atmosphere Realizer') } else { @@ -1488,11 +1477,11 @@ const CiderAudio = { } } else { - if (app.cfg.audio.spatial === true) { + if (app.cfg.audio.maikiwiAudio.spatial === true) { if (app.cfg.audio.maikiwiAudio.spatial === true) { app.cfg.audio.normalization = true; CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); - CiderAudio.audioNodes.spatialNode.connect(CiderAudio.context.destination); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.context.destination); console.debug('[Cider][Audio] Maikiwi Spatial') } else { diff --git a/src/renderer/audio/impulses/AtmosphereRealizer_Cryptofyre.wav b/src/renderer/audio/impulses/AtmosphereRealizer_Cryptofyre.wav new file mode 100644 index 00000000..557f34a9 Binary files /dev/null and b/src/renderer/audio/impulses/AtmosphereRealizer_Cryptofyre.wav differ diff --git a/src/renderer/less/elements.less b/src/renderer/less/elements.less index 383bfd10..716b71a4 100644 --- a/src/renderer/less/elements.less +++ b/src/renderer/less/elements.less @@ -891,6 +891,10 @@ margin: 6px; cursor: pointer; + .mediaitem-artwork { + box-shadow: unset; + } + &.round { border-radius: var(--mediaItemRadiusRound); } diff --git a/src/renderer/less/helpers.less b/src/renderer/less/helpers.less index 43452a24..db659232 100644 --- a/src/renderer/less/helpers.less +++ b/src/renderer/less/helpers.less @@ -1,6 +1,6 @@ .notyf__toast { -webkit-app-region: no-drag; - cursor: pointer; + cursor : pointer; } .notyf-info { @@ -9,142 +9,141 @@ .tooltip-inner { background: #2f2f2f; - opacity: 1; - border: 1px solid rgb(0 0 0 / 35%); + opacity : 1; + border : 1px solid rgb(0 0 0 / 35%); transition: all 0.3s ease-in-out; box-shadow: 0px 2px 6px rgba(0, 0, 0, 0.25); } .modal-fullscreen { - display: flex; + display : flex; justify-content: center; - align-items: center; - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.3); - z-index: 1000; + align-items : center; + position : fixed; + top : 0; + left : 0; + width : 100%; + height : 100%; + background : rgba(0, 0, 0, 0.3); + z-index : 1000; .modal-window { - background: #333; + background : #333; border-radius: 10px; - box-shadow: var(--mediaItemShadow-Shadow); - display: flex; - flex-flow: column; - max-height: 500px; - max-width: 360px; - background: #121212; - width: 100%; - position: relative; + box-shadow : var(--mediaItemShadow-Shadow); + display : flex; + flex-flow : column; + max-height : 500px; + max-width : 360px; + background : #121212; + width : 100%; + position : relative; &:after { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; + content : ""; + position : absolute; + top : 0; + left : 0; + width : 100%; + height : 100%; pointer-events: none; - box-shadow: var(--mediaItemShadow); - z-index: 1; - border-radius: inherit; + box-shadow : var(--mediaItemShadow); + z-index : 1; + border-radius : inherit; } .modal-header { - width: 100%; + width : 100%; padding: 6px; } .modal-content { - width: 100%; - height: 100%; - overflow: hidden; + width : 100%; + height : 100%; + overflow : hidden; overflow-y: overlay; } - .modal-footer { - } + .modal-footer {} } } .spatialproperties-panel { .modal-window { - height: 700px; + height : 700px; max-height: 700px; - width: 800px; - max-width: 800px; - overflow: hidden; + width : 800px; + max-width : 800px; + overflow : hidden; .info-header { padding-left: 12px; } .visual-container { - display: flex; + display : flex; justify-content: center; - align-items: center; - overflow: hidden; + align-items : center; + overflow : hidden; } .visual { - position: relative; - height: 250px; - width: 300px; - display: inline-flex; - align-items: flex-end; + position : relative; + height : 250px; + width : 300px; + display : inline-flex; + align-items : flex-end; justify-content: center; - filter: drop-shadow(2px 12px 6px rgb(0 0 0 / 25%)); - margin: 0 auto; + filter : drop-shadow(2px 12px 6px rgb(0 0 0 / 25%)); + margin : 0 auto; .face { - position: absolute; - width: calc(12px * 6); - height: calc(12px * 6); + position : absolute; + width : calc(12px * 6); + height : calc(12px * 6); border-radius: 6px; - transform: rotateX(60deg) rotateZ(-45deg); - transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear; + transform : rotateX(60deg) rotateZ(-45deg); + transition : transform 0.2s linear, width 0.2s linear, height 0.2s linear; } .listener { - position: absolute; - width: 32px; - height: 32px; + position : absolute; + width : 32px; + height : 32px; border-radius: 6px; - transform: rotateX(60deg) rotateZ(-45deg); - transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear; - background: white; - color: black; - z-index: 2; + transform : rotateX(60deg) rotateZ(-45deg); + transition : transform 0.2s linear, width 0.2s linear, height 0.2s linear; + background : white; + color : black; + z-index : 2; } .audiosource { - position: absolute; - width: 32px; - height: 32px; + position : absolute; + width : 32px; + height : 32px; border-radius: 6px; - transform: rotateX(60deg) rotateZ(-45deg); - transition: transform 0.2s linear, width 0.2s linear, height 0.2s linear; - background: yellow; - z-index: 2; + transform : rotateX(60deg) rotateZ(-45deg); + transition : transform 0.2s linear, width 0.2s linear, height 0.2s linear; + background : yellow; + z-index : 2; } .face:nth-of-type(1) { background: linear-gradient(45deg, #28223a, #1f2038); - z-index: 1; + z-index : 1; } .face:nth-of-type(2) { background: linear-gradient(45deg, #7d53ad, #5763ff); - transform: rotateX(60deg) rotateZ(-45deg) translateZ(30px); - opacity: 0.7; - z-index: 3; + transform : rotateX(60deg) rotateZ(-45deg) translateZ(30px); + opacity : 0.7; + z-index : 3; } } .modal-header { - padding: 16px; + padding : 16px; position: relative; overflow: hidden; @@ -153,18 +152,18 @@ } .close-btn { - width: 50px; - height: 100%; - background-image: var(--gfx-closeBtn); + width : 50px; + height : 100%; + background-image : var(--gfx-closeBtn); background-position: center; - background-repeat: no-repeat; - -webkit-app-region: no-drag; - appearance: none; - border: 0; - background-color: transparent; - position: absolute; - top: 0; - right: 0; + background-repeat : no-repeat; + -webkit-app-region : no-drag; + appearance : none; + border : 0; + background-color : transparent; + position : absolute; + top : 0; + right : 0; &:hover { background-color: rgb(196, 43, 28) @@ -176,14 +175,14 @@ .addtoplaylist-panel { .modal-window { - max-height: 600px; - max-width: 400px; - background: rgb(18 18 18 / 90%); - overflow: hidden; + max-height : 600px; + max-width : 400px; + background : rgb(18 18 18 / 90%); + overflow : hidden; backdrop-filter: blur(16px) saturate(180%); .modal-header { - padding: 16px; + padding : 16px; position: relative; .modal-title { @@ -191,18 +190,18 @@ } .close-btn { - width: 50px; - height: 100%; - background-image: var(--gfx-closeBtn); + width : 50px; + height : 100%; + background-image : var(--gfx-closeBtn); background-position: center; - background-repeat: no-repeat; - -webkit-app-region: no-drag; - appearance: none; - border: 0; - background-color: transparent; - position: absolute; - top: 0; - right: 0; + background-repeat : no-repeat; + -webkit-app-region : no-drag; + appearance : none; + border : 0; + background-color : transparent; + position : absolute; + top : 0; + right : 0; &:hover { background-color: rgb(196, 43, 28) @@ -211,34 +210,34 @@ } .modal-search { - width: 100%; - padding: 0px 16px; + width : 100%; + padding : 0px 16px; position: relative; } .playlist-item { - appearance: none; - border: 0px; - text-align: left; - width: 100%; - margin: 0; - display: flex; - background: rgba(32, 32, 32, 0.46); - color: #eee; + appearance : none; + border : 0px; + text-align : left; + width : 100%; + margin : 0; + display : flex; + background : rgba(32, 32, 32, 0.46); + color : #eee; font-family: inherit; - font-size: 0.98em; - padding: 6px 12px; + font-size : 0.98em; + padding : 6px 12px; align-items: center; - flex-flow: row; + flex-flow : row; .icon { - pointer-events: none; - width: 32px; - height: 32px; - display: flex; + pointer-events : none; + width : 32px; + height : 32px; + display : flex; justify-content: center; - align-items: center; - margin-right: 6px; + align-items : center; + margin-right : 6px; } .name { @@ -265,35 +264,35 @@ } .menu-panel { - width: 100%; - height: 100%; - position: fixed; - top: 0; - left: 0; - z-index: 100001; - display: flex; - justify-content: center; - align-items: center; + width : 100%; + height : 100%; + position : fixed; + top : 0; + left : 0; + z-index : 100001; + display : flex; + justify-content : center; + align-items : center; -webkit-app-region: no-drag; .menu-header-body { - padding: 6px; - display: flex; + padding : 6px; + display : flex; background: rgb(200 200 200 / 10%); .menu-option-header { - width: 40px; - height: 40px; - display: flex; + width : 40px; + height : 40px; + display : flex; justify-content: center; - align-items: center; - border-radius: var(--mediaItemRadius); - appearance: none; - border: 0; - background: transparent; + align-items : center; + border-radius : var(--mediaItemRadius); + appearance : none; + border : 0; + background : transparent; &.active { - .sidebar-icon > .svg-icon { + .sidebar-icon>.svg-icon { --color: var(--keyColor); } } @@ -309,36 +308,63 @@ } .menu-panel-body { - display: flex; - flex-flow: column; - background: rgb(30 30 30 / 45%); - backdrop-filter : blur(32px) saturate(180%); - position: relative; - min-width: 200px; - box-shadow: var(--ciderShadow-Generic); - border-radius: var(--panelRadius); - overflow: hidden; - font-size: 13px; + display : flex; + flex-flow : column; + background : rgb(30 30 30 / 45%); + backdrop-filter: blur(32px) saturate(180%); + position : relative; + min-width : 200px; + box-shadow : var(--ciderShadow-Generic); + border-radius : var(--panelRadius); + overflow : hidden; + font-size : 13px; + .menu-option { text-align: left; - display: flex; - width: calc(100% - 4px); - padding: 8px 10px; + display : flex; appearance: none; - border: 0px; - font: inherit; + border : 0px; + font : inherit; background: transparent; - color: inherit; - margin: 0 auto; - border-radius: 5px; + color : inherit; + margin : 0 auto; + position : relative; + width : 100%; + padding : 9px 14px; + + &::before { + background : var(--hover); + border-radius: 6px; + content : ""; + --sizeY : 3px; + --sizeX : 4px; + top : var(--sizeY); + left : var(--sizeX); + bottom : var(--sizeY); + right : var(--sizeX); + position : absolute; + opacity : 0; + transform : scale(0.98); + z-index : -1; + transition : transform .25s ease-out, opacity .25s ease-out; + } &:hover { - background: var(--selected); + &::before { + transition: transform .1s ease-in, opacity .1s ease-in; + opacity : 1; + transform : scale(1); + } } &:active { - background: var(--selected-click); + &::before { + transition: transform .1s ease-in-out, opacity .1s ease-in-out; + opacity : 1; + transform : scale(0.98); + background: var(--selected-click); + } } } } @@ -348,18 +374,18 @@ margin: 18px 6px; .close-btn { - width: 50px; - height: 42px; - background-image: var(--gfx-closeBtn); + width : 50px; + height : 42px; + background-image : var(--gfx-closeBtn); background-position: center; - background-repeat: no-repeat; - -webkit-app-region: no-drag; - appearance: none; - border: 0; - background-color: transparent; - position: absolute; - top: 0; - right: 0; + background-repeat : no-repeat; + -webkit-app-region : no-drag; + appearance : none; + border : 0; + background-color : transparent; + position : absolute; + top : 0; + right : 0; &:hover { background-color: rgb(196, 43, 28) @@ -368,24 +394,25 @@ } .menu-body { - overflow: overlay; - height: 100%; - display: flex; + overflow : overlay; + height : 100%; + display : flex; flex-flow: column; - gap: 4px; - padding: 6px 4px; + gap : 0px; + padding : 0px; + position : relative; } .menu-footer { - width: 100%; + width : 100%; padding: 12px; } } .queue-panel { - height: 100%; - width: 100%; - display: flex; + height : 100%; + width : 100%; + display : flex; flex-flow: column; .queue-header-text { @@ -394,59 +421,66 @@ .queue-body { overflow: overlay; - height: 100%; + height : 100%; } .queue-footer { - width: 100%; + width : 100%; padding: 12px; } .autoplay { - background: rgb(200 200 200 / 15%); - display: flex; + background : rgb(200 200 200 / 15%); + display : flex; justify-content: center; - appearance: none; - border: 0; - border-radius: 6px; - height: 32px; - width: 32px; + appearance : none; + border : 0; + border-radius : 6px; + height : 32px; + width : 32px; } .infinity { content: url("./assets/infinity.svg"); - margin: auto; + margin : auto; } } .moreinfo-modal { - .modal-window{ - height: 70%; - max-height: 100%; - width: 45%; - max-width: 100%; - overflow: hidden; + .modal-window { + height : 70%; + max-height : 100%; + width : 45%; + max-width : 100%; + overflow : hidden; line-height: 1.25; } - .modal-content{ - padding: 1em; + + .modal-content { + padding : 1em; font-size: 0.8rem; + br { - display: block; /* makes it have a width */ - content: ""; /* clears default height */ - margin: 2em; + display : block; + /* makes it have a width */ + content : ""; + /* clears default height */ + margin : 2em; margin-bottom: -0.6rem; - } + } } - .modal-header{ + + .modal-header { flex-direction: column; - .modal-title{ + + .modal-title { text-align: unset !important; - width: 100%; - &:not(.modal-subtitle){ + width : 100%; + + &:not(.modal-subtitle) { font-size: 25px; } } } -} +} \ No newline at end of file diff --git a/src/renderer/main/vueapp.js b/src/renderer/main/vueapp.js index e05480a9..bcc7dfce 100644 --- a/src/renderer/main/vueapp.js +++ b/src/renderer/main/vueapp.js @@ -972,7 +972,7 @@ const app = new Vue({ async reloadStyles() { const styles = this.cfg.visual.styles document.querySelectorAll(`[id*='less']`).forEach(el => { - if(el.id != "less:style") { + if (el.id != "less:style") { el.remove() } }); @@ -1255,12 +1255,12 @@ const app = new Vue({ }) }, copyToClipboard(str) { - if (navigator.userAgent.includes('Darwin') || navigator.appVersion.indexOf("Mac") != -1) { - this.darwinShare(str) - } else { - notyf.success(app.getLz('term.share.success')) - navigator.clipboard.writeText(str).then(r => console.log("Copied to clipboard.")) - } + // if (navigator.userAgent.includes('Darwin') || navigator.appVersion.indexOf("Mac") != -1) { + // this.darwinShare(str) + // } else { + notyf.success(app.getLz('term.share.success')) + navigator.clipboard.writeText(str).then(r => console.log("Copied to clipboard.")) + // } }, newPlaylist(name = app.getLz('term.newPlaylist'), tracks = []) { let self = this @@ -1572,9 +1572,9 @@ const app = new Vue({ return; } route = route.replace(/#/g, "") - if (app.cfg.general.resumeTabs.tab == "dynamic") { + if (app.cfg.general.resumeTabs.tab == "dynamic") { if (route == "home" || route == "library-songs" || route == "library-albums" || route == "library-artists" || route == "library-videos" || route == "podcasts") { - app.cfg.general.resumeTabs.dynamicData = route + app.cfg.general.resumeTabs.dynamicData = route } else { app.cfg.general.resumeTabs.dynamicData = "home" } @@ -1667,7 +1667,7 @@ const app = new Vue({ } // if (this.cfg.advanced.experiments.includes('inline-playlists')) { - if(false) { + if (false) { let showModal = kind.toString().includes("album") || kind.toString().includes("playlist") if (app.page.includes("playlist") || app.page.includes("album")) { showModal = false @@ -2699,7 +2699,7 @@ const app = new Vue({ function getToken(mode, track, artist, songid, lang, time, id) { if (attempt > 2) { app.loadNeteaseLyrics(); - // app.loadAMLyrics(); + // app.loadAMLyrics(); } else { attempt = attempt + 1; let url = "https://apic-desktop.musixmatch.com/ws/1.1/token.get?app_id=web-desktop-app-v1.0&t=" + revisedRandId(); @@ -2740,7 +2740,7 @@ const app = new Vue({ req.onerror = function () { console.log('error'); app.loadQQLyrics(); - // app.loadAMLyrics(); + // app.loadAMLyrics(); }; req.send(); } @@ -2779,7 +2779,7 @@ const app = new Vue({ if (lrcfile == "") { app.loadQQLyrics(); - // app.loadAMLyrics() + // app.loadAMLyrics() } else { if (richsync == [] || richsync.length == 0) { console.log("ok"); @@ -2827,14 +2827,14 @@ const app = new Vue({ // load translation getMXMTrans(id, lang, token); } else { - // app.loadAMLyrics() - app.loadQQLyrics(); + // app.loadAMLyrics() + app.loadQQLyrics(); } } } catch (e) { console.log(e); app.loadQQLyrics(); - // app.loadAMLyrics() + // app.loadAMLyrics() } } else { //4xx rejected getToken(1, track, artist, '', lang, time); @@ -2908,7 +2908,7 @@ const app = new Vue({ const track = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.title ?? '' : ''); const artist = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.artistName ?? '' : ''); const time = encodeURIComponent((this.mk.nowPlayingItem != null) ? (Math.round((this.mk.nowPlayingItem.attributes["durationInMillis"] ?? -1000) / 1000) ?? -1) : -1); - var url = `http://music.163.com/api/search/get/?csrf_token=hlpretag=&hlposttag=&s=${track+" "+artist}&type=1&offset=0&total=true&limit=6`; + var url = `http://music.163.com/api/search/get/?csrf_token=hlpretag=&hlposttag=&s=${track + " " + artist}&type=1&offset=0&total=true&limit=6`; var req = new XMLHttpRequest(); req.overrideMimeType("application/json"); req.open('GET', url, true); @@ -2929,14 +2929,15 @@ const app = new Vue({ let preLrc = [] for (var i = u.length - 1; i >= 0; i--) { let xline = (/(\[[0-9.:\[\]]*\])+(.*)/).exec(u[i]) - if (xline != null) { - let end = (preLrc.length > 0) ? ((preLrc[preLrc.length - 1].startTime) ?? 99999) : 99999 - preLrc.push({ - startTime: app.toMS(xline[1].substring(1, xline[1].length - 2)) ?? 0, - endTime: end, - line: xline[2], - translation: '' - })} + if (xline != null) { + let end = (preLrc.length > 0) ? ((preLrc[preLrc.length - 1].startTime) ?? 99999) : 99999 + preLrc.push({ + startTime: app.toMS(xline[1].substring(1, xline[1].length - 2)) ?? 0, + endTime: end, + line: xline[2], + translation: '' + }) + } } if (preLrc.length > 0) preLrc.push({ @@ -2951,8 +2952,8 @@ const app = new Vue({ app.lyrics = ""; } }; - req2.onerror = function(){ - + req2.onerror = function () { + } req2.send(); } catch (e) { @@ -2960,7 +2961,7 @@ const app = new Vue({ } }; req.send(); - req.onerror = function(){ + req.onerror = function () { } }, @@ -2969,8 +2970,8 @@ const app = new Vue({ const track = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.title ?? '' : ''); const artist = encodeURIComponent((this.mk.nowPlayingItem != null) ? this.mk.nowPlayingItem.artistName ?? '' : ''); const time = encodeURIComponent((this.mk.nowPlayingItem != null) ? (Math.round((this.mk.nowPlayingItem.attributes["durationInMillis"] ?? -1000) / 1000) ?? -1) : -1); - var url = `https://c.y.qq.com/soso/fcgi-bin/client_search_cp?w=${track+" "+artist}&t=0&n=1&page=1&cr=1&new_json=1&format=json&platform=yqq.json`; - + var url = `https://c.y.qq.com/soso/fcgi-bin/client_search_cp?w=${track + " " + artist}&t=0&n=1&page=1&cr=1&new_json=1&format=json&platform=yqq.json`; + var req = new XMLHttpRequest(); req.overrideMimeType("application/json"); req.open('GET', url, true); @@ -2986,14 +2987,14 @@ const app = new Vue({ req2.open('GET', url2, true); req2.onload = function () { try { - function b64_to_utf8( str ) { - return decodeURIComponent(escape(window.atob( str ))); + function b64_to_utf8(str) { + return decodeURIComponent(escape(window.atob(str))); } const htmlDecode = (input) => { const doc = new DOMParser().parseFromString(input, "text/html"); return doc.documentElement.textContent; } - var jsonResponse2 = JSON.parse(req2.responseText.replace("MusicJsonCallback(","").replace("})","}")); + var jsonResponse2 = JSON.parse(req2.responseText.replace("MusicJsonCallback(", "").replace("})", "}")); var lrcfile = htmlDecode(b64_to_utf8(jsonResponse2["lyric"])); app.lyricsMediaItem = lrcfile let u = app.lyricsMediaItem.split(/[\n]/); @@ -3001,14 +3002,15 @@ const app = new Vue({ let preLrc = [] for (var i = u.length - 1; i >= 0; i--) { let xline = (/(\[[0-9.:\[\]]*\])+(.*)/).exec(u[i]) - if (xline != null) { - let end = (preLrc.length > 0) ? ((preLrc[preLrc.length - 1].startTime) ?? 99999) : 99999 - preLrc.push({ - startTime: app.toMS(xline[1].substring(1, xline[1].length - 2)) ?? 0, - endTime: end, - line: xline[2], - translation: '' - })} + if (xline != null) { + let end = (preLrc.length > 0) ? ((preLrc[preLrc.length - 1].startTime) ?? 99999) : 99999 + preLrc.push({ + startTime: app.toMS(xline[1].substring(1, xline[1].length - 2)) ?? 0, + endTime: end, + line: xline[2], + translation: '' + }) + } } if (preLrc.length > 0) preLrc.push({ @@ -3025,7 +3027,7 @@ const app = new Vue({ app.lyrics = ""; } }; - req2.onerror = function(){ + req2.onerror = function () { app.loadNeteaseLyrics(); } req2.send(); @@ -3035,7 +3037,7 @@ const app = new Vue({ app.lyrics = ""; } } - req.onerror = function(){ + req.onerror = function () { app.loadNeteaseLyrics(); } req.send(); @@ -4272,7 +4274,7 @@ const app = new Vue({ document.getElementById('settings.option.general.updateCider.check').innerHTML = app.getLz('term.check') }) }, - authCC(){ + authCC() { ipcRenderer.send('cc-auth') } } diff --git a/src/renderer/themes/sweetener.less b/src/renderer/themes/sweetener.less index 681f41d3..79b76138 100644 --- a/src/renderer/themes/sweetener.less +++ b/src/renderer/themes/sweetener.less @@ -5,11 +5,18 @@ .menu-panel-body { background-color: @panelColors; backdrop-filter : blur(32px) saturate(180%); - animation: menuIn .10s var(--appleEase); + + &.menu-panel-body-down { + animation: menuInDown .10s var(--appleEase); + } + + &.menu-panel-body-up { + animation: menuInUp .10s var(--appleEase); + } + } - - @keyframes menuIn { + @keyframes menuInUp { 0% { opacity : 0; transform : translateY(-10px) translate3d(0,0,0); @@ -23,6 +30,20 @@ } } + @keyframes menuInDown { + 0% { + opacity : 0; + transform : translateY(10px) translate3d(0,0,0); + background: @panelColorsFallback; + } + + 100% { + opacity : 1; + transform : translateY(0); + background: @panelColors; + } + } + } diff --git a/src/renderer/views/components/mediaitem-list-item.ejs b/src/renderer/views/components/mediaitem-list-item.ejs index 7f1d06c8..0a1ab179 100644 --- a/src/renderer/views/components/mediaitem-list-item.ejs +++ b/src/renderer/views/components/mediaitem-list-item.ejs @@ -23,7 +23,7 @@ - diff --git a/src/renderer/views/components/mediaitem-square.ejs b/src/renderer/views/components/mediaitem-square.ejs index 8d1013d8..93fc2dfd 100644 --- a/src/renderer/views/components/mediaitem-square.ejs +++ b/src/renderer/views/components/mediaitem-square.ejs @@ -2,12 +2,12 @@
{{item?.meta?.reason?.stringForDisplay ?? ''}}
+ class="cd-mediaitem-square" :class="getClasses()" @contextmenu="getContextMenu">