UNPKG

ngx-lite-video

Version:

ngx-lite-video is an Angular package for lazy loading embedded YouTube and Vimeo videos, improving page speed and user experience.

1 lines 26.1 kB
{"version":3,"file":"ngx-lite-video.mjs","sources":["../../../projects/ngx-lite-video/src/lib/services/ngx-lite-video-general-service.service.ts","../../../projects/ngx-lite-video/src/lib/components/ngx-lite-vimeo/ngx-lite-vimeo.component.ts","../../../projects/ngx-lite-video/src/lib/components/ngx-lite-vimeo/ngx-lite-vimeo.component.html","../../../projects/ngx-lite-video/src/lib/components/ngx-lite-vimeo/ngx-lite-vimeo.module.ts","../../../projects/ngx-lite-video/src/lib/components/ngx-lite-youtube/ngx-lite-youtube.component.ts","../../../projects/ngx-lite-video/src/lib/components/ngx-lite-youtube/ngx-lite-youtube.component.html","../../../projects/ngx-lite-video/src/lib/components/ngx-lite-youtube/ngx-lite-youtube.module.ts","../../../projects/ngx-lite-video/src/lib/components/index.ts","../../../projects/ngx-lite-video/src/ngx-lite-video.ts"],"sourcesContent":["import { DomSanitizer, SafeUrl } from '@angular/platform-browser';\r\nimport {\r\n ThumbSize,\r\n VimeoVideo,\r\n VideoQualities,\r\n VimeoLazyData,\r\n} from '../models';\r\nimport { Injectable, Optional } from '@angular/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { Observable, catchError, map, of } from 'rxjs';\r\n\r\n@Injectable()\r\nexport class NgxLiteVideoGeneralService {\r\n //#region Declerations\r\n private readonly __youtubeSizes: VideoQualities = {\r\n sd: 'sddefault',\r\n medium: 'mqdefault',\r\n high: 'hqdefault',\r\n max: 'maxresdefault',\r\n };\r\n private readonly __thumbHelper: VideoQualities = {\r\n max: 'thumbnail_large',\r\n high: 'thumbnail_large',\r\n medium: 'thumbnail_medium',\r\n sd: 'thumbnail_small',\r\n };\r\n //#endregion\r\n\r\n constructor(\r\n private __domSanitizer: DomSanitizer,\r\n @Optional() private __http: HttpClient\r\n ) {}\r\n\r\n //#region Methods\r\n // This function returns the URL of a YouTube video thumbnail image of a specific size\r\n // Parameters:\r\n // - videoId: string representing a YouTube video ID\r\n // - quality: ThumbSize enum value representing the desired thumbnail size\r\n // Returns:\r\n // - A string representing the URL of the thumbnail image\r\n getYouTubeBanner(videoId: string, quality: ThumbSize): string {\r\n // Return the URL using string interpolation with the given videoId and quality size\r\n // YouTube uses a specific format for their thumbnail URLs, hence the use of `https://img.youtube.com/vi/<videoId>/<size>.jpg`\r\n return `https://img.youtube.com/vi/${videoId}/${this.__youtubeSizes[quality]}.jpg`;\r\n }\r\n // This function returns a sanitized YouTube video URL with specified parameters\r\n // Parameters:\r\n // - videoId: string representing a YouTube video ID\r\n // - hasControls: boolean that determines whether or not to display controls on the embedded video player\r\n // - allowFullScreen: boolean that determines whether or not to allow fullscreen mode on the embedded video player\r\n // - loop: boolean that determines whether or not to loop the video\r\n // - start: number that represents the starting time of the video (in seconds)\r\n // - end: number that represents the ending time of the video (in seconds)\r\n // Returns:\r\n // - A SafeUrl object representing the sanitized YouTube video URL\r\n getYouTubeUrl(\r\n videoId: string,\r\n hasControls: boolean,\r\n allowFullScreen: boolean,\r\n loop: boolean,\r\n start: number,\r\n end: number\r\n ): SafeUrl {\r\n // Sanitize the URL using the Angular DomSanitizer service, since we're embedding it in our DOM\r\n return this.__domSanitizer.bypassSecurityTrustResourceUrl(\r\n `https://www.youtube-nocookie.com/embed/${videoId}?autoplay=1&controls=${\r\n hasControls ? '1' : '0'\r\n }${loop ? '&playlist=' + videoId + '&loop=1' : ''}${\r\n start ? '&start=' + start : ''\r\n }${end ? '&end=' + end : ''}${allowFullScreen ? '&fs=1' : '&fs=0'}`\r\n );\r\n }\r\n // This function returns a Vimeo video URL with specified parameters\r\n // Parameters:\r\n // - videoId: string representing a Vimeo video ID\r\n // - hasControls: boolean that determines whether or not to display controls on the embedded video player\r\n // - loop: boolean that determines whether or not to loop the video\r\n // - isBackground: boolean that determines whether or not the video is being used as a background\r\n // Returns:\r\n // - A SafeUrl object representing the Vimeo video URL\r\n getVimeoVideoUrl(\r\n videoId: string,\r\n hasControls: boolean,\r\n loop: boolean,\r\n isBackground: boolean\r\n ): SafeUrl {\r\n // Sanitize the URL using the Angular DomSanitizer service, since we're embedding it in our DOM\r\n return this.__domSanitizer.bypassSecurityTrustResourceUrl(\r\n `https://player.vimeo.com/video/${videoId}?autoplay=1${\r\n hasControls ? '&controls=true' : '&controls=false'\r\n }${loop ? '&loop=true' : ''}${isBackground ? '&background=true' : ''}`\r\n );\r\n }\r\n // This function returns a banner representing the Vimeo video with the specified ID\r\n // Parameters:\r\n // - videoId: string representing a Vimeo video ID\r\n // - quality: an enum type ThumbSize that determines the size of the thumbnail image to be used\r\n // Returns:\r\n // - An Observable object containing an object with the banner source and title for the Vimeo video\r\n getVimeoBanner(\r\n videoId: string,\r\n quality: ThumbSize\r\n ): Observable<VimeoLazyData> {\r\n // Get data about the Vimeo video from the Vimeo API using Angular's HttpClient service\r\n return this.__http\r\n .get<VimeoVideo[]>(`https://vimeo.com/api/v2/video/${videoId}.json`)\r\n .pipe(\r\n map((data: any) => ({\r\n bannerSrc: `url(${data[0][this.__thumbHelper[quality]]})`,\r\n title: data[0].title,\r\n })),\r\n catchError(() => {\r\n return of({\r\n bannerSrc: '',\r\n title: '',\r\n });\r\n })\r\n );\r\n }\r\n // This function checks if a video ID is provided or not\r\n // Parameters:\r\n // - videoId: a string representing a Vimeo video ID\r\n // Returns:\r\n // - void (nothing)\r\n hasNoVideoId(videoId: string): void {\r\n // If videoId is falsy (i.e., empty, undefined or null), throw an error indicating that videoId must be provided\r\n if (!videoId) {\r\n throw new Error('Video ID MUST be provided');\r\n }\r\n }\r\n //#endregion\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n OnInit,\r\n OnChanges,\r\n} from '@angular/core';\r\nimport { BehaviorSubject, Observable } from 'rxjs';\r\nimport { ThumbSize, VimeoLazyData } from '../../models';\r\nimport { NgxLiteVideoGeneralService } from '../../services/ngx-lite-video-general-service.service';\r\nimport { SafeUrl } from '@angular/platform-browser';\r\n\r\n@Component({\r\n selector: 'ngx-lite-vimeo',\r\n templateUrl: './ngx-lite-vimeo.component.html',\r\n styleUrls: ['./ngx-lite-vimeo.component.scss'],\r\n providers: [NgxLiteVideoGeneralService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxLiteVimeoComponent implements OnInit, OnChanges {\r\n //#region Declerations\r\n _showIframe$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n _videoUrl!: SafeUrl;\r\n _vimeoBanner$!: Observable<VimeoLazyData>;\r\n\r\n /**\r\n * Video ID to be viewed\r\n * @type string\r\n * @Required true\r\n */\r\n @Input() videoId!: string;\r\n /**\r\n * Lazy image quality\r\n * @type ThumbSize\r\n * @default 'high'\r\n */\r\n @Input() thumbQuality: ThumbSize = 'high';\r\n /**\r\n * Enables/disables showing title in lazy mode\r\n * @type boolean\r\n * @default false\r\n */\r\n @Input() showTitle: boolean = false;\r\n /**\r\n * Shows/hides video controls in iframe\r\n * @type boolean\r\n * @default true\r\n */\r\n @Input() hasControls: boolean = true;\r\n /**\r\n * Enables video looping\r\n * @type boolean\r\n * @default false\r\n */\r\n @Input() loop: boolean = false;\r\n /**\r\n * Enables vimeo background mode, please refer to (https://developer.vimeo.com/player/sdk/embed)\r\n * @type boolean\r\n * @default false\r\n */\r\n @Input() isBackground: boolean = false;\r\n /**\r\n * External styling class\r\n * @type string\r\n */\r\n @Input() styleClass!: string;\r\n //#endregion\r\n\r\n constructor(private __ngxService: NgxLiteVideoGeneralService) {}\r\n\r\n //#region Life Cycle Hooks\r\n ngOnInit(): void {\r\n this.init();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.init();\r\n this._showIframe$.next(false);\r\n }\r\n //#endregion\r\n\r\n //#region Methods\r\n // This method initializes the component by setting the '_vimeoBanner$'and '_videoUrl' properties based on the value of 'this.videoId'.\r\n init(): void {\r\n // Call the 'hasNoVideoId' method from the injected '__ngxService' service with the current value of 'this.videoId' as its argument,\r\n // which checks if 'this.videoId' is defined and throws an error in case it isn't.\r\n this.__ngxService.hasNoVideoId(this.videoId);\r\n\r\n // Set the '_vimeoBanner$' variable to the result of calling the 'getVimeoBanner()' method from the injected '__ngxService' service\r\n // passing it the current 'this.videoId' value and thumbnail quality ('this.thumbQuality') as its arguments. The 'getVimeoBanner()' method\r\n // returns an observable that emits the URL of a Vimeo video's banner image based on the given 'this.videoId' and thumbnail quality.\r\n this._vimeoBanner$ = this.__ngxService.getVimeoBanner(\r\n this.videoId,\r\n this.thumbQuality\r\n );\r\n\r\n // Set the '_videoUrl' variable to the result of calling the 'getVimeoVideoUrl()' method from the injected '__ngxService' service,\r\n // passing it the current 'this.videoId' value as its first argument, and several boolean flags ('this.hasControls', 'this.loop',\r\n // 'this.isBackground') as its remaining arguments. The 'getVimeoVideoUrl()' method creates a URL for a Vimeo video using\r\n // embed codes and modifying it based on the supplied boolean values. The resulting URL is saved in the '_videoUrl' variable.\r\n this._videoUrl = this.__ngxService.getVimeoVideoUrl(\r\n this.videoId,\r\n this.hasControls,\r\n this.loop,\r\n this.isBackground\r\n );\r\n }\r\n //#endregion\r\n}\r\n","<div\r\n *ngIf=\"_vimeoBanner$ | async as vimeoBanner\"\r\n [ngStyle]=\"{ 'background-image': vimeoBanner.bannerSrc }\"\r\n class=\"ngx-lite-video{{ styleClass ? ' ' + styleClass : '' }}\"\r\n (click)=\"_showIframe$.next(true)\"\r\n [ngClass]=\"{ 'ngx-lite-with-title': showTitle }\"\r\n>\r\n <iframe\r\n *ngIf=\"_showIframe$ | async\"\r\n width=\"640\"\r\n height=\"360\"\r\n frameborder=\"0\"\r\n allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\"\r\n allowfullscreen\r\n [src]=\"_videoUrl\"\r\n ></iframe>\r\n\r\n <!-- Play btn before iframe is loaded -->\r\n <div class=\"ngx-lite-video__play\" *ngIf=\"!_showIframe$.value\">\r\n <button class=\"vimeo-logo\" aria-label=\"Vimeo Play Button\"></button>\r\n </div>\r\n\r\n <!-- Title shown before iframe is loaded -->\r\n <p *ngIf=\"showTitle && !_showIframe$.value\" class=\"ngx-lite-video__title\">\r\n {{ vimeoBanner.title }}\r\n </p>\r\n</div>\r\n","// Modules\r\nimport { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { HttpClientModule } from '@angular/common/http';\r\n// Components\r\nimport { NgxLiteVimeoComponent } from './ngx-lite-vimeo.component';\r\n\r\n@NgModule({\r\n declarations: [NgxLiteVimeoComponent],\r\n imports: [CommonModule, HttpClientModule],\r\n exports: [NgxLiteVimeoComponent],\r\n})\r\nexport class NgxLiteVimeoModule {}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { SafeUrl } from '@angular/platform-browser';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { ThumbSize } from '../../models';\r\nimport { NgxLiteVideoGeneralService } from '../../services/ngx-lite-video-general-service.service';\r\n\r\n@Component({\r\n selector: 'ngx-lite-youtube',\r\n templateUrl: './ngx-lite-youtube.component.html',\r\n styleUrls: ['./ngx-lite-youtube.component.scss'],\r\n providers: [NgxLiteVideoGeneralService],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxLiteYoutubeComponent implements OnInit, OnChanges {\r\n //#region Declerations\r\n _showIframe$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);\r\n _bannerSrc!: string;\r\n _videoUrl!: SafeUrl;\r\n\r\n /**\r\n * Video ID to be viewed\r\n * @type string\r\n * @Required true\r\n */\r\n @Input() videoId!: string;\r\n /**\r\n * Title to be displayed in lazy mode\r\n * @type string\r\n */\r\n @Input() videoTitle!: string;\r\n /**\r\n * Lazy image quality\r\n * @type ThumbSize\r\n * @default 'high'\r\n */\r\n @Input() thumbQuality: ThumbSize = 'high';\r\n /**\r\n * Shows/hides video controls in iframe\r\n * @type boolean\r\n * @default true\r\n */\r\n @Input() hasControls: boolean = true;\r\n /**\r\n * Enables video looping\r\n * @type boolean\r\n * @default false\r\n */\r\n @Input() loop: boolean = false;\r\n /**\r\n * Sets starting video time (in seconds)\r\n * @type number\r\n */\r\n @Input() start!: number;\r\n /**\r\n * Enables/disables fullscreen button in iframe\r\n * @type boolean\r\n * @default true\r\n */\r\n @Input() allowFullScreen: boolean = true;\r\n /**\r\n * Sets ending video time (in seconds)\r\n * @type number\r\n */\r\n @Input() end!: number;\r\n /**\r\n * External styling class\r\n * @type string\r\n */\r\n @Input() styleClass!: string;\r\n //#endregion\r\n\r\n constructor(private __ngxService: NgxLiteVideoGeneralService) {}\r\n\r\n //#region Life Cycle Hooks\r\n ngOnInit(): void {\r\n this.init();\r\n }\r\n\r\n ngOnChanges(): void {\r\n this.init();\r\n this._showIframe$.next(false);\r\n }\r\n //#endregion\r\n\r\n //#region Methods\r\n // This method initializes the component by setting the `_bannerSrc` and `_videoUrl` properties based on the value of `this.videoId`.\r\n init(): void {\r\n // Call the `hasNoVideoId()` method from the injected `__ngxService` service with the current value of `this.videoId` as its argument,\r\n // which checks if `this.videoId` is defined and throws an error in case it isn't.\r\n this.__ngxService.hasNoVideoId(this.videoId);\r\n\r\n // Set the `_bannerSrc` variable to a string that consists of a 'url()' CSS function with the result of calling the `getYouTubeBanner()` method\r\n // from the injected `__ngxService` service as its argument. The `getYouTubeBanner()` method returns the URL of a YouTube video's banner image\r\n // based on the given `this.videoId` and thumbnail quality (`this.thumbQuality`).\r\n this._bannerSrc = `url(${this.__ngxService.getYouTubeBanner(\r\n this.videoId,\r\n this.thumbQuality\r\n )})`;\r\n\r\n // Set the `_videoUrl` variable to the result of calling the `getYouTubeUrl()` method from the injected `__ngxService` service,\r\n // passing it the current `this.videoId` value as the first argument, and several boolean flags (`this.hasControls`, `this.allowFullScreen`,\r\n // `this.loop`, `this.start`, `this.end`) as the remaining arguments. The `getYouTubeUrl()` method creates a URL for a YouTube video\r\n // using embed codes and modifying the URL based on the supplied boolean values. The resulting URL is saved in the `_videoUrl` variable.\r\n this._videoUrl = this.__ngxService.getYouTubeUrl(\r\n this.videoId,\r\n this.hasControls,\r\n this.allowFullScreen,\r\n this.loop,\r\n this.start,\r\n this.end\r\n );\r\n }\r\n //#endregion\r\n}\r\n","<div\r\n [ngStyle]=\"{ 'background-image': _bannerSrc }\"\r\n class=\"ngx-lite-video{{ styleClass ? ' ' + styleClass : '' }}\"\r\n (click)=\"_showIframe$.next(true)\"\r\n [ngClass]=\"{ 'ngx-lite-with-title': videoTitle }\"\r\n>\r\n <iframe\r\n *ngIf=\"_showIframe$ | async\"\r\n width=\"560\"\r\n height=\"315\"\r\n [src]=\"_videoUrl\"\r\n title=\"YouTube video player\"\r\n frameborder=\"0\"\r\n allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture;\"\r\n allowfullscreen\r\n ></iframe>\r\n\r\n <!-- Play btn before iframe is loaded -->\r\n <div class=\"ngx-lite-video__play\" *ngIf=\"!_showIframe$.value\">\r\n <button class=\"youtube-logo\" aria-label=\"YouTube Play Button\"></button>\r\n </div>\r\n\r\n <!-- Title shown before iframe is loaded -->\r\n <p *ngIf=\"videoTitle && !_showIframe$.value\" class=\"ngx-lite-video__title\">\r\n {{ videoTitle }}\r\n </p>\r\n</div>\r\n","// Modules\r\nimport { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n// Components\r\nimport { NgxLiteYoutubeComponent } from './ngx-lite-youtube.component';\r\n\r\n@NgModule({\r\n declarations: [NgxLiteYoutubeComponent],\r\n imports: [CommonModule],\r\n exports: [NgxLiteYoutubeComponent],\r\n})\r\nexport class NgxLiteYoutubeModule {}\r\n","// Vimeo\r\nexport * from './ngx-lite-vimeo/ngx-lite-vimeo.module';\r\nexport * from './ngx-lite-vimeo/ngx-lite-vimeo.component';\r\n// Youtube\r\nexport * from './ngx-lite-youtube/ngx-lite-youtube.module';\r\nexport * from './ngx-lite-youtube/ngx-lite-youtube.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.NgxLiteVideoGeneralService","i2"],"mappings":"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"}