Add an option to provide responsive embed (#5690)
* Add option to provide responsive embed * Fix typo * More understandable parameter
This commit is contained in:
parent
e72ace5a50
commit
cadc1a1b0b
|
@ -72,14 +72,22 @@
|
||||||
></my-peertube-checkbox>
|
></my-peertube-checkbox>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<ng-container *ngIf="isInPlaylistEmbedTab()">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<my-peertube-checkbox
|
<my-peertube-checkbox
|
||||||
*ngIf="isInPlaylistEmbedTab()"
|
|
||||||
inputName="onlyEmbedUrl" [(ngModel)]="customizations.onlyEmbedUrl"
|
inputName="onlyEmbedUrl" [(ngModel)]="customizations.onlyEmbedUrl"
|
||||||
i18n-labelText labelText="Only display embed URL"
|
i18n-labelText labelText="Only display embed URL"
|
||||||
></my-peertube-checkbox>
|
></my-peertube-checkbox>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<my-peertube-checkbox
|
||||||
|
inputName="responsive" [(ngModel)]="customizations.responsive"
|
||||||
|
i18n-labelText labelText="Responsive embed"
|
||||||
|
></my-peertube-checkbox>
|
||||||
|
</div>
|
||||||
|
</ng-container>
|
||||||
|
|
||||||
<my-plugin-placeholder pluginId="share-modal-playlist-settings"></my-plugin-placeholder>
|
<my-plugin-placeholder pluginId="share-modal-playlist-settings"></my-plugin-placeholder>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -228,6 +236,13 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ng-container *ngIf="isInVideoEmbedTab()">
|
<ng-container *ngIf="isInVideoEmbedTab()">
|
||||||
|
<div class="form-group">
|
||||||
|
<my-peertube-checkbox
|
||||||
|
inputName="responsive" [(ngModel)]="customizations.responsive"
|
||||||
|
i18n-labelText labelText="Responsive embed"
|
||||||
|
></my-peertube-checkbox>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<my-peertube-checkbox
|
<my-peertube-checkbox
|
||||||
inputName="title" [(ngModel)]="customizations.title"
|
inputName="title" [(ngModel)]="customizations.title"
|
||||||
|
|
|
@ -29,6 +29,7 @@ type Customizations = {
|
||||||
warningTitle: boolean
|
warningTitle: boolean
|
||||||
controlBar: boolean
|
controlBar: boolean
|
||||||
peertubeLink: boolean
|
peertubeLink: boolean
|
||||||
|
responsive: boolean
|
||||||
|
|
||||||
includeVideoInPlaylist: boolean
|
includeVideoInPlaylist: boolean
|
||||||
}
|
}
|
||||||
|
@ -100,6 +101,7 @@ export class VideoShareComponent {
|
||||||
warningTitle: true,
|
warningTitle: true,
|
||||||
controlBar: true,
|
controlBar: true,
|
||||||
peertubeLink: true,
|
peertubeLink: true,
|
||||||
|
responsive: false,
|
||||||
|
|
||||||
includeVideoInPlaylist: false
|
includeVideoInPlaylist: false
|
||||||
}, {
|
}, {
|
||||||
|
@ -152,10 +154,11 @@ export class VideoShareComponent {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async getVideoIframeCode () {
|
async getVideoEmbedCode (options: { responsive: boolean }) {
|
||||||
|
const { responsive } = options
|
||||||
return this.hooks.wrapFun(
|
return this.hooks.wrapFun(
|
||||||
buildVideoOrPlaylistEmbed,
|
buildVideoOrPlaylistEmbed,
|
||||||
{ embedUrl: await this.getVideoEmbedUrl(), embedTitle: this.video.name },
|
{ embedUrl: await this.getVideoEmbedUrl(), embedTitle: this.video.name, responsive },
|
||||||
'video-watch',
|
'video-watch',
|
||||||
'filter:share.video-embed-code.build.params',
|
'filter:share.video-embed-code.build.params',
|
||||||
'filter:share.video-embed-code.build.result'
|
'filter:share.video-embed-code.build.result'
|
||||||
|
@ -186,10 +189,11 @@ export class VideoShareComponent {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPlaylistEmbedCode () {
|
async getPlaylistEmbedCode (options: { responsive: boolean }) {
|
||||||
|
const { responsive } = options
|
||||||
return this.hooks.wrapFun(
|
return this.hooks.wrapFun(
|
||||||
buildVideoOrPlaylistEmbed,
|
buildVideoOrPlaylistEmbed,
|
||||||
{ embedUrl: await this.getPlaylistEmbedUrl(), embedTitle: this.playlist.displayName },
|
{ embedUrl: await this.getPlaylistEmbedUrl(), embedTitle: this.playlist.displayName, responsive },
|
||||||
'video-watch',
|
'video-watch',
|
||||||
'filter:share.video-playlist-embed-code.build.params',
|
'filter:share.video-playlist-embed-code.build.params',
|
||||||
'filter:share.video-playlist-embed-code.build.result'
|
'filter:share.video-playlist-embed-code.build.result'
|
||||||
|
@ -204,15 +208,15 @@ export class VideoShareComponent {
|
||||||
if (this.playlist) {
|
if (this.playlist) {
|
||||||
this.playlistUrl = await this.getPlaylistUrl()
|
this.playlistUrl = await this.getPlaylistUrl()
|
||||||
this.playlistEmbedUrl = await this.getPlaylistEmbedUrl()
|
this.playlistEmbedUrl = await this.getPlaylistEmbedUrl()
|
||||||
this.playlistEmbedHTML = await this.getPlaylistEmbedCode()
|
this.playlistEmbedHTML = await this.getPlaylistEmbedCode({ responsive: this.customizations.responsive })
|
||||||
this.playlistEmbedSafeHTML = this.sanitizer.bypassSecurityTrustHtml(this.playlistEmbedHTML)
|
this.playlistEmbedSafeHTML = this.sanitizer.bypassSecurityTrustHtml(await this.getPlaylistEmbedCode({ responsive: false }))
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.video) {
|
if (this.video) {
|
||||||
this.videoUrl = await this.getVideoUrl()
|
this.videoUrl = await this.getVideoUrl()
|
||||||
this.videoEmbedUrl = await this.getVideoEmbedUrl()
|
this.videoEmbedUrl = await this.getVideoEmbedUrl()
|
||||||
this.videoEmbedHTML = await this.getVideoIframeCode()
|
this.videoEmbedHTML = await this.getVideoEmbedCode({ responsive: this.customizations.responsive })
|
||||||
this.videoEmbedSafeHTML = this.sanitizer.bypassSecurityTrustHtml(this.videoEmbedHTML)
|
this.videoEmbedSafeHTML = this.sanitizer.bypassSecurityTrustHtml(await this.getVideoEmbedCode({ responsive: false }))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,19 +3,34 @@ import { HTMLServerConfig, Video, VideoPrivacy } from '@shared/models'
|
||||||
function buildVideoOrPlaylistEmbed (options: {
|
function buildVideoOrPlaylistEmbed (options: {
|
||||||
embedUrl: string
|
embedUrl: string
|
||||||
embedTitle: string
|
embedTitle: string
|
||||||
|
responsive?: boolean
|
||||||
}) {
|
}) {
|
||||||
const { embedUrl, embedTitle } = options
|
const { embedUrl, embedTitle, responsive = false } = options
|
||||||
|
|
||||||
const iframe = document.createElement('iframe')
|
const iframe = document.createElement('iframe')
|
||||||
|
|
||||||
iframe.title = embedTitle
|
iframe.title = embedTitle
|
||||||
iframe.width = '560'
|
iframe.width = responsive ? '100%' : '560'
|
||||||
iframe.height = '315'
|
iframe.height = responsive ? '100%' : '315'
|
||||||
iframe.src = embedUrl
|
iframe.src = embedUrl
|
||||||
iframe.frameBorder = '0'
|
iframe.frameBorder = '0'
|
||||||
iframe.allowFullscreen = true
|
iframe.allowFullscreen = true
|
||||||
iframe.sandbox.add('allow-same-origin', 'allow-scripts', 'allow-popups')
|
iframe.sandbox.add('allow-same-origin', 'allow-scripts', 'allow-popups')
|
||||||
|
|
||||||
|
if (responsive) {
|
||||||
|
const wrapper = document.createElement('div')
|
||||||
|
|
||||||
|
wrapper.style.position = 'relative'
|
||||||
|
wrapper.style['padding-top'] = '56.25%'
|
||||||
|
|
||||||
|
iframe.style.position = 'absolute'
|
||||||
|
iframe.style.inset = '0'
|
||||||
|
|
||||||
|
wrapper.appendChild(iframe)
|
||||||
|
|
||||||
|
return wrapper.outerHTML
|
||||||
|
}
|
||||||
|
|
||||||
return iframe.outerHTML
|
return iframe.outerHTML
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue