Merge pull request #1609 from Materialious/update/1.16.23

Update/1.16.23
This commit is contained in:
Ward
2026-03-25 02:46:59 +13:00
committed by GitHub
13 changed files with 157 additions and 66 deletions
+2 -2
View File
@@ -7,8 +7,8 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 239
versionName "1.16.22"
versionCode 240
versionName "1.16.23"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
@@ -81,7 +81,11 @@
<release version="1.16.22" date="2026-3-17">
<release version="1.16.23" date="2026-3-25">
<url>https://github.com/Materialious/Materialious/releases/tag/1.16.23</url>
</release>
<release version="1.16.22" date="2026-3-17">
<url>https://github.com/Materialious/Materialious/releases/tag/1.16.22</url>
</release>
<release version="1.16.21" date="2026-3-17">
+19 -29
View File
@@ -1,29 +1,28 @@
{
"name": "Materialious",
"version": "1.16.21",
"version": "1.16.22",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "Materialious",
"version": "1.16.21",
"version": "1.16.22",
"license": "MIT",
"dependencies": {
"@capacitor-community/electron": "^5.0.0",
"bgutils-js": "^3.2.0",
"capacitor-nodejs": "https://github.com/hampoelz/capacitor-nodejs/releases/download/v1.0.0-beta.9/capacitor-nodejs.tgz",
"chokidar": "~5.0.0",
"electron-is-dev": "~2.0.0",
"electron-serve": "~3.0.0",
"electron-unhandled": "^4.0.1",
"electron-updater": "^6.8.3",
"electron-window-state": "^5.0.3",
"jsdom": "^29.0.0",
"jsdom": "^29.0.1",
"jsonfile": "^6.2.0",
"youtubei.js": "^16.0.1"
"youtubei.js": "^17.0.1"
},
"devDependencies": {
"electron": "^41.0.2",
"electron": "^41.0.3",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.9.3"
@@ -2479,15 +2478,6 @@
"node": ">= 0.4"
}
},
"node_modules/capacitor-nodejs": {
"version": "1.0.0-beta.9",
"resolved": "https://github.com/hampoelz/capacitor-nodejs/releases/download/v1.0.0-beta.9/capacitor-nodejs.tgz",
"integrity": "sha512-4EU/QBolfuyHiMtwd1nxZ4wsK243tGE4VttKvVBG+x1yQuK9EIlEf3lbRjFXfjrJMTZNCqaP6glmdfj9Zo7KVg==",
"license": "MIT",
"peerDependencies": {
"@capacitor/core": ">=7.0.0"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -3115,9 +3105,9 @@
}
},
"node_modules/electron": {
"version": "41.0.2",
"resolved": "https://registry.npmjs.org/electron/-/electron-41.0.2.tgz",
"integrity": "sha512-raotm/aO8kOs1jD8SI8ssJ7EKciQOY295AOOprl1TxW7B0At8m5Ae7qNU1xdMxofiHMR8cNEGi9PKD3U+yT/mA==",
"version": "41.0.3",
"resolved": "https://registry.npmjs.org/electron/-/electron-41.0.3.tgz",
"integrity": "sha512-IDjx8liW1q+r7+MOip5W1Eo1eMwJzVObmYrd9yz2dPCkS7XlgLq3qPVMR80TpiROFp73iY30kTzMdpA6fEVs3A==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -4460,13 +4450,13 @@
"license": "MIT"
},
"node_modules/jsdom": {
"version": "29.0.0",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.0.tgz",
"integrity": "sha512-9FshNB6OepopZ08unmmGpsF7/qCjxGPbo3NbgfJAnPeHXnsODE9WWffXZtRFRFe0ntzaAOcSKNJFz8wiyvF1jQ==",
"version": "29.0.1",
"resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.1.tgz",
"integrity": "sha512-z6JOK5gRO7aMybVq/y/MlIpKh8JIi68FBKMUtKkK2KH/wMSRlCxQ682d08LB9fYXplyY/UXG8P4XXTScmdjApg==",
"license": "MIT",
"dependencies": {
"@asamuzakjp/css-color": "^5.0.1",
"@asamuzakjp/dom-selector": "^7.0.2",
"@asamuzakjp/dom-selector": "^7.0.3",
"@bramus/specificity": "^2.4.2",
"@csstools/css-syntax-patches-for-csstree": "^1.1.1",
"@exodus/bytes": "^1.15.0",
@@ -4480,7 +4470,7 @@
"saxes": "^6.0.0",
"symbol-tree": "^3.2.4",
"tough-cookie": "^6.0.1",
"undici": "^7.24.3",
"undici": "^7.24.5",
"w3c-xmlserializer": "^5.0.0",
"webidl-conversions": "^8.0.1",
"whatwg-mimetype": "^5.0.0",
@@ -6420,9 +6410,9 @@
}
},
"node_modules/undici": {
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz",
"integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==",
"version": "7.24.5",
"resolved": "https://registry.npmjs.org/undici/-/undici-7.24.5.tgz",
"integrity": "sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==",
"license": "MIT",
"engines": {
"node": ">=20.18.1"
@@ -6753,9 +6743,9 @@
}
},
"node_modules/youtubei.js": {
"version": "16.0.1",
"resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-16.0.1.tgz",
"integrity": "sha512-3802bCAGkBc2/G5WUTc0l/bO5mPYJbQAHL04d9hE9PnrDHoBUT8MN721Yqt4RCNncAXdHcfee9VdJy3Fhq1r5g==",
"version": "17.0.1",
"resolved": "https://registry.npmjs.org/youtubei.js/-/youtubei.js-17.0.1.tgz",
"integrity": "sha512-1lO4b8UqMDzE0oh2qEGzbBOd4UYRdxn/4PdpRM7BGTHxM6ddsEsKZTu90jp8V9FHVgC2h1UirQyqoqLiKwl+Zg==",
"funding": [
"https://github.com/sponsors/LuanRT"
],
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "Materialious",
"version": "1.16.22",
"version": "1.16.23",
"description": "Modern material design for YouTube and Invidious.",
"author": {
"name": "Ward Pearce",
@@ -30,12 +30,12 @@
"electron-unhandled": "^4.0.1",
"electron-updater": "^6.8.3",
"electron-window-state": "^5.0.3",
"jsdom": "^29.0.0",
"jsdom": "^29.0.1",
"jsonfile": "^6.2.0",
"youtubei.js": "^16.0.1"
"youtubei.js": "^17.0.1"
},
"devDependencies": {
"electron": "^41.0.2",
"electron": "^41.0.3",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.9.3"
+13 -13
View File
@@ -1,12 +1,12 @@
{
"name": "materialious",
"version": "1.16.21",
"version": "1.16.22",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "materialious",
"version": "1.16.21",
"version": "1.16.22",
"hasInstallScript": true,
"dependencies": {
"@capacitor-community/electron": "^5.0.1",
@@ -14,7 +14,7 @@
"@capacitor/app": "^8.0.1",
"@capacitor/browser": "^8.0.1",
"@capacitor/clipboard": "^8.0.1",
"@capacitor/core": "^8.0.0",
"@capacitor/core": "^8.2.0",
"@capacitor/network": "^8.0.1",
"@capacitor/preferences": "^8.0.1",
"@capacitor/screen-orientation": "^8.0.1",
@@ -87,7 +87,7 @@
"prettier": "^3.6.2",
"prettier-plugin-svelte": "^3.5.0",
"svelte": "^5.53.12",
"svelte-check": "^4.4.4",
"svelte-check": "^4.4.5",
"tslib": "^2.7.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.55.0",
@@ -2268,9 +2268,9 @@
}
},
"node_modules/@capacitor/core": {
"version": "8.1.0",
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.1.0.tgz",
"integrity": "sha512-UfMBMWc1v7J+14AhH03QmeNwV3HZx3qnOWhpwnHfzALEwAwlV/itQOQqcasMQYhOHWL0tiymc5ByaLTn7KKQxw==",
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.2.0.tgz",
"integrity": "sha512-oKaoNeNtH2iIZMDFVrb1atoyRECDGHcfLMunJ5KWN8DtvpVBeeA4c41e20NTuhMxw1cSYbpq2PV2hb+/9CJxlQ==",
"license": "MIT",
"dependencies": {
"tslib": "^2.1.0"
@@ -10286,9 +10286,9 @@
}
},
"node_modules/flatted": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
"integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
"integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"dev": true,
"license": "ISC"
},
@@ -17377,9 +17377,9 @@
}
},
"node_modules/svelte-check": {
"version": "4.4.4",
"resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.4.tgz",
"integrity": "sha512-F1pGqXc710Oi/wTI4d/x7d6lgPwwfx1U6w3Q35n4xsC2e8C/yN2sM1+mWxjlMcpAfWucjlq4vPi+P4FZ8a14sQ==",
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.5.tgz",
"integrity": "sha512-1bSwIRCvvmSHrlK52fOlZmVtUZgil43jNL/2H18pRpa+eQjzGt6e3zayxhp1S7GajPFKNM/2PMCG+DZFHlG9fw==",
"dev": true,
"license": "MIT",
"dependencies": {
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "materialious",
"version": "1.16.22",
"version": "1.16.23",
"private": true,
"scripts": {
"dev": "npm run patch:github && vite dev",
@@ -40,7 +40,7 @@
"prettier": "^3.6.2",
"prettier-plugin-svelte": "^3.5.0",
"svelte": "^5.53.12",
"svelte-check": "^4.4.4",
"svelte-check": "^4.4.5",
"tslib": "^2.7.0",
"typescript": "^5.9.3",
"typescript-eslint": "^8.55.0",
@@ -53,7 +53,7 @@
"@capacitor/app": "^8.0.1",
"@capacitor/browser": "^8.0.1",
"@capacitor/clipboard": "^8.0.1",
"@capacitor/core": "^8.0.0",
"@capacitor/core": "^8.2.0",
"@capacitor/network": "^8.0.1",
"@capacitor/preferences": "^8.0.1",
"@capacitor/screen-orientation": "^8.0.1",
@@ -39,7 +39,7 @@ export async function searchChannelContentInvidious(
search: string,
fetchOptions?: RequestInit
): Promise<ChannelContent> {
const path = buildPath(`channel/${channelId}/search`);
const path = buildPath(`channels/${channelId}/search`);
path.searchParams.set('q', search);
const resp = await fetchErrorHandle(await fetch(path, fetchOptions));
@@ -1,4 +1,6 @@
<script lang="ts">
import { goto } from '$app/navigation';
import { resolve } from '$app/paths';
import { proxyGoogleImage } from '$lib/images';
import { avatarFromChannelId } from '$lib/thumbnail';
import { mergeAttrs } from 'melt';
@@ -22,6 +24,9 @@
<img class="circle small" {...avatar.image} alt="Channel profile" />
<button
class="circle secondary-container"
onclick={() => {
goto(resolve('/channel/[authorId]', { authorId }));
}}
{...mergeAttrs(avatar.fallback, {
style: 'text-transform: uppercase;border-radius: 2.5rem !important;'
})}>{author[0]}</button
@@ -45,8 +45,6 @@
});
function goToItem(uniqueItemId: string) {
feedLastItemId.set(uniqueItemId);
const articleElement = document.getElementById(uniqueItemId);
if (articleElement) {
const clickable = articleElement.querySelector('a, button');
@@ -74,6 +72,8 @@
{@const uniqueItemId = extractUniqueId(item)}
{@const spatialItem = spatialMenu.getItem(item, {
onSelect: () => {
feedLastItemId.set(uniqueItemId);
if ($isAndroidTvStore) goToItem(uniqueItemId);
}
})}
@@ -81,6 +81,8 @@
<article
{...mergeAttrs(spatialItem.attrs, {
onclick: () => {
feedLastItemId.set(uniqueItemId);
if ($isAndroidTvStore) goToItem(uniqueItemId);
},
id: uniqueItemId
@@ -359,7 +359,12 @@
{video.viewCountText ?? cleanNumber(video.viewCount ?? 0)}
{video.published && video.published !== 0
? relativeTimestamp(video.published * 1000, false)
? relativeTimestamp(
typeof video.published === 'string'
? new Date(video.published).getTime()
: video.published * 1000,
false
)
: video.publishedText}
</span>
{/if}
+93 -8
View File
@@ -75,7 +75,9 @@
"materialiousLink": "Copiar link Materialious",
"invidiousRedirect": "Copiar link de redirecionamento Invidious",
"youtubeLink": "Copiar link do Youtube",
"copiedSuccess": "Copiado para área de transfêrencia"
"copiedSuccess": "Copiado para área de transfêrencia",
"copyXLink": "Copiar {{linkType}} link",
"includeTimestamp": "marcação de tempo"
},
"download": "Baixar",
"downloadSteps": {
@@ -154,8 +156,13 @@
"dash": "Hífen",
"silenceSkipper": "Pular silêncio (Experimental)",
"youtubeJsFallback": "Fallback para processamento de vídeo local",
"youtubeJsAlways": "Sempre usar processamento de vídeo local",
"lockOrientation": "Orientação travada para igualar aspecto de proporção"
"youtubeJsAlways": "Sempre usar",
"lockOrientation": "Orientação travada para igualar aspecto de proporção",
"ccByDefault": "Legendas ativadas por padrão",
"defaultPlaybackSpeed": "Velocidade de reprodução padrão",
"playerStatistics": "Mostrar estatísticas de reprodutor por padrão",
"localVideoFallback": "Fallback de vídeo local",
"networkChangePause": "Pausar na mudança de rede"
},
"bookmarklet": "Favoritos",
"instanceUrl": "URL da instância",
@@ -169,7 +176,11 @@
"intermissionIntroAnimation": "Intervalo/Animação de introdução",
"credits": "Cartões finais/Créditos",
"preViewRecapHook": "Prévia/Recapitulação/Gancho",
"tangentJokes": "Tangente não relacionada/Piadas"
"tangentJokes": "Tangente não relacionada/Piadas",
"musicOffTopic": "Segmento não musical",
"automatic": "Pular automaticamente",
"manual": "Pular manualmente",
"timeline": "Apenas linha do tempo"
},
"deArrow": {
"title": "DeArrow",
@@ -177,13 +188,65 @@
"titleOnly": "Somente títulos"
},
"about": "Sobre",
"materialiousAccount": "Conta"
"materialiousAccount": "Conta",
"shareURL": "Compartilhar URL",
"searchHistory": "Histórico de pesquisa",
"deleteAccount": "Deletar conta",
"historyEnabled": "Salvar histórico de exibição",
"allowInsecureRequests": "Permitir solicitações inseguras",
"disableAutoUpdate": "Desativar atualizações automáticas",
"androidNativeShare": "Usar compartilhamento nativo",
"backendEngine": {
"warning": "Configurações avançadas! Para usuários experientes apenas. Só modifique se você souber o que está fazendo.",
"concurrent": "Quantidade máxima de canais para analisar antes de retornar o feed",
"importExport": "Exportar/importar automáticos",
"exportToInvidious": "Exportar para Invidious de Materialious",
"importToMaterialious": "Exportar de Invidious para Materialious",
"importingToMaterialious": "Importação para Materialious começou",
"importingToMaterialiousFinished": "Importação para Materialious finalizada",
"exportingToInvidious": "Exportação para Invidious começou",
"exportingToInvidiousFinished": "Exportação para Invidious finalizada",
"cull": "Itens máximos do feed",
"cooldown": "Atualizar intervalo horário de espera",
"fallbacks": "Fallbacks"
},
"exportToJson": "Exportar para JSON",
"filter": {
"title": "Filtros de conteúdo",
"url": "Importar Filtros de URL",
"autoUpdate": "Atualizar automaticamente filtro de URL",
"contentType": "Tipo de conteúdo",
"operator": "Operador",
"optionPlaceholder": "Selecione sua opção",
"value": "Valor",
"addConditional": "Adicionar condicional",
"addFilter": "Adicionar filtro",
"field": "Campo",
"channelFiltered": "\"{{authorName}}\" filtrado",
"videoFiltered": "\"{{videoTitle}}\" de \"{{authorName}}\" filtrado"
},
"export": {
"title": "Exportar/importar",
"importSub": "Importar inscrições",
"importSubSupported": "YouTube CSV/OPML/JSON, Invidious OPML/JSON, banco de dados Freetube & NewPipe JSON suportados",
"importing": "Importando inscrições (isso levará um momento)",
"importingCompleted": "Inscrições importadas com sucesso",
"exportSub": "Exportar inscrições",
"exportToClipboard": "Exportar para área de transferência",
"exportToFile": "Exportar para arquivo",
"importFromFile": "Importar de arquivo"
},
"engine": "Motor de backend",
"displayThumbnailAvatars": "Avatares de miniaturas (Lento)",
"companionUrl": "URL complementar",
"clickXmoreTimesToDelete": "Clique {{clicksTillDelete}} vez(es) mais para deletar",
"expandChapters": "Expandir capítulos por padrão"
},
"subscribe": "Inscrever-se",
"disabled": "Desativado",
"popularPageDisabled": "Página popular foi desativada por Administradores",
"premium": "Conteúdo premium do youtube não podem ser assistidos no Materialious.",
"copy": "Copiar JSON",
"copy": "Copiar para área de transferência",
"login": "Login",
"username": "Nome de usuário",
"password": "Senha",
@@ -217,7 +280,8 @@
"invidiousInfo": "Invidious é uma interface do youtube auto-hospedável.",
"localFallbackInfo": "Quando um vídeo não consegue ser carregado a partir do Invidious, Materialious carrega-o localmente.",
"configureInstance": "Configurar Instância",
"done": "Feito"
"done": "Feito",
"useLocalFallback": "Eu quero usar fallback de vídeo local"
},
"skip": "Pular",
"upcomingSegment": "Próximo ",
@@ -228,5 +292,26 @@
"defaultPage": "Página padrão",
"newest": "Mais recente",
"oldest": "Mais antigos",
"popular": "Popular"
"popular": "Popular",
"markAs": {
"watched": "Marcar como assistido",
"unwatched": "Marcar como não assistido"
},
"hideAuthor": "Esconder autor",
"watchParty": {
"createRoom": "Criar sala",
"joinRoom": "Entrar na sala",
"roomID": "ID da sala",
"shareRoom": "Compartilhar sala",
"leaveRoom": "Sair da sala",
"userJoin": "Usuário entrou na sala",
"userLeft": "Usuário saiu da sala",
"start": "Iniciar um grupo para assistir",
"header": "Assistir em grupo"
},
"favouriteChannel": "Favoritar canal",
"unfavouriteChannel": "Desfavoritar canal",
"linkInvidious": "Vincular conta Invidious",
"unlinkInvidious": "Desvincular conta Invidious",
"playlistVideos": "Vídeos da lista de reprodução"
}
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -3,7 +3,7 @@ import os
import re
from datetime import datetime
LATEST_VERSION = "1.16.22"
LATEST_VERSION = "1.16.23"
RELEASE_DATE = datetime.now().strftime("%Y-%-m-%d") # Format: YYYY-M-D
WORKING_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "materialious")