Merge pull request #1078 from Materialious/update/1.10.5

Update/1.10.5
This commit is contained in:
Ward
2025-09-05 09:17:52 +12:00
committed by GitHub
16 changed files with 377 additions and 263 deletions
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>
+2 -2
View File
@@ -7,8 +7,8 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 145
versionName "1.10.4"
versionCode 146
versionName "1.10.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
@@ -62,7 +62,11 @@
<release version="1.10.4" date="2025-8-19">
<release version="1.10.5" date="2025-9-05">
<url>https://github.com/Materialious/Materialious/releases/tag/1.10.5</url>
</release>
<release version="1.10.4" date="2025-8-19">
<url>https://github.com/Materialious/Materialious/releases/tag/1.10.4</url>
</release>
<release version="1.10.3" date="2025-8-11">
+10 -10
View File
@@ -1,12 +1,12 @@
{
"name": "Materialious",
"version": "1.10.4",
"version": "1.10.5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "Materialious",
"version": "1.10.4",
"version": "1.10.5",
"license": "MIT",
"dependencies": {
"@capacitor-community/electron": "^5.0.0",
@@ -19,10 +19,10 @@
"electron-updater": "^6.3.4",
"electron-window-state": "^5.0.3",
"jsdom": "^26.1.0",
"jsonfile": "^6.1.0"
"jsonfile": "^6.2.0"
},
"devDependencies": {
"electron": "^37.2.6",
"electron": "^37.3.1",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.9.2"
@@ -2492,9 +2492,9 @@
}
},
"node_modules/electron": {
"version": "37.2.6",
"resolved": "https://registry.npmjs.org/electron/-/electron-37.2.6.tgz",
"integrity": "sha512-Ns6xyxE+hIK5UlujtRlw7w4e2Ju/ImCWXf1Q/PoOhc0N3/6SN6YW7+ujCarsHbxWnolbW+1RlkHtdklUJpjbPA==",
"version": "37.3.1",
"resolved": "https://registry.npmjs.org/electron/-/electron-37.3.1.tgz",
"integrity": "sha512-7DhktRLqhe6OJh/Bo75bTI0puUYEmIwSzMinocgO63mx3MVjtIn2tYMzLmAleNIlud2htkjpsMG2zT4PiTCloA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -3920,9 +3920,9 @@
}
},
"node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
"integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"license": "MIT",
"dependencies": {
"universalify": "^2.0.0"
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "Materialious",
"version": "1.10.4",
"version": "1.10.5",
"description": "Modern material design for Invidious.",
"author": {
"name": "Ward Pearce",
@@ -32,10 +32,10 @@
"electron-updater": "^6.3.4",
"electron-window-state": "^5.0.3",
"jsdom": "^26.1.0",
"jsonfile": "^6.1.0"
"jsonfile": "^6.2.0"
},
"devDependencies": {
"electron": "^37.2.6",
"electron": "^37.3.1",
"electron-builder": "^26.0.12",
"electron-rebuild": "^3.2.9",
"typescript": "^5.9.2"
+34 -20
View File
@@ -1,12 +1,12 @@
{
"name": "materialious",
"version": "1.10.3",
"version": "1.10.5",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "materialious",
"version": "1.10.3",
"version": "1.10.5",
"hasInstallScript": true,
"dependencies": {
"@capacitor-community/electron": "^5.0.1",
@@ -24,7 +24,7 @@
"googlevideo": "^3.0.0",
"he": "^1.2.0",
"human-number": "^2.0.4",
"i18next": "^25.2.1",
"i18next": "^25.5.0",
"iso-3166": "^4.3.0",
"iso-639-1": "^3.1.5",
"material-dynamic-colors": "^1.1.1",
@@ -42,7 +42,7 @@
"@capacitor/cli": "^7.0.0",
"@sveltejs/adapter-auto": "^6.0.1",
"@sveltejs/adapter-static": "^3.0.8",
"@sveltejs/kit": "^2.21.2",
"@sveltejs/kit": "^2.37.0",
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@types/eslint": "^8.56.7",
"@types/event-source-polyfill": "^1.0.5",
@@ -1682,9 +1682,9 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.27.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.4.tgz",
"integrity": "sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA==",
"version": "7.28.3",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz",
"integrity": "sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -3250,6 +3250,13 @@
"win32"
]
},
"node_modules/@standard-schema/spec": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz",
"integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==",
"dev": true,
"license": "MIT"
},
"node_modules/@surma/rollup-plugin-off-main-thread": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz",
@@ -3305,17 +3312,18 @@
}
},
"node_modules/@sveltejs/kit": {
"version": "2.21.2",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.21.2.tgz",
"integrity": "sha512-EMYTY4+rNa7TaRZYzCqhQslEkACEZzWc363jOYuc90oJrgvlWTcgqTxcGSIJim48hPaXwYlHyatRnnMmTFf5tA==",
"version": "2.37.0",
"resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.37.0.tgz",
"integrity": "sha512-xgKtpjQ6Ry4mdShd01ht5AODUsW7+K1iValPDq7QX8zI1hWOKREH9GjG8SRCN5tC4K7UXmMhuQam7gbLByVcnw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@standard-schema/spec": "^1.0.0",
"@sveltejs/acorn-typescript": "^1.0.5",
"@types/cookie": "^0.6.0",
"acorn": "^8.14.1",
"cookie": "^0.6.0",
"devalue": "^5.1.0",
"devalue": "^5.3.2",
"esm-env": "^1.2.2",
"kleur": "^4.1.5",
"magic-string": "^0.30.5",
@@ -3331,9 +3339,15 @@
"node": ">=18.13"
},
"peerDependencies": {
"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0",
"@opentelemetry/api": "^1.0.0",
"@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0",
"svelte": "^4.0.0 || ^5.0.0-next.0",
"vite": "^5.0.3 || ^6.0.0"
"vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0"
},
"peerDependenciesMeta": {
"@opentelemetry/api": {
"optional": true
}
}
},
"node_modules/@sveltejs/vite-plugin-svelte": {
@@ -5546,9 +5560,9 @@
}
},
"node_modules/devalue": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz",
"integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==",
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.3.2.tgz",
"integrity": "sha512-UDsjUbpQn9kvm68slnrs+mfxwFkIflOhkanmyabZ8zOYk8SMEIbJ3TK+88g70hSIeytu4y18f0z/hYHMTrXIWw==",
"dev": true,
"license": "MIT"
},
@@ -7283,9 +7297,9 @@
}
},
"node_modules/i18next": {
"version": "25.2.1",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-25.2.1.tgz",
"integrity": "sha512-+UoXK5wh+VlE1Zy5p6MjcvctHXAhRwQKCxiJD8noKZzIXmnAX8gdHX5fLPA3MEVxEN4vbZkQFy8N0LyD9tUqPw==",
"version": "25.5.0",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-25.5.0.tgz",
"integrity": "sha512-Mm2CgIq0revRFbBvfzqW9kDw1r44M4VDWC+YNRx9vTo5bU/iogSdEAC2HEonDA4czEce/iSbAkK90Tw7UrRZKA==",
"funding": [
{
"type": "individual",
@@ -7302,7 +7316,7 @@
],
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.27.1"
"@babel/runtime": "^7.27.6"
},
"peerDependencies": {
"typescript": "^5"
+4 -4
View File
@@ -1,6 +1,6 @@
{
"name": "materialious",
"version": "1.10.4",
"version": "1.10.5",
"private": true,
"scripts": {
"dev": "vite dev",
@@ -17,7 +17,7 @@
"@capacitor/cli": "^7.0.0",
"@sveltejs/adapter-auto": "^6.0.1",
"@sveltejs/adapter-static": "^3.0.8",
"@sveltejs/kit": "^2.21.2",
"@sveltejs/kit": "^2.37.0",
"@sveltejs/vite-plugin-svelte": "^5.0.3",
"@types/eslint": "^8.56.7",
"@types/event-source-polyfill": "^1.0.5",
@@ -56,7 +56,7 @@
"googlevideo": "^3.0.0",
"he": "^1.2.0",
"human-number": "^2.0.4",
"i18next": "^25.2.1",
"i18next": "^25.5.0",
"iso-3166": "^4.3.0",
"iso-639-1": "^3.1.5",
"material-dynamic-colors": "^1.1.1",
@@ -69,4 +69,4 @@
"svelte-persisted-store": "^0.12.0",
"youtubei.js": "^15.0.0"
}
}
}
@@ -29,11 +29,12 @@
<div class="max">
<p>{$_('enabled')}</p>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
bind:checked={$synciousStore}
onclick={() => synciousStore.set(!$synciousStore)}
type="checkbox"
role="switch"
/>
<span></span>
</label>
@@ -43,11 +43,12 @@
<div class="max">
<p>{$_('layout.deArrow.titleOnly')}</p>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
bind:checked={$deArrowTitlesOnly}
onclick={() => deArrowTitlesOnly.set(!$deArrowTitlesOnly)}
type="checkbox"
role="switch"
/>
<span></span>
</label>
@@ -57,11 +58,12 @@
<div class="max">
<p>{$_('enabled')}</p>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
bind:checked={$deArrowEnabledStore}
onclick={() => deArrowEnabledStore.set(!$deArrowEnabledStore)}
type="checkbox"
role="switch"
/>
<span></span>
</label>
@@ -153,6 +153,7 @@
type="checkbox"
bind:checked={$interfaceAllowInsecureRequests}
onclick={allowInsecureRequests}
role="switch"
/>
<span></span>
</label>
@@ -184,11 +185,12 @@
<div class="max">
<div>{$_('layout.theme.AmoledTheme')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$interfaceAmoledTheme}
onclick={() => interfaceAmoledTheme.set(!$interfaceAmoledTheme)}
role="switch"
/>
<span></span>
</label>
@@ -201,7 +203,7 @@
<div class="max">
<div>{$_('layout.searchHistory')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$interfaceSearchHistoryEnabled}
@@ -209,6 +211,7 @@
interfaceSearchHistoryEnabled.set(!$interfaceSearchHistoryEnabled);
searchHistoryStore.set([]);
}}
role="switch"
/>
<span></span>
</label>
@@ -220,11 +223,12 @@
<div class="max">
<div>{$_('layout.lowBandwidthMode')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$interfaceLowBandwidthMode}
onclick={() => interfaceLowBandwidthMode.set(!$interfaceLowBandwidthMode)}
role="switch"
/>
<span></span>
</label>
@@ -236,11 +240,12 @@
<div class="max">
<div>{$_('layout.searchSuggestions')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$interfaceSearchSuggestionsStore}
onclick={() => interfaceSearchSuggestionsStore.set(!$interfaceSearchSuggestionsStore)}
role="switch"
/>
<span></span>
</label>
@@ -252,11 +257,12 @@
<div class="max">
<div>{$_('layout.expandDescription')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$interfaceAutoExpandDesc}
onclick={() => interfaceAutoExpandDesc.set(!$interfaceAutoExpandDesc)}
role="switch"
/>
<span></span>
</label>
@@ -268,11 +274,12 @@
<div class="max">
<div>{$_('layout.expandChapters')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$interfaceAutoExpandChapters}
onclick={() => interfaceAutoExpandChapters.set(!$interfaceAutoExpandChapters)}
role="switch"
/>
<span></span>
</label>
@@ -284,11 +291,12 @@
<div class="max">
<div>{$_('layout.expandComments')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$interfaceAutoExpandComments}
onclick={() => interfaceAutoExpandComments.set(!$interfaceAutoExpandComments)}
role="switch"
/>
<span></span>
</label>
@@ -301,11 +309,12 @@
<div class="max">
<div>{$_('layout.disableAutoUpdate')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$interfaceDisableAutoUpdate}
onclick={() => interfaceDisableAutoUpdate.set(!$interfaceDisableAutoUpdate)}
role="switch"
/>
<span></span>
</label>
@@ -141,11 +141,12 @@
<div class="max">
<div>{$_('layout.player.ccByDefault')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$playerCCByDefault}
onclick={() => playerCCByDefault.set(!$playerCCByDefault)}
role="switch"
/>
<span></span>
</label>
@@ -157,11 +158,12 @@
<div class="max">
<div>{$_('layout.player.autoPlay')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$playerAutoPlayStore}
onclick={() => playerAutoPlayStore.set(!$playerAutoPlayStore)}
role="switch"
/>
<span></span>
</label>
@@ -173,11 +175,12 @@
<div class="max">
<div>{$_('layout.player.alwaysLoopVideo')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$playerAlwaysLoopStore}
onclick={() => playerAlwaysLoopStore.set(!$playerAlwaysLoopStore)}
role="switch"
/>
<span></span>
</label>
@@ -190,11 +193,12 @@
<div class="max">
<div>{$_('layout.player.lockOrientation')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$playerAndroidLockOrientation}
onclick={() => playerAndroidLockOrientation.set(!$playerAndroidLockOrientation)}
role="switch"
/>
<span></span>
</label>
@@ -208,11 +212,12 @@
<div class="max">
<div>{$_('layout.player.proxyVideos')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$playerProxyVideosStore}
onclick={() => playerProxyVideosStore.set(!$playerProxyVideosStore)}
role="switch"
/>
<span></span>
</label>
@@ -225,11 +230,12 @@
<div class="max">
<div>{$_('layout.player.savePlaybackPosition')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$playerSavePlaybackPositionStore}
onclick={() => playerSavePlaybackPositionStore.set(!$playerSavePlaybackPositionStore)}
role="switch"
/>
<span></span>
</label>
@@ -241,11 +247,12 @@
<div class="max">
<div>{$_('layout.player.theatreModeByDefault')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$playerTheatreModeByDefaultStore}
onclick={() => playerTheatreModeByDefaultStore.set(!$playerTheatreModeByDefaultStore)}
role="switch"
/>
<span></span>
</label>
@@ -257,11 +264,12 @@
<div class="max">
<div>{$_('layout.player.autoPlayNextByDefault')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$playerAutoplayNextByDefaultStore}
onclick={() => playerAutoplayNextByDefaultStore.set(!$playerAutoplayNextByDefaultStore)}
role="switch"
/>
<span></span>
</label>
@@ -273,11 +281,12 @@
<div class="max">
<div>{$_('layout.player.playerStatistics')}</div>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
bind:checked={$playerStatisticsByDefault}
onclick={() => playerStatisticsByDefault.set(!playerStatisticsByDefault)}
role="switch"
/>
<span></span>
</label>
@@ -29,11 +29,12 @@
<div class="max">
<p>{$_('enabled')}</p>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
bind:checked={$returnYtDislikesStore}
onclick={() => returnYtDislikesStore.set(!$returnYtDislikesStore)}
type="checkbox"
role="switch"
/>
<span></span>
</label>
@@ -10,14 +10,22 @@
import SponsorBlock from './SponsorBlock.svelte';
import { isAndroidTvStore } from '$lib/store';
let activeTab:
| 'interface'
| 'player'
| 'data'
| 'ryd'
| 'api extended'
| 'sponsorblock'
| 'dearrow' = $state('interface');
let activeTab = $state('interface');
const isActive = (id: string) => activeTab === id;
const tabs = [
{ id: 'interface', label: $_('layout.interface'), icon: 'grid_view', component: Interface },
{ id: 'player', label: $_('layout.player.title'), icon: 'smart_display', component: Player },
{ id: 'ryd', label: 'RYD', icon: 'thumb_down', component: Ryd },
{ id: 'api extended', label: 'API Extended', icon: 'sync', component: ApiExtended },
{ id: 'sponsorblock', label: 'Sponsorblock', icon: 'block', component: SponsorBlock },
{
id: 'dearrow',
label: $_('layout.deArrow.title'),
icon: 'keyboard_double_arrow_down',
component: DeArrow
}
];
let dialogType = $state('');
@@ -29,10 +37,41 @@
}
}
function onKeydown(event: KeyboardEvent, idx: number) {
const keys = ['ArrowRight', 'ArrowLeft', 'Home', 'End'] as const;
if (!keys.includes(event.key as (typeof keys)[number])) return;
event.preventDefault();
let next = idx;
switch (event.key) {
case 'ArrowRight':
next = (idx + 1) % tabs.length;
break;
case 'ArrowLeft':
next = (idx - 1 + tabs.length) % tabs.length;
break;
case 'Home':
next = 0;
break;
case 'End':
next = tabs.length - 1;
break;
}
activeTab = tabs[next].id;
const els = document.querySelectorAll<HTMLElement>('[role="tab"]');
els[next]?.focus();
}
onMount(() => {
checkWidth();
addEventListener('resize', () => checkWidth());
if ($isAndroidTvStore) {
document.getElementById(`tab-${activeTab}`)?.focus();
}
});
</script>
@@ -43,33 +82,32 @@
</nav>
<div>
<nav tabindex="0" class="tabbed small" style="outline: none" role="region">
<a class:active={activeTab === 'interface'} onclick={() => (activeTab = 'interface')}>
<i>grid_view</i>
<span>{$_('layout.interface')}</span>
</a>
<a class:active={activeTab === 'player'} onclick={() => (activeTab = 'player')}>
<i>smart_display</i>
<span>{$_('layout.player.title')}</span>
</a>
<a tabindex="0" class:active={activeTab === 'ryd'} onclick={() => (activeTab = 'ryd')}>
<i>thumb_down</i>
<span>RYD</span>
</a>
<a class:active={activeTab === 'api extended'} onclick={() => (activeTab = 'api extended')}>
<i>sync</i>
<span>API Extended</span>
</a>
<a class:active={activeTab === 'sponsorblock'} onclick={() => (activeTab = 'sponsorblock')}>
<i>block</i>
<span>Sponsorblock</span>
</a>
<a class:active={activeTab === 'dearrow'} onclick={() => (activeTab = 'dearrow')}>
<i>keyboard_double_arrow_down</i>
<span>{$_('layout.deArrow.title')}</span>
</a>
<nav class="tabbed small" style="outline: none" role="tablist" tabindex="0">
{#each tabs as tab, i}
<a
role="tab"
class:active={isActive(tab.id)}
aria-selected={isActive(tab.id)}
id={`tab-${tab.id}`}
aria-controls={`panel-${tab.id}`}
tabindex={isActive(tab.id) ? 0 : -1}
onclick={() => (activeTab = tab.id)}
onkeydown={(event) => onKeydown(event, i)}
>
<i>{tab.icon}</i>
<span>{tab.label}</span>
</a>
{/each}
{#if !$isAndroidTvStore}
<a class:active={activeTab === 'data'} onclick={() => (activeTab = 'data')}>
<a
role="tab"
class:active={isActive('data')}
aria-selected={isActive('data')}
id="tab-data"
aria-controls="panel-data"
tabindex="0"
onclick={() => (activeTab = 'data')}
>
<i>save</i>
<span>{$_('layout.dataPreferences.dataPreferences')}</span>
</a>
@@ -91,27 +129,32 @@
</a>
{/if}
</nav>
<div class="page padding" class:active={activeTab === 'interface'}>
<Interface />
</div>
<div class="page padding" class:active={activeTab === 'player'}>
<Player />
</div>
<div class="page padding" class:active={activeTab === 'data'}>
{#each tabs as tab, _}
<div
class="page padding"
id={`panel-${tab.id}`}
role="tabpanel"
aria-labelledby={`tab-${tab.id}`}
hidden={!isActive(tab.id)}
inert={!$isAndroidTvStore && !isActive(tab.id)}
aria-hidden={!isActive(tab.id)}
class:active={isActive(tab.id)}
>
<tab.component />
</div>
{/each}
<div
class="page padding"
id="panel-data"
role="tabpanel"
aria-labelledby="tab-data"
hidden={!isActive('data')}
inert={!$isAndroidTvStore && !isActive('data')}
aria-hidden={!isActive('data')}
class:active={isActive('data')}
>
<DataPreferences />
</div>
<div class="page padding" class:active={activeTab === 'ryd'}>
<Ryd />
</div>
<div class="page padding" class:active={activeTab === 'api extended'}>
<ApiExtended />
</div>
<div class="page padding" class:active={activeTab === 'sponsorblock'}>
<SponsorBlock />
</div>
<div class="page padding" class:active={activeTab === 'dearrow'}>
<DeArrow />
</div>
</div>
</dialog>
@@ -61,11 +61,12 @@
<div class="max">
<p>{$_('enabled')}</p>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
bind:checked={$sponsorBlockStore}
onclick={() => sponsorBlockStore.set(!$sponsorBlockStore)}
type="checkbox"
role="switch"
/>
<span></span>
</label>
@@ -75,11 +76,12 @@
<div class="max">
<p>{$_('layout.sponsors.disableToast')}</p>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
bind:checked={$sponsorBlockDisplayToastStore}
onclick={() => sponsorBlockDisplayToastStore.set(!$sponsorBlockDisplayToastStore)}
type="checkbox"
role="switch"
/>
<span></span>
</label>
@@ -109,11 +111,12 @@
<div class="max">
<p>{sponsor.name}</p>
</div>
<label class="switch" tabindex="0" role="switch">
<label class="switch" tabindex="0">
<input
type="checkbox"
checked={sponsorCategoriesList.includes(sponsor.category)}
onclick={() => toggleSponsor(sponsor.category)}
role="switch"
/>
<span></span>
</label>
+160 -145
View File
@@ -1,146 +1,161 @@
{
"enabled": "Aktif et",
"copyUrl": "URLi kopyala",
"loadMore": "Daha fazlasını yükle",
"views": "görüntülenme",
"videos": "videolar",
"cancel": "İptal",
"create": "Oluştur",
"title": "Başlık",
"searchPlaceholder": "Ara...",
"delete": "Sil",
"deleteAllHistory": "Tüm geçmişi sil",
"skipping": "Atla",
"replies": "cevaplar",
"region": "Bölge",
"noResult": "Sonuç yok",
"language": "Dil",
"transcript": "Transkript",
"noCaptionData": "Altyazılarda herhangi bir veri yoktur.",
"selectLang": "Dil seçin",
"letterCase": "Başlıklar için harf durumu",
"hideReplies": "Cevapları gizle",
"hideVideo": "Videoyu gizle",
"syncParty": {
"userJoined": "Kullanıcı izleme partinize katıldı.",
"userLeft": "Kullanıcı izleme partinizden ayrıldı.",
"userOnPrivatePage": "Kullanıcı şu an gizli bir sayfa görüntülüyor, senkronizasyon birazdan devam edecek."
},
"videoTabs": {
"all": "Tümü",
"videos": "Videolar",
"playlists": "Oynatma listeleri",
"channels": "Kanallar",
"shorts": "Shorts",
"streams": "Canlı Yayınlar"
},
"subscriptions": {
"manageSubscriptions": "Abonelikleri Yönet"
},
"playlist": {
"createPlaylist": "Oynatma listesi oluştur",
"public": "Herkese açık",
"unlisted": "Liste dışı",
"private": "Gizli",
"playVideos": "Videoları oynat",
"shuffleVideos": "Videoları karışık oynat",
"loopPlaylist": "Çalma listesini tekrarla"
},
"thumbnail": {
"live": "CANLI",
"failedToLoadImage": "Resim yüklenemedi"
},
"pages": {
"home": "Ana Sayfa",
"trending": "Trendler",
"subscriptions": "Abonelikler",
"history": "Geçmiş",
"playlists": "Oynatma Listeleri"
},
"subscribers": "aboneler",
"unsubscribe": "Abonelikten çık",
"loginRequired": "Oturum açmak gereklidir",
"player": {
"audioOnly": "Sadece ses",
"theatreMode": "Tiyatro modu",
"share": {
"title": "Paylaş",
"materialiousLink": "Bağlantıyı Materialious a kopyala",
"invidiousRedirect": "Invidious yönlendirme bağlantısını kopyala",
"youtubeLink": "Youtube bağlantısını kopyala"
},
"download": "İndir",
"downloadSteps": {
"merging": "Birlikte video ve ses birleştiriliyor",
"video": "Video indiriliyor",
"audio": "Ses indiriliyor",
"ffmpeg": "FFmpeg kütüphaneleri ve parçaları indiriliyor",
"classWorker": "FFmpeg sınıf işcisi indiriliyor",
"core": "FFmpeg çekirdeği indiriliyor",
"wasm": "FFmpeg wasm indiriliyor",
"worker": "FFmpeg işcisi indiriliyor"
},
"noPlaylists": "Oynatma listesi yok",
"unableToLoadComments": "Yorumlar yüklenemiyor",
"addToPlaylist": "Oynatma listesine ekle"
},
"layout": {
"interface": "Arayüz",
"star": "Github'da bize yıldız verin!",
"syncParty": "Senkronizasyon partisi",
"syncPartyWarning": "Lütfen IP nizin davet ettiğiniz kullanıcılara görüneceğini unutmayın.",
"startSyncParty": "Senkronizasyon partisi başlat",
"endSyncParty": "Senkronizasyon partisini sonlandır",
"notifications": "Bildirimler",
"noNewNotifications": "Burada yeni bildirim yok",
"settings": "Ayarlar",
"login": "Giriş Yap",
"logout": "Çıkış Yap",
"customize": "Özelleştir",
"theme": {
"theme": "Tema",
"darkMode": "Koyu mod",
"lightMode": "Açık Mod",
"color": "Renk"
},
"searchSuggestions": "Önerileri ara",
"previewVideoOnHover": "Fareyle üzerine gelindiğinde videoyu ön izleyin",
"expandDescription": "Açıklamayı varsayılan olarak genişlet",
"expandComments": "Yorumları varsayılan olarak genişlet",
"dataPreferences": {
"content": "Abonelikleri içe/dışa aktarmayı, şifreyi değiştirmeyi veya hesabı silmeyi mi istiyorsunuz? Buraya tıklayın ve sayfanın en altına gidin.",
"dataPreferences": "Veri tercihleri"
},
"player": {
"title": "Oynatıcı",
"autoPlay": "Otomatik oynatılan video",
"alwaysLoopVideo": "Videoyu her zaman tekrara al",
"savePlaybackPosition": "Oynatma konumunu kaydet",
"listenByDefault": "Varsayılan olarak dinle",
"theatreModeByDefault": "Varsayılan olarak tiyatro modu",
"autoPlayNextByDefault": "Sonrakini varsayılan olarak otomatik oynat",
"miniPlayer": "Mini oynatıcı",
"proxyVideos": "Vekil Sunucu videolar",
"backgroundPlay": "Arka planda ses çal",
"silenceSkipper": "Sessizlik atlayıcı (Deneysel)"
},
"bookmarklet": "Yer işareti",
"instanceUrl": "Instance URL",
"sponsors": {
"sponsor": "Sponsor",
"Catagories": "Kategoriler",
"unpaidSelfPromotion": "Ücretsiz/Kişisel Promosyon",
"interactionReminder": "Etkileşim Hatırlatıcısı (Abone Ol)",
"intermissionIntroAnimation": "Ara/Giriş Animasyonu",
"credits": "Bitiş Kartları/Krediler",
"preViewRecapHook": "Önizleme/Özet/Kanca",
"tangentJokes": "Dolgu Tanjantı/Şakalar"
},
"deArrow": {
"title": "DeArrow",
"thumbnailInstanceUrl": "Küçük resim görünüm URL'si",
"titleOnly": "Sadece başlık"
}
},
"subscribe": "Abone Ol"
}
"enabled": "Etkin",
"copyUrl": "URL' yi kopyala",
"loadMore": "Daha fazlasını yükle",
"views": "görüntülenme",
"videos": "videolar",
"cancel": "İptal",
"create": "Oluştur",
"title": "Başlık",
"searchPlaceholder": "Ara...",
"delete": "Sil",
"deleteAllHistory": "Tüm geçmişi sil",
"skipping": "Atla",
"replies": "cevaplar",
"region": "Bölge",
"noResult": "Sonuç yok",
"language": "Dil",
"transcript": "Transkript",
"noCaptionData": "Altyazılarda herhangi bir veri yoktur.",
"selectLang": "Dil seçin",
"letterCase": "Başlıklar için harf durumu",
"hideReplies": "Cevapları gizle",
"hideVideo": "Videoyu gizle",
"syncParty": {
"userJoined": "Kullanıcı izleme partinize katıldı.",
"userLeft": "Kullanıcı izleme partinizden ayrıldı.",
"userOnPrivatePage": "Kullanıcı şu an gizli bir sayfa görüntülüyor, senkronizasyon birazdan devam edecek."
},
"videoTabs": {
"all": "Tümü",
"videos": "Videolar",
"playlists": "Oynatma listeleri",
"channels": "Kanallar",
"shorts": "Shorts",
"streams": "Canlı Yayınlar"
},
"subscriptions": {
"manageSubscriptions": "Abonelikleri Yönet"
},
"playlist": {
"createPlaylist": "Oynatma listesi oluştur",
"public": "Herkese açık",
"unlisted": "Liste dışı",
"private": "Gizli",
"playVideos": "Videoları oynat",
"shuffleVideos": "Videoları karışık oynat",
"loopPlaylist": "Çalma listesini tekrarla"
},
"thumbnail": {
"live": "CANLI",
"failedToLoadImage": "Resim yüklenemedi"
},
"pages": {
"home": "Ana Sayfa",
"trending": "Trendler",
"subscriptions": "Abonelikler",
"history": "Geçmiş",
"playlists": "Oynatma Listeleri"
},
"subscribers": "aboneler",
"unsubscribe": "Abonelikten çık",
"loginRequired": "Oturum açmak gereklidir",
"player": {
"audioOnly": "Sadece ses",
"theatreMode": "Tiyatro modu",
"share": {
"title": "Paylaş",
"materialiousLink": "Bağlantıyı Materialious a kopyala",
"invidiousRedirect": "Invidious yönlendirme bağlantısını kopyala",
"youtubeLink": "Youtube bağlantısını kopyala"
},
"download": "İndir",
"downloadSteps": {
"merging": "Birlikte video ve ses birleştiriliyor",
"video": "Video indiriliyor",
"audio": "Ses indiriliyor",
"ffmpeg": "FFmpeg kütüphaneleri ve parçaları indiriliyor",
"classWorker": "FFmpeg sınıf işcisi indiriliyor",
"core": "FFmpeg çekirdeği indiriliyor",
"wasm": "FFmpeg wasm indiriliyor",
"worker": "FFmpeg işcisi indiriliyor"
},
"noPlaylists": "Oynatma listesi yok",
"unableToLoadComments": "Yorumlar yüklenemiyor",
"addToPlaylist": "Oynatma listesine ekle"
},
"layout": {
"interface": "Arayüz",
"star": "Github'da bize yıldız verin!",
"syncParty": "Senkronizasyon partisi",
"syncPartyWarning": "Lütfen IP nizin davet ettiğiniz kullanıcılara görüneceğini unutmayın.",
"startSyncParty": "Senkronizasyon partisi başlat",
"endSyncParty": "Senkronizasyon partisini sonlandır",
"notifications": "Bildirimler",
"noNewNotifications": "Burada yeni bildirim yok",
"settings": "Ayarlar",
"login": "Giriş Yap",
"logout": "Çıkış Yap",
"customize": "Özelleştir",
"theme": {
"theme": "Tema",
"darkMode": "Koyu mod",
"lightMode": "Açık Mod",
"color": "Renk"
},
"searchSuggestions": "Önerileri ara",
"previewVideoOnHover": "Fareyle üzerine gelindiğinde videoyu ön izleyin",
"expandDescription": "Açıklamayı varsayılan olarak genişlet",
"expandComments": "Yorumları varsayılan olarak genişlet",
"dataPreferences": {
"content": "Abonelikleri içe/dışa aktarmayı, şifreyi değiştirmeyi veya hesabı silmeyi mi istiyorsunuz? Buraya tıklayın ve sayfanın en altına gidin.",
"dataPreferences": "Veri tercihleri"
},
"player": {
"title": "Oynatıcı",
"autoPlay": "Otomatik oynatılan video",
"alwaysLoopVideo": "Videoyu her zaman tekrara al",
"savePlaybackPosition": "Oynatma konumunu kaydet",
"listenByDefault": "Varsayılan olarak dinle",
"theatreModeByDefault": "Varsayılan olarak tiyatro modu",
"autoPlayNextByDefault": "Sonrakini varsayılan olarak otomatik oynat",
"miniPlayer": "Mini oynatıcı",
"proxyVideos": "Vekil Sunucu videolar",
"backgroundPlay": "Arka planda ses çal",
"silenceSkipper": "Sessizlik atlayıcı (Deneysel)"
},
"bookmarklet": "Yer işareti",
"instanceUrl": "Instance URL",
"sponsors": {
"sponsor": "Sponsor",
"Catagories": "Kategoriler",
"unpaidSelfPromotion": "Ücretsiz/Kişisel Promosyon",
"interactionReminder": "Etkileşim Hatırlatıcısı (Abone Ol)",
"intermissionIntroAnimation": "Ara/Giriş Animasyonu",
"credits": "Bitiş Kartları/Krediler",
"preViewRecapHook": "Önizleme/Özet/Kanca",
"tangentJokes": "Dolgu Tanjantı/Şakalar"
},
"deArrow": {
"title": "DeArrow",
"thumbnailInstanceUrl": "Küçük resim görünüm URL'si",
"titleOnly": "Sadece başlık"
},
"allowInsecureRequests": "Güvenli olmayan isteklere izin ver"
},
"subscribe": "Abone Ol",
"premium": "Premium YouTube içeriği Materialious ile izlenemez.",
"isUpcoming": "Video henüz izlenebilir durumda değil.",
"recommendedVideos": "Önerilen Videolar",
"playlistVideos": "Çalma Listeleri",
"channels": "kanallar",
"defaultPage": "Varsayılan sayfa",
"invalidInstance": "Lütfen URL' yi kontrol edin. Eğer doğruysa, sunucu kapalı olabilir veya üçüncü taraf istemcileri desteklemiyor olabilir.",
"disabled": "Devre dışı",
"invidiousBlockWarning": "Invidious şu anda Google tarafından engellenmiş durumda. Eğer bu sunucu çalışmıyorsa, bunu aşmak için lütfen Materialous {android} ve {masaüstü} sunucusunu kullanın.",
"donate": "Bağış",
"comments": "yorumlar",
"reply": "cevapla",
"login": "Giriş",
"invidiousLogin": "Lütfen Invidious hesabınız ile giriş yapınız"
}
+1 -1
View File
@@ -3,7 +3,7 @@ import os
import re
from datetime import datetime
LATEST_VERSION = "1.10.4"
LATEST_VERSION = "1.10.5"
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")