Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Embed a YouTube video in Angular?

Tags:

I was following this tutorial on YouTube, and it's basically a table with the music you like, but the tutorial ends.

It's using Angular2, and everything is working correctly however where the gentleman left it, it's just showing the constructor of the video in the console with this code:

*Playlist.Component.Ts:

export class PlaylistComponent{  onSelect(vid:Video) {  console.log(JSON.stringify(vid)); } } 

*Playlist.Component.html:

<table class="table table-hover"> <thead> <tr> <td>ID</td> <td>Title</td> <td>Description</td> </tr> </thead> <tbody> <tr *ngFor="#v of videos" (click)="onSelect(v)"> <td>{{ v.id }}</td> <td>{{ v.title }}</td> <td>{{ v.desc }}</td> </tr> </tbody> </table> 

*App.Component.Ts:

import {Component} from 'angular2/core'; import {Config} from './config.service'; import {Video} from './video'; import {PlaylistComponent} from './playlist.component';  @Component({     selector: 'my-app',     templateUrl: 'app/ts/app.component.html',     directives: [PlaylistComponent] })  export class AppComponent {     mainHeading = Config.MAIN_HEADING;     videos:Array<Video>;      constructor() {          this.videos = [             new Video(1, "The 1975 - Somebody Else", "Bimd2nZirT4", "Calm."),             new Video(2, "Killswitch Engage - Holy Diver", "NR7dG_m3MsI", "Hell Yeah!")         ]       } } 

*And finally the Video.ts:

export class Video {     id: number;     title: string;     videoCode: string;     desc: string;      constructor(id: number, title: string, videoCode: string, desc: string){           this.id = id;           this.title = title;           this.videoCode = videoCode;           this.desc = desc;     } } 

How would I get it to actually embed the YouTube video in the browser once you click on the table?

like image 935
Arun Purewal Avatar asked Feb 24 '17 12:02

Arun Purewal


People also ask

Can you embed part of a YouTube video?

You just have to replace the Video ID, the start time (in seconds), the end time (in seconds), the height of the player (in pixels) and the width in the DIV tag as per your needs.

How do I embed a YouTube video in mobile site?

YouTube has an option on the embed button called 'use old embed link' that gives you an embed code. If you want it to serve a video according to the device, you are out of luck. The problem is that the old embed code is flash based, so it will play inline on newer android devices.


2 Answers

YouTube videos are embedded as iframe. One embed code look like this,

<iframe width="560" height="315" src="https://www.youtube.com/embed/1ozGKlOzEVc" frameborder="0" allowfullscreen></iframe> 

To make the YouTube Video work with Angular 2+, you have to sanitize the URL first.

import DomSanitizer to use it. So pass the videoURL as https://www.youtube.com/watch?v=1ozGKlOzEVc.

import { DomSanitizer } from '@angular/platform-browser'; 

Then add it to your constructor

constructor(videoURL: string, private _sanitizer: DomSanitizer){    this.safeURL = this._sanitizer.bypassSecurityTrustResourceUrl(videoURL); } 

Then bind the value safeUrl to iframe.

<iframe [src]='safeURL' frameborder="0" allowfullscreen></iframe> 
like image 86
All Іѕ Vаиітy Avatar answered Sep 19 '22 13:09

All Іѕ Vаиітy


There is now an Angular YouTube Player component

To understand the API you need to read the source. It has various inputs, outputs and functions. For example:

example.component.html

<youtube-player   #player   [videoId]="videoId"   (ready)="onReady($event)"   (stateChange)="onStateChange($event)" ></youtube-player> 

example.component.ts

import { Component, Input, OnInit, ViewChild } from '@angular/core';  @Component({   selector: 'example'   templateUrl: './example.component.html' }) class YoutubePlayerExample implements OnInit {   @ViewChild('player') player: any;   videoId: string;    @Input()   set id(id: string) {     this.videoId = id;   }    ngOnInit() {     const tag = document.createElement('script');     tag.src = 'https://www.youtube.com/iframe_api';     document.body.appendChild(tag);   }    // Autoplay   onReady() {     this.player.mute();              this.player.playVideo();       }    // Loop   onStateChange(event) {     if (event.data === 0) {       this.player.playVideo();       }   } } 

example-module.ts

import { NgModule } from '@angular/core'; import { YouTubePlayerModule } from '@angular/youtube-player';  @NgModule({   imports: [YouTubePlayerModule],   declarations: [YoutubePlayerExample] }) export class YoutubePlayerExampleModule {} 
like image 25
Derek Hill Avatar answered Sep 21 '22 13:09

Derek Hill