Merge pull request #1372 from Materialious/update/1.13.13

Update/1.13.13
This commit is contained in:
Ward
2026-02-07 02:15:29 +00:00
committed by GitHub
14 changed files with 78 additions and 40 deletions
+2 -2
View File
@@ -7,8 +7,8 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 196
versionName "1.13.12"
versionCode 197
versionName "1.13.13"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
@@ -95,7 +95,11 @@
<release version="1.13.12" date="2026-2-06">
<release version="1.13.13" date="2026-2-07">
<url>https://github.com/Materialious/Materialious/releases/tag/1.13.13</url>
</release>
<release version="1.13.12" date="2026-2-06">
<url>https://github.com/Materialious/Materialious/releases/tag/1.13.12</url>
</release>
<release version="1.13.11" date="2026-2-06">
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "Materialious",
"version": "1.13.12",
"version": "1.13.13",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "Materialious",
"version": "1.13.12",
"version": "1.13.13",
"license": "MIT",
"dependencies": {
"@capacitor-community/electron": "^5.0.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "Materialious",
"version": "1.13.12",
"version": "1.13.13",
"description": "Modern material design for Invidious.",
"author": {
"name": "Ward Pearce",
@@ -1,6 +1,4 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const CapacitorNodejs = require('../../../node_modules/capacitor-nodejs/electron/dist/plugin.js');
module.exports = {
CapacitorNodejs,
}
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "materialious",
"version": "1.13.12",
"version": "1.13.13",
"private": true,
"scripts": {
"dev": "npm run patch:github && vite dev",
+11 -24
View File
@@ -129,6 +129,7 @@
userManualSeeking = true;
currentTime = timeToSet;
showPlayerUI();
setPlayerTimelineChapters(currentTime);
if (playerSliderDebounce) clearTimeout(playerSliderDebounce);
@@ -146,6 +147,7 @@
const playerVolumeSlider = new Slider({
onValueChange: (volumeToSet) => {
if (!playerElement) return;
showPlayerUI();
playerElement.volume = volumeToSet;
},
value: () => playerVolume,
@@ -154,8 +156,6 @@
step: 0.01
});
let playerAndroidUITimeout: ReturnType<typeof setTimeout>;
let clickCount = $state(0);
let clickCounterTimeout: ReturnType<typeof setTimeout>;
@@ -167,10 +167,10 @@
updateVideoPlayerHeight();
});
const markerGapSize = 0.5;
const markerGapSize = 0.1;
const minVisiblePercent = 0.05;
function timelineMarker(startTime: number, endTime?: number): string {
const ratio = (endTime ? endTime - startTime : startTime) / playerMaxKnownTime;
function timelineMarkerWidth(startTime: number, endTime: number): string {
const ratio = (endTime - startTime) / playerMaxKnownTime;
if (ratio <= 0) return `0%`;
let percent = ratio * 100;
@@ -1098,17 +1098,7 @@
if (isMobile()) {
const initalControlsState = showControls.valueOf();
if (playerAndroidUITimeout) {
clearTimeout(playerAndroidUITimeout);
}
showControls = true;
playerAndroidUITimeout = setTimeout(() => {
showControls = false;
}, 3000);
showPlayerUI();
if (!initalControlsState) return;
}
@@ -1182,12 +1172,9 @@
Mousetrap.unbind(['left', 'right', 'space', 'c', 'f', 'shift+left', 'shift+right', 'enter']);
if (watchProgressInterval) clearInterval(watchProgressInterval);
if (sabrAdapter) sabrAdapter.dispose();
if (clickCounterTimeout) clearTimeout(clickCounterTimeout);
if (playerAndroidUITimeout) clearTimeout(playerAndroidUITimeout);
if (showPlayerUiTimeout) clearTimeout(showPlayerUiTimeout);
if (player) {
player.unload();
@@ -1310,8 +1297,8 @@
{#each data.content.timestamps as chapter, index (chapter)}
<div
class="chapter-marker"
style:left={timelineMarker(chapter.time)}
style:width={timelineMarker(
style:left="{(chapter.time / playerMaxKnownTime) * 100}%"
style:width={timelineMarkerWidth(
chapter.time,
data.content.timestamps[index + 1]?.time || playerMaxKnownTime // Next chapter time or end of video
)}
@@ -1321,8 +1308,8 @@
{#each segments as segment (segment)}
<div
class="chapter-marker segment-marker"
style:left={timelineMarker(segment.startTime)}
style:width={timelineMarker(segment.startTime, segment.endTime)}
style:left="{(segment.startTime / playerMaxKnownTime) * 100}%"
style:width={timelineMarkerWidth(segment.startTime, segment.endTime)}
></div>
{/each}
{/if}
@@ -62,6 +62,10 @@
padding: 0;
}
[data-melt-toaster-root]:empty {
display: none;
}
[data-melt-toaster-toast-content]:nth-last-child(n + 4) {
z-index: 1;
scale: 0.925;
@@ -7,7 +7,7 @@
import { interfaceLowBandwidthMode } from '$lib/store';
import { onMount } from 'svelte';
import CommentSelf from './Comment.svelte';
import { insecureRequestImageHandler } from '$lib/misc';
import { insecureRequestImageHandler, truncate } from '$lib/misc';
import { _ } from '$lib/i18n';
interface Props {
@@ -68,7 +68,7 @@
<div class="comment-info">
<a href={resolve(`/channel/[authorId]`, { authorId: comment.authorId })} class="author">
<span class="bold" class:channel-owner={comment.authorIsChannelOwner}>
{comment.author}
{truncate(comment.author, 12)}
</span>
<span class="secondary-text">{comment.publishedText}</span>
</a>
+16 -1
View File
@@ -4,6 +4,7 @@
:root {
--video-player-height: 0px;
--safe-area-inset-top: 0px;
}
@font-face {
@@ -11,6 +12,19 @@
src: url('/inter.ttf');
}
html,
body {
height: 100%;
margin: 0;
overflow: hidden;
}
:has(>main) {
height: 100%;
min-height: 0;
overflow: hidden;
}
.hide {
display: none;
}
@@ -58,9 +72,10 @@ dialog {
}
main.root {
max-height: 100vh;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
overscroll-behavior: contain;
}
.row {
@@ -61,8 +61,13 @@
page.subscribe((pageData) => {
playerIsPip = !pageData.url.pathname.includes('/watch');
requestAnimationFrame(() => resetScroll());
});
playerState.subscribe(() => {
requestAnimationFrame(() => resetScroll());
})
interfaceAmoledTheme.subscribe(async () => {
setAmoledTheme();
@@ -194,6 +199,13 @@
await ui('theme', hex);
});
function resetScroll() {
const main = document.querySelector('main.root');
if (main) main.scrollTop = 0;
document.documentElement.scrollTop = 0;
document.body.scrollTop = 0;
}
onMount(async () => {
ui();
@@ -233,6 +245,7 @@
if (isLoggedIn) {
loadNotifications().catch(() => authStore.set(null));
}
resetScroll();
});
let webManifestLink = $derived(pwaInfo ? pwaInfo.webManifest.linkTag : '');
@@ -289,6 +302,13 @@
</nav>
{#if !$isAndroidTvStore}
<nav class="top" id="top-content" class:tv-nav={$isAndroidTvStore}>
{#if $playertheatreModeIsActive}
<header role="presentation" style="cursor: pointer;" tabindex="-1" class="small-padding">
<a href={resolve($interfaceDefaultPage, {})}>
<Logo />
</a>
</header>
{/if}
{#if !mobileSearchShow}
<button
onclick={() => (mobileSearchShow = !mobileSearchShow)}
@@ -536,7 +536,7 @@
{/if}
{#if comments && comments.comments.length > 0}
<article class="border">
<article class="border comment-list">
<details>
<summary id="comment-section" class="none bold">
<nav>
@@ -551,7 +551,11 @@
<Comment {comment} videoId={data.video.videoId}></Comment>
{/each}
{#if comments.continuation}
<button onclick={loadMoreComments} class="margin">{$_('loadMore')}</button>
<div class="space"></div>
<button onclick={loadMoreComments} class="secondary">
<i>read_more</i>
<span>{$_('loadMore')}</span>
</button>
{/if}
</div>
</details>
@@ -713,6 +717,12 @@
overflow-x: hidden;
}
.comment-list {
max-height: 600px;
overflow-y: scroll;
overflow-x: hidden;
}
.recommended {
margin-top: calc(var(--video-player-height) * -1);
}
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.13.12"
LATEST_VERSION = "1.13.13"
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")