diff options
author | Chocobozzz <me@florianbigard.com> | 2020-08-20 11:46:25 +0200 |
---|---|---|
committer | Chocobozzz <chocobozzz@cpy.re> | 2020-08-20 14:23:57 +0200 |
commit | f95628636b6ccdf3eae2449ca718e075b072f678 (patch) | |
tree | 35d51980c87b7d6747bdff6e37bdfe37e3c989dc /client/src/standalone/videos/embed.ts | |
parent | a9f6802e7dac4f21599076bc1119bb6ff16961dc (diff) | |
download | PeerTube-f95628636b6ccdf3eae2449ca718e075b072f678.tar.gz PeerTube-f95628636b6ccdf3eae2449ca718e075b072f678.tar.zst PeerTube-f95628636b6ccdf3eae2449ca718e075b072f678.zip |
Support plugin hooks in embed
Diffstat (limited to 'client/src/standalone/videos/embed.ts')
-rw-r--r-- | client/src/standalone/videos/embed.ts | 81 |
1 files changed, 78 insertions, 3 deletions
diff --git a/client/src/standalone/videos/embed.ts b/client/src/standalone/videos/embed.ts index adba32a31..fe65794f7 100644 --- a/client/src/standalone/videos/embed.ts +++ b/client/src/standalone/videos/embed.ts | |||
@@ -1,7 +1,5 @@ | |||
1 | import './embed.scss' | 1 | import './embed.scss' |
2 | import videojs from 'video.js' | 2 | import videojs from 'video.js' |
3 | import { objectToUrlEncoded, peertubeLocalStorage } from '@root-helpers/index' | ||
4 | import { Tokens } from '@root-helpers/users' | ||
5 | import { peertubeTranslate } from '../../../../shared/core-utils/i18n' | 3 | import { peertubeTranslate } from '../../../../shared/core-utils/i18n' |
6 | import { | 4 | import { |
7 | ResultList, | 5 | ResultList, |
@@ -11,12 +9,19 @@ import { | |||
11 | VideoDetails, | 9 | VideoDetails, |
12 | VideoPlaylist, | 10 | VideoPlaylist, |
13 | VideoPlaylistElement, | 11 | VideoPlaylistElement, |
14 | VideoStreamingPlaylistType | 12 | VideoStreamingPlaylistType, |
13 | PluginType, | ||
14 | ClientHookName | ||
15 | } from '../../../../shared/models' | 15 | } from '../../../../shared/models' |
16 | import { P2PMediaLoaderOptions, PeertubePlayerManagerOptions, PlayerMode } from '../../assets/player/peertube-player-manager' | 16 | import { P2PMediaLoaderOptions, PeertubePlayerManagerOptions, PlayerMode } from '../../assets/player/peertube-player-manager' |
17 | import { VideoJSCaption } from '../../assets/player/peertube-videojs-typings' | 17 | import { VideoJSCaption } from '../../assets/player/peertube-videojs-typings' |
18 | import { TranslationsManager } from '../../assets/player/translations-manager' | 18 | import { TranslationsManager } from '../../assets/player/translations-manager' |
19 | import { Hooks, loadPlugin, runHook } from '../../root-helpers/plugins' | ||
20 | import { Tokens } from '../../root-helpers/users' | ||
21 | import { peertubeLocalStorage } from '../../root-helpers/peertube-web-storage' | ||
22 | import { objectToUrlEncoded } from '../../root-helpers/utils' | ||
19 | import { PeerTubeEmbedApi } from './embed-api' | 23 | import { PeerTubeEmbedApi } from './embed-api' |
24 | import { RegisterClientHelpers } from '../../types/register-client-option.model' | ||
20 | 25 | ||
21 | type Translations = { [ id: string ]: string } | 26 | type Translations = { [ id: string ]: string } |
22 | 27 | ||
@@ -60,6 +65,9 @@ export class PeerTubeEmbed { | |||
60 | 65 | ||
61 | private wrapperElement: HTMLElement | 66 | private wrapperElement: HTMLElement |
62 | 67 | ||
68 | private peertubeHooks: Hooks = {} | ||
69 | private loadedScripts = new Set<string>() | ||
70 | |||
63 | static async main () { | 71 | static async main () { |
64 | const videoContainerId = 'video-wrapper' | 72 | const videoContainerId = 'video-wrapper' |
65 | const embed = new PeerTubeEmbed(videoContainerId) | 73 | const embed = new PeerTubeEmbed(videoContainerId) |
@@ -473,6 +481,8 @@ export class PeerTubeEmbed { | |||
473 | this.PeertubePlayerManagerModulePromise | 481 | this.PeertubePlayerManagerModulePromise |
474 | ]) | 482 | ]) |
475 | 483 | ||
484 | await this.ensurePluginsAreLoaded(config, serverTranslations) | ||
485 | |||
476 | const videoInfo: VideoDetails = videoInfoTmp | 486 | const videoInfo: VideoDetails = videoInfoTmp |
477 | 487 | ||
478 | const PeertubePlayerManager = PeertubePlayerManagerModule.PeertubePlayerManager | 488 | const PeertubePlayerManager = PeertubePlayerManagerModule.PeertubePlayerManager |
@@ -577,6 +587,8 @@ export class PeerTubeEmbed { | |||
577 | this.playNextVideo() | 587 | this.playNextVideo() |
578 | }) | 588 | }) |
579 | } | 589 | } |
590 | |||
591 | this.runHook('action:embed.player.loaded', undefined, { player: this.player }) | ||
580 | } | 592 | } |
581 | 593 | ||
582 | private async initCore () { | 594 | private async initCore () { |
@@ -714,6 +726,69 @@ export class PeerTubeEmbed { | |||
714 | private isPlaylistEmbed () { | 726 | private isPlaylistEmbed () { |
715 | return window.location.pathname.split('/')[1] === 'video-playlists' | 727 | return window.location.pathname.split('/')[1] === 'video-playlists' |
716 | } | 728 | } |
729 | |||
730 | private async ensurePluginsAreLoaded (config: ServerConfig, translations?: { [ id: string ]: string }) { | ||
731 | if (config.plugin.registered.length === 0) return | ||
732 | |||
733 | for (const plugin of config.plugin.registered) { | ||
734 | for (const key of Object.keys(plugin.clientScripts)) { | ||
735 | const clientScript = plugin.clientScripts[key] | ||
736 | |||
737 | if (clientScript.scopes.includes('embed') === false) continue | ||
738 | |||
739 | const script = `/plugins/${plugin.name}/${plugin.version}/client-scripts/${clientScript.script}` | ||
740 | |||
741 | if (this.loadedScripts.has(script)) continue | ||
742 | |||
743 | const pluginInfo = { | ||
744 | plugin, | ||
745 | clientScript: { | ||
746 | script, | ||
747 | scopes: clientScript.scopes | ||
748 | }, | ||
749 | pluginType: PluginType.PLUGIN, | ||
750 | isTheme: false | ||
751 | } | ||
752 | |||
753 | await loadPlugin(this.peertubeHooks, pluginInfo, _ => this.buildPeerTubeHelpers(translations)) | ||
754 | } | ||
755 | } | ||
756 | } | ||
757 | |||
758 | private buildPeerTubeHelpers (translations?: { [ id: string ]: string }): RegisterClientHelpers { | ||
759 | function unimplemented (): any { | ||
760 | throw new Error('This helper is not implemented in embed.') | ||
761 | } | ||
762 | |||
763 | return { | ||
764 | getBaseStaticRoute: unimplemented, | ||
765 | |||
766 | getSettings: unimplemented, | ||
767 | |||
768 | isLoggedIn: unimplemented, | ||
769 | |||
770 | notifier: { | ||
771 | info: unimplemented, | ||
772 | error: unimplemented, | ||
773 | success: unimplemented | ||
774 | }, | ||
775 | |||
776 | showModal: unimplemented, | ||
777 | |||
778 | markdownRenderer: { | ||
779 | textMarkdownToHTML: unimplemented, | ||
780 | enhancedMarkdownToHTML: unimplemented | ||
781 | }, | ||
782 | |||
783 | translate: (value: string) => { | ||
784 | return Promise.resolve(peertubeTranslate(value, translations)) | ||
785 | } | ||
786 | } | ||
787 | } | ||
788 | |||
789 | private runHook <T> (hookName: ClientHookName, result?: T, params?: any): Promise<T> { | ||
790 | return runHook(this.peertubeHooks, hookName, result, params) | ||
791 | } | ||
717 | } | 792 | } |
718 | 793 | ||
719 | PeerTubeEmbed.main() | 794 | PeerTubeEmbed.main() |