diff --git a/materialious/android/app/build.gradle b/materialious/android/app/build.gradle
index c317a96d..c128c36c 100644
--- a/materialious/android/app/build.gradle
+++ b/materialious/android/app/build.gradle
@@ -7,8 +7,8 @@ android {
applicationId "us.materialio.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
- versionCode 79
- versionName "1.6.28"
+ versionCode 80
+ versionName "1.6.29"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
diff --git a/materialious/android/app/capacitor.build.gradle b/materialious/android/app/capacitor.build.gradle
index 6f5750f8..14775e3e 100644
--- a/materialious/android/app/capacitor.build.gradle
+++ b/materialious/android/app/capacitor.build.gradle
@@ -15,6 +15,7 @@ dependencies {
implementation project(':capacitor-screen-orientation')
implementation project(':capacitor-status-bar')
implementation project(':capgo-inappbrowser')
+ implementation project(':hugotomazi-capacitor-navigation-bar')
implementation project(':mediagrid-capacitor-native-audio')
implementation project(':capacitor-nodejs')
diff --git a/materialious/android/capacitor.settings.gradle b/materialious/android/capacitor.settings.gradle
index 5afe2907..b4eac4f4 100644
--- a/materialious/android/capacitor.settings.gradle
+++ b/materialious/android/capacitor.settings.gradle
@@ -20,6 +20,9 @@ project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacit
include ':capgo-inappbrowser'
project(':capgo-inappbrowser').projectDir = new File('../node_modules/@capgo/inappbrowser/android')
+include ':hugotomazi-capacitor-navigation-bar'
+project(':hugotomazi-capacitor-navigation-bar').projectDir = new File('../node_modules/@hugotomazi/capacitor-navigation-bar/android')
+
include ':mediagrid-capacitor-native-audio'
project(':mediagrid-capacitor-native-audio').projectDir = new File('../node_modules/@mediagrid/capacitor-native-audio/android')
diff --git a/materialious/electron/package.json b/materialious/electron/package.json
index 1dc3c1c2..99541ed0 100644
--- a/materialious/electron/package.json
+++ b/materialious/electron/package.json
@@ -1,6 +1,6 @@
{
"name": "Materialious",
- "version": "1.6.28",
+ "version": "1.6.29",
"description": "Modern material design for Invidious.",
"author": {
"name": "Ward Pearce",
diff --git a/materialious/package-lock.json b/materialious/package-lock.json
index e1e7cb25..ba7b7c2d 100644
--- a/materialious/package-lock.json
+++ b/materialious/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "materialious",
- "version": "1.6.27",
+ "version": "1.6.28",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "materialious",
- "version": "1.6.27",
+ "version": "1.6.28",
"dependencies": {
"@capacitor-community/electron": "^5.0.1",
"@capacitor/android": "^6.1.2",
@@ -19,6 +19,7 @@
"@capacitor/status-bar": "^6.0.1",
"@capgo/inappbrowser": "^6.6.8",
"@ffmpeg/ffmpeg": "^0.12.10",
+ "@hugotomazi/capacitor-navigation-bar": "^4.0.1",
"@mediagrid/capacitor-native-audio": "^1.0.0",
"beercss": "^3.8.0",
"bgutils-js": "^3.1.1",
@@ -2177,6 +2178,15 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/@hugotomazi/capacitor-navigation-bar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@hugotomazi/capacitor-navigation-bar/-/capacitor-navigation-bar-4.0.1.tgz",
+ "integrity": "sha512-CtG9c2mxH1hxNvr8+PsoMhfKxoUkv17DQGqt82Y65gM4UARBe0Dp2fa8Eeo+ZzybJ1nRwSAiB4kEQ3nx5UpT1A==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@capacitor/core": "^4.0.1 || ^5.0.0 || ^6.0.0"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.14",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
diff --git a/materialious/package.json b/materialious/package.json
index e5b9ed42..c99fd238 100644
--- a/materialious/package.json
+++ b/materialious/package.json
@@ -1,6 +1,6 @@
{
"name": "materialious",
- "version": "1.6.28",
+ "version": "1.6.29",
"private": true,
"scripts": {
"dev": "vite dev",
@@ -53,6 +53,7 @@
"@capacitor/status-bar": "^6.0.1",
"@capgo/inappbrowser": "^6.6.8",
"@ffmpeg/ffmpeg": "^0.12.10",
+ "@hugotomazi/capacitor-navigation-bar": "^4.0.1",
"@mediagrid/capacitor-native-audio": "^1.0.0",
"beercss": "^3.8.0",
"bgutils-js": "^3.1.1",
diff --git a/materialious/src/lib/Player.svelte b/materialious/src/lib/Player.svelte
index 4848e89e..47409705 100644
--- a/materialious/src/lib/Player.svelte
+++ b/materialious/src/lib/Player.svelte
@@ -19,7 +19,6 @@
getBestThumbnail,
proxyVideoUrl,
pullBitratePreference,
- setStatusBarColor,
videoLength,
type PhasedDescription
} from './misc';
@@ -43,7 +42,7 @@
synciousInstanceStore,
synciousStore
} from './store';
- import { getDynamicTheme } from './theme';
+ import { getDynamicTheme, setStatusBarColor } from './theme';
export let data: { video: VideoPlay; content: PhasedDescription; playlistId: string | null };
export let audioMode = false;
@@ -365,6 +364,7 @@
if (get(playerAutoPlayStore)) {
player.play();
+ player.exitFullscreen();
}
await loadPlayerPos();
});
@@ -424,8 +424,6 @@
}
if (Capacitor.getPlatform() === 'android') {
- let initialFullscreen = true;
-
const videoFormats = data.video.adaptiveFormats.filter((format) =>
format.type.startsWith('video/')
);
@@ -433,14 +431,6 @@
originalOrigination = await ScreenOrientation.orientation();
player.addEventListener('fullscreen-change', async (event: FullscreenChangeEvent) => {
- // A bit of a hack to fix Android automatically
- // fullscreening when opening a video.
- if (initialFullscreen) {
- player.exitFullscreen();
- initialFullscreen = false;
- return;
- }
-
if (event.detail) {
// Ensure bar color is black while in fullscreen
await StatusBar.setBackgroundColor({ color: '#000000' });
diff --git a/materialious/src/lib/Settings.svelte b/materialious/src/lib/Settings.svelte
index d50cf775..2b42706c 100644
--- a/materialious/src/lib/Settings.svelte
+++ b/materialious/src/lib/Settings.svelte
@@ -10,6 +10,7 @@
import { _ } from 'svelte-i18n';
import { get } from 'svelte/store';
import { ensureNoTrailingSlash, letterCase, titleCase, titleCases } from './misc';
+ import { getPages } from './navPages';
import {
authStore,
darkModeStore,
@@ -21,6 +22,7 @@
interfaceAmoledTheme,
interfaceAutoExpandComments,
interfaceAutoExpandDesc,
+ interfaceDefaultPage,
interfaceDisplayThumbnailAvatars,
interfaceForceCase,
interfaceLowBandwidthMode,
@@ -66,6 +68,7 @@
let region = get(interfaceRegionStore);
let forceCase = get(interfaceForceCase);
let defaultLanguage = get(playerDefaultLanguage);
+ let defaultPage = get(interfaceDefaultPage);
const languageNames = ISO6391.getAllCodes().map((code) =>
ISO6391.getName(code).toLocaleLowerCase()
@@ -385,6 +388,24 @@
arrow_drop_down
+
+
+
+ arrow_drop_down
+
+
{#if !Capacitor.isNativePlatform()}
{$_('layout.bookmarklet')}
diff --git a/materialious/src/lib/android/http/androidRequests.ts b/materialious/src/lib/android/http/androidRequests.ts
index 38905886..0df0dcde 100644
--- a/materialious/src/lib/android/http/androidRequests.ts
+++ b/materialious/src/lib/android/http/androidRequests.ts
@@ -51,5 +51,5 @@ if (Capacitor.getPlatform() === 'android') {
return originalXhrOpen.apply(this, args);
};
- setTimeout(() => goto('/', { replaceState: true }), 300);
+ setTimeout(() => goto('/', { replaceState: true }), 10);
}
diff --git a/materialious/src/lib/externalSettings.ts b/materialious/src/lib/externalSettings.ts
index 2d5abb2d..07706050 100644
--- a/materialious/src/lib/externalSettings.ts
+++ b/materialious/src/lib/externalSettings.ts
@@ -8,6 +8,7 @@ import {
interfaceAmoledTheme,
interfaceAutoExpandComments,
interfaceAutoExpandDesc,
+ interfaceDefaultPage,
interfaceDisplayThumbnailAvatars,
interfaceForceCase,
interfaceLowBandwidthMode,
@@ -207,6 +208,11 @@ const persistedStores: { name: string, store: Writable
, type: 'string' | 'b
name: 'defaultLanguage',
store: playerDefaultLanguage,
type: 'boolean'
+ },
+ {
+ name: 'defaultPage',
+ store: interfaceDefaultPage,
+ type: 'string'
}
];
diff --git a/materialious/src/lib/i18n/locales/en.json b/materialious/src/lib/i18n/locales/en.json
index 7ab2e622..fea99828 100644
--- a/materialious/src/lib/i18n/locales/en.json
+++ b/materialious/src/lib/i18n/locales/en.json
@@ -24,6 +24,7 @@
"letterCase": "Letter case for titles",
"hideReplies": "Hide replies",
"hideVideo": "Hide video",
+ "defaultPage": "Default page",
"syncParty": {
"userJoined": "User joined your watch party.",
"userLeft": "User left your watch party.",
diff --git a/materialious/src/lib/misc.ts b/materialious/src/lib/misc.ts
index 5e8a42ee..b75ab48d 100644
--- a/materialious/src/lib/misc.ts
+++ b/materialious/src/lib/misc.ts
@@ -1,14 +1,11 @@
import { pushState } from '$app/navigation';
import { page } from '$app/stores';
-import { Capacitor } from '@capacitor/core';
-import { StatusBar } from '@capacitor/status-bar';
import he from 'he';
import humanNumber from 'human-number';
import type Peer from 'peerjs';
import { get } from 'svelte/store';
import type { Image } from './api/model';
import { instanceStore, interfaceForceCase } from './store';
-import { getDynamicTheme } from './theme';
export type TitleCase = 'uppercase' | 'lowercase' | 'sentence case' | 'title case' | null;
@@ -291,11 +288,3 @@ export function ensureNoTrailingSlash(url: any): string {
return url.endsWith('/') ? url.slice(0, -1) : url;
}
-
-export async function setStatusBarColor() {
- if (Capacitor.getPlatform() === 'android') {
- await StatusBar.setBackgroundColor({
- color: (await getDynamicTheme())['--surface-container']
- });
- }
-}
\ No newline at end of file
diff --git a/materialious/src/lib/navPages.ts b/materialious/src/lib/navPages.ts
new file mode 100644
index 00000000..28d14a14
--- /dev/null
+++ b/materialious/src/lib/navPages.ts
@@ -0,0 +1,39 @@
+import { _ } from 'svelte-i18n';
+import { get } from 'svelte/store';
+
+
+// Must be a func do to how i18n is loaded
+export function getPages(): { icon: string, href: string, name: string, requiresAuth: boolean; }[] {
+ return [
+ {
+ icon: 'home',
+ href: '/',
+ name: get(_)('pages.home'),
+ requiresAuth: false
+ },
+ {
+ icon: 'whatshot',
+ href: '/trending',
+ name: get(_)('pages.trending'),
+ requiresAuth: false
+ },
+ {
+ icon: 'subscriptions',
+ href: '/subscriptions',
+ name: get(_)('pages.subscriptions'),
+ requiresAuth: true
+ },
+ {
+ icon: 'video_library',
+ href: '/playlists',
+ name: get(_)('pages.playlists'),
+ requiresAuth: true
+ },
+ {
+ icon: 'history',
+ href: '/history',
+ name: get(_)('pages.history'),
+ requiresAuth: true
+ }
+ ];
+}
\ No newline at end of file
diff --git a/materialious/src/lib/patches/youtubejs.ts b/materialious/src/lib/patches/youtubejs.ts
index 36d61735..e76b9c18 100644
--- a/materialious/src/lib/patches/youtubejs.ts
+++ b/materialious/src/lib/patches/youtubejs.ts
@@ -159,11 +159,13 @@ export async function patchYoutubeJs(videoId: string): Promise {
});
}
+ console.log(video.primary_info);
+
return {
type: 'video',
title: video.primary_info.title?.toString() || '',
- viewCount: video.primary_info.view_count ? Number(video.primary_info.view_count?.toString()?.replace(/\D/g, '')) : 0,
- viewCountText: video.primary_info.view_count?.toString() || '',
+ viewCount: Number(video.primary_info.view_count?.original_view_count || 0),
+ viewCountText: video.primary_info.view_count?.original_view_count.toString() || '0',
likeCount: video.basic_info.like_count || 0,
dislikeCount: 0,
allowRatings: false,
diff --git a/materialious/src/lib/store.ts b/materialious/src/lib/store.ts
index 10cc4374..ad0708c5 100644
--- a/materialious/src/lib/store.ts
+++ b/materialious/src/lib/store.ts
@@ -67,6 +67,7 @@ export const interfaceAutoExpandDesc: Writable = persisted('autoExpandD
export const interfaceAmoledTheme = persisted('amoledTheme', false);
export const interfaceLowBandwidthMode = persisted('lowBandwidthMode', false);
export const interfaceDisplayThumbnailAvatars = persisted('disableThumbnailAvatars', false);
+export const interfaceDefaultPage = persisted('defaultPage', '/');
export const sponsorBlockStore = persisted('sponsorBlock', true);
export const sponsorBlockUrlStore: Writable = persisted(
diff --git a/materialious/src/lib/theme.ts b/materialious/src/lib/theme.ts
index bc176374..4cf28eae 100644
--- a/materialious/src/lib/theme.ts
+++ b/materialious/src/lib/theme.ts
@@ -1,3 +1,6 @@
+import { Capacitor } from '@capacitor/core';
+import { StatusBar, Style } from '@capacitor/status-bar';
+import { NavigationBar } from '@hugotomazi/capacitor-navigation-bar';
import ui from 'beercss';
import { get } from 'svelte/store';
import { darkModeStore, interfaceAmoledTheme } from './store';
@@ -15,6 +18,26 @@ export async function getDynamicTheme(mode?: string): Promise
import { afterNavigate, beforeNavigate, goto } from '$app/navigation';
- import { navigating } from '$app/stores';
+
+ import { navigating, page } from '$app/stores';
import '$lib/android/http/androidRequests';
import colorTheme, { convertToHexColorCode } from '$lib/android/plugins/colorTheme';
import { getFeed } from '$lib/api/index';
@@ -8,7 +9,7 @@
import { bookmarkletLoadFromUrl, loadSettingsFromEnv } from '$lib/externalSettings';
import Logo from '$lib/Logo.svelte';
import MiniPlayer from '$lib/MiniPlayer.svelte';
- import { setStatusBarColor } from '$lib/misc';
+ import { getPages } from '$lib/navPages';
import PageLoading from '$lib/PageLoading.svelte';
import Search from '$lib/Search.svelte';
import Settings from '$lib/Settings.svelte';
@@ -18,12 +19,13 @@
darkModeStore,
instanceStore,
interfaceAmoledTheme,
+ interfaceDefaultPage,
showWarningStore,
syncPartyPeerStore,
themeColorStore
} from '$lib/store';
import SyncParty from '$lib/SyncParty.svelte';
- import { setAmoledTheme, setTheme } from '$lib/theme';
+ import { setAmoledTheme, setStatusBarColor, setTheme } from '$lib/theme';
import Thumbnail from '$lib/Thumbnail.svelte';
import { App } from '@capacitor/app';
import { Browser } from '@capacitor/browser';
@@ -48,39 +50,6 @@
let notifications: Notification[] = [];
- const pages = [
- {
- icon: 'home',
- href: '/',
- name: $_('pages.home'),
- requiresAuth: false
- },
- {
- icon: 'whatshot',
- href: '/trending',
- name: $_('pages.trending'),
- requiresAuth: false
- },
- {
- icon: 'subscriptions',
- href: '/subscriptions',
- name: $_('pages.subscriptions'),
- requiresAuth: true
- },
- {
- icon: 'video_library',
- href: '/playlists',
- name: $_('pages.playlists'),
- requiresAuth: true
- },
- {
- icon: 'history',
- href: '/history',
- name: $_('pages.history'),
- requiresAuth: true
- }
- ];
-
interfaceAmoledTheme.subscribe(() => {
setAmoledTheme();
});
@@ -178,6 +147,19 @@
onMount(async () => {
ui();
+ if (
+ $interfaceDefaultPage &&
+ $interfaceDefaultPage !== '/' &&
+ $interfaceDefaultPage.startsWith('/') &&
+ $page.url.pathname === '/'
+ ) {
+ getPages().forEach((page) => {
+ if (page.href === $interfaceDefaultPage && (!page.requiresAuth || $authStore)) {
+ goto($interfaceDefaultPage);
+ }
+ });
+ }
+
scrollableRoot = document.querySelector('.root');
loadSettingsFromEnv();
@@ -216,7 +198,7 @@