diff --git a/materialious/android/app/build.gradle b/materialious/android/app/build.gradle index 3d67f9d6..582a9dda 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 32 - versionName "1.3.3" + versionCode 33 + versionName "1.3.4" 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/package.json b/materialious/electron/package.json index 0efe5f43..a5a6fe05 100644 --- a/materialious/electron/package.json +++ b/materialious/electron/package.json @@ -1,6 +1,6 @@ { "name": "Materialious", - "version": "1.3.3", + "version": "1.3.4", "description": "Modern material design for Invidious.", "author": { "name": "Ward Pearce", diff --git a/materialious/package.json b/materialious/package.json index 2bb70adf..115fabeb 100644 --- a/materialious/package.json +++ b/materialious/package.json @@ -1,6 +1,6 @@ { "name": "materialious", - "version": "1.3.3", + "version": "1.3.4", "private": true, "scripts": { "dev": "vite dev", diff --git a/materialious/src/lib/Player.svelte b/materialious/src/lib/Player.svelte index 69bd66e2..43619844 100644 --- a/materialious/src/lib/Player.svelte +++ b/materialious/src/lib/Player.svelte @@ -4,7 +4,7 @@ import { page } from '$app/stores'; import { Capacitor } from '@capacitor/core'; import type { Page } from '@sveltejs/kit'; - import { SponsorBlock, type Category } from 'sponsorblock-api'; + import { SponsorBlock, type Category, type Segment } from 'sponsorblock-api'; import { onDestroy, onMount } from 'svelte'; import { _ } from 'svelte-i18n'; import { get } from 'svelte/store'; @@ -32,6 +32,7 @@ sponsorBlockCategoriesStore, sponsorBlockDisplayToastStore, sponsorBlockStore, + sponsorBlockTimelineStore, sponsorBlockUrlStore, synciousInstanceStore, synciousStore @@ -43,6 +44,7 @@ export let player: MediaPlayerElement; export let isSyncing: boolean = false; export let isEmbed: boolean = false; + export let segments: Segment[] = []; let src: PlayerSrc = []; let categoryBeingSkipped = ''; @@ -54,6 +56,50 @@ let silenceSkipperInterval: NodeJS.Timeout; + let sponsorBlockElements: Element[] = []; + + function setSponsorTimeline() { + if (!get(sponsorBlockTimelineStore)) return; + if (segments.length === 0) return; + + const timeline = document.getElementsByClassName('vds-time-slider')[0]; + + if (sponsorBlockElements.length > 0) { + sponsorBlockElements.forEach((barDiv) => { + if (timeline.contains(barDiv)) { + timeline.removeChild(barDiv); + } + }); + } + + const segmentColors = { + sponsor: '00d400', + selfpromo: 'ffff00', + interaction: 'cc00ff', + intro: '00ffff', + outro: '0202ed', + preview: '008fd6', + music_offtopic: 'ff9900', + filler: '7300FF' + }; + + segments.forEach((segment) => { + const startPercent = (segment.startTime / data.video.lengthSeconds) * 100; + const endPercent = (segment.endTime / data.video.lengthSeconds) * 100; + const widthPercent = endPercent - startPercent; + + const barDiv = document.createElement('div'); + barDiv.classList.add('sponsorskip-bar'); + barDiv.style.left = `${startPercent}%`; + barDiv.style.width = `${widthPercent}%`; + barDiv.style.backgroundColor = + segment.category in segmentColors ? `#${segmentColors[segment.category]}` : 'grey'; + + timeline.appendChild(barDiv); + sponsorBlockElements.push(barDiv); + }); + } + function loadTimeFromUrl(page: Page): boolean { if (player) { const timeGivenUrl = page.url.searchParams.get('time'); @@ -243,11 +289,17 @@ const sponsorBlock = new SponsorBlock('', { baseURL: sponsorBlockUrl }); try { - const segments = await sponsorBlock.getSegments( + segments = await sponsorBlock.getSegments( data.video.videoId, get(sponsorBlockCategoriesStore) as Category[] ); + setSponsorTimeline(); + + addEventListener('resize', () => { + setSponsorTimeline(); + }); + player.addEventListener('time-update', (event: MediaTimeUpdateEvent) => { segments.forEach((segment) => { if ( @@ -275,6 +327,9 @@ } player.addEventListener('dash-can-play', async () => { + if (get(playerAutoPlayStore)) { + player.play(); + } await loadPlayerPos(); }); } else { diff --git a/materialious/src/lib/Settings.svelte b/materialious/src/lib/Settings.svelte index 351adee6..8ec9d1fb 100644 --- a/materialious/src/lib/Settings.svelte +++ b/materialious/src/lib/Settings.svelte @@ -36,6 +36,7 @@ sponsorBlockCategoriesStore, sponsorBlockDisplayToastStore, sponsorBlockStore, + sponsorBlockTimelineStore, sponsorBlockUrlStore, synciousInstanceStore, synciousStore, @@ -552,6 +553,20 @@ + +
{$_('layout.sponsors.Catagories')}
diff --git a/materialious/src/lib/i18n/locales/en.json b/materialious/src/lib/i18n/locales/en.json index b1228608..d7bff6a3 100644 --- a/materialious/src/lib/i18n/locales/en.json +++ b/materialious/src/lib/i18n/locales/en.json @@ -130,6 +130,7 @@ "sponsors": { "sponsor": "Sponsor", "disableToast": "Disable toast", + "disableTimeline": "Disable segments on timeline", "Catagories": "Catagories", "unpaidSelfPromotion": "Unpaid/Self Promotion", "interactionReminder": "Interaction Reminder (Subscribe)", diff --git a/materialious/src/lib/store.ts b/materialious/src/lib/store.ts index 1968e8ee..fdd2f72c 100644 --- a/materialious/src/lib/store.ts +++ b/materialious/src/lib/store.ts @@ -72,6 +72,10 @@ export const sponsorBlockDisplayToastStore: Writable{data.video.author}
-{data.video.subCountText}
+{data.video.author}
+{data.video.subCountText}