Skip to content

Commit faf3b94

Browse files
author
Nathan Tate
committed
feat(youtube-player): Add proxy methods for calling the underlying player
1 parent 6416bab commit faf3b94

File tree

2 files changed

+230
-1
lines changed

2 files changed

+230
-1
lines changed

src/youtube-player/youtube-player.spec.ts

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,73 @@ describe('YoutubePlayer', () => {
8484
expect(playerCtorSpy).toHaveBeenCalledWith(
8585
containerElement, jasmine.objectContaining({videoId: 'otherId2'}));
8686
});
87+
88+
it('proxies methods to the player', () => {
89+
onPlayerReady();
90+
91+
testComponent.youtubePlayer.playVideo();
92+
expect(playerSpy.playVideo).toHaveBeenCalled();
93+
94+
testComponent.youtubePlayer.pauseVideo();
95+
expect(playerSpy.pauseVideo).toHaveBeenCalled();
96+
97+
testComponent.youtubePlayer.stopVideo();
98+
expect(playerSpy.stopVideo).toHaveBeenCalled();
99+
100+
testComponent.youtubePlayer.mute();
101+
expect(playerSpy.mute).toHaveBeenCalled();
102+
103+
testComponent.youtubePlayer.unMute();
104+
expect(playerSpy.unMute).toHaveBeenCalled();
105+
106+
testComponent.youtubePlayer.isMuted();
107+
expect(playerSpy.isMuted).toHaveBeenCalled();
108+
109+
testComponent.youtubePlayer.seekTo(5, true);
110+
expect(playerSpy.seekTo).toHaveBeenCalledWith(5, true);
111+
112+
testComponent.youtubePlayer.isMuted();
113+
expect(playerSpy.isMuted).toHaveBeenCalled();
114+
115+
testComponent.youtubePlayer.setVolume(54);
116+
expect(playerSpy.setVolume).toHaveBeenCalledWith(54);
117+
118+
testComponent.youtubePlayer.getVolume();
119+
expect(playerSpy.getVolume).toHaveBeenCalled();
120+
121+
testComponent.youtubePlayer.setPlaybackRate(1.5);
122+
expect(playerSpy.setPlaybackRate).toHaveBeenCalledWith(1.5);
123+
124+
testComponent.youtubePlayer.getPlaybackRate();
125+
expect(playerSpy.getPlaybackRate).toHaveBeenCalled();
126+
127+
testComponent.youtubePlayer.getAvailablePlaybackRates();
128+
expect(playerSpy.getAvailablePlaybackRates).toHaveBeenCalled();
129+
130+
testComponent.youtubePlayer.getVideoLoadedFraction();
131+
expect(playerSpy.getVideoLoadedFraction).toHaveBeenCalled();
132+
133+
testComponent.youtubePlayer.getPlayerState();
134+
expect(playerSpy.getPlayerState).toHaveBeenCalled();
135+
136+
testComponent.youtubePlayer.getCurrentTime();
137+
expect(playerSpy.getCurrentTime).toHaveBeenCalled();
138+
139+
testComponent.youtubePlayer.getPlaybackQuality();
140+
expect(playerSpy.getPlaybackQuality).toHaveBeenCalled();
141+
142+
testComponent.youtubePlayer.getAvailableQualityLevels();
143+
expect(playerSpy.getAvailableQualityLevels).toHaveBeenCalled();
144+
145+
testComponent.youtubePlayer.getDuration();
146+
expect(playerSpy.getDuration).toHaveBeenCalled();
147+
148+
testComponent.youtubePlayer.getVideoUrl();
149+
expect(playerSpy.getVideoUrl).toHaveBeenCalled();
150+
151+
testComponent.youtubePlayer.getVideoEmbedCode();
152+
expect(playerSpy.getVideoEmbedCode).toHaveBeenCalled();
153+
});
87154
});
88155

