This commit is contained in:
yazninja 2022-08-21 21:41:00 +08:00
commit c9268105f0
17 changed files with 257 additions and 327 deletions

View file

@ -48,6 +48,9 @@ jobs:
- name: Setup Environment
run: brew install automake #libtool autoconf
- name: Clear node_airtunes2 cache
run: sudo rm -rf /Users/runner/Library/Caches/Yarn/v6/.tmp/cf5bc2de2629636ca224995234b8eaa1 || true
- name: Install and Configure Node Modules
run: |
yarn install

View file

@ -30,7 +30,10 @@
[![Get it from the Microsoft Store](https://img.shields.io/badge/Get_It_From_The_Microsoft_Store-100000?style=for-the-badge&logo=microsoft)](https://www.microsoft.com/store/apps/9P21XJ9D9G66)
[![Get it from Windows Package Manager](https://custom-icon-badges.herokuapp.com/badge/Get_It_via_Winget_(Nightly)_-100000?style=for-the-badge&logo=winstall)](https://winstall.app/apps/CiderCollective.Cider)
[![Get it from Windows Package Manager](https://custom-icon-badges.herokuapp.com/badge/Get_It_via_Winget_-100000?style=for-the-badge&logo=winstall)](https://winstall.app/apps/CiderCollective.Cider)
[![Get it from Windows Package Manager](https://custom-icon-badges.herokuapp.com/badge/Get_It_via_Winget_(Nightly)_-100000?style=for-the-badge&logo=winstall)](https://winstall.app/apps/CiderCollective.Cider.Nightly)
[![Get it from Chocolatey Package Manager](https://custom-icon-badges.herokuapp.com/badge/Get_It_via_Chocolatey_-100000?style=for-the-badge&logo=chocolatey)](https://community.chocolatey.org/packages/cider)
<!--
[![Get it from Windows Package Manager](https://custom-icon-badges.herokuapp.com/badge/Get_It_via_Winget_(Nightly)_-100000?style=for-the-badge&logo=winstall)](https://winstall.app/apps/CiderCollective.Cider.Nightly)

View file

@ -73,7 +73,7 @@
"request": "^2.88.2",
"run-script-os": "^1.1.6",
"source-map-support": "^0.5.21",
"ts-md5": "^1.2.11",
"ts-md5": "1.2.11",
"v8-compile-cache": "^2.3.0",
"wallpaper": "5.0.1",
"ws": "^8.8.1",

View file

@ -2,7 +2,7 @@
"i18n.languageName": "Engwish (OwO)",
"i18n.languageNameEnglish": "Engwish (OwO)",
"i18n.category": "fun",
"i18n.authors": "@deerwithacurl @gamingliamstudios",
"i18n.authors": "@deerwithacurl @gamingliamstudios @ctaetcsh",
"app.name": "Cidew",
"date.format": "${m} ${d}, ${y}",
"dialog.cancel": "Cancew",
@ -62,6 +62,7 @@
"term.stop": "Stop",
"term.previous": "Pwevious",
"term.next": "Nyext",
"term.skip": "Skip",
"term.shuffle": "Shuffwe",
"term.enableShuffle": "Enyabwe shuffwe",
"term.disableShuffle": "Disabwe shuffwe",
@ -142,7 +143,7 @@
"term.amLive": "Appwe Music Wive",
"term.language": "Wanguage",
"term.funLanguages": "Fun",
"term.noLyrics": "Instwumentaw Twack / Nyo Wywics.",
"term.noLyrics": ">w< Sowwy Wowwy.. N-Nyo Wywics Avaiwabwe",
"term.copyright": "Copywight",
"term.rightsReserved": "Aww Wights Wesewved.",
"term.sponsor": "Sponsow this pwoject",

View file

@ -317,7 +317,7 @@
"menubar.options.toggledevtools": "Toggle Developer Tools",
"menubar.options.window": "Window",
"menubar.options.minimize": "Minimize",
"menubar.options.plugins": "Plu-gins Menu",
"menubar.options.plugins": "Plugins Menu",
"menubar.options.controls": "Controls",
"menubar.options.volumeup": "Volume Up",
"menubar.options.volumedown": "Volume Down",

View file

@ -2,7 +2,7 @@
"i18n.languageName": "Português (Portugal)",
"i18n.languageNameEnglish": "Portuguese (Portugal)",
"i18n.category": "main",
"i18n.authors": "@pgalhardo",
"i18n.authors": "@pgalhardo @hugok79",
"app.name": "Cider",
"date.format": "${m} ${d}, ${y}",
"dialog.cancel": "Cancelar",
@ -31,8 +31,12 @@
"term.miniplayer": "Mini-leitor",
"term.history": "Histórico",
"term.search": "Pesquisa",
"term.scroll": "Modo de deslocamento",
"term.scroll.infinite": "Infinito",
"term.scroll.paged": "${songsPerPage} por página",
"term.live": "AO VIVO",
"term.showSearch": "Mostrar a barra de pesquisa",
"term.hideSearch": "Esconder a barar de pesquisa",
"term.hideSearch": "Ocultar a barra de pesquisa",
"term.library": "Biblioteca",
"term.listenNow": "Ouvir agora",
"term.browse": "Explorar",
@ -58,6 +62,7 @@
"term.stop": "Parar",
"term.previous": "Anterior",
"term.next": "Seguinte",
"term.skip": "Ignorar",
"term.shuffle": "Modo aleatório",
"term.enableShuffle": "Ativar modo aleatório",
"term.disableShuffle": "Desativar modo aleatório",
@ -136,14 +141,13 @@
"term.recentStations": "Estações recentes",
"term.personalStations": "Estações pessoais",
"term.amLive": "Apple Music Live",
"term.live": "AO VIVO",
"term.language": "Idioma",
"term.funLanguages": "Divertido",
"term.noLyrics": "A carregar... / Letra não encontrada. / Instrumental.",
"term.copyright": "Copyright",
"term.noLyrics": "Música instrumental / Sem letra.",
"term.copyright": "Direitos de autor",
"term.rightsReserved": "Todos os direitos reservados.",
"term.sponsor": "Patrocine este projecto",
"term.ciderTeam": "Equipa do Cider",
"term.ciderTeam": "Equipa da Cider",
"term.developer": "Programador",
"term.socialTeam": "Equipa social",
"term.socials": "Redes sociais",
@ -181,6 +185,7 @@
"term.top": "Top",
"term.version": "Versão",
"term.noVideos": "Não foram encontrados vídeos.",
"term.plugins": "Plug-ins",
"term.plugin": "Plug-in",
"term.pluginMenu": "Menu de plug-ins",
"term.pluginMenu.none": "Sem plug-ins interactivos",
@ -207,8 +212,12 @@
"term.zoomout": "Diminuir o zoom",
"term.zoomreset": "Repor zoom",
"term.fullscreen": "Ecrã inteiro",
"term.nowPlaying": "Em reprodução",
"home.syncFavorites": "Sincronizar favoritos",
"home.syncFavorites.gettingArtists": "A obter os artistas favoritos...",
"action.favorite": "Adicionar favorito",
"action.removeFavorite": "Remover favorito",
"action.refresh": "Atualizar",
"home.title": "Início",
"home.recentlyPlayed": "Reproduzido recentemente",
"home.recentlyAdded": "Adicionado recentemente",
@ -229,8 +238,6 @@
"podcast.episodes": "Episódios",
"podcast.playEpisode": "Reproduzir episódio",
"podcast.website": "Website do Podcast",
"action.favorite": "Adicionar favorito",
"action.removeFavorite": "Remover favorito",
"action.hideLibrary": "Ocultar biblioteca",
"action.showLibrary": "Mostrar biblioteca",
"action.cut": "Cortar",
@ -239,6 +246,7 @@
"action.delete": "Apagar",
"action.edit": "Editar",
"action.done": "Concluído",
"action.submit": "Submeter",
"action.editTracklist": "Editar lista de reprodução",
"action.addToLibrary": "Adicionar à biblioteca",
"action.addToLibrary.success": "Adicionado à biblioteca",
@ -412,10 +420,10 @@
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E68_2": "Uji Matcha Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.E168_1": "Jasmine Macchiato",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z3600": "Hokkaido Milk Tea",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Moonwight Softcake",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500A": "Moonlight Softcake",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Brown Sugar Creme Brûlée Milk",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500B": "Clafoutis aux Cerises",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.Z8500C": "Uji Matcha Mochi",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.BSCBM": "Brown Sugar Creme Brûlée Milk",
"settings.option.audio.enableAdvancedFunctionality.atmosphereRealizerMode.CUDDLE": "Cuddle Warmth",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE": "Cider Adrenaline Processor™",
"settings.option.audio.enableAdvancedFunctionality.ciderPPE.description": "Melhora a qualidade de áudio percecionada do áudio codificado em AAC, utilizando um algoritmo de tempo real que tira partido tanto dos modelos psicoacústicos da audição humana como das características de codificação do AAC.",
@ -449,11 +457,6 @@
"settings.header.visual": "Aparência",
"settings.header.visual.description": "Ajustar as definições visuais do Cider.",
"settings.option.visual.windowStyle": "Estilo da janela",
"settings.option.visual.customAccentColor": "Cor de destaque personalizada",
"settings.option.visual.accentColor": "Cor de destaque",
"settings.option.visual.purplePodcastPlaybackBar": "Barra de reprodução roxa para Podcasts",
"settings.option.visual.windowColor": "Tonalidade da cor da janela",
"settings.header.visual.windowBackgroundStyle.color": "Tonalidade da cor",
"settings.option.visual.windowBackgroundStyle": "Estilo do fundo da janela",
"settings.header.visual.windowBackgroundStyle.none": "Nenhum",
"settings.header.visual.windowBackgroundStyle.artwork": "Grafismo",
@ -483,6 +486,7 @@
"settings.prompt.visual.theme.github.URL": "Introduza o URL do tema que pretende instalar",
"settings.prompt.visual.theme.uninstallTheme": "Tem a certeza de que pretende desinstalar {{ theme }}?",
"settings.option.visual.theme.checkForUpdates": "Procurar por atualizações",
"settings.header.visual.styles": "Estilos",
"settings.option.visual.theme.manageStyles": "Gerir estilos",
"settings.option.visual.theme.uninstall": "Desinstalar",
"settings.option.visual.theme.viewInfo": "Ver informação",
@ -523,8 +527,8 @@
"settings.option.connectivity.discordRPC": "Discord Rich Presence",
"settings.option.connectivity.discordRPC.clientName": "Nome do cliente",
"settings.option.connectivity.discordRPC.clearOnPause": "Limpar o Discord Rich Presence ao colocar em pausa",
"settings.option.connectivity.discordRPC.hideButtons": "Esconder botões no Discord Rich Presence",
"settings.option.connectivity.discordRPC.hideTimestamp": "Esconder timestamp no Discord Rich Presence",
"settings.option.connectivity.discordRPC.hideButtons": "Ocultar botões no Discord Rich Presence",
"settings.option.connectivity.discordRPC.hideTimestamp": "Ocultar timestamp no Discord Rich Presence",
"settings.option.connectivity.discordRPC.detailsFormat": "Formato dos detalhes",
"settings.option.connectivity.discordRPC.stateFormat": "Formato do estado",
"settings.option.connectivity.discordRPC.reload": "Reiniciar o DiscordRPC",
@ -534,7 +538,13 @@
"settings.option.connectivity.lastfmScrobble.nowPlaying": "Ativar Last.fm Now Playing",
"settings.option.connectivity.lastfmScrobble.removeFeatured": "Remover artistas do título da música (Last.fm)",
"settings.option.connectivity.lastfmScrobble.filterLoop": "Filtrar música em loop (Last.fm)",
"settings.header.debug": "Debug",
"settings.option.connectivity.lastfmScrobble.filterLoop.description": "Impedir que músicas em loop sejam \"scrobbled\" ou apresentadas na lista Now Playing na Last.fm.",
"settings.option.connectivity.lastfmScrobble.filterTypes": "Filtrar tipos de ficheiro (Last.fm)",
"settings.option.connectivity.lastfmScrobble.manualToken": "Introduzir Token Last.fm manualmente",
"settings.notyf.connectivity.lastfmScrobble.connectError": "Ligação à Last.fm expirou",
"settings.notyf.connectivity.lastfmScrobble.connectSuccess": "Ligação à Last.fm bem sucedida",
"settings.notyf.connectivity.lastfmScrobble.connecting": "A estabelecer ligação com a Last.fm...",
"settings.header.debug": "Depurar",
"settings.option.debug.copy_log": "Copiar logs para a área de transferência",
"settings.option.debug.openAppData": "Abrir pasta do Cider",
"settings.header.experimental": "Experimental",
@ -545,11 +555,18 @@
"settings.option.experimental.unknownPlugin.description": "Permitir a instalação de plug-ins de outros repositórios que não o repositório de plug-ins do Cider",
"settings.option.experimental.compactUI": "UI compacta",
"settings.option.window.close_button_hide": "Botão fechar oculta a aplicação",
"settings.option.window.maxElementScale": "Escala máxima de elementos",
"settings.option.experimental.inline_playlists": "Listas de reprodução e álbuns \"inline\"",
"settings.option.advanced.playlistTrackMapping": "Mapeamento de músicas de listas de reprodução",
"settings.option.advanced.playlistTrackMapping.description": "Ativa uma análise profunda das listas de reprodução para determinar que músicas estão em que listas de reprodução. O tempo de construção da cache das listas de reprodução pode aumentar significativamente.",
"settings.option.visual.transparent": "Moldura transparente",
"settings.option.visual.transparent.description": "Necessita de suporte do tema, requer reinício",
"settings.option.visual.customAccentColor": "Cor de destaque personalizada",
"settings.option.visual.accentColor": "Cor de destaque",
"settings.option.visual.purplePodcastPlaybackBar": "Barra de reprodução roxa para Podcasts",
"settings.option.visual.compactArtistHeader": "Cabeçalho compacto do artista",
"settings.option.visual.windowColor": "Tonalidade da cor da janela",
"settings.header.visual.windowBackgroundStyle.color": "Tonalidade da cor",
"settings.header.advanced": "Avançado",
"settings.header.connect": "Sincronização",
"settings.option.connect.link_account": "Ativar a sincronização com o Cider Connect",
@ -565,7 +582,7 @@
"spatial.roomPositions": "Posições na sala",
"spatial.setDimensions": "Definir dimensões",
"spatial.setPositions": "Definir posições",
"spatial.up": "Acima",
"spatial.up": "Em cima",
"spatial.front": "Frente",
"spatial.left": "Esquerda",
"spatial.right": "Direita",
@ -586,5 +603,44 @@
"share.platform.email": "Email",
"share.platform.songLink": "Copiar com song.link",
"share.platform.clipboard": "Copiar ligação",
"about.thanks": "Um grande obrigado à equipa da Cider Collective e a todos os nossos contribuidores."
"about.thanks": "Um grande obrigado à equipa da Cider Collective e a todos os nossos contribuidores.",
"oobe.yes": "Sim",
"oobe.no": "Não",
"oobe.next": "Seguinte",
"oobe.previous": "Anterior",
"oobe.done": "Concluído",
"oobe.amupsell.title": "Antes de iniciar",
"oobe.amupsell.text": "O Cider requer uma subscrição ativa e paga da Apple Music\n´O Cider não funcionará com o Apple Music Voice Plan ou algumas subscrições promocionais experimentais. Se já tem uma subscrição Apple Music qualificada, clique em Seguinte para continuar.",
"oobe.amupsell.subscribeBtn": "Subscrever a Apple Music",
"oobe.amupsell.explainBtn": "Explicação",
"oobe.amupsell.subscribeUrl": "https://apple.co/3MdqJVQ",
"oobe.amupsell.amWebUrl": "https://beta.music.apple.com/",
"oobe.amupsell.promoExplained": "Algumas subscrições promocionais e experimentais não-EUA da Apple Music não têm acesso às API's da Apple Music Web Player necessárias para o funcionamento da Cider. Para verificar se a sua versão experimental ativa irá funcionar com o Cider, vá a <a href='{{ amWebUrl }}'>{{ amWebUrl }}</a> iniciar sessão e tente reproduzir alguma música. Se funcionar, óptimo! Está pronto a usar o Cider, no entanto, se não considerar subscrever a Apple Music aqui: <a href='{{ subscribeUrl }}'>{{ subscribeUrl }}</a>",
"oobe.intro.title": "Benvindo(a) ao Cider",
"oobe.intro.subtitle": "",
"oobe.intro.text": "Vamos preparar algumas coisas para que possa usar o Cider, como gostaria. Pode sempre alterar estas definições mais tarde.",
"oobe.general.title": "Geral",
"oobe.general.subtitle": "",
"oobe.general.text": "",
"oobe.audio.title": "Áudio",
"oobe.audio.subtitle": "",
"oobe.audio.text": "O Cider dispõe de um conjunto personalizado de áudio sintonizado e desenhado que proporciona uma rica experiência áudio de alta qualidade.\nApresentando o Cider Adrenalina, Realizador de Atmosfera, e Áudio Espacializado.\nPara ativar esta funcionalidade a \"Funcionalidade de áudio avançada\" deve ser ativada.\nA ativação da funcionalidade de áudio avançada dar-lhe-á acesso a estes melhoramentos no Cider Audio Lab, encontrados nas definições da aplicação.",
"oobe.audio.advancedFunctionality": "",
"oobe.visual.title": "Aparência",
"oobe.visual.subtitle": "",
"oobe.visual.text": "",
"oobe.visual.layout.text": "O Cider apresenta duas disposições diferentes de janela.\nO Maverick é uma disposição semelhante à do iTunes com o leitor no topo da janela.\nMojave é uma nova alternativa criada pela Cider Collective.\n\nPode alterar a disposição em qualquer altura nas definições.",
"oobe.visual.suggestingThemes": "Os temas são uma óptima forma de personalizar a sua experiência. Aqui estão alguns que sugerimos: ",
"oobe.visual.suggestingThemes.subtext": "(Estes temas serão descarregados do GitHub)",
"oobe.visual.suggestingThemes.default": "Cider",
"oobe.visual.suggestingThemes.default.text": "O tema clássico Cider.",
"oobe.visual.suggestingThemes.dark": "Escuro",
"oobe.visual.suggestingThemes.dark.text": "Escuridão.",
"oobe.visual.suggestingThemes.community1": "Groovy",
"oobe.visual.suggestingThemes.community1.text": "Um tema de influência WinUI",
"oobe.visual.suggestingThemes.community2": "iTheme",
"oobe.visual.suggestingThemes.community2.text": "A disposição clássica big fruit.",
"oobe.visual.suggestingThemes.community3": "Dracula",
"oobe.visual.suggestingThemes.community3.text": "O esquema de cores icónico Dracula.",
"oobe.amsignin.title": ""
}

View file

@ -1444,15 +1444,13 @@ export class BrowserWindow {
if ((process.platform === "darwin" || utils.getStoreValue("general.close_button_hide")) && !isQuitting) {
e.preventDefault();
win.hide();
}
});
win.on("closed", (_: any) => {
} else {
win.webContents.executeJavaScript(`
window.localStorage.setItem("currentTrack", JSON.stringify(app.mk.nowPlayingItem));
window.localStorage.setItem("currentTime", JSON.stringify(app.mk.currentPlaybackTime));
window.localStorage.setItem("currentQueue", JSON.stringify(app.mk.queue._unplayedQueueItems));
ipcRenderer.send('stopGCast','');`);
}
});
app.on("before-quit", () => {

View file

@ -87,29 +87,43 @@ export default class RAOP {
private ondeviceup(name: any, host: any, port: any, addresses: any, text: any, airplay2: any = null) {
// console.log(this.castDevices.findIndex((item: any) => {return (item.name == host.replace(".local","") && item.port == port )}))
let shown_name = (host ?? "Unknown").replace(".local", "");
try {
let model = text.filter((u: any) => String(u).startsWith("model="));
let manufacturer = text.filter((u: any) => String(u).startsWith("manufacturer="));
let name1 = text.filter((u: any) => String(u).startsWith("name="));
if (name1.length > 0) {
shown_name = name1[0].split("=")[1];
} else if (manufacturer.length > 0) {
shown_name = (manufacturer.length > 0 ? manufacturer[0].substring(13) : "") + " " + (model.length > 0 ? model[0].substring(6) : "");
shown_name = shown_name.trim().length > 1 ? shown_name : (host ?? "Unknown").replace(".local", "");
}
} catch (e) {}
let host_name = addresses != null && typeof addresses == "object" && addresses.length > 0 ? addresses[0] : typeof addresses == "string" ? addresses : "";
if (
this.castDevices.findIndex((item: any) => {
return item != null && item.name == (host ?? "Unknown").replace(".local", "") && item.port == port && item.host == (addresses ? addresses[0] : "");
return item != null && item.name == shown_name && item.port == port && item.host == host_name && item.host != "Unknown";
}) == -1
) {
this.castDevices.push({
name: (host ?? "Unknown").replace(".local", ""),
host: addresses ? addresses[0] : "",
name: shown_name,
host: host_name,
port: port,
addresses: addresses,
txt: text,
airplay2: airplay2,
});
if (this.devices.indexOf(host) === -1) {
this.devices.push(host);
}
if (name) {
this._win.webContents.executeJavaScript(`console.log('deviceFound','ip: ${host} name:${name}')`).catch((err: any) => console.error(err));
console.log("deviceFound", host, name);
// if (this.devices.indexOf(host_name) === -1) {
// this.devices.push(host_name);
// }
if (shown_name) {
this._win.webContents.executeJavaScript(`console.log('deviceFound','ip: ${host_name} name:${shown_name}')`).catch((err: any) => console.error(err));
console.log("deviceFound", host_name, shown_name);
}
} else {
this._win.webContents.executeJavaScript(`console.log('deviceFound (added)','ip: ${host} name:${name}')`).catch((err: any) => console.error(err));
console.log("deviceFound (added)", host, name);
this._win.webContents.executeJavaScript(`console.log('deviceFound (added)','ip: ${host_name} name:${shown_name}')`).catch((err: any) => console.error(err));
console.log("deviceFound (added)", host_name, shown_name);
}
}
@ -142,7 +156,7 @@ export default class RAOP {
});
electron.ipcMain.on("getAirplayDevice", (event, data) => {
this.castDevices = [];
// this.castDevices = [];
console.log("scan for airplay devices");
const browser = this.mdns.createBrowser(this.mdns.tcp("raop"));

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="48px" height="48px"><path d="M21.74 19.71c-.53.06-2.08-2.47-2.08-2.47 0 1.47-.75 3.38-2.37 4.77-6.21-1.8-10.58 0-10.58 0-1.62-1.39-2.37-3.3-2.37-4.77 0 0-1.55 2.53-2.08 2.47-.25-.03-.58-1.39.43-4.67l.08-.28c.25-.76.52-1.51.72-1.99l.13-.33.94-2.36c-.01-.03-.02-.56-.02-.84C4.54 4.63 6.7 0 12 0s7.46 4.63 7.46 9.24c0 .27-.01.8-.01.84l.99 2.52.07.17-.06-.17-.03-.1c.01.03.03.07.04.1.27.71.53 1.44.85 2.44 1.01 3.28.68 4.64.43 4.67z"/><path fill="#FFF" d="M14.03 3c.72.03 1.27.91 1.23 1.96-.04 1.06-.65 1.88-1.37 1.85-.72-.03-1.27-.91-1.23-1.96.03-1.06.65-1.88 1.37-1.85zM9.97 3c.72-.03 1.34.79 1.37 1.85.04 1.05-.51 1.93-1.23 1.96-.72.03-1.33-.79-1.37-1.85C8.7 3.91 9.25 3.03 9.97 3z"/><path fill="#FFCA28" d="M7.46 8.29c.19-.43 2.13-.9 4.53-.9h.02c2.4 0 4.34.48 4.53.9.01.02.01.04.01.07 0 .03-.01.05-.02.08-.17.24-2.32 1.41-4.52 1.41h-.02c-2.2 0-4.35-1.17-4.51-1.41a.114.114 0 0 1-.03-.08c0-.03 0-.05.01-.07z"/><path d="M17.79 16.92c-.22 3.67-2.38 5.98-5.72 6.02h-.14c-3.34-.04-5.5-2.35-5.72-6.02-.08-1.35 0-2.5.15-3.43.31.06.63.12.95.17v3.51s1.64.33 3.28.1v-3.22c.49.02.96.04 1.4.03h.02c.27 0 .55 0 .83-.01h.02c1.48-.05 3.14-.26 4.76-.58h.02c.15.93.23 2.08.15 3.43zM7.463 8.293v.001zM10.494 5.804c.31-.041.537-.409.503-.825s-.311-.72-.623-.679c-.31.04-.536.409-.503.824.033.417.312.72.623.68zm3.963-.648c.077.037.219.042.286-.146.035-.095.025-.165-.009-.214-.023-.033-.132-.118-.368-.176-.896-.22-1.329.384-1.392.499-.04.072-.012.176.056.227.067.051.138.037.177-.006.575-.628 1.199-.208 1.25-.184z"/><path fill="#D32F2F" d="M19.45 10.08c-9.02 1.99-14.89 0-14.89 0l-.94 2.36c1.16.78 2.74 1.05 2.74 1.05.31.06.63.12.95.17v3.51s1.64.33 3.28.1v-3.22c.49.02.96.04 1.4.03h.02c.27 0 .55 0 .83-.01H12.96c1.69.02 3.31-.24 4.66-.58h.02c1.23-.31 2.22-.66 2.8-.89h.02l-1.01-2.52z"/><path fill="#FFCA28" d="M19.42 23.62c-.34.58-5.83.37-7.42.19-1.58.18-7.07.39-7.41-.19-.08-.13-.14-.46.29-.78.48-.35 1.23-.64 1.83-.83 0 0 4.37-1.8 10.58 0 .61.19 1.35.48 1.83.83.43.32.37.65.3.78z"/><path fill="#FFF" d="M17.79 16.92c-.22 3.67-2.38 5.98-5.72 6.02h-.14c-3.34-.04-5.5-2.35-5.72-6.02-.08-1.35 0-2.5.15-3.43.31.06.63.12.95.17v3.51s1.64.33 3.28.1v-3.22c.49.02.96.04 1.4.03h.02c.27 0 .55 0 .83-.01H12.96c1.69.02 3.31-.24 4.66-.58h.02c.15.93.23 2.08.15 3.43z"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View file

@ -426,8 +426,9 @@ const CiderAudio = {
let dataLength = audioRawData[0]?.length ?? 0;
for (let idx=0; idx<dataLength; idx++) {
for (let channel=0; channel < numberOfChannels; channel++) {
try {
let value = audioRawData[channel][idx];
this._buffers[channel][this._bytesWritten] = value;
this._buffers[channel][this._bytesWritten] = value;} catch(e){}
}
this._bytesWritten += 1;
}
@ -967,28 +968,29 @@ const CiderAudio = {
return;
} // do nothing if there's no processing lmao
app.cfg.audio.maikiwiAudio.staticOptimizer.lock = true; // Lock CiderAudio from performing hierarchical loading.
CiderAudioRenderer.init(() => console.log("CARenderer Called back"));
CiderAudioRenderer.init();
app.cfg.audio.maikiwiAudio.staticOptimizer.lock = true; // Lock CiderAudio from performing hierarchical loading.
if (MusicKit.getInstance().isPlaying) {
MusicKit.getInstance().pause(); // Pause first
}
const res = CiderAudioRenderer.hierarchical_optimizer();
CiderAudioRenderer.off(); // Clean up IMMEDIATELY
CiderAudio.audioNodes.optimizedNode = CiderAudio.context.createConvolver();
CiderAudio.audioNodes.optimizedNode.normalize = false;
CiderAudio.audioNodes.optimizedNode.buffer = res; // Load the sucker up
const res = CiderAudioRenderer.hierarchical_optimizer().then((res) => {
CiderAudio.audioNodes.optimizedNode.buffer = res;
});
// Load the sucker up
CiderAudio.hierarchical_unloading();
CiderAudio.audioNodes.gainNode.connect(CiderAudio.audioNodes.optimizedNode);
CiderAudio.audioNodes.optimizedNode.connect(CiderAudio.context.destination);
console.debug("[Cider][Audio]\n" + [...configMap.entries()] + "\n lastNode: " + lastNode);
console.debug("[Cider][Audio] Finished hierarchical loading + Optimizing");
if (MusicKit.getInstance().nowPlayingItem != null) {

View file

@ -30,7 +30,11 @@ const CiderAudioRenderer = {
};
} catch (e) {}
},
init: function () {
init: function (
cb = function () {
console.log("CARenderer init");
}
) {
CiderAudioRenderer.context = new OfflineAudioContext({
numberOfChannels: 2,
length: 96000 * 8,
@ -42,6 +46,7 @@ const CiderAudioRenderer = {
CiderAudioRenderer.audioNodes.intelliGainComp.gain.value = 1;
CiderAudioRenderer.audioNodes.intelliGainComp.connect(CiderAudioRenderer.audioNodes.gainNode);
CiderAudioRenderer.hierarchical_loading();
cb();
},
optimizerProfile: [
{
@ -52,165 +57,17 @@ const CiderAudioRenderer = {
container: "WAV",
},
],
spatialProfiles: [
{
id: "maikiwi",
file: "./cideraudio/impulses/CiderSpatial_Maikiwi.wav",
name: "Maikiwi",
description: "",
gainComp: "1.044",
},
{
id: "maikiwiplus",
file: "./cideraudio/impulses/CiderSpatial_MaikiwiPlus.wav",
name: "Maikiwi+",
description: "",
gainComp: "1.044",
},
{
id: "71_420maikiwi",
file: "./cideraudio/impulses/CiderSpatial_v71.420_Maikiwi.wav",
name: "Soundstage",
description: "",
gainComp: "1.3963683610559376",
},
{
id: "70_422maikiwi",
file: "./cideraudio/impulses/CiderSpatial_v70.422_Maikiwi.wav",
name: "Separation",
description: "",
gainComp: "1.30767553892022",
},
{
id: "standard",
file: "./cideraudio/impulses/CiderSpatial_Natural.wav",
name: "Minimal",
description: "",
gainComp: "1.044",
},
{
id: "standardplus",
file: "./cideraudio/impulses/CiderSpatial_Natural+.wav",
name: "Minimal+",
description: "",
gainComp: "1.044",
},
{
id: "diffused",
file: "./cideraudio/impulses/CiderSpatial_Diffuse.wav",
name: "Diffused",
description: "",
gainComp: "1.044",
},
{
id: "BPLK",
file: "./cideraudio/impulses/CiderSpatial_BPLK.wav",
name: "BPLK",
description: "",
gainComp: "1.044",
},
{
id: "HW2K",
file: "./cideraudio/impulses/CiderSpatial_HW2K.wav",
name: "HW2K",
description: "",
gainComp: "1.044",
},
{
id: "live",
file: "./cideraudio/impulses/CiderSpatial_LIVE_2.wav",
name: "live",
description: "",
gainComp: "1.2647363474711515",
},
],
atmosphereRealizerProfiles: [
{
id: "NATURAL_STANDARD",
file: "./cideraudio/impulses/AtmosphereRealizer_NaturalStandard.wav",
name: "ほうじ茶チーズクリーマティー",
description: "",
},
{
id: "NATURAL_PLUS",
file: "./cideraudio/impulses/AtmosphereRealizer_Natural+.wav",
name: "玄米茶タピオカミルクティー",
description: "",
},
{
id: "E68_1",
file: "./cideraudio/impulses/AtmosphereRealizer_E68_1.5.wav",
name: "岩塩クリームチーズティー",
description: "Light",
},
{
id: "E68_2",
file: "./cideraudio/impulses/AtmosphereRealizer_E68_2.2.wav",
name: "抹茶ミルクティー",
description: "Dark",
},
{
id: "BSCBM",
file: "./cideraudio/impulses/AtmosphereRealizer_BSCBM.wav",
name: "BSCBM",
description: "BSCBM",
},
{
id: "CUDDLE",
file: "./cideraudio/impulses/AtmosphereRealizer_Cuddle.wav",
name: "CUDDLE",
description: "CUDDLE",
},
{
id: "E168_1",
file: "./cideraudio/impulses/AtmosphereRealizer_E168_1.2.wav",
name: "春毫ジャスミンマキアート",
description: "Natural Air",
},
{
id: "Z3600",
file: "./cideraudio/impulses/AtmosphereRealizer_Z3600.wav",
name: "ロイヤルミルクティー",
description: "3600",
},
{
id: "Z8500A",
file: "./cideraudio/impulses/AtmosphereRealizer_Z8500_A.wav",
name: "ムーンライトソフトケーキ",
description: "8500",
},
{
id: "Z8500B",
file: "./cideraudio/impulses/AtmosphereRealizer_Z8500_B.wav",
name: "Clafoutis aux Cerises",
description: "8500",
},
{
id: "Z8500C",
file: "./cideraudio/impulses/AtmosphereRealizer_Z8500_C.wav",
name: "宇治抹茶だいふく",
description: "8500",
},
],
opportunisticCorrectionProfiles: [
{
id: "CHU",
file: "./cideraudio/impulses/MoondropCHU_Cider.wav",
name: "Moondrop CHU Specific",
description: "",
},
],
spatial_ninf: function () {
CiderAudioRenderer.audioNodes.spatialNode = null;
CiderAudioRenderer.audioNodes.spatialNode = CiderAudioRenderer.context.createConvolver();
CiderAudioRenderer.audioNodes.spatialNode.normalize = false;
let spatialProfile = CiderAudioRenderer.spatialProfiles.find(function (profile) {
let spatialProfile = CiderAudio.spatialProfiles.find(function (profile) {
return profile.id === app.cfg.audio.maikiwiAudio.spatialProfile;
});
if (spatialProfile === undefined) {
spatialProfile = CiderAudioRenderer.spatialProfiles[0];
spatialProfile = CiderAudio.spatialProfiles[0];
}
fetch(spatialProfile.file).then(async (impulseData) => {
let bufferedImpulse = await impulseData.arrayBuffer();
@ -223,7 +80,7 @@ const CiderAudioRenderer = {
spatialOff: function () {
CiderAudioRenderer.hierarchical_loading();
},
intelliGainComp_n0_0: function () {
intelliGainComp_n0_0: async function () {
let filters = [];
const precisionHz = 12;
// Biquad calculation
@ -250,18 +107,16 @@ const CiderAudioRenderer = {
filterlessGain = filterlessGain * 1.096478196143185;
}
if (app.cfg.audio.maikiwiAudio.spatial == true) {
let spatialProfile = CiderAudioRenderer.spatialProfiles.find(function (profile) {
let spatialProfile = CiderAudio.spatialProfiles.find(function (profile) {
return profile.id === app.cfg.audio.maikiwiAudio.spatialProfile;
});
if (spatialProfile === undefined) {
spatialProfile = CiderAudioRenderer.spatialProfiles[0];
spatialProfile = CiderAudio.spatialProfiles[0];
}
filterlessGain = filterlessGain * spatialProfile.gainComp;
}
filterlessGain = Math.pow(10, (-1 * (20 * Math.log10(filterlessGain))) / 20).toFixed(4);
filterlessGain > 1.0
? CiderAudioRenderer.audioNodes.intelliGainComp.gain.exponentialRampToValueAtTime(1.0, CiderAudioRenderer.context.currentTime + 0.3)
: CiderAudioRenderer.audioNodes.intelliGainComp.gain.exponentialRampToValueAtTime(filterlessGain, CiderAudioRenderer.context.currentTime + 0.3);
filterlessGain > 1.0 ? (CiderAudioRenderer.audioNodes.intelliGainComp.gain.value = 1) : (CiderAudioRenderer.audioNodes.intelliGainComp.gain.value = filterlessGain);
console.debug(`[Cider][Audio] IntelliGainComp: ${filterlessGain > 1.0 ? 0 : (20 * Math.log10(filterlessGain)).toFixed(2)} dB (${filterlessGain > 1.0 ? 1 : filterlessGain})`);
return;
}
@ -307,11 +162,11 @@ const CiderAudioRenderer = {
maxGain = maxGain * 1.096478196143185;
}
if (app.cfg.audio.maikiwiAudio.spatial == true) {
let spatialProfile = CiderAudioRenderer.spatialProfiles.find(function (profile) {
let spatialProfile = CiderAudio.spatialProfiles.find(function (profile) {
return profile.id === app.cfg.audio.maikiwiAudio.spatialProfile;
});
if (spatialProfile === undefined) {
spatialProfile = CiderAudioRenderer.spatialProfiles[0];
spatialProfile = CiderAudio.spatialProfiles[0];
}
maxGain = maxGain * spatialProfile.gainComp;
}
@ -325,12 +180,12 @@ const CiderAudioRenderer = {
if (status === true) {
CiderAudioRenderer.audioNodes.atmosphereRealizer2 = CiderAudioRenderer.context.createConvolver();
CiderAudioRenderer.audioNodes.atmosphereRealizer2.normalize = false;
let atmosphereRealizerProfile = CiderAudioRenderer.atmosphereRealizerProfiles.find(function (profile) {
let atmosphereRealizerProfile = CiderAudio.atmosphereRealizerProfiles.find(function (profile) {
return profile.id === app.cfg.audio.maikiwiAudio.atmosphereRealizer2_value;
});
if (atmosphereRealizerProfile === undefined) {
atmosphereRealizerProfile = CiderAudioRenderer.atmosphereRealizerProfiles[0];
atmosphereRealizerProfile = CiderAudio.atmosphereRealizerProfiles[0];
}
fetch(atmosphereRealizerProfile.file).then(async (impulseData) => {
let bufferedImpulse = await impulseData.arrayBuffer();
@ -393,12 +248,12 @@ const CiderAudioRenderer = {
if (status === true) {
CiderAudioRenderer.audioNodes.atmosphereRealizer1 = CiderAudioRenderer.context.createConvolver();
CiderAudioRenderer.audioNodes.atmosphereRealizer1.normalize = false;
let atmosphereRealizerProfile = CiderAudioRenderer.atmosphereRealizerProfiles.find(function (profile) {
let atmosphereRealizerProfile = CiderAudio.atmosphereRealizerProfiles.find(function (profile) {
return profile.id === app.cfg.audio.maikiwiAudio.atmosphereRealizer1_value;
});
if (atmosphereRealizerProfile === undefined) {
atmosphereRealizerProfile = CiderAudioRenderer.atmosphereRealizerProfiles[0];
atmosphereRealizerProfile = CiderAudio.atmosphereRealizerProfiles[0];
}
fetch(atmosphereRealizerProfile.file).then(async (impulseData) => {
let bufferedImpulse = await impulseData.arrayBuffer();
@ -461,12 +316,12 @@ const CiderAudioRenderer = {
if (status === true) {
CiderAudioRenderer.audioNodes.opportunisticCorrection = CiderAudioRenderer.context.createConvolver();
CiderAudioRenderer.audioNodes.opportunisticCorrection.normalize = false;
let opportunisticCorrectionProfile = CiderAudioRenderer.opportunisticCorrectionProfiles.find(function (profile) {
let opportunisticCorrectionProfile = CiderAudio.opportunisticCorrectionProfiles.find(function (profile) {
return profile.id === app.cfg.audio.maikiwiAudio.opportunisticCorrection_state;
});
if (opportunisticCorrectionProfile === undefined) {
opportunisticCorrectionProfile = CiderAudioRenderer.opportunisticCorrectionProfiles[0];
opportunisticCorrectionProfile = CiderAudio.opportunisticCorrectionProfiles[0];
}
fetch(opportunisticCorrectionProfile.file).then(async (impulseData) => {
let bufferedImpulse = await impulseData.arrayBuffer();
@ -758,25 +613,22 @@ const CiderAudioRenderer = {
}
}
},
hierarchical_optimizer: function () {
CiderAudioRenderer.intelliGainComp_n0_0(); // Calculate headroom for upcoming convolver
hierarchical_optimizer: async function () {
await CiderAudioRenderer.intelliGainComp_n0_0(); // Calculate headroom for upcoming convolver
// Render and return convolved buffer
let optimizerProfile = CiderAudioRenderer.optimizerProfile.find(function (profile) {
return profile.id === "dirac32_96"; // Hard code for now
});
return fetch(optimizerProfile.file)
fetch(optimizerProfile.file)
.then(async (response) => await response.arrayBuffer())
.then((arrayBuffer) => CiderAudioRenderer.context.decodeAudioData(arrayBuffer))
.then((arrayBuffer) => CiderAudio.context.decodeAudioData(arrayBuffer))
.then((decodedBuffer) => {
const source = new AudioBufferSourceNode(CiderAudioRenderer.context, {
buffer: decodedBuffer,
});
const source = CiderAudioRenderer.context.createBufferSource();
source.buffer = decodedBuffer;
source.connect(CiderAudioRenderer.audioNodes.intelliGainComp);
switch (lastNode) {
switch (app.cfg.audio.maikiwiAudio.lastNode) {
case "spatial":
CiderAudioRenderer.audioNodes.gainNode.connect(CiderAudioRenderer.audioNodes.spatialNode);
break;
@ -800,34 +652,34 @@ const CiderAudioRenderer = {
break;
}
switch (firstNode) {
switch (app.cfg.audio.maikiwiAudio.firstNode) {
case "spatial":
CiderAudioRenderer.audioNodes.spatialNode.disconnect();
CiderAudioRenderer.audioNodes.spatialNode.connect(renderer.destination);
CiderAudioRenderer.audioNodes.spatialNode.connect(CiderAudioRenderer.destination);
break;
case "n6":
CiderAudioRenderer.audioNodes.atmosphereRealizer2.disconnect();
CiderAudioRenderer.audioNodes.atmosphereRealizer2.connect(renderer.destination);
CiderAudioRenderer.audioNodes.atmosphereRealizer2.connect(CiderAudioRenderer.destination);
break;
case "n5":
CiderAudioRenderer.audioNodes.atmosphereRealizer1.disconnect();
CiderAudioRenderer.audioNodes.atmosphereRealizer1.connect(renderer.destination);
CiderAudioRenderer.audioNodes.atmosphereRealizer1.connect(CiderAudioRenderer.destination);
break;
case "n4":
CiderAudioRenderer.audioNodes.vibrantbassNode.at(-1).disconnect();
CiderAudioRenderer.audioNodes.vibrantbassNode.at(-1).connect(renderer.destination);
CiderAudioRenderer.audioNodes.vibrantbassNode.at(-1).connect(CiderAudioRenderer.destination);
break;
case "n3":
CiderAudioRenderer.audioNodes.audioBands.at(-1).disconnect();
CiderAudioRenderer.audioNodes.audioBands.at(-1).connect(renderer.destination);
CiderAudioRenderer.audioNodes.audioBands.at(-1).connect(CiderAudioRenderer.destination);
break;
case "n2":
CiderAudioRenderer.audioNodes.opportunisticCorrection.disconnect();
CiderAudioRenderer.audioNodes.opportunisticCorrection.connect(renderer.destination);
CiderAudioRenderer.audioNodes.opportunisticCorrection.connect(CiderAudioRenderer.destination);
break;
case "n1":
CiderAudioRenderer.audioNodes.llpw.at(-1).disconnect();
CiderAudioRenderer.audioNodes.llpw.at(-1).connect(renderer.destination);
CiderAudioRenderer.audioNodes.llpw.at(-1).connect(CiderAudioRenderer.destination);
break;
}

View file

@ -902,6 +902,7 @@ input[type="range"].web-slider::-webkit-slider-runnable-track {
> ._svg-icon {
--size: var(--iconSize);
flex-shrink: 0;
}
}
@ -1975,6 +1976,10 @@ input[type="range"].web-slider.display--small::-webkit-slider-thumb {
&.twitterBtn {
background-color: #1d9bf0;
}
&.qqBtn {
background-color: #d32f2f;
}
}
}

View file

@ -16,7 +16,6 @@
</div>
</div>
<div class="modal-content">
<div style="opacity: 0.8; pointer-events: none" v-if="app.cfg.audio.maikiwiAudio.staticOptimizer.lock === true">
<!-- BANDS = [60, 170, 310, 600, 1000, 3000, 6000, 12000, 14000, 16000]; -->
<div class="inputs-container">
<div class="input-container mini">
@ -97,7 +96,6 @@
</div>
</div>
</div>
</div>
<div class="modal-lowercontent">
<div class="row">
<div class="col">
@ -336,9 +334,11 @@
}
},
changeFreq(i) {
if (app.cfg.audio.maikiwiAudio.staticOptimizer.lock === true) { return notyf.error("Static Compilation Mode is enabled.")}
CiderAudio.audioNodes.audioBands[i].frequency.value = app.cfg.audio.equalizer.frequencies[i]
},
changeQ(i) {
if (app.cfg.audio.maikiwiAudio.staticOptimizer.lock === true) { return notyf.error("Static Compilation Mode is enabled.")}
CiderAudio.audioNodes.audioBands[i].Q.value = app.cfg.audio.equalizer.Q[i]
},
resetGain() {

View file

@ -62,16 +62,18 @@
<div class="title text-overflow-elipsis" :title="item.attributes.name">
{{ item.attributes.name }}
</div>
<div class="subtitle text-overflow-elipsis" :title="item.attributes.artistName"
<div class="subtitle text-overflow-elipsis"
style="-webkit-box-orient: horizontal;">
<template v-if="item.attributes.artistName">
<div class="artist item-navigate text-overflow-elipsis"
:title="item.attributes.artistName"
@click="app.searchAndNavigate(item,'artist')">
{{ item.attributes.artistName }}
</div>
<template v-if="item.attributes.albumName">&nbsp;—&nbsp;</template>
<template v-if="item.attributes.albumName">
<div class="artist item-navigate text-overflow-elipsis"
:title="item.attributes.albumName"
@click="app.searchAndNavigate(item,'album')">
{{ item.attributes.albumName }}
</div>

View file

@ -189,11 +189,7 @@
</template>
</div>
<div class="app-sidebar-footer display--small app-sidebar-footer--controls">
<div
class="app-playback-controls"
v-if="$root.mkReady()"
@contextmenu="$root.nowPlayingContextMenu"
>
<div class="app-playback-controls" @contextmenu="$root.nowPlayingContextMenu">
<div class="control-buttons">
<div class="app-chrome-item">
<button
@ -295,15 +291,9 @@
</div>
</div>
</div>
<div
class="app-sidebar-notification backgroundNotification"
v-if="$root.library.backgroundNotification.show"
>
<div class="app-sidebar-notification backgroundNotification" v-if="$root.library.backgroundNotification.show" >
<div class="message">
{{ $root.library.backgroundNotification.message }} ({{
$root.library.backgroundNotification.progress
}}
/ {{ $root.library.backgroundNotification.total }})
{{ $root.library.backgroundNotification.message }} ({{$root.library.backgroundNotification.progress }} / {{ $root.library.backgroundNotification.total }})
</div>
</div>
</div>
@ -311,6 +301,6 @@
<script>
Vue.component("cider-app-sidebar", {
template: "#cider-app-sidebar"
template: "#cider-app-sidebar",
})
</script>

View file

@ -33,6 +33,9 @@
<button onclick="window.open('https://twitter.com/UseCider')" class="md-btn sponsorBtn twitterBtn"><img
src="./assets/twitter.svg" />Twitter
</button>
<button onclick="window.open('https://jq.qq.com/?_wv=1027&k=2VP4cdyo')" class="md-btn sponsorBtn qqBtn"><img
src="./assets/qq.svg" />QQ
</button>
</div>
<div class="col">

View file

@ -28,7 +28,7 @@
</div>
<div class="md-option-segment md-option-segment_auto">
<input type="checkbox" v-model="app.cfg.audio.maikiwiAudio.staticOptimizer.state"
v-on:change="CiderOptimizer()" switch/>
v-on:change="CiderOptimizer()" :disabled="app.cfg.advanced.experiments.includes('staticOptimizer') === false" switch/>
</div>
</div>
<div class="md-option-line">