Angular Video Player and Video Gallery
// video-gallery.component.ts
import { Component, Input, OnInit, Inject } from "@angular/core";
import { DOCUMENT } from "@angular/common";
const SRC = "https://elfsightcdn.com/platform.js";
@Component({
selector: "app-video-gallery",
standalone: true,
template: `<div [class]="'elfsight-app-' + id" data-elfsight-app-lazy></div>`,
})
export class VideoGalleryComponent implements OnInit {
@Input({ required: true }) id!: string;
constructor(@Inject(DOCUMENT) private doc: Document) {}
ngOnInit() {
if (this.doc.querySelector(`script[src="${SRC}"]`)) return;
const s = this.doc.createElement("script");
s.src = SRC;
s.async = true;
this.doc.body.appendChild(s);
}
}Trusted by over 3,000,000 small businesses, agencies and top global brands worldwide
Configure it visually — drop it into your Angular app
- 1. Choose a template
- 2. Connect your videos
- 3. Add to website
Why build a video gallery in Angular from scratch?
What building it yourself really takes
Fetching and caching
Player and popup
Vertical video
Layouts
SEO and analytics
Maintenance
Client edits
With Elfsight Video Gallery
<app-video-gallery id="YOUR-ID" />No API keys or quotas in your app
Feeds from YouTube, Vimeo, TikTok, Instagram Reels, Twitch and any link
7 layouts, popup player, CTA card
Schema.org markup and Google Analytics
Maintained by Elfsight when platforms change
Drop-in integration for Angular
The Angular component
Standalone component. Drop it into any standalone or NgModule-based app.
SSR-safe. The script is injected through DOCUMENT in ngOnInit on the client.
Typed input. A required id input — nothing else to configure in code.
// video-gallery.component.ts
import { Component, Input, OnInit, Inject } from "@angular/core";
import { DOCUMENT } from "@angular/common";
const SRC = "https://elfsightcdn.com/platform.js";
@Component({
selector: "app-video-gallery",
standalone: true,
template: `<div [class]="'elfsight-app-' + id" data-elfsight-app-lazy></div>`,
})
export class VideoGalleryComponent implements OnInit {
@Input({ required: true }) id!: string;
constructor(@Inject(DOCUMENT) private doc: Document) {}
ngOnInit() {
if (this.doc.querySelector(`script[src="${SRC}"]`)) return;
const s = this.doc.createElement("script");
s.src = SRC;
s.async = true;
this.doc.body.appendChild(s);
}
}Performance and security
Async and lazy
No dependencies
No keys in your code
Works with strict security policies
Customize it like code — or don’t write any
Custom CSS
Custom JS
Visual editor
Filters and sorting
Hand off to clients
No redeploys
Everything the widget does for you

YouTube

TikTok

Instagram Reels

Vimeo

Twitch

Any video link

Popup player

CTA after the video

Schema.org markup

Channel header

Analytics events
Elfsight vs. building with Angular libraries
Time to ship
Video Gallery
Build with player libraries
Sources
Video Gallery
Build with player libraries
API keys in your app
Video Gallery
Build with player libraries
Feeds update automatically
Video Gallery
Build with player libraries
Layouts, popup, CTA card
Video Gallery
Build with player libraries
Schema.org and Google Analytics
Video Gallery
Build with player libraries
Custom styling and behavior
Video Gallery
Build with player libraries
Clients edit content without you
Video Gallery
Build with player libraries
Maintenance when APIs change
Video Gallery
Build with player libraries
Need DRM, custom analytics pipelines or a fully bespoke player? Build it — start with our Video.js vs react-player vs hls.js comparison.