diff --git a/Assets/Install On Cider/install on cider.afdesign b/Assets/Install On Cider/install on cider.afdesign new file mode 100644 index 00000000..5a621a62 Binary files /dev/null and b/Assets/Install On Cider/install on cider.afdesign differ diff --git a/Assets/Install On Cider/install on cider.svg b/Assets/Install On Cider/install on cider.svg new file mode 100644 index 00000000..7bf4d965 --- /dev/null +++ b/Assets/Install On Cider/install on cider.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/i18n/pt_BR.jsonc b/src/i18n/pt_BR.jsonc index fce8bbef..c289c825 100644 --- a/src/i18n/pt_BR.jsonc +++ b/src/i18n/pt_BR.jsonc @@ -1,7 +1,7 @@ { // i18n Info - "i18n.languageName": "Português ( brasileiro )", // name of language in native language + "i18n.languageName": "Português (brasileiro)", // name of language in native language "i18n.languageNameEnglish": "Portuguese (Brazil)", // name of language in English "i18n.category": "main", // main = real language, fun = fun community languages "i18n.authors": "", // Authors, if you contribute to this file feel free to add your name seperated with a space @@ -44,8 +44,8 @@ "term.albums": "Albuns", "term.artists": "Artistas", "term.podcasts": "Podcasts", - "term.playlists": "Listas de Reprodução", - "term.playlist": "Lista de Reprodução", + "term.playlists": "Playlists", + "term.playlist": "Playlist", "term.play": "Tocar", "term.pause": "Pausar", "term.previous": "Anterior", @@ -55,7 +55,7 @@ "term.volume": "Volume", "term.mute": "Mudo", "term.unmute": "Tirar o Mudo", - "term.share": "Partilhar", + "term.share": "Compartilhar", "term.settings": "Definições", "term.seeAll": "Ver Tudo", "term.sortBy": "Organizar Por", @@ -81,7 +81,7 @@ "term.connect": "Conectar", "term.disconnect": "Desconectar", "term.connecting": "Conectando", - "term.confirm": "Confirmar ?", + "term.confirm": "Confirmar?", "term.more": "Mais", "term.less": "Menos", "term.showMore": "Mostrar Mais", @@ -97,6 +97,50 @@ "term.clearAll": "Limpar Tudo", "term.language": "Idioma", "term.recentStations": "Estações Recentes", + "term.language": "Idioma", + "term.funLanguages": "Fun", + "term.noLyrics": "Carregando... / Letras não achadas./ Instrumental.", + "term.copyright": "Copyright", + "term.rightsReserved": "Todos direitos reservados.", + "term.sponsor": "Patrocine esse projeto", + "term.ciderTeam": "Time Cider", + "term.developer": "Desenvolvedor", + "term.socialTeam": "Time social", + "term.socials": "Redes Sociais", + "term.contributors": "Contribuidores", + "term.equalizer": "Equalizador", + "term.reset": "Resetar", + // Example for multiple plural forms : look up the key for your language in https://github.com/prantlf/fast-plural-rules/blob/master/docs/languages.md#supported-languages + // "term.track": { + // "one" : "track", + // "other" : "tracks" + // }, + "term.tracks": "músicas", // Assume x amount of tracks. e.g. 50 tracks + "term.videos": "Vídeos", + "term.menu": "Menu", + "term.check": "Checark", + "term.aboutArtist": "Sobre {{artistName}}", // e.g. 'About Doja Cat' + "term.topResult": "Melhor resultado", // Search Results + "term.sharedPlaylists": "Playlists compartilhadas", // Search Results + "term.people": "Pessoas", // Search Results + "term.newpreset.name": "Nova predefinição para o equalizador", // Equalizer Preset + "term.addedpreset": "Predefinição adicionada", + "term.deletepreset.warn": "Certeza que quer apagar essa predefinição?", + "term.deletedpreset": "Predefinição removida", + "term.defaultPresets": "predefinições padrão", + "term.userPresets": "Predefinições do usuário", + "term.requestError": "There was a problem with the request.", + "term.song.link.generate": "Gerando URL do song.link...", + "term.musicVideos": "Vídeos", // Search page friendlyTypes + "term.stations": "Estações", + "term.curators": "Curadores", + "term.appleCurators": "Curadores da Apple", + "term.radioShows": "Shows de Radio", + "term.recordLabels": "Gravadoras", + "term.videoExtras": "Extras", + "term.top": "Top", + "term.version": "Versão", + "term.noVideos": "Vídeos não encontrados.", // Home "home.title": "Inicio", @@ -106,9 +150,23 @@ "home.madeForYou": "Feito para Você", "home.friendsListeningTo": "Amigos Ouvindo", "home.followedArtists": "Artistas Seguidos", + "home.artistsFeed.noArtist": "Siga uns artistas e o seus ultimos lançamentos aparecerão aqui", // Errors "error.appleMusicSubRequired": "Necessário uma assinatura Apple Music.", + "error.connectionError": "Aconteceu um problema ao conectar ao Apple Music.", + "error.noResults": "Sem resultados.", + "error.noResults.description": "Tente uma nova busca.", + + // Podcasts + "podcast.followOnCider": "Seguir no Cider", + "podcast.followedOnCider": "Seguindo no Cider", + "podcast.subscribeOnItunes": "Inscrever-se no iTunes", + "podcast.subscribedOnItunes": "Inscrito no iTunes", + "podcast.itunesStore": "iTunes Store", + "podcast.episodes": "Episodios", + "podcast.playEpisode": "Reproduzir episódio", + "podcast.website": "Website do Podcast", // Actions "action.addToLibrary": "Adicionar à Biblioteca", @@ -131,64 +189,111 @@ "action.unfollow": "Deixar de Seguir", "action.unfollow.success": "Deixou de Seguir", "action.unfollow.error": "Erro ao Deixar de Seguir", - "action.playNext": "Tocar Proximo", - "action.playLater": "Tocar por Ultimo", + "action.playNext": "Reproduzir a Seguir", + "action.playLater": "Reproduzir por Ultimo", "action.startRadio": "Começar Radio", "action.goToArtist": "Ir para o Artista", "action.goToAlbum": "Ir para o Album", "action.moveToTop": "Mover para cima", - "action.share": "Partilhar", - "action.rename": "Mudar o Nome", + "action.share": "Compartilhar", + "action.rename": "Renomear", "action.love": "Gostar", "action.unlove": "Deixar de Gostar", "action.dislike": "Não Gostar", "action.undoDislike": "Deixar de Não Gostar", "action.showWebRemoteQR": "Mostrar o QR para Página Remota", + "action.playTracksNext": "Reproduzir ${app.selectedMediaItems.length} músicas a seguir", + "action.playTracksLater": "Reproduzir ${app.selectedMediaItems.length} músicas depois", + "action.removeTracks": "Remover ${self.selectedItems.length} músicas da fila", + "action.import": "Importar", + "action.export": "Exportar", + "action.showAlbum": "Mostrar album completo", + "action.tray.minimize": "Minimize to Tray", + "action.tray.quit": "Sair", + "action.tray.show": "Mostrar", + "action.update": "Atualizar", + "action.copy": "Copiar", + "action.newpreset": "Nova predefinição...", // Equalizer Preset + "action.deletepreset": "Apagar predefinição", + "action.open": "Abrir", // Settings - General "settings.header.general": "Principal", "settings.header.general.description": "Ajustar as definiçoes principais no Cider.", + "settings.option.general.language": "Idioma", // Language optgroups + "settings.option.general.language.main": "Idiomas", + "settings.option.general.language.fun": "Idiomas divertidos", + "settings.option.general.language.unsorted": "Sem categoria", // Update Cider + "settings.option.general.updateCider": "Atualizar o Cider", // Button. Refer to term.check for the check button + "settings.option.general.updateCider.branch": "Cider Update Branch", // Dropdown + "settings.option.general.updateCider.branch.description": "Escolha a versão do Cider para atualizar", + "settings.option.general.updateCider.branch.main": "Estável", + "settings.option.general.updateCider.branch.develop": "Em desenvolvimeno", // Settings - Audio - "settings.header.audio": "Audio", - "settings.header.audio.description": "Ajustar as definições de audio no Cider.", - "settings.option.audio.quality": "Qualidade do Audio", // Dropdown + "settings.header.audio": "Áudio", + "settings.header.audio.description": "Ajustar as configurações de áudio no Cider.", + "settings.option.audio.volumeStep": "Incrementos", + "settings.option.audio.maxVolume": "Volume máximo", + "settings.option.audio.quality": "Qualidade de Áudio", // Dropdown + "settings.header.audio.quality.hireslossless": "Hi-Res Lossless", + "settings.header.audio.quality.hireslossless.description": "até 24-bit/192 kHz", + "settings.header.audio.quality.lossless": "Lossless", + "settings.header.audio.quality.lossless.description": "até 24-bit/48 kHz", "settings.header.audio.quality.high": "Alta", - "settings.header.audio.quality.low": "Baixa", - "settings.header.audio.quality.auto": "Automatico", - "settings.option.audio.seamlessTransition": "Transição de Áudio Perfeita", // Toggle - "settings.option.audio.enableAdvancedFunctionality": "Ativar Funcionabilidades Avançadas", // Toggle + "settings.header.audio.quality.high.description": "256 kbps", + "settings.header.audio.quality.standard": "Padrão", + "settings.header.audio.quality.standard.description": "64 kbps", + "settings.option.audio.seamlessTransition": "Transição de audio ...", // Toggle + "settings.option.audio.enableAdvancedFunctionality": "Ativar configurações avancadas", // Toggle "settings.option.audio.enableAdvancedFunctionality.description": "Habilitar a funcionalidade AudioContext permitirá recursos de áudio estendidos, como Normalização de Áudio , Equalizadores e Visualizadores. No entanto, em alguns sistemas, isso pode causar travamentos nas faixas de áudio.", - "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalização de Audio", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™️", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Melhoras psicoacusticas que fazem com que tudo soe mais vivo | feito por Maikiwi.", + "settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility": "CAP não é compativel com Áudio Espacial. Por favor, desative-o para continuar.", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength": "Potência do CAP", // Toggle + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.description": "Muda a potência do processamento feito no áudio. (a função Agressiva pode levar a resultados não desejados.)", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.standard": "Padrão", + "settings.option.audio.enableAdvancedFunctionality.ciderPPEStrength.aggressive": "Agressiva", + "settings.option.audio.enableAdvancedFunctionality.audioNormalization": "Normalização de Áudio", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioNormalization.description": "Normaliza o volume alto para faixas individuais para criar uma experiência de audição mais uniforme.", - "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Audio Espacial", // Toggle + "settings.option.audio.enableAdvancedFunctionality.audioSpatialization": "Áudio Espacial", // Toggle "settings.option.audio.enableAdvancedFunctionality.audioSpatialization.description": "Espacialize o áudio e torne o áudio mais tridimensional (nota: isto não é Dolby Atmos)", + "settings.warn.audio.enableAdvancedFunctionality.audioSpatialization.compatibility": "Áudio Espacial não é compativel com o CAP. Por favor desative-o.", + - // Settings - Visual - "settings.header.visual": "Visual", - "settings.header.visual.description": "Ajustar as Definições de Visual do Cider.", - "settings.option.visual.windowBackgroundStyle": "Estilo do Fundo da Janela", // Toggle + // Settings - Visual + "settings.header.visual": "Visual", + "settings.header.visual.description": "Ajustar as configurações visuais do Cider.", + "settings.option.visual.windowBackgroundStyle": "Estilo do fundo da janela", // Toggle "settings.header.visual.windowBackgroundStyle.none": "Nenhum", "settings.header.visual.windowBackgroundStyle.artwork": "Capa", - "settings.option.visual.animatedArtwork": "Capa Animada", // Dropdown + "settings.header.visual.windowBackgroundStyle.image": "Imagem", + "settings.option.visual.animatedArtwork": "Capa animada", // Dropdown "settings.header.visual.animatedArtwork.always": "Sempre", "settings.header.visual.animatedArtwork.limited": "Limitado a páginas e entradas especiais", - "settings.header.visual.animatedArtwork.disable": "Desativar em Tudo", - "settings.option.visual.animatedArtworkQuality": "Qualidade da Capa Animada", // Dropdown + "settings.header.visual.animatedArtwork.disable": "Desativar", + "settings.option.visual.animatedArtworkQuality": "Qualidade da capa animada", // Dropdown "settings.header.visual.animatedArtworkQuality.low": "Baixa", "settings.header.visual.animatedArtworkQuality.medium": "Media", "settings.header.visual.animatedArtworkQuality.high": "Alta", "settings.header.visual.animatedArtworkQuality.veryHigh": "Muito Alta", - "settings.header.visual.animatedArtworkQuality.extreme": "Extrema", - "settings.option.visual.animatedWindowBackground": "Fundo de Janela Animado", // Toggle - "settings.option.visual.hardwareAcceleration": "Acelaração no Hardware", // Dropdown - "settings.option.visual.hardwareAcceleration.description": "Necessário reiniciar a aplicação", - "settings.header.visual.hardwareAcceleration.default": "Normal", - "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.animatedArtworkQuality.extreme": "Altissima", + "settings.option.visual.animatedWindowBackground": "Fundo animado", // Toggle + "settings.option.visual.hardwareAcceleration": "Aceleração de Hardware", // Dropdown + "settings.option.visual.hardwareAcceleration.description": "Necessário reabrir o Cider", + "settings.header.visual.hardwareAcceleration.default": "Padrão", + "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", + "settings.header.visual.theme": "Tema", + "settings.option.visual.theme.github.download": "Instalar pelo URL do GitHub", + "settings.option.visual.theme.github.explore": "Explorar temas no GitHub", + "settings.option.visual.theme.github.install.confirm": "Tem certeza que quer instalar {{ repo }}?", + "settings.prompt.visual.theme.github.URL": "Insira o URL do tema que deseja instalar", + "settings.notyf.visual.theme.install.success": "Tema instalado com sucesso", + "settings.notyf.visual.theme.install.error": "A instalação do tema falhou", // Settings - Visual - Theme name @@ -214,13 +319,20 @@ "settings.option.connectivity.lastfmScrobble": "LastFM Scrobbling", // Option to Connect "settings.option.connectivity.lastfmScrobble.delay": "Atraso dos Scrobbles do LastFM (%)", "settings.option.connectivity.lastfmScrobble.nowPlaying": "Ativar LastFM Now Playing", - "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remover artistas de colaboração do nome da música (LastFM)", + "settings.option.connectivity.lastfmScrobble.removeFeatured": "Remover artistas de colaboração do nome da música (LastFM)", + "settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar músicas repitidas (Last.fm)", // Refer to term.connect for the connect button + // Settings - Debug + "settings.header.debug": "Debug", + "settings.option.debug.copy_log": "Copiar logs", + "settings.option.debug.openAppData": "Abrir a pasta do Cider", + // Settings - Experimental "settings.header.experimental": "Experimental", "settings.header.experimental.description": "Ajustar as definições experimental no Cider.", "settings.option.experimental.compactUI": "UI Compacto", // Toggle + "settings.option.experimental.close_button_hide": "Fechar apenas esconde o Cider", // Refer to term.disabled & term.enabled // Spatialization Menu @@ -250,4 +362,4 @@ "remote.web.description": "Digitalize o código QR para emparelhar seu telefone com esta instância Cider" // About -} \ No newline at end of file +} diff --git a/src/i18n/ru_RU.jsonc b/src/i18n/ru_RU.jsonc index 57e3e171..4325ed6b 100644 --- a/src/i18n/ru_RU.jsonc +++ b/src/i18n/ru_RU.jsonc @@ -105,27 +105,25 @@ "few": "часа", "other": "часов" }, - // "term.time.hour": "час", "term.time.minute": { "one": "минута", "few": "минуты", "other": "минут" }, - // "term.time.minute": "минута", "term.time.second": { "one": "секунд", "few": "секунды", "other": "секунд" }, - // "term.time.second": "секунда", "term.fullscreenView": "Полноэкранное отображение", "term.defaultView": "Стандартное отображение", "term.audioSettings": "Настройки звука", + "term.audioControls": "Настройка громкости", "term.clearAll": "Очистить", "term.recentStations": "Вы недавно слушали", // FROM ITUNES "term.language": "Язык", "term.funLanguages": "Забавные", - "term.noLyrics": "Загрузка... / Текст песни не найден./ Инструментал.", + "term.noLyrics": "Текст песни не найден.", "term.copyright": "Авторское право", "term.rightsReserved": "Все права защищены.", "term.sponsor": "Поддержать проект", @@ -165,6 +163,7 @@ "term.videoExtras": "Ещё", // FROM ITUNES "term.top": "Top", // NOT SURE WHAT IT IS, NOT TRANSLATED "term.version": "Версия", + "term.noVideos": "Видео не найдено.", // Home "home.title": "Главная", "home.recentlyPlayed": "Недавно прослушанные", @@ -239,7 +238,7 @@ "action.copy": "Скопировать", "action.newpreset": "Новый пресет...", // Equalizer Preset "action.deletepreset": "Удалить пресет", - + "action.open": "Открыть", // Settings - General "settings.header.general": "Общие", "settings.header.general.description": "Настройка общих параметров Cider.", @@ -260,6 +259,8 @@ // Settings - Audio "settings.header.audio": "Звук", "settings.header.audio.description": "Настройка звука Cider.", + "settings.option.audio.volumeStep": "Шаг громкости", + "settings.option.audio.maxVolume": "Максимальная громкость", "settings.option.audio.quality": "Качество звука", // Dropdown FROM IOS "settings.header.audio.quality.hireslossless": "Высокое разрешение, без потерь", // FROM IOS "settings.header.audio.quality.hireslossless.description": "ALAC до 24 бит/192 кГц", // FROM IOS @@ -309,6 +310,8 @@ "settings.header.visual.hardwareAcceleration.webGPU": "WebGPU", "settings.header.visual.theme": "Тема", "settings.option.visual.theme.github.download": "Установить с GitHub", + "settings.option.visual.theme.github.explore": "Исследовать темы с 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": "Не удалось установить тему", @@ -343,13 +346,18 @@ "settings.option.connectivity.lastfmScrobble.removeFeatured": "Удалять фит-исполнителей из названия песни (Last.fm)", "settings.option.connectivity.lastfmScrobble.filterLoop": "Фильтровать зацикленный трек (Last.fm)", // Refer to term.connect for the connect button - + + // Settings - Debug + "settings.header.debug": "Debug", + "settings.option.debug.copy_log": "Копировать логи в буфер обмена", + "settings.option.debug.openAppData": "Открыть папку Cider", + + // Settings - Experimental "settings.header.experimental": "Экспериментальные", "settings.header.experimental.description": "Настройка экспериментальных функций Cider.", "settings.option.experimental.compactUI": "Компактный интерфейс", // Toggle "settings.option.experimental.close_button_hide": "Кнопка «Закрыть» скрывает приложение", - "settings.option.experimental.copy_log": "Скопировать логи в буфер обмена", "settings.option.experimental.inline_playlists": "Встроенные плейлисты и альбомы", // NOT SURE // Refer to term.disabled & term.enabled diff --git a/src/main/base/browserwindow.ts b/src/main/base/browserwindow.ts index 9c89b50f..ef87242b 100644 --- a/src/main/base/browserwindow.ts +++ b/src/main/base/browserwindow.ts @@ -48,6 +48,7 @@ export class BrowserWindow { "pages/remote-pair", "pages/themes-github", "pages/replay", + "pages/audiolabs", "components/mediaitem-artwork", "components/artwork-material", "components/menu-panel", @@ -261,9 +262,10 @@ export class BrowserWindow { } }); - app.get("/themes/:theme/:file", (req, res) => { + app.get("/themes/:theme/*", (req, res) => { const theme = req.params.theme.toLowerCase(); - const file = req.params.file; + // @ts-ignore + const file = req.params[0]; const themePath = join(utils.getPath('srcPath'), "./renderer/themes/", theme); const userThemePath = join(utils.getPath('themes'), theme); if (existsSync(userThemePath)) { @@ -274,6 +276,18 @@ export class BrowserWindow { res.send(`// File not found - ${userThemePath}`); } }); + + app.get("/plugins/:plugin/*", (req, res) => { + const plugin = req.params.plugin; + // @ts-ignore + const file = req.params[0]; + const pluginPath = join(utils.getPath('plugins'), plugin); + if (existsSync(pluginPath)) { + res.sendFile(join(pluginPath, file)); + } else { + res.send(`// Plugin not found - ${pluginPath}`); + } + }); app.get("/audio.webm", (req, res) => { try { @@ -664,7 +678,7 @@ export class BrowserWindow { console.log(err) }); }); - +/* ipcMain.on('check-for-update', async (_event) => { const branch = utils.getStoreValue('general.update_branch') let latestbranch = await fetch(`https://circleci.com/api/v1.1/project/gh/ciderapp/Cider/latest/artifacts?branch=${branch}&filter=successful`) @@ -680,10 +694,10 @@ export class BrowserWindow { const options: any = { provider: 'generic', url: `${base_url}` - } + }*/ /* * Have to handle the auto updaters seperatly until we can support macOS. electron-builder limitation -q - */ + */ /* const win_autoUpdater = new NsisUpdater(options) //Windows const linux_autoUpdater = new AppImageUpdater(options) //Linux await win_autoUpdater.checkForUpdatesAndNotify() @@ -697,7 +711,7 @@ export class BrowserWindow { event.returnValue = true } }) - +*/ ipcMain.on('share-menu', async (_event, url) => { if (process.platform != 'darwin') return; diff --git a/src/main/base/plugins.ts b/src/main/base/plugins.ts index ccb7f2e4..e9a6971d 100644 --- a/src/main/base/plugins.ts +++ b/src/main/base/plugins.ts @@ -64,6 +64,7 @@ export class Plugins { app: electron.app, store: utils.getStore(), utils: utils, + win: utils.getWindow(), dir: pluginPath } plugins[plugin.name] = new plugin(pluginEnv); diff --git a/src/main/base/store.ts b/src/main/base/store.ts index 0e9267f0..c97989cb 100644 --- a/src/main/base/store.ts +++ b/src/main/base/store.ts @@ -12,7 +12,7 @@ export class Store { "discord_rpc_clear_on_pause": true, "language": "en_US", // electron.app.getLocale().replace('-', '_') this can be used in future "playbackNotifications": true, - "update_branch": "main" + "update_branch": "innolab" }, "home": { "followedArtists": [], @@ -27,15 +27,26 @@ export class Store { }, "audio": { "volume": 1, - "volumeStep": 0.02, + "volumeStep": 0.1, "maxVolume": 1, "lastVolume": 1, "muted": false, "quality": "HIGH", "seamless_audio": true, "normalization": false, - "ciderPPE": false, - "ciderPPE_value": 0.5, + "maikiwiAudio": { + "ciderPPE": false, + "ciderPPE_value": 0.5, + "analogWarmth": false, + "analogWarmth_value": 1.25, + "spatial": false, + "vibrantBass": { // Hard coded into the app. Don't include any of this config into exporting presets in store.ts + 'multiplier': 0, + 'frequencies': [17.182, 42.169, 53.763, 112.69, 119.65, 264.59, 336.57, 400.65, 505.48, 612.7, 838.7, 1155.3, 1175.6, 3406.8, 5158.6, 5968.1, 6999.9, 7468.6, 8862.9, 9666, 10109], + 'Q': [2.5, 0.388, 5, 5, 2.5, 7.071, 14.14, 10, 7.071, 14.14, 8.409, 0.372, 7.071, 10, 16.82, 7.071, 28.28, 20, 8.409, 40, 40], + 'gain': [-0.34, 2.49, 0.23, -0.49, 0.23, -0.12, 0.32, -0.29, 0.33, 0.19, -0.18, -1.27, -0.11, 0.25, -0.18, -0.53, 0.34, 1.32, 1.78, 0.41, -0.28] + } + }, "spatial": false, "spatial_properties": { "presets": [], @@ -66,12 +77,6 @@ export class Store { 'presets': [], 'userGenerated': false }, - "vibrantBass": { // Hard coded into the app. Don't include any of this config into exporting presets in store.ts - 'multiplier': 0, - 'frequencies': [17.182, 42.169, 53.763, 112.69, 119.65, 264.59, 336.57, 400.65, 505.48, 612.7, 838.7, 1155.3, 1175.6, 3406.8, 5158.6, 5968.1, 6999.9, 7468.6, 8862.9, 9666, 10109], - 'Q': [2.5, 0.388, 5, 5, 2.5, 7.071, 14.14, 10, 7.071, 14.14, 8.409, 0.372, 7.071, 10, 16.82, 7.071, 28.28, 20, 8.409, 40, 40], - 'gain': [-0.34, 2.49, 0.23, -0.49, 0.23, -0.12, 0.32, -0.29, 0.33, 0.19, -0.18, -1.27, -0.11, 0.25, -0.18, -0.53, 0.34, 1.32, 1.78, 0.41, -0.28] - } }, "visual": { "theme": "", diff --git a/src/main/base/utils.ts b/src/main/base/utils.ts index 96b937d0..68919815 100644 --- a/src/main/base/utils.ts +++ b/src/main/base/utils.ts @@ -83,6 +83,10 @@ export class utils { return bw.win } + static loadJSFrontend(path: string): void { + bw.win.webContents.executeJavaScript(fs.readFileSync(path, "utf8")); + } + /** * Playback Functions */ diff --git a/src/main/base/wsapi.ts b/src/main/base/wsapi.ts index 619a0ac6..bb48d86a 100644 --- a/src/main/base/wsapi.ts +++ b/src/main/base/wsapi.ts @@ -183,7 +183,10 @@ export class wsapi { break; case "next": this._win.webContents.executeJavaScript(`if (MusicKit.getInstance().queue.nextPlayableItemIndex != -1 && MusicKit.getInstance().queue.nextPlayableItemIndex != null) { - MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.nextPlayableItemIndex);}`); + try { + app.prevButtonBackIndicator = false; + } catch (e) { } + MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.nextPlayableItemIndex);}`); response.message = "Next"; break; case "previous": diff --git a/src/main/index.ts b/src/main/index.ts index daeb3eeb..a046cd8a 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -61,6 +61,10 @@ app.on('ready', () => { * Renderer Event Handlers * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ +ipcMain.handle("renderer-ready", (event) => { + CiderPlug.callPlugins("onRendererReady", event); +}) + ipcMain.on('playbackStateDidChange', (_event, attributes) => { CiderPlug.callPlugins('onPlaybackStateDidChange', attributes); }); diff --git a/src/preload/cider-preload.js b/src/preload/cider-preload.js index 243b7951..84a55e91 100644 --- a/src/preload/cider-preload.js +++ b/src/preload/cider-preload.js @@ -136,6 +136,9 @@ const MusicKitInterop = { }, next: () => { + try { + app.prevButtonBackIndicator = false; + } catch (e) { } if (MusicKit.getInstance().queue.nextPlayableItemIndex != -1 && MusicKit.getInstance().queue.nextPlayableItemIndex != null) MusicKit.getInstance().changeToMediaAtIndex(MusicKit.getInstance().queue.nextPlayableItemIndex); // MusicKit.getInstance().skipToNextItem().then(r => console.log(`[MusicKitInterop.next] Skipping to Next ${r}`)); diff --git a/src/renderer/audio/CiderSpatial_Conv.wav b/src/renderer/audio/CiderSpatial_Conv.wav new file mode 100644 index 00000000..06b2551e Binary files /dev/null and b/src/renderer/audio/CiderSpatial_Conv.wav differ diff --git a/src/renderer/audio/CiderSpatial_Conv_v2.wav b/src/renderer/audio/CiderSpatial_Conv_v2.wav new file mode 100644 index 00000000..dad94064 Binary files /dev/null and b/src/renderer/audio/CiderSpatial_Conv_v2.wav differ diff --git a/src/renderer/audio/audio.js b/src/renderer/audio/audio.js index 8dbaccac..c47f2f4e 100644 --- a/src/renderer/audio/audio.js +++ b/src/renderer/audio/audio.js @@ -8,7 +8,8 @@ var CiderAudio = { audioBands : null, vibrantbassNode: null, llpw: null, - llpwEnabled: null + llpwEnabled: null, + analogWarmth: null }, init: function (cb = function () { }) { //AudioOutputs.fInit = true; @@ -29,6 +30,9 @@ var CiderAudio = { CiderAudio.audioNodes.gainNode.disconnect(); } catch(e){} try{ CiderAudio.audioNodes.spatialNode.disconnect();} catch(e){} try{ + for (var i of CiderAudio.audioNodes.analogWarmth){ + i.disconnect(); + } for (var i of CiderAudio.audioNodes.llpw){ i.disconnect(); } @@ -47,7 +51,8 @@ var CiderAudio = { audioBands : null, vibrantbassNode: null, llpw: null, - llpwEnabled: null + llpwEnabled: null, + analogWarmth: null } } catch (e) {} CiderAudio.source.connect(CiderAudio.context.destination);} catch(e){} @@ -74,26 +79,41 @@ var CiderAudio = { normalizerOff: function (){ CiderAudio.audioNodes.gainNode.gain.setTargetAtTime(1, CiderAudio.context.currentTime+ 1, 0.5); }, + spatialOn: function (){ - CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context); - //CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination); - 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(); - CiderAudio.hierarchical_loading(); + if (app.cfg.audio.maikiwiAudio.spatial === true) { + CiderAudio.audioNodes.spatialNode = CiderAudio.context.createConvolver(); + + fetch('./audio/CiderSpatial_Conv_v2.wav').then(async (impulseData) => { + let bufferedImpulse = await impulseData.arrayBuffer(); + CiderAudio.audioNodes.spatialNode.buffer = await CiderAudio.context.decodeAudioData(bufferedImpulse); + + }); + CiderAudio.audioNodes.spatialNode.normalize = true; + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.context.destination); + } + else { + try{ + CiderAudio.audioNodes.gainNode.disconnect(CiderAudio.context.destination);} catch(e){} + CiderAudio.audioNodes.spatialNode = new ResonanceAudio(CiderAudio.context); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.context.destination); + 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(); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input);} }, spatialOff: function (){ CiderAudio.hierarchical_loading(); @@ -113,6 +133,44 @@ var CiderAudio = { ); } }, + analogWarmth_h2_3: function (status, hierarchy){ + if (status === true) { // 23 Band Adjustment + let WARMTH_FREQUENCIES = [10.513, 15.756, 224.01, 677.77, 1245.4, 2326.8, 2847.3, 4215.3, 11057, 12793, 16235, 16235, 17838, 18112, 18112, 19326, 19372, 19372, 20061, 20280, 20280, 20853, 22276]; + let WARMTH_GAIN = [-4.81, 0.74, 0.55, -0.84, -1.52, 0.84, 0.66, -0.29, 0.29, 0.94, 1.67, 1.62, -0.53, -0.81, -4.98, 1.43, 0.86, 1.13, -1.06, -0.95, -1.13, 1.78, -3.86]; + let WARMTH_Q = [0.442, 3.536, 2.102, 8.409, 0.625, 16.82, 5, 2.973, 3.536, 2.5, 2.5, 11.89, 0.625, 1.487, 1.153, 5, 5.453, 5, 2.973, 3.386, 3.386, 14.14, 8.409]; + CiderAudio.audioNodes.analogWarmth = [] + + + for (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].Q.value = WARMTH_Q[i]; + CiderAudio.audioNodes.analogWarmth[i].gain.value = WARMTH_GAIN[i] * app.cfg.audio.maikiwiAudio.analogWarmth_value; + } + + for (i = 1; i < WARMTH_FREQUENCIES.length; i ++) { + CiderAudio.audioNodes.analogWarmth[i-1].connect(CiderAudio.audioNodes.analogWarmth[i]); + } + + switch (hierarchy) { + case 3: + try{ + CiderAudio.audioNodes.analogWarmth[WARMTH_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.llpw[0]);} catch(e){} + break; + case 2: + try{ + CiderAudio.audioNodes.analogWarmth[WARMTH_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.vibrantbassNode[0]);} catch(e){} + break; + case 1: + try{ + CiderAudio.audioNodes.analogWarmth[WARMTH_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.audioBands[0]);} catch(e){} + break; + } + + + } + }, llpw_h2_2: function (status, hierarchy){ if (status === true) { let LLPW_Q = [5, 1, 3.536, 1.25, 8.409, 1.25, 14.14, 7.071, 5, 0.625, 16.82, 20, 20, 20, 28.28, 28.28, 28.28, 20, 33.64, 33.64, 10, 28.28, 7.071, 3.856]; @@ -125,27 +183,31 @@ var CiderAudio = { CiderAudio.audioNodes.llpw[i].type = 'peaking'; // 'peaking'; CiderAudio.audioNodes.llpw[i].frequency.value = LLPW_FREQUENCIES[i]; CiderAudio.audioNodes.llpw[i].Q.value = LLPW_Q[i]; - CiderAudio.audioNodes.llpw[i].gain.value = LLPW_GAIN[i] * app.cfg.audio.ciderPPE_value; + CiderAudio.audioNodes.llpw[i].gain.value = LLPW_GAIN[i] * app.cfg.audio.maikiwiAudio.ciderPPE_value; } for (i = 1; i < LLPW_FREQUENCIES.length; i ++) { CiderAudio.audioNodes.llpw[i-1].connect(CiderAudio.audioNodes.llpw[i]); } - if (hierarchy === 2) { - try{ - CiderAudio.audioNodes.llpw[LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.vibrantbassNode[0]);} catch(e){}} - else if (hierarchy === 1) { - try{ - CiderAudio.audioNodes.llpw[LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.audioBands[0]);} catch(e){}} + switch (hierarchy) { + case 2: + try{ + CiderAudio.audioNodes.llpw[LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.vibrantbassNode[0]);} catch(e){} + break; + case 1: + try{CiderAudio.audioNodes.llpw[LLPW_FREQUENCIES.length-1].connect(CiderAudio.audioNodes.audioBands[0]);} catch(e){} + break; + + } } }, vibrantbass_h2_1: function (status){ if (status === true) { - let VIBRANTBASSBANDS = app.cfg.audio.vibrantBass.frequencies; - let VIBRANTBASSGAIN = app.cfg.audio.vibrantBass.gain; - let VIBRANTBASSQ = app.cfg.audio.vibrantBass.Q; + let VIBRANTBASSBANDS = app.cfg.audio.maikiwiAudio.vibrantBass.frequencies; + let VIBRANTBASSGAIN = app.cfg.audio.maikiwiAudio.vibrantBass.gain; + let VIBRANTBASSQ = app.cfg.audio.maikiwiAudio.vibrantBass.Q; CiderAudio.audioNodes.vibrantbassNode = [] for (i = 0; i < VIBRANTBASSBANDS.length; i++) { @@ -153,7 +215,7 @@ var CiderAudio = { CiderAudio.audioNodes.vibrantbassNode[i].type = 'peaking'; // 'peaking'; 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.vibrantBass.multiplier; + CiderAudio.audioNodes.vibrantbassNode[i].gain.value = VIBRANTBASSGAIN[i] * app.cfg.audio.maikiwiAudio.vibrantBass.multiplier; } for (i = 1; i < VIBRANTBASSBANDS.length; i ++) { @@ -166,7 +228,9 @@ var CiderAudio = { }, hierarchical_unloading: function (){ try {CiderAudio.audioNodes.spatialNode.output.disconnect();} catch(e){} + try {CiderAudio.audioNodes.spatialNode.disconnect();} catch(e){} try {CiderAudio.audioNodes.gainNode.disconnect();} catch(e){} + try {for (var i of CiderAudio.audioNodes.analogWarmth){i.disconnect();} CiderAudio.audioNodes.analogWarmth = []} catch(e){} try {for (var i of CiderAudio.audioNodes.llpw){i.disconnect();} CiderAudio.audioNodes.llpw = []} catch(e){} try {for (var i of CiderAudio.audioNodes.vibrantbassNode){i.disconnect();} CiderAudio.audioNodes.vibrantbassNode = []} catch(e){} @@ -175,46 +239,218 @@ var CiderAudio = { }, hierarchical_loading: function (){ CiderAudio.hierarchical_unloading(); - if (app.cfg.audio.vibrantBass.multiplier !== 0) { // If vibrant bass is enabled - if (app.cfg.advanced.ciderPPE) { // If CAP & vibrant bass is enabled - CiderAudio.vibrantbass_h2_1(true) - if (app.cfg.audio.spatial) { - app.cfg.advanced.ciderPPE = false; - notyf.error(app.getLz('settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility')); - CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); - CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]); - } - else {CiderAudio.llpw_h2_2(true, 2); CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);} - } - else { // If only vibrant bass is enabled - CiderAudio.vibrantbass_h2_1(true) - //CiderAudio.llpw_h2_2(false, 0) - if (app.cfg.audio.spatial) { - CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); - CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]);} - else {CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]);} + + // Vibrant Bass, CAP, Analog Warmth, Spatial + if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier !== 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === true && + app.cfg.audio.spatial === true && + app.cfg.audio.maikiwiAudio.analogWarmth === true) { + + CiderAudio.vibrantbass_h2_1(true) + CiderAudio.llpw_h2_2(true, 2); + CiderAudio.analogWarmth_h2_3(true, 3); + + if (app.cfg.audio.maikiwiAudio.spatial === true) { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] Vibrant Bass, CAP, Analog Warmth, Maikiwi Spatial') + } + else { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] Vibrant Bass, CAP, Analog Warmth, Spatial') } } - else { // If vibrant bass is disabled - if (app.cfg.advanced.ciderPPE) { // If CAP is enabled & vibrant bass is disabled - //CiderAudio.vibrantbass_h2_1(false) - if (app.cfg.audio.spatial) { - app.cfg.advanced.ciderPPE = false; - notyf.error(app.getLz('settings.warn.audio.enableAdvancedFunctionality.ciderPPE.compatibility')); - CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); - CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]); - } - else {CiderAudio.llpw_h2_2(true, 1); CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]);} + // CAP, Analog Warmth, Spatial + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier === 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === true && + app.cfg.audio.spatial === true && + app.cfg.audio.maikiwiAudio.analogWarmth === true) { + + CiderAudio.llpw_h2_2(true, 1); + CiderAudio.analogWarmth_h2_3(true, 3); + + if (app.cfg.audio.maikiwiAudio.spatial === true) { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] CAP, Analog Warmth, Maikiwi Spatial') } - else { // If CAP & vibrant bass is disabled - //CiderAudio.vibrantbass_h2_1(false) - //CiderAudio.llpw_h2_2(false, 0) - if (app.cfg.audio.spatial) { - CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); - CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]);} - else {CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.audioBands[0]);} + else { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] CAP, Analog Warmth, Spatial') } } + // Vibrant Bass, CAP, Spatial + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier !== 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === true && + app.cfg.audio.spatial === true && + app.cfg.audio.maikiwiAudio.analogWarmth === false) { + + CiderAudio.vibrantbass_h2_1(true) + CiderAudio.llpw_h2_2(true, 2); + if (app.cfg.audio.maikiwiAudio.spatial === true) { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.llpw[0]); + console.log('[Cider][Audio] Vibrant Bass, CAP, Maikiwi Spatial') + } + else { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.llpw[0]); + console.log('[Cider][Audio] Vibrant Bass, CAP, Spatial') + } + + } + // Vibrant Bass, CAP, Analog Warmth + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier !== 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === true && + app.cfg.audio.spatial === false && + app.cfg.audio.maikiwiAudio.analogWarmth === true) { + + CiderAudio.vibrantbass_h2_1(true) + CiderAudio.llpw_h2_2(true, 2); + CiderAudio.analogWarmth_h2_3(true, 3); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] Vibrant Bass, CAP, Analog Warmth') + } + // CAP, Spatial + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier === 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === true && + app.cfg.audio.spatial === true && + app.cfg.audio.maikiwiAudio.analogWarmth === false) { + + CiderAudio.llpw_h2_2(true, 1); + if (app.cfg.audio.maikiwiAudio.spatial === true) { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.llpw[0]); + console.log('[Cider][Audio] CAP, Maikiwi Spatial') + } + else { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.llpw[0]); + console.log('[Cider][Audio] CAP, Spatial') + } + } + // Analog Warmth, Spatial + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier === 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === false && + app.cfg.audio.spatial === true && + app.cfg.audio.maikiwiAudio.analogWarmth === true) { + + CiderAudio.analogWarmth_h2_3(true, 1); + if (app.cfg.audio.maikiwiAudio.spatial === true) { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] Analog Warmth, Maikiwi Spatial') + } + else { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] Analog Warmth, Spatial') + } + } + // CAP, Analog Warmth + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier === 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === true && + app.cfg.audio.spatial === false && + app.cfg.audio.maikiwiAudio.analogWarmth === true) { + + CiderAudio.llpw_h2_2(true, 1); + CiderAudio.analogWarmth_h2_3(true, 3); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] CAP and Analog Warmth') + } + // Vibrant Bass, Analog Warmth + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier !== 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === false && + app.cfg.audio.spatial === false && + app.cfg.audio.maikiwiAudio.analogWarmth === true) { + + CiderAudio.vibrantbass_h2_1(true) + CiderAudio.analogWarmth_h2_3(true, 2); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] Vibrant Bass, Analog Warmth') + } + + // Vibrant Bass, CAP + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier !== 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === true && + app.cfg.audio.spatial === false && + app.cfg.audio.maikiwiAudio.analogWarmth === false) { + + CiderAudio.vibrantbass_h2_1(true) + CiderAudio.llpw_h2_2(true, 2); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]); + console.log('[Cider][Audio] Vibrant Bass, CAP') + } + // Vibrant Bass, Spatial + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier !== 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === false && + app.cfg.audio.spatial === true && + app.cfg.audio.maikiwiAudio.analogWarmth === false) { + + CiderAudio.vibrantbass_h2_1(true) + if (app.cfg.audio.maikiwiAudio.spatial === true) { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]); + console.log('[Cider][Audio] Vibrant Bass, Maikiwi Spatial') + } + else { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.vibrantbassNode[0]); + console.log('[Cider][Audio] Vibrant Bass, Spatial') + } + + } + // Vibrant Bass + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier !== 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === false && + app.cfg.audio.spatial === false && + app.cfg.audio.maikiwiAudio.analogWarmth === false) { + CiderAudio.vibrantbass_h2_1(true) + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.vibrantbassNode[0]); + console.log('[Cider][Audio] Vibrant Bass') + } + // CAP + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier === 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === true && + app.cfg.audio.spatial === false && + app.cfg.audio.maikiwiAudio.analogWarmth === false) { + CiderAudio.llpw_h2_2(true, 1); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.llpw[0]); + console.log('[Cider][Audio] CAP') + } + // Analog Warmth + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier === 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === false && + app.cfg.audio.maikiwiAudio.spatial === false && + app.cfg.audio.maikiwiAudio.analogWarmth === true) { + CiderAudio.analogWarmth_h2_3(true, 1); + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.analogWarmth[0]); + console.log('[Cider][Audio] Analog Warmth') + } + // Spatial + else if (app.cfg.audio.maikiwiAudio.vibrantBass.multiplier === 0 && + app.cfg.audio.maikiwiAudio.ciderPPE === false && + app.cfg.audio.spatial === true && + app.cfg.audio.maikiwiAudio.analogWarmth === false){ + if (app.cfg.audio.maikiwiAudio.spatial === true) { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialNode); + CiderAudio.audioNodes.spatialNode.connect(CiderAudio.audioNodes.audioBands[0]); + console.log('[Cider][Audio] Maikiwi Spatial') + } + else { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.spatialInput.input); + CiderAudio.audioNodes.spatialNode.output.connect(CiderAudio.audioNodes.audioBands[0]); + console.log('[Cider][Audio] Spatial') + } + + } + // Nothing + else { + CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.audioBands[0]); + console.log('[Cider][Audio] Nothing') // If CAP & vibrant bass is disabled + } console.log("[Cider][Audio] Finished hierarchical loading"); diff --git a/src/renderer/index.js b/src/renderer/index.js index cc0f3c3b..a3551d58 100644 --- a/src/renderer/index.js +++ b/src/renderer/index.js @@ -250,7 +250,8 @@ const app = new Vue({ items: {}, headerItems: {} } - } + }, + pauseButtonTimer : null }, watch: { cfg: { @@ -813,12 +814,14 @@ const app = new Vue({ this.page = "home" } + this.mediaKeyFixes() + setTimeout(() => { this.getSocialBadges() this.getBrowsePage(); this.$forceUpdate() }, 500) - + ipcRenderer.invoke("renderer-ready", true) }, setTheme(theme = "") { console.log(theme) @@ -1319,6 +1322,14 @@ const app = new Vue({ extend: "offers,editorialVideo", "views": "appears-on,more-by-artist,related-videos,other-versions,you-might-also-like,video-extras,audio-extras", } + if (kind.includes("playlist")){ + params["include"] = "tracks"; + } + if (kind.includes("album")){ + params["include[albums]"] = "artists" + params["fields[artists]"] = "name,url" + params["fields[albums]"] = "artistName,artistUrl,artwork,contentRating,editorialArtwork,name,playParams,releaseDate,url" + } if (this.cfg.advanced.experiments.includes('inline-playlists')) { let showModal = kind.toString().includes("album") || kind.toString().includes("playlist") @@ -1347,8 +1358,11 @@ const app = new Vue({ prevButton() { if (!app.prevButtonBackIndicator && app.mk.nowPlayingItem && app.mk.currentPlaybackTime > 2) { app.prevButtonBackIndicator = true; + try{clearTimeout(app.pauseButtonTimer)} catch (e){ } app.mk.seekToTime(0); + app.pauseButtonTimer = setTimeout(() => {app.prevButtonBackIndicator = false},3000); } else { + try{clearTimeout(app.pauseButtonTimer)} catch (e){ } app.prevButtonBackIndicator = false; app.skipToPreviousItem() } @@ -3245,8 +3259,8 @@ const app = new Vue({ }, async getRating(item) { let type = item.type.slice(-1) === "s" ? item.type : item.type + "s" - let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id - if (item.id.startsWith("i.")) { + let id = item.attributes?.playParams?.catalogId ? item.attributes.playParams.catalogId : (item.attributes?.playParams?.id ?? item.id) + if (item.id != null && (item.id.toString()).startsWith("i.")) { if (!type.startsWith("library-")) { type = "library-" + type } @@ -3262,8 +3276,8 @@ const app = new Vue({ }, love(item) { let type = item.type.slice(-1) === "s" ? item.type : item.type + "s" - let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id - if (item.id.startsWith("i.")) { + let id = item.attributes?.playParams?.catalogId ? item.attributes.playParams.catalogId : (item.attributes?.playParams?.id ?? item.id) + if (item.id != null && (item.id.toString()).startsWith("i.")) { if (!type.startsWith("library-")) { type = "library-" + type } @@ -3283,8 +3297,8 @@ const app = new Vue({ }, dislike(item) { let type = item.type.slice(-1) === "s" ? item.type : item.type + "s" - let id = item.attributes.playParams.catalogId ? item.attributes.playParams.catalogId : item.id - if (item.id.startsWith("i.")) { + let id = item.attributes?.playParams?.catalogId ? item.attributes.playParams.catalogId : (item.attributes?.playParams?.id ?? item.id) + if (item.id != null && (item.id.toString()).startsWith("i.")) { if (!type.startsWith("library-")) { type = "library-" + type } @@ -3675,9 +3689,6 @@ const app = new Vue({ closeWindow() { ipcRenderer.send('close'); }, - checkForUpdate() { - ipcRenderer.send('check-for-update') - }, darwinShare(url) { ipcRenderer.send('share-menu', url) }, @@ -3735,6 +3746,7 @@ const app = new Vue({ } }, skipToNextItem(){ + app.prevButtonBackIndicator = false; // app.mk.skipToNextItem() is buggy somehow so use this if (this.mk.queue.nextPlayableItemIndex != -1 && this.mk.queue.nextPlayableItemIndex != null) this.mk.changeToMediaAtIndex(this.mk.queue.nextPlayableItemIndex); @@ -3743,6 +3755,10 @@ const app = new Vue({ // app.mk.skipToPreviousItem() is buggy somehow so use this if (this.mk.queue.previousPlayableItemIndex != -1 && this.mk.queue.previousPlayableItemIndex != null) this.mk.changeToMediaAtIndex(this.mk.queue.previousPlayableItemIndex); + }, + mediaKeyFixes(){ + navigator.mediaSession.setActionHandler('previoustrack', function() { app.prevButton() }); + navigator.mediaSession.setActionHandler('nexttrack', function() { app.skipToNextItem() }); } } }) @@ -3852,7 +3868,7 @@ function fallbackinitMusicKit() { }, sourceType: 24, suppressErrorDialog: true - }); + }) setTimeout(() => { app.init() }, 1000) diff --git a/src/renderer/less/pages.less b/src/renderer/less/pages.less index 013a4d72..5a4b4397 100644 --- a/src/renderer/less/pages.less +++ b/src/renderer/less/pages.less @@ -37,7 +37,7 @@ font-weight: 500; overflow: hidden; text-overflow: ellipsis; - white-space: nowrap; + white-space: break-spaces; } .repo-url { @@ -948,7 +948,6 @@ object-fit: cover; } } - .top-genres-container { .genre-name { diff --git a/src/renderer/views/app/app-content.ejs b/src/renderer/views/app/app-content.ejs index b64e3f7d..10250ca4 100644 --- a/src/renderer/views/app/app-content.ejs +++ b/src/renderer/views/app/app-content.ejs @@ -171,7 +171,12 @@ - + + + +