{$_('transcript')}
diff --git a/materialious/src/lib/components/Watch/Description.svelte b/materialious/src/lib/components/Watch/Description.svelte
index 4cc6ffee..318132bf 100644
--- a/materialious/src/lib/components/Watch/Description.svelte
+++ b/materialious/src/lib/components/Watch/Description.svelte
@@ -30,14 +30,14 @@
{@html description}
-
-
+
+ {/if}
diff --git a/materialious/src/lib/css/global.css b/materialious/src/lib/css/global.css
index 6ffa26b7..5f711192 100644
--- a/materialious/src/lib/css/global.css
+++ b/materialious/src/lib/css/global.css
@@ -1,3 +1,12 @@
+::-webkit-scrollbar {
+ display: none;
+}
+
+@font-face {
+ font-family: Inter;
+ src: url('/static/inter.ttf');
+}
+
article {
box-shadow: none !important;
}
diff --git a/materialious/src/lib/css/shaka-player-theme.css b/materialious/src/lib/css/shaka-player-theme.css
index 6c056c3e..75feabaf 100644
--- a/materialious/src/lib/css/shaka-player-theme.css
+++ b/materialious/src/lib/css/shaka-player-theme.css
@@ -1,3 +1,7 @@
+.shaka-text-container > div {
+ align-items: center !important;
+}
+
.player-theme {
font-family: var(--font) !important;
color: var(--on-surface) !important;
@@ -18,7 +22,7 @@
visibility: visible !important;
z-index: 99999999 !important;
pointer-events: auto !important;
- max-height: 400px !important;
+ max-height: 400px;
}
.shaka-overflow-menu button,
@@ -97,3 +101,15 @@
visibility: visible !important;
}
}
+
+@media only screen and (width <=400px) {
+ :deep(.shaka-text-container) {
+ font-size: 16px !important;
+ }
+
+ .player-theme .shaka-overflow-menu,
+ .player-theme .shaka-settings-menu {
+ max-height: 80%;
+ overflow-y: scroll;
+ }
+}
diff --git a/materialious/src/lib/patches/youtubejs.ts b/materialious/src/lib/patches/youtubejs.ts
index ebe57152..479e3b51 100644
--- a/materialious/src/lib/patches/youtubejs.ts
+++ b/materialious/src/lib/patches/youtubejs.ts
@@ -1,6 +1,7 @@
import { androidPoTokenMinter } from '$lib/android/youtube/minter';
import type {
AdaptiveFormats,
+ Captions,
Image,
StoryBoard,
Thumbnail,
@@ -11,7 +12,27 @@ import { interfaceRegionStore, poTokenCacheStore } from '$lib/store';
import { Capacitor } from '@capacitor/core';
import BG, { USER_AGENT } from 'bgutils-js';
import { get } from 'svelte/store';
-import { Innertube, UniversalCache, Utils, YT, YTNodes } from 'youtubei.js';
+import type { Types } from 'youtubei.js';
+import { Innertube, UniversalCache, Utils, YT, YTNodes, Platform } from 'youtubei.js';
+
+Platform.shim.eval = async (
+ data: Types.BuildScriptResult,
+ env: Record
+) => {
+ const properties = [];
+
+ if (env.n) {
+ properties.push(`n: exportedVars.nFunction("${env.n}")`);
+ }
+
+ if (env.sig) {
+ properties.push(`sig: exportedVars.sigFunction("${env.sig}")`);
+ }
+
+ const code = `${data.output}\nreturn { ${properties.join(', ')} }`;
+
+ return new Function(code)();
+};
export async function patchYoutubeJs(videoId: string): Promise {
if (!Capacitor.isNativePlatform()) {
@@ -22,8 +43,7 @@ export async function patchYoutubeJs(videoId: string): Promise {
fetch: fetch,
cache: new UniversalCache(false),
location: get(interfaceRegionStore),
- user_agent: USER_AGENT,
- player_id: '0004de42'
+ user_agent: USER_AGENT
});
const requestKey = 'O43z0dpjhgX20SCx4KAo';
@@ -44,7 +64,7 @@ export async function patchYoutubeJs(videoId: string): Promise {
pyv: true
},
contentPlaybackContext: {
- signatureTimestamp: youtube.session.player?.sts
+ signatureTimestamp: youtube.session.player?.signature_timestamp
}
}
});
@@ -61,13 +81,7 @@ export async function patchYoutubeJs(videoId: string): Promise {
throw new Error('Unable to pull video info from youtube.js');
}
- if (video.basic_info.is_live) {
- poTokenCacheStore.set(await platformMinter(requestKey, videoId));
- } else {
- poTokenCacheStore.set(BG.PoToken.generateColdStartToken(videoId));
-
- platformMinter(requestKey, videoId).then((poToken) => poTokenCacheStore.set(poToken));
- }
+ poTokenCacheStore.set(await platformMinter(requestKey, videoId));
let dashUri: string | undefined;
@@ -90,7 +104,6 @@ export async function patchYoutubeJs(videoId: string): Promise {
await video.toDash({
manifest_options: {
is_sabr: true,
- captions_format: 'vtt',
include_thumbnails: false
}
})
@@ -108,6 +121,27 @@ export async function patchYoutubeJs(videoId: string): Promise {
authorThumbnails = [];
}
+ const captions: Captions[] = [];
+ video.captions?.caption_tracks?.forEach((caption) => {
+ const url = new URL(caption.base_url);
+
+ url.searchParams.set('potc', '1');
+ url.searchParams.set('pot', get(poTokenCacheStore) ?? '');
+ url.searchParams.set('c', youtube.session.context.client.clientName);
+ url.searchParams.set('fmt', 'vtt');
+
+ // Remove &xosf=1 as it adds `position:63% line:0%` to the subtitle lines
+ // placing them in the top right corner
+ url.searchParams.delete('xosf');
+
+ captions.push({
+ label: caption.name?.toString() || '',
+ language_code: caption.language_code,
+ // Add correct format to url.
+ url: url.toString()
+ });
+ });
+
const recommendedVideos: VideoBase[] = [];
video.watch_next_feed?.forEach((recommended: Record) => {
if (
@@ -189,7 +223,7 @@ export async function patchYoutubeJs(videoId: string): Promise {
formatStreams: [],
recommendedVideos: recommendedVideos,
authorThumbnails: authorThumbnails,
- captions: [],
+ captions: captions,
authorId: video.basic_info.channel_id || '',
authorUrl: `/channel/${video.basic_info.channel_id}`,
authorVerified: false,
diff --git a/materialious/src/lib/sabr/index.ts b/materialious/src/lib/sabr/index.ts
index 05fc5f32..c64946ac 100644
--- a/materialious/src/lib/sabr/index.ts
+++ b/materialious/src/lib/sabr/index.ts
@@ -8,7 +8,10 @@ import { get } from 'svelte/store';
import { poTokenCacheStore } from '$lib/store';
import { buildSabrFormat } from 'googlevideo/utils';
-export function injectSabr(video: VideoPlay, player: shaka.Player): SabrStreamingAdapter | null {
+export async function injectSabr(
+ video: VideoPlay,
+ player: shaka.Player
+): Promise {
if (!video.ytjs || !Capacitor.isNativePlatform()) return null;
const sabrAdapter = new SabrStreamingAdapter({
@@ -44,7 +47,7 @@ export function injectSabr(video: VideoPlay, player: shaka.Player): SabrStreamin
pyv: true
},
contentPlaybackContext: {
- signatureTimestamp: video.ytjs.innertube.session.player?.sts
+ signatureTimestamp: video.ytjs.innertube.session.player?.signature_timestamp
},
reloadPlaybackContext: reloadContext
}
@@ -56,7 +59,7 @@ export function injectSabr(video: VideoPlay, player: shaka.Player): SabrStreamin
video.ytjs.video.cpn
);
sabrAdapter.setStreamingURL(
- video.ytjs.innertube.session.player!.decipher(
+ await video.ytjs.innertube.session.player!.decipher(
parsedInfo.streaming_data?.server_abr_streaming_url
)
);
@@ -77,7 +80,7 @@ export function injectSabr(video: VideoPlay, player: shaka.Player): SabrStreamin
if (video.ytjs.video.streaming_data && !isPostLiveDVR && !isLive) {
sabrAdapter.setStreamingURL(
- video.ytjs.innertube.session.player!.decipher(
+ await video.ytjs.innertube.session.player!.decipher(
video.ytjs.video.streaming_data?.server_abr_streaming_url
)
);
diff --git a/materialious/src/routes/(app)/playlist/[slug]/+page.svelte b/materialious/src/routes/(app)/playlist/[slug]/+page.svelte
index 2c7fe5be..4918015b 100644
--- a/materialious/src/routes/(app)/playlist/[slug]/+page.svelte
+++ b/materialious/src/routes/(app)/playlist/[slug]/+page.svelte
@@ -90,6 +90,8 @@
{/if}
+