1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Load only required fallback fonts for ASS subtitles, instead of preloading them all

This commit is contained in:
p0358 2024-08-25 22:18:12 +02:00
parent 9a24c2fbd1
commit 792dee44e2
No known key found for this signature in database
GPG key ID: F2FFD05F552EFC00

View file

@ -1244,15 +1244,15 @@ export class HtmlVideoPlayer {
* @private * @private
*/ */
renderSsaAss(videoElement, track, item) { renderSsaAss(videoElement, track, item) {
const supportedFonts = ['application/vnd.ms-opentype', 'application/x-truetype-font', 'font/otf', 'font/ttf', 'font/woff', 'font/woff2']; const supportedFontMimeTypes = ['application/vnd.ms-opentype', 'application/x-truetype-font', 'font/otf', 'font/ttf', 'font/woff', 'font/woff2'];
const availableFonts = []; const fontsToPreload = [];
const attachments = this._currentPlayOptions.mediaSource.MediaAttachments || []; const attachments = this._currentPlayOptions.mediaSource.MediaAttachments || [];
const apiClient = ServerConnections.getApiClient(item); const apiClient = ServerConnections.getApiClient(item);
attachments.forEach(i => { attachments.forEach(i => {
// we only require font files and ignore embedded media attachments like covers as there are cases where ffmpeg fails to extract those // we only require font files and ignore embedded media attachments like covers as there are cases where ffmpeg fails to extract those
if (supportedFonts.includes(i.MimeType)) { if (supportedFontMimeTypes.includes(i.MimeType)) {
// embedded font url // embedded font url
availableFonts.push(apiClient.getUrl(i.DeliveryUrl)); fontsToPreload.push(apiClient.getUrl(i.DeliveryUrl));
} }
}); });
const fallbackFontList = apiClient.getUrl('/FallbackFont/Fonts', { const fallbackFontList = apiClient.getUrl('/FallbackFont/Fonts', {
@ -1263,7 +1263,7 @@ export class HtmlVideoPlayer {
const options = { const options = {
video: videoElement, video: videoElement,
subUrl: getTextTrackUrl(track, item), subUrl: getTextTrackUrl(track, item),
fonts: availableFonts, fonts: fontsToPreload,
workerUrl: `${appRouter.baseUrl()}/libraries/subtitles-octopus-worker.js`, workerUrl: `${appRouter.baseUrl()}/libraries/subtitles-octopus-worker.js`,
legacyWorkerUrl: `${appRouter.baseUrl()}/libraries/subtitles-octopus-worker-legacy.js`, legacyWorkerUrl: `${appRouter.baseUrl()}/libraries/subtitles-octopus-worker-legacy.js`,
onError() { onError() {
@ -1301,12 +1301,18 @@ export class HtmlVideoPlayer {
if (config.EnableFallbackFont) { if (config.EnableFallbackFont) {
apiClient.getJSON(fallbackFontList).then((fontFiles = []) => { apiClient.getJSON(fallbackFontList).then((fontFiles = []) => {
const availableFonts = {};
fontFiles.forEach(font => { fontFiles.forEach(font => {
if (!font.FamilyName) return;
const familyNameLower = font.FamilyName.trim().toLowerCase();
if (!(familyNameLower in availableFonts)) {
const fontUrl = apiClient.getUrl(`/FallbackFont/Fonts/${encodeURIComponent(font.Name)}`, { const fontUrl = apiClient.getUrl(`/FallbackFont/Fonts/${encodeURIComponent(font.Name)}`, {
api_key: apiClient.accessToken() api_key: apiClient.accessToken()
}); });
availableFonts.push(fontUrl); availableFonts[familyNameLower] = fontUrl;
}
}); });
options.availableFonts = availableFonts;
this.#currentAssRenderer = new SubtitlesOctopus(options); this.#currentAssRenderer = new SubtitlesOctopus(options);
}); });
} else { } else {