diff --git a/materialious/src/lib/Api/index.ts b/materialious/src/lib/Api/index.ts index 277d0598..4d6fa107 100644 --- a/materialious/src/lib/Api/index.ts +++ b/materialious/src/lib/Api/index.ts @@ -3,7 +3,8 @@ import { authStore, deArrowInstanceStore, deArrowThumbnailInstanceStore, - returnYTDislikesInstanceStore + returnYTDislikesInstanceStore, + synciousInstanceStore } from '../../store'; import type { Channel, @@ -18,6 +19,7 @@ import type { ReturnYTDislikes, SearchSuggestion, Subscription, + SynciousProgressModel, Video, VideoPlay } from './model'; @@ -301,3 +303,56 @@ export async function getThumbnail(videoId: string, time: number): Promise { + const resp = await fetchErrorHandle( + await fetch( + `${get(synciousInstanceStore)}/video/${encodeURIComponent(videoId)}`, + buildAuthHeaders() + ) + ); + + return resp.json(); +} + +export async function saveVideoProgress(videoId: string, time: number) { + const headers: Record> = buildAuthHeaders(); + headers['headers']['Content-type'] = 'application/json'; + + await fetchErrorHandle( + await fetch( + `${get(synciousInstanceStore)}/video/${encodeURIComponent(videoId)}`, + { + ...headers, + method: "POST", + body: JSON.stringify({ + time: time + }) + } + ) + ); +} + +export async function deleteVideoProgress(videoId: string) { + await fetchErrorHandle( + await fetch( + `${get(synciousInstanceStore)}/video/${videoId}`, + { + method: "DELETE", + ...buildAuthHeaders() + } + ) + ); +} + +export async function deleteAllVideoProgress() { + await fetchErrorHandle( + await fetch( + `${get(synciousInstanceStore)}/videos`, + { + method: "DELETE", + ...buildAuthHeaders() + } + ) + ); +} \ No newline at end of file diff --git a/materialious/src/lib/Api/model.ts b/materialious/src/lib/Api/model.ts index dd1604b7..6fe6552f 100644 --- a/materialious/src/lib/Api/model.ts +++ b/materialious/src/lib/Api/model.ts @@ -250,3 +250,12 @@ export interface DeArrow { randomTime: number; videoDuration: number; } + +export interface SynciousProgressModel { + time: number; + video_id: string; +} + +export interface SynciousSaveProgressModel { + time: number; +} diff --git a/materialious/src/routes/+layout.svelte b/materialious/src/routes/+layout.svelte index 4752fb0f..cf5791bd 100644 --- a/materialious/src/routes/+layout.svelte +++ b/materialious/src/routes/+layout.svelte @@ -42,6 +42,8 @@ sponsorBlockUrlStore, syncPartyConnectionsStore, syncPartyPeerStore, + synciousInstanceStore, + synciousStore, themeColorStore } from '../store'; @@ -61,6 +63,7 @@ let notifications: Notification[] = []; let sponsorBlockInstance = get(sponsorBlockUrlStore); + let synciousInstance = get(synciousInstanceStore); let returnYTInstance = get(returnYTDislikesInstanceStore); let deArrowUrl = get(deArrowInstanceStore); let deArrowThumbnailUrl = get(deArrowThumbnailInstanceStore); @@ -604,6 +607,36 @@ +
+
Syncious
+ +
synciousInstanceStore.set(synciousInstance)}> + +
+ + +
+
Sponsorblock
diff --git a/materialious/src/store.ts b/materialious/src/store.ts index ff329409..7d2f5dd1 100644 --- a/materialious/src/store.ts +++ b/materialious/src/store.ts @@ -3,10 +3,12 @@ import type { DataConnection } from 'peerjs'; import { persisted } from 'svelte-persisted-store'; import { writable, type Writable } from 'svelte/store'; -export const returnYTDislikesInstanceStore: Writable = persisted( - 'returnYTDislikesInstance', - import.meta.env.VITE_DEFAULT_RETURNYTDISLIKES_INSTANCE +export const authStore: Writable = persisted( + 'authToken', + null ); + + export const darkModeStore: Writable = persisted('darkMode', null); export const themeColorStore: Writable = persisted('themeColor', null); @@ -22,15 +24,20 @@ export const playerTheatreModeByDefaultStore = persisted('theatreModeByDefault', export const playerAutoplayNextByDefaultStore = persisted('autoplayNextByDefault', false); export const returnYtDislikesStore = persisted('returnYtDislikes', false); +export const returnYTDislikesInstanceStore: Writable = persisted( + 'returnYTDislikesInstance', + import.meta.env.VITE_DEFAULT_RETURNYTDISLIKES_INSTANCE +); + +export const synciousStore = persisted('syncious', true); +export const synciousInstanceStore: Writable = persisted( + 'synciousInstance', + import.meta.env.VITE_DEFAULT_SYNCIOUS_INSTANCE +); export const interfaceSearchSuggestionsStore = persisted('searchSuggestions', true); export const interfacePreviewVideoOnHoverStore = persisted('previewVideoOnHover', true); -export const authStore: Writable = persisted( - 'authToken', - null -); - export const sponsorBlockStore = persisted('sponsorBlock', true); export const sponsorBlockUrlStore: Writable = persisted( 'sponsorBlockUrl',