Skip to content

Commit

Permalink
Merge pull request #235 from videogular/buffer
Browse files Browse the repository at this point in the history
feat(Player): Added buffering indicator plugin
  • Loading branch information
joanllenas authored Sep 14, 2016
2 parents 1031cae + 4d805d8 commit 9bc32b8
Show file tree
Hide file tree
Showing 17 changed files with 424 additions and 41 deletions.
2 changes: 2 additions & 0 deletions buffering.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export declare class VgBufferingModule {
}
32 changes: 32 additions & 0 deletions buffering.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions buffering.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import {VgBuffering} from './src/vg-buffering/vg-buffering';

@NgModule({
imports: [ CommonModule ],
declarations: [
VgBuffering
],
exports: [
VgBuffering
]
})
export class VgBufferingModule {}
4 changes: 3 additions & 1 deletion examples/single-media-player/src/app.module.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion examples/single-media-player/src/app.module.js.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion examples/single-media-player/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@ import {BrowserModule} from '@angular/platform-browser';
import {VgCore} from 'videogular2/core';
import {VgControlsModule} from 'videogular2/controls';
import {VgOverlayPlayModule} from 'videogular2/overlay-play';
import {VgBufferingModule} from 'videogular2/buffering';
import {SingleMediaPlayer} from './single-media-player';

@NgModule({
imports: [
BrowserModule,
VgCore,
VgControlsModule,
VgOverlayPlayModule
VgOverlayPlayModule,
VgBufferingModule
],
declarations: [SingleMediaPlayer],
bootstrap: [SingleMediaPlayer]
Expand Down
1 change: 1 addition & 0 deletions examples/single-media-player/src/single-media-player.html
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<vg-player>
<vg-overlay-play></vg-overlay-play>
<vg-buffering></vg-buffering>

<vg-scrub-bar>
<vg-scrub-bar-current-time></vg-scrub-bar-current-time>
Expand Down
2 changes: 1 addition & 1 deletion src/services/vg-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {VgStates} from "../states/vg-states";

@Injectable()
export class VgAPI {
medias:Object = {};
medias:Object = {};// TODO: refactor to Set<IPlayable>
videogularElement: any;
playerReadyEvent: EventEmitter<any> = new EventEmitter(true);

Expand Down
22 changes: 22 additions & 0 deletions src/vg-buffering/vg-buffering.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ElementRef } from '@angular/core';
import { VgAPI } from '../services/vg-api';
import { IPlayable } from "../vg-media/i-playable";
export declare class VgBuffering {
API: VgAPI;
elem: HTMLElement;
vgFor: string;
target: IPlayable;
checkBufferInterval: number;
displayState: string;
constructor(ref: ElementRef, API: VgAPI);
onPlayerReady(): void;
checkInterval: number;
currentPlayPos: number;
lastPlayPos: number;
bufferingDetected: boolean;
bufferCheck(): void;
startBufferCheck(): void;
stopBufferCheck(): void;
show(): void;
hide(): void;
}
Empty file.
110 changes: 110 additions & 0 deletions src/vg-buffering/vg-buffering.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
import {VgBuffering} from "./vg-buffering";
import {VgAPI} from "../services/vg-api";
import {IPlayable} from "../vg-media/i-playable";
import {ElementRef} from "@angular/core";

describe('Volume control', () => {
let vgBuffering:VgBuffering;
let ref:ElementRef;
let api:VgAPI;

beforeEach(() => {
ref = {
nativeElement: {
getAttribute: (name) => {
return name;
}
}
};

api = new VgAPI();
vgBuffering = new VgBuffering(ref, api);
});

describe('onPlayerReady', ()=>{
it('should subscribe to play and pause media events', ()=>{
spyOn(api, 'getMediaById').and.returnValue({
subscriptions: {
play: {subscribe: jasmine.createSpy('play') },
pause: {subscribe: jasmine.createSpy('pause') }
}
});
vgBuffering.onPlayerReady();
expect(vgBuffering.target.subscriptions.play.subscribe).toHaveBeenCalled();
expect(vgBuffering.target.subscriptions.pause.subscribe).toHaveBeenCalled();
});
});

describe('startBufferCheck', ()=>{
it('should register bufferCheck in a setInterval', () => {
spyOn(window, 'setInterval').and.returnValue(100);
vgBuffering.checkInterval = 77;
vgBuffering.startBufferCheck();
expect(window.setInterval).toHaveBeenCalledWith(
vgBuffering.bufferCheck,
77
);
expect(vgBuffering.checkBufferInterval).toBe(100);
});
});

describe('stopBufferCheck', ()=>{
it('should unregister bufferCheck from setInterval', () => {
spyOn(window, 'clearInterval');
vgBuffering.stopBufferCheck();
expect(window.clearInterval).toHaveBeenCalledWith(
vgBuffering.checkBufferInterval
);
});
it('should set props to hide buffering indicator', () => {
vgBuffering.bufferingDetected = true;
spyOn(vgBuffering, 'hide');
vgBuffering.stopBufferCheck();
expect(vgBuffering.bufferingDetected).toBe(false);
expect(vgBuffering.hide).toHaveBeenCalled();
});
});

describe('show', ()=>{
it('should set displayState to "block"', () => {
vgBuffering.displayState = 'none';
vgBuffering.show();
expect(vgBuffering.displayState).toBe('block');
});
});

describe('hide', ()=>{
it('should set displayState to "none"', () => {
vgBuffering.displayState = 'block';
vgBuffering.hide();
expect(vgBuffering.displayState).toBe('none');
});
});

describe('bufferCheck', ()=>{
beforeEach(()=>{
vgBuffering.target = <IPlayable>{currentTime:0};
});
it('should set bufferingDetected to true', () => {
spyOn(vgBuffering, 'show');
vgBuffering.bufferingDetected = false;
vgBuffering.target.currentTime = 10;
vgBuffering.lastPlayPos = 10;
vgBuffering.bufferCheck();
expect(vgBuffering.bufferingDetected).toBe(true);
expect(vgBuffering.lastPlayPos).toBe(10);
expect(vgBuffering.show).toHaveBeenCalled();
});

it('should set bufferingDetected to false', () => {
spyOn(vgBuffering, 'hide');
vgBuffering.bufferingDetected = true;
vgBuffering.target.currentTime = 20;
vgBuffering.lastPlayPos = 10;
vgBuffering.bufferCheck();
expect(vgBuffering.bufferingDetected).toBe(false);
expect(vgBuffering.lastPlayPos).toBe(20);
expect(vgBuffering.hide).toHaveBeenCalled();
});
});
});
Loading

0 comments on commit 9bc32b8

Please sign in to comment.