89156
/** Test component that contains a YouTubePlayer. */
@@ -97,5 +164,5 @@ describe('YoutubePlayer', () => {
97164
class TestApp {
98165
videoId: string | undefined = VIDEO_ID;
99166
visible = true;
100-
@ViewChild('player', {static: true}) youtubePlayer: YouTubePlayer;
167+
@ViewChild('player', {static: false}) youtubePlayer: YouTubePlayer;
101168
}

src/youtube-player/youtube-player.ts

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,168 @@ export class YouTubePlayer implements AfterViewInit, OnDestroy {
115115
this._player.destroy();
116116
this._destroyed.emit();
117117
}
118+
119+
/** Proxied methods. */
120+
121+
/** See https://developers.google.com/youtube/iframe_api_reference#playVideo */
122+
playVideo() {
123+
if (!this._player) {
124+
return;
125+
}
126+
this._player.playVideo();
127+
}
128+
129+
/** See https://developers.google.com/youtube/iframe_api_reference#pauseVideo */
130+
pauseVideo() {
131+
if (!this._player) {
132+
return;
133+
}
134+
this._player.pauseVideo();
135+
}
136+
137+
/** See https://developers.google.com/youtube/iframe_api_reference#stopVideo */
138+
stopVideo() {
139+
if (!this._player) {
140+
return;
141+
}
142+
this._player.stopVideo();
143+
}
144+
145+
/** See https://developers.google.com/youtube/iframe_api_reference#seekTo */
146+
seekTo(seconds: number, allowSeekAhead: boolean) {
147+
if (!this._player) {
148+
return;
149+
}
150+
this._player.seekTo(seconds, allowSeekAhead);
151+
}
152+
153+
/** See https://developers.google.com/youtube/iframe_api_reference#mute */
154+
mute() {
155+
if (!this._player) {
156+
return;
157+
}
158+
this._player.mute();
159+
}
160+
161+
/** See https://developers.google.com/youtube/iframe_api_reference#unMute */
162+
unMute() {
163+
if (!this._player) {
164+
return;
165+
}
166+
this._player.unMute();
167+
}
168+
169+
/** See https://developers.google.com/youtube/iframe_api_reference#isMuted */
170+
isMuted(): boolean {
171+
if (!this._player) {
172+
return false;
173+
}
174+
return this._player.isMuted();
175+
}
176+
177+
/** See https://developers.google.com/youtube/iframe_api_reference#setVolume */
178+
setVolume(volume: number) {
179+
if (!this._player) {
180+
return;
181+
}
182+
this._player.setVolume(volume);
183+
}
184+
185+
/** See https://developers.google.com/youtube/iframe_api_reference#getVolume */
186+
getVolume(): number {
187+
if (!this._player) {
188+
return 0;
189+
}
190+
return this._player.getVolume();
191+
}
192+
193+
/** See https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate */
194+
setPlaybackRate(playbackRate: number) {
195+
if (!this._player) {
196+
return;
197+
}
198+
return this._player.setPlaybackRate(playbackRate);
199+
}
200+
201+
/** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackRate */
202+
getPlaybackRate(): number {
203+
if (!this._player) {
204+
return 0;
205+
}
206+
return this._player.getPlaybackRate();
207+
}
208+
209+
/** See https://developers.google.com/youtube/iframe_api_reference#getAvailablePlaybackRates */
210+
getAvailablePlaybackRates(): number[] {
211+
if (!this._player) {
212+
return [];
213+
}
214+
return this._player.getAvailablePlaybackRates();
215+
}
216+
217+
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoLoadedFraction */
218+
getVideoLoadedFraction(): number {
219+
if (!this._player) {
220+
return 0;
221+
}
222+
return this._player.getVideoLoadedFraction();
223+
}
224+
225+
/** See https://developers.google.com/youtube/iframe_api_reference#getPlayerState */
226+
getPlayerState(): YT.PlayerState {
227+
if (!this._player) {
228+
return YT.PlayerState.UNSTARTED;
229+
}
230+
return this._player.getPlayerState();
231+
}
232+
233+
/** See https://developers.google.com/youtube/iframe_api_reference#getCurrentTime */
234+
getCurrentTime(): number {
235+
if (!this._player) {
236+
return 0;
237+
}
238+
return this._player.getCurrentTime();
239+
}
240+
241+
/** See https://developers.google.com/youtube/iframe_api_reference#getPlaybackQuality */
242+
getPlaybackQuality(): YT.SuggestedVideoQuality {
243+
if (!this._player) {
244+
return 'default';
245+
}
246+
return this._player.getPlaybackQuality();
247+
}
248+
249+
/** See https://developers.google.com/youtube/iframe_api_reference#getAvailableQualityLevels */
250+
getAvailableQualityLevels(): YT.SuggestedVideoQuality[] {
251+
if (!this._player) {
252+
return [];
253+
}
254+
return this._player.getAvailableQualityLevels();
255+
}
256+
257+
/** See https://developers.google.com/youtube/iframe_api_reference#getDuration */
258+
getDuration(): number {
259+
if (!this._player) {
260+
return 0;
261+
}
262+
return this._player.getDuration();
263+
}
264+
265+
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoUrl */
266+
getVideoUrl(): string {
267+
if (!this._player) {
268+
return '';
269+
}
270+
return this._player.getVideoUrl();
271+
}
272+
273+
/** See https://developers.google.com/youtube/iframe_api_reference#getVideoEmbedCode */
274+
getVideoEmbedCode(): string {
275+
if (!this._player) {
276+
return '';
277+
}
278+
return this._player.getVideoEmbedCode();
279+
}
118280
}
119281

120282
/**

0 commit comments

Comments
 (0)