From 6b806c7ddab6c5e034f16db390938e5bf6442b7f Mon Sep 17 00:00:00 2001 From: WardPearce Date: Thu, 23 Apr 2026 21:42:42 +1200 Subject: [PATCH] Playlist go to last item in watch history --- .../electron/src/rt/electron-plugins.js | 2 + materialious/src/lib/api/youtubejs/schema.ts | 1 - materialious/src/lib/filtering/index.ts | 1 - .../routes/(app)/playlist/[slug]/+page.svelte | 58 +++++++++++++++---- 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/materialious/electron/src/rt/electron-plugins.js b/materialious/electron/src/rt/electron-plugins.js index b33b2826..5f312366 100644 --- a/materialious/electron/src/rt/electron-plugins.js +++ b/materialious/electron/src/rt/electron-plugins.js @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-var-requires */ +const CapacitorNodejs = require('../../../node_modules/capacitor-nodejs/electron/dist/plugin.js'); module.exports = { + CapacitorNodejs, } \ No newline at end of file diff --git a/materialious/src/lib/api/youtubejs/schema.ts b/materialious/src/lib/api/youtubejs/schema.ts index 58819f6c..ba673718 100644 --- a/materialious/src/lib/api/youtubejs/schema.ts +++ b/materialious/src/lib/api/youtubejs/schema.ts @@ -6,7 +6,6 @@ import { Helpers, YTNodes } from 'youtubei.js'; export function invidiousItemSchema(item: Helpers.YTNode): Video | Channel | Playlist | undefined { if (item.is(YTNodes.Video)) { const views = extractNumber(item.view_count?.toString() || ''); - console.log(item); return { type: 'video', title: item.title.toString(), diff --git a/materialious/src/lib/filtering/index.ts b/materialious/src/lib/filtering/index.ts index 425a0211..450ea516 100644 --- a/materialious/src/lib/filtering/index.ts +++ b/materialious/src/lib/filtering/index.ts @@ -51,7 +51,6 @@ const zFilterRootSchema = z.object({ }); export function isItemFiltered(item: FeedItem): boolean { - console.log(item); const filteredContent = get(filterContentListStore); if (!filteredContent) return false; diff --git a/materialious/src/routes/(app)/playlist/[slug]/+page.svelte b/materialious/src/routes/(app)/playlist/[slug]/+page.svelte index bda6a485..e2040707 100644 --- a/materialious/src/routes/(app)/playlist/[slug]/+page.svelte +++ b/materialious/src/routes/(app)/playlist/[slug]/+page.svelte @@ -7,29 +7,63 @@ import ItemsList from '$lib/components/layout/ItemsList.svelte'; import Share from '$lib/components/Share.svelte'; import { page } from '$app/state'; + import { goto } from '$app/navigation'; + import type { VideoWatchHistory } from '$lib/api/model.js'; + import { getWatchHistory } from '$lib/api/index.js'; let { data } = $props(); + + async function loadLastWatched() { + const videoIds = data.playlist.videos.map((video) => video.videoId); + + let lastHistory: VideoWatchHistory[] = []; + + let page = 0; + while (true) { + const historyPage = await getWatchHistory({ page, videoIds }); + + if (historyPage.length === 0) break; + + lastHistory = historyPage; + + page++; + } + + if (lastHistory.length > 0) { + goto( + resolve( + $isAndroidTvStore + ? `/tv/[videoId]?playlist=${data.playlist.info.playlistId}` + : `/watch/[videoId]?playlist=${data.playlist.info.playlistId}`, + { + videoId: lastHistory[0].videoId + } + ) + ); + } else { + goto( + resolve( + $isAndroidTvStore + ? `/tv/[videoId]?playlist=${data.playlist.info.playlistId}` + : `/watch/[videoId]?playlist=${data.playlist.info.playlistId}`, + { + videoId: data.playlist.videos[0].videoId + } + ) + ); + } + }
{#if data.playlist.videos.length > 0}