Merge pull request #1441 from Materialious/update/1.15.7

Update/1.15.7
This commit is contained in:
Ward
2026-02-16 22:39:49 +13:00
committed by GitHub
14 changed files with 41 additions and 29 deletions
+10
View File
@@ -2,6 +2,16 @@
This Guide is for the docker image `wardpearce/materialious-full` **NOT** `wardpearce/materialious`
### Invidious Companion support
`public_url` **MUST** be set in Invidious under **invidious_companion** for companion to work with Materialious.
e.g.
```yml
invidious_companion:
- private_url: "http://companion:8282/companion"
public_url: "http://companion.example.com/companion"
```
### Docker Compose
```yaml
+2 -2
View File
@@ -7,8 +7,8 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 214
versionName "1.15.6"
versionCode 215
versionName "1.15.7"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
@@ -79,7 +79,11 @@
<release version="1.15.6" date="2026-2-16">
<release version="1.15.7" date="2026-2-16">
<url>https://github.com/Materialious/Materialious/releases/tag/1.15.7</url>
</release>
<release version="1.15.6" date="2026-2-16">
<url>https://github.com/Materialious/Materialious/releases/tag/1.15.6</url>
</release>
<release version="1.15.5" date="2026-2-16">
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "Materialious",
"version": "1.15.5",
"version": "1.15.7",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "Materialious",
"version": "1.15.5",
"version": "1.15.7",
"license": "MIT",
"dependencies": {
"@capacitor-community/electron": "^5.0.0",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "Materialious",
"version": "1.15.6",
"version": "1.15.7",
"description": "Modern material design for YouTube and Invidious.",
"author": {
"name": "Ward Pearce",
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "materialious",
"version": "1.15.6",
"version": "1.15.7",
"private": true,
"scripts": {
"dev": "npm run patch:github && vite dev",
@@ -52,8 +52,8 @@
goToPreviousVideo,
playbackRates,
playerDoubleTapSeek
} from '$lib/player';
import { dashManifestDomainInclusion } from '$lib/android/youtube/dash';
} from '$lib/player/index';
import { manifestDomainInclusion } from '$lib/player/manifest';
import { injectSabr } from '$lib/sabr';
import type { SabrStreamingAdapter } from 'googlevideo/sabr-streaming-adapter';
import { SvelteSet } from 'svelte/reactivity';
@@ -67,6 +67,7 @@
storyboardThumbnails,
type TimelineThumbnail
} from '$lib/timelineThumbnails';
import { isOwnBackend } from '$lib/shared';
interface Props {
data: { video: VideoPlay; content: ParsedDescription; playlistId: string | null };
@@ -567,11 +568,12 @@
}
if (
Capacitor.getPlatform() === 'android' &&
(Capacitor.getPlatform() === 'android' ||
(isOwnBackend() && Capacitor.getPlatform() === 'web')) &&
$playerProxyVideosStore &&
!data.video.fallbackPatch
) {
const manifest = await dashManifestDomainInclusion(dashUrl);
const manifest = await manifestDomainInclusion(dashUrl);
await player.load(manifest, await getLastPlayPos());
} else {
await player.load(dashUrl, await getLastPlayPos());
@@ -9,7 +9,7 @@
setWindowQueryFlag,
shareURL
} from '$lib/misc';
import type { PlayerEvents } from '$lib/player';
import type { PlayerEvents } from '$lib/player/index';
import type { DataConnection } from 'peerjs';
import { onDestroy, onMount } from 'svelte';
import { _ } from '$lib/i18n';
@@ -22,7 +22,7 @@
playerYouTubeJsAlways,
playerYouTubeJsFallback
} from '../../store';
import { playbackRates } from '$lib/player';
import { playbackRates } from '$lib/player/index';
import { isUnrestrictedPlatform } from '$lib/misc';
let defaultLanguage = $state(get(playerDefaultLanguage));
@@ -1,16 +1,16 @@
import { get } from 'svelte/store';
import type { PlaylistPageVideo, VideoPlay } from './api/model';
import type { PlaylistPageVideo, VideoPlay } from '$lib/api/model';
import {
isAndroidTvStore,
playerAutoplayNextByDefaultStore,
playerPlaylistHistory,
playlistSettingsStore,
syncPartyConnectionsStore
} from './store';
} from '$lib/store';
import { goto } from '$app/navigation';
import { resolve } from '$app/paths';
import { loadEntirePlaylist } from './playlist';
import { unsafeRandomItem } from './misc';
import { loadEntirePlaylist } from '$lib/playlist';
import { unsafeRandomItem } from '$lib/misc';
export interface PlayerEvent {
type: 'pause' | 'seek' | 'change-video' | 'play' | 'playlist' | 'goto';
@@ -1,23 +1,19 @@
export async function dashManifestDomainInclusion(manifestUrl: string): Promise<string> {
/* If on android, must manually format dash manifest to include URL. */
// Must fetch the headers of the request
// using our custom android proxy logic
export async function manifestDomainInclusion(manifestUrl: string): Promise<string> {
const respIvg = await fetch(manifestUrl, {
method: 'GET',
headers: {
__custom_return: 'json-headers',
// Required for our custom android backend.
__redirect: 'manual'
}
},
referrerPolicy: 'no-referrer'
});
if (!respIvg.ok) {
throw Error('Unable to make request to Invidious');
}
const ivgHeaders = await respIvg.json();
// If location isn't present, then use base manifest URL.
const companionUrl = 'location' in ivgHeaders ? ivgHeaders['location'] : manifestUrl;
const companionUrl = respIvg.headers.get('location') ?? manifestUrl;
const respCompanion = await fetch(companionUrl, {
method: 'GET'
@@ -13,7 +13,7 @@
import { getBestThumbnail } from '$lib/images';
import { letterCase } from '$lib/letterCasing';
import { cleanNumber, numberWithCommas } from '$lib/numbers';
import { goToNextVideo, goToPreviousVideo, type PlayerEvents } from '$lib/player';
import { goToNextVideo, goToPreviousVideo, type PlayerEvents } from '$lib/player/index';
import {
invidiousAuthStore,
interfaceAutoExpandChapters,
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.15.6"
LATEST_VERSION = "1.15.7"
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")