diff --git a/materialious/src/lib/Player.svelte b/materialious/src/lib/Player.svelte index 2c8781b4..43619844 100644 --- a/materialious/src/lib/Player.svelte +++ b/materialious/src/lib/Player.svelte @@ -32,6 +32,7 @@ sponsorBlockCategoriesStore, sponsorBlockDisplayToastStore, sponsorBlockStore, + sponsorBlockTimelineStore, sponsorBlockUrlStore, synciousInstanceStore, synciousStore @@ -43,19 +44,62 @@ export let player: MediaPlayerElement; export let isSyncing: boolean = false; export let isEmbed: boolean = false; + export let segments: Segment[] = []; let src: PlayerSrc = []; let categoryBeingSkipped = ''; let playerIsLive = false; let playerPosSet = false; - let segments: Segment[]; - let userVideoSpeed = 1; let silenceIsFastForwarding = false; 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'); @@ -250,6 +294,12 @@ get(sponsorBlockCategoriesStore) as Category[] ); + setSponsorTimeline(); + + addEventListener('resize', () => { + setSponsorTimeline(); + }); + player.addEventListener('time-update', (event: MediaTimeUpdateEvent) => { segments.forEach((segment) => { if ( 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