diff --git a/materialious/android/app/build.gradle b/materialious/android/app/build.gradle index 94e6216b..c9469893 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 213 - versionName "1.15.5" + versionCode 214 + versionName "1.15.6" 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/electron/materialious.metainfo.xml b/materialious/electron/materialious.metainfo.xml index ba535d43..2b7fde22 100644 --- a/materialious/electron/materialious.metainfo.xml +++ b/materialious/electron/materialious.metainfo.xml @@ -78,7 +78,11 @@ - + + + https://github.com/Materialious/Materialious/releases/tag/1.15.6 + + https://github.com/Materialious/Materialious/releases/tag/1.15.5 diff --git a/materialious/electron/package.json b/materialious/electron/package.json index 74a45e32..fe9af0a5 100644 --- a/materialious/electron/package.json +++ b/materialious/electron/package.json @@ -1,6 +1,6 @@ { "name": "Materialious", - "version": "1.15.5", + "version": "1.15.6", "description": "Modern material design for YouTube and Invidious.", "author": { "name": "Ward Pearce", diff --git a/materialious/package.json b/materialious/package.json index a2aa63ac..3df66039 100644 --- a/materialious/package.json +++ b/materialious/package.json @@ -1,6 +1,6 @@ { "name": "materialious", - "version": "1.15.5", + "version": "1.15.6", "private": true, "scripts": { "dev": "npm run patch:github && vite dev", diff --git a/materialious/src/lib/api/backend.ts b/materialious/src/lib/api/backend.ts index 35534f92..9f25ab1a 100644 --- a/materialious/src/lib/api/backend.ts +++ b/materialious/src/lib/api/backend.ts @@ -85,16 +85,22 @@ export async function deleteUnsubscribeBackend(authorId: string) { }); } -export async function postSubscribeBackend(authorId: string) { +export async function postSubscribeBackend( + authorId: string, + authorName: string | undefined = undefined +) { const rawKey = await getRawKey(); if (!rawKey) return; const internalAuthorId = await getInternalAuthorId(authorId, rawKey); - const channel = await getChannelYTjs(authorId); + if (!authorName) { + const channel = await getChannelYTjs(authorId); + authorName = channel.author; + } const channelId = await encryptWithMasterKey(authorId); - const channelName = await encryptWithMasterKey(channel.author); + const channelName = await encryptWithMasterKey(authorName); const resp = await fetch(`/api/user/subscriptions/${internalAuthorId}`, { method: 'POST', diff --git a/materialious/src/lib/api/youtubejs/subscriptions.ts b/materialious/src/lib/api/youtubejs/subscriptions.ts index e3dd1de2..85885867 100644 --- a/materialious/src/lib/api/youtubejs/subscriptions.ts +++ b/materialious/src/lib/api/youtubejs/subscriptions.ts @@ -60,7 +60,9 @@ export async function deleteUnsubscribeYTjs(authorId: string) { export async function parseChannelRSS(channelId: string): Promise { const feedUrl = `https://www.youtube.com/feeds/videos.xml?channel_id=${channelId}`; - const response = await fetch(feedUrl); + const response = await fetch(feedUrl, { priority: 'low' }); + if (!response.ok) return; + const text = await response.text(); const parser = new DOMParser(); diff --git a/materialious/src/lib/components/ItemsList.svelte b/materialious/src/lib/components/ItemsList.svelte index d6f0e6bc..4d8c99f2 100644 --- a/materialious/src/lib/components/ItemsList.svelte +++ b/materialious/src/lib/components/ItemsList.svelte @@ -6,10 +6,11 @@ import ContentColumn from './ContentColumn.svelte'; import { onMount, onDestroy, tick } from 'svelte'; import Mousetrap from 'mousetrap'; - import { extractUniqueId, type feedItems } from '$lib/misc'; + import { extractUniqueId, timeout, type feedItems } from '$lib/misc'; import ChannelThumbnail from './ChannelThumbnail.svelte'; import PlaylistThumbnail from './PlaylistThumbnail.svelte'; import HashtagThumbnail from './HashtagThumbnail.svelte'; + import NoResults from './NoResults.svelte'; interface Props { items?: feedItems; @@ -184,15 +185,16 @@ } else if ($feedLastItemId) { const element = document.getElementById($feedLastItemId); - feedLastItemId.set(undefined); - if (element) { + await timeout(100); element.scrollIntoView({ behavior: 'instant', block: 'start', inline: 'nearest' }); } + + feedLastItemId.set(undefined); } }); @@ -215,16 +217,7 @@
{#if items.length === 0} -
-
- -

{$_('noResult')}

-
+ {/if}
{#each items as item, index (index)} diff --git a/materialious/src/lib/components/NoResults.svelte b/materialious/src/lib/components/NoResults.svelte new file mode 100644 index 00000000..77a50ba6 --- /dev/null +++ b/materialious/src/lib/components/NoResults.svelte @@ -0,0 +1,14 @@ + + +
+
+ +

{$_('noResult')}

+
diff --git a/materialious/src/lib/components/settings/Engine.svelte b/materialious/src/lib/components/settings/Engine.svelte index bec09b96..d34cc84d 100644 --- a/materialious/src/lib/components/settings/Engine.svelte +++ b/materialious/src/lib/components/settings/Engine.svelte @@ -7,13 +7,16 @@ engineFallbacksStore, engineMaxConcurrentChannelsStore, invidiousInstanceStore, - backendInUseStore + backendInUseStore, + rawMasterKeyStore } from '$lib/store'; import { useEngineFallback, type EngineFallback } from '$lib/api/misc'; import { get } from 'svelte/store'; import { getSubscriptions, postSubscribe } from '$lib/api'; import { postSubscribeYTjs } from '$lib/api/youtubejs/subscriptions'; import { addToast } from '../Toast.svelte'; + import { isOwnBackend } from '$lib/shared'; + import { postSubscribeBackend } from '$lib/api/backend'; const engineFallbacks: EngineFallback[] = [ 'Channel', @@ -53,9 +56,17 @@ } }); + let subscribeFunction: (id: string, name: string) => Promise; + + if (isOwnBackend()?.internalAuth && $rawMasterKeyStore) { + subscribeFunction = postSubscribeBackend; + } else { + subscribeFunction = postSubscribeYTjs; + } + const subPromises: Promise[] = []; importedSubs.forEach((sub) => { - subPromises.push(postSubscribeYTjs(sub.authorId, sub.author)); + subPromises.push(subscribeFunction(sub.authorId, sub.author)); }); await Promise.all(subPromises); diff --git a/materialious/src/lib/components/settings/Interface.svelte b/materialious/src/lib/components/settings/Interface.svelte index 5ed90282..393870d3 100644 --- a/materialious/src/lib/components/settings/Interface.svelte +++ b/materialious/src/lib/components/settings/Interface.svelte @@ -11,7 +11,12 @@ import type { RgbaColor, HsvaColor, Colord } from 'colord'; import { _ } from '$lib/i18n'; import { get } from 'svelte/store'; - import { isUnrestrictedPlatform, setInvidiousInstance, goToInvidiousLogin } from '../../misc'; + import { + isUnrestrictedPlatform, + setInvidiousInstance, + goToInvidiousLogin, + invidiousLogout + } from '../../misc'; import { getPages, type Pages } from '../../navPages'; import ColorPicker from 'svelte-awesome-color-picker'; import { @@ -158,12 +163,7 @@ {$_('linkInvidious')} {:else} - diff --git a/materialious/src/lib/components/settings/InternalAccount.svelte b/materialious/src/lib/components/settings/InternalAccount.svelte index 7e8e9bc3..d9e28c80 100644 --- a/materialious/src/lib/components/settings/InternalAccount.svelte +++ b/materialious/src/lib/components/settings/InternalAccount.svelte @@ -1,6 +1,6 @@ diff --git a/materialious/src/lib/components/settings/Player.svelte b/materialious/src/lib/components/settings/Player.svelte index d2f5d862..5af31689 100644 --- a/materialious/src/lib/components/settings/Player.svelte +++ b/materialious/src/lib/components/settings/Player.svelte @@ -5,6 +5,7 @@ import { _ } from '$lib/i18n'; import { get } from 'svelte/store'; import { + backendInUseStore, playerAlwaysLoopStore, playerAndroidLockOrientation, playerAndroidPauseOnNetworkChange, @@ -22,7 +23,7 @@ playerYouTubeJsFallback } from '../../store'; import { playbackRates } from '$lib/player'; - import { isUnrestrictedPlatform, isYTBackend } from '$lib/misc'; + import { isUnrestrictedPlatform } from '$lib/misc'; let defaultLanguage = $state(get(playerDefaultLanguage)); @@ -122,7 +123,7 @@ arrow_drop_down
-{#if isUnrestrictedPlatform() && !isYTBackend()} +{#if isUnrestrictedPlatform() && $backendInUseStore === 'ivg'}
-
+{#if subscriptions.length > 0} +
+
+ search +
- {#each subscriptions as sub (sub.authorId)} - - {/each} -
+ {#each subscriptions as sub (sub.authorId)} + + {/each} +
+{:else} + +{/if}