X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fassets%2Fplayer%2Fpeertube-player.ts;h=7e53d2142f9fb639c7148d821745b461ec1a86f4;hb=5d128505dca854cb7225624936d1053f06473260;hp=baae740fe64846e6b8f2a03d842eee0155473fd5;hpb=999417328bde0e60cd59318fc1c18672356254ce;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/assets/player/peertube-player.ts b/client/src/assets/player/peertube-player.ts index baae740fe..7e53d2142 100644 --- a/client/src/assets/player/peertube-player.ts +++ b/client/src/assets/player/peertube-player.ts @@ -11,12 +11,16 @@ import './webtorrent-info-button' import './peertube-videojs-plugin' import './peertube-load-progress-bar' import './theater-button' -import { videojsUntyped } from './peertube-videojs-typings' +import { VideoJSCaption, videojsUntyped } from './peertube-videojs-typings' import { buildVideoEmbed, buildVideoLink, copyToClipboard } from './utils' import { getCompleteLocale, getShortLocale, is18nLocale, isDefaultLocale } from '../../../../shared/models/i18n/i18n' // Change 'Playback Rate' to 'Speed' (smaller for our settings menu) videojsUntyped.getComponent('PlaybackRateMenuButton').prototype.controlText_ = 'Speed' +// Change Captions to Subtitles/CC +videojsUntyped.getComponent('CaptionsButton').prototype.controlText_ = 'Subtitles/CC' +// We just want to display 'Off' instead of 'captions off', keep a space so the variable == true (hacky I know) +videojsUntyped.getComponent('CaptionsButton').prototype.label_ = ' ' function getVideojsOptions (options: { autoplay: boolean, @@ -28,13 +32,17 @@ function getVideojsOptions (options: { inactivityTimeout: number, peertubeLink: boolean, poster: string, - startTime: number + startTime: number | string theaterMode: boolean, + videoCaptions: VideoJSCaption[], + language?: string, controls?: boolean, muted?: boolean, loop?: boolean }) { const videojsOptions = { + // We don't use text track settings for now + textTrackSettings: false, controls: options.controls !== undefined ? options.controls : true, muted: options.controls !== undefined ? options.muted : false, loop: options.loop !== undefined ? options.loop : false, @@ -45,6 +53,7 @@ function getVideojsOptions (options: { plugins: { peertube: { autoplay: options.autoplay, // Use peertube plugin autoplay because we get the file by webtorrent + videoCaptions: options.videoCaptions, videoFiles: options.videoFiles, playerElement: options.playerElement, videoViewUrl: options.videoViewUrl, @@ -66,13 +75,25 @@ function getVideojsOptions (options: { }) } + if (options.language && !isDefaultLocale(options.language)) { + Object.assign(videojsOptions, { language: options.language }) + } + return videojsOptions } function getControlBarChildren (options: { peertubeLink: boolean - theaterMode: boolean + theaterMode: boolean, + videoCaptions: VideoJSCaption[] }) { + const settingEntries = [] + + // Keep an order + settingEntries.push('playbackRateMenuButton') + if (options.videoCaptions.length !== 0) settingEntries.push('captionsButton') + settingEntries.push('resolutionMenuButton') + const children = { 'playToggle': {}, 'currentTimeDisplay': {}, @@ -102,10 +123,7 @@ function getControlBarChildren (options: { setup: { maxHeightOffset: 40 }, - entries: [ - 'resolutionMenuButton', - 'playbackRateMenuButton' - ] + entries: settingEntries } } @@ -161,18 +179,55 @@ function addContextMenu (player: any, videoEmbedUrl: string) { }) } -function loadLocale (serverUrl: string, videojs: any, locale: string) { +function loadLocaleInVideoJS (serverUrl: string, videojs: any, locale: string) { + const path = getLocalePath(serverUrl, locale) + // It is the default locale, nothing to translate + if (!path) return Promise.resolve(undefined) + + let p: Promise + + if (loadLocaleInVideoJS.cache[path]) { + p = Promise.resolve(loadLocaleInVideoJS.cache[path]) + } else { + p = fetch(path + '/player.json') + .then(res => res.json()) + .then(json => { + loadLocaleInVideoJS.cache[path] = json + return json + }) + } + const completeLocale = getCompleteLocale(locale) + return p.then(json => videojs.addLanguage(getShortLocale(completeLocale), json)) +} +namespace loadLocaleInVideoJS { + export const cache: { [ path: string ]: any } = {} +} - if (!is18nLocale(completeLocale) || isDefaultLocale(completeLocale)) return Promise.resolve(undefined) +function getServerTranslations (serverUrl: string, locale: string) { + const path = getLocalePath(serverUrl, locale) + // It is the default locale, nothing to translate + if (!path) return Promise.resolve(undefined) - return fetch(serverUrl + '/client/locales/' + completeLocale + '/player.json') + return fetch(path + '/server.json') .then(res => res.json()) - .then(json => videojs.addLanguage(getShortLocale(completeLocale), json)) } +// ############################################################################ + export { - loadLocale, + getServerTranslations, + loadLocaleInVideoJS, getVideojsOptions, addContextMenu } + +// ############################################################################ + +function getLocalePath (serverUrl: string, locale: string) { + const completeLocale = getCompleteLocale(locale) + + if (!is18nLocale(completeLocale) || isDefaultLocale(completeLocale)) return undefined + + return serverUrl + '/client/locales/' + completeLocale +}