Skip to content

Commit f991757

Browse files
committed
Install MediaElementPlayer;
MediaPlayerComponent;
1 parent 3a80db0 commit f991757

17 files changed

+260
-4
lines changed

angular.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,14 @@
3030
"styles": [
3131
"node_modules/ngx-owl-carousel-o/lib/styles/prebuilt-themes/owl.carousel.min.css",
3232
"node_modules/ngx-owl-carousel-o/lib/styles/prebuilt-themes/owl.theme.default.min.css",
33+
"node_modules/mediaelement/build/mediaelementplayer.min.css",
3334
"src/styles.scss"
3435
],
35-
"scripts": [],
36+
"scripts": [
37+
"node_modules/mediaelement/build/mediaelement-and-player.min.js",
38+
"node_modules/mediaelement-plugins/dist/airplay/airplay.min.js",
39+
"node_modules/mediaelement-plugins/dist/chromecast/chromecast.min.js"
40+
],
3641
"stylePreprocessorOptions": {
3742
"includePaths": [
3843
"./src"

package-lock.json

Lines changed: 61 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
"private": true,
1313
"dependencies": {
1414
"@angular/animations": "~9.1.1",
15+
"@angular/cdk": "^9.2.1",
1516
"@angular/common": "~9.1.1",
1617
"@angular/compiler": "~9.1.1",
1718
"@angular/core": "~9.1.1",
19+
"@angular/flex-layout": "^9.0.0-beta.29",
1820
"@angular/forms": "~9.1.1",
1921
"@angular/platform-browser": "~9.1.1",
2022
"@angular/platform-browser-dynamic": "~9.1.1",
@@ -26,6 +28,8 @@
2628
"apollo-link": "^1.2.11",
2729
"graphql": "^14.6.0",
2830
"graphql-tag": "^2.10.0",
31+
"mediaelement": "^4.2.16",
32+
"mediaelement-plugins": "^2.5.1",
2933
"ngx-owl-carousel-o": "^3.0.0",
3034
"ngx-skeleton-loader": "^1.2.7",
3135
"rxjs": "~6.5.4",
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,10 @@
1-
<p>content-detail works!</p>
1+
<t4e-page-header
2+
isInnerPage="true"
3+
[backgroundImage]="getBackgroundHeader()"
4+
[title]="contentItem.title"
5+
backLabel="< VOLTAR PARA CONTEÚDOS"
6+
backUrl="/conteudo"
7+
></t4e-page-header>
8+
<section class="t4e-content-item">
9+
<t4e-media-player *ngIf="contentItem.videoUrl" [videoUrl]="contentItem.videoUrl"></t4e-media-player>
10+
</section>
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
.t4e-content-item {
2+
margin-top: 60px;
3+
}

src/app/screens/content-detail/content-detail.component.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,21 @@ export class ContentDetailComponent implements OnInit {
2222
this.contentItem = queryResult.data.contentItem;
2323
})
2424
}
25+
getBackgroundHeader(): string {
26+
if (this.contentItem.stakeholder) {
27+
switch(this.contentItem.stakeholder.code) {
28+
case 'PROFESSOR':
29+
return 'assets/pages/content-detail/professor-header-bg.png';
30+
31+
case 'ALUNO':
32+
return 'assets/pages/content-detail/aluno-header-bg.png';
33+
34+
case 'PAIS':
35+
return 'assets/pages/content-detail/pais-header-bg.png';
36+
}
37+
} else {
38+
return 'assets/pages/content-detail/generic-header-bg.png';
39+
}
40+
}
2541

2642
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div class="t4e-media-player">
2+
<video #mediaPlayerElement preload="auto" style="width:100%;height:100%;" controls="controls" ></video>
3+
</div>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
.t4e-media-player {
2+
width: 100%;
3+
/* max-width: 10px; */
4+
margin: 0 auto;
5+
display: flex;
6+
flex-wrap: nowrap;
7+
flex-direction: column;
8+
justify-content: center;
9+
align-items: flex-start;
10+
overflow: hidden;
11+
12+
::ng-deep .mejs__mediaelement,
13+
.mejs__poster {
14+
mask-image: url(/assets/pages/content-detail/video-mask.png);
15+
mask-position: center;
16+
mask-repeat: no-repeat;
17+
mask-size: cover;
18+
mask-border-slice: 20px;
19+
}
20+
21+
::ng-deep .mejs__container-fullscreen .mejs__mediaelement {
22+
mask-image: none;
23+
}
24+
25+
::ng-deep .mejs__container-fullscreen .mejs__mediaelement video {
26+
//width: auto !important;
27+
//height: 100vh !important;
28+
}
29+
30+
::ng-deep .mejs__controls:not([style*="display: none"]) {
31+
background: transparent;
32+
margin-bottom: 24px;
33+
padding: 0 30px;
34+
}
35+
::ng-deep .mejs__container {
36+
background: #fff;
37+
font-family: Helvetica, Arial, serif;
38+
position: relative;
39+
text-align: left;
40+
text-indent: 0;
41+
vertical-align: top;
42+
}
43+
44+
::ng-deep .mejs__overlay {
45+
border-radius: 40px;
46+
//background: linear-gradient(0deg, rgba(123, 201, 80, 0.7) 0%, rgba(123, 201, 80, 0) 23.58%)
47+
}
48+
49+
video {
50+
width: 100% !important;
51+
height: auto !important;
52+
display: flex;
53+
flex: 1 1 100%;
54+
}
55+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
2+
3+
import { MediaPlayerComponent } from './media-player.component';
4+
5+
describe('MediaPlayerComponent', () => {
6+
let component: MediaPlayerComponent;
7+
let fixture: ComponentFixture<MediaPlayerComponent>;
8+
9+
beforeEach(async(() => {
10+
TestBed.configureTestingModule({
11+
declarations: [ MediaPlayerComponent ]
12+
})
13+
.compileComponents();
14+
}));
15+
16+
beforeEach(() => {
17+
fixture = TestBed.createComponent(MediaPlayerComponent);
18+
component = fixture.componentInstance;
19+
fixture.detectChanges();
20+
});
21+
22+
it('should create', () => {
23+
expect(component).toBeTruthy();
24+
});
25+
});
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import {Component, ElementRef, Input, OnChanges, OnInit, Renderer2, SimpleChanges, ViewChild} from '@angular/core';
2+
import { MediaObserver } from '@angular/flex-layout';
3+
import {fromEvent} from 'rxjs';
4+
import {auditTime} from 'rxjs/operators';
5+
declare const MediaElementPlayer: any;
6+
7+
@Component({
8+
selector: 't4e-media-player',
9+
templateUrl: './media-player.component.html',
10+
styleUrls: ['./media-player.component.scss']
11+
})
12+
export class MediaPlayerComponent implements OnInit, OnChanges {
13+
14+
@Input() videoUrl: string;
15+
@ViewChild('mediaPlayerElement') mediaPlayerElement: ElementRef
16+
17+
mediaPlayer: any;
18+
19+
width: number = 1054;
20+
height: number = this.width / 1.77;
21+
22+
constructor(
23+
public mediaObserver: MediaObserver,
24+
private renderer: Renderer2
25+
) {
26+
mediaObserver.media$.subscribe(el => {
27+
this.width = Number(el.mediaQuery.split('max-width:')[1].split('px)')[0])
28+
console.log('width', this.width);
29+
})
30+
}
31+
32+
ngOnInit(): void {
33+
}
34+
35+
ngOnChanges(changes: SimpleChanges): void {
36+
if (this.videoUrl) {
37+
setTimeout(() => {
38+
this.loader()
39+
console.log('videoUrl', this.videoUrl)
40+
}, 0);
41+
}
42+
}
43+
44+
loader() {
45+
this.loadMediaPlayer();
46+
fromEvent(window, "resize")
47+
.pipe(auditTime(100))
48+
.subscribe((event: any) => {
49+
this.width = event['target'].innerWidth
50+
this.height = event['target'].innerHeight;
51+
this.renderer.setAttribute(this.mediaPlayerElement.nativeElement,'width', this.width.toString())
52+
this.renderer.setAttribute(this.mediaPlayerElement.nativeElement,'height', (this.width / 1.77 ).toString())
53+
console.log(this.width)
54+
});
55+
}
56+
57+
loadMediaPlayer() {
58+
this.mediaPlayer = new MediaElementPlayer(
59+
this.mediaPlayerElement.nativeElement, {
60+
autoSize: true,
61+
features: ['playpause', 'current', 'progress', 'duration', 'volume', 'fullscreen', 'airplay', 'chromecast']
62+
}
63+
);
64+
this.mediaPlayer.setSrc(this.videoUrl);
65+
this.mediaPlayer.load();
66+
// const video = this.mediaPlayerElement.nativeElement;
67+
// setTimeout(() => {}, 300);
68+
}
69+
70+
}

src/app/shared/components/page-header/page-header.component.scss

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@
2929
@include font('button');
3030
color: #FFF;
3131
margin-bottom: 16px;
32+
cursor: pointer;
33+
34+
&:hover {
35+
text-decoration: underline;
36+
}
3237
}
3338

3439
h1 {

src/app/shared/shared.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {ReactiveFormsModule} from '@angular/forms';
1111
import { ContentCardComponent } from './components/content-card/content-card.component';
1212
import { FilterDrawerComponent } from './components/filter-drawer/filter-drawer.component';
1313
import {ContentItemsService} from './services/content-items.service';
14+
import { MediaPlayerComponent } from './components/media-player/media-player.component';
1415

1516
const SHARED_COMPONENTS = [
1617
NavbarComponent,
@@ -20,6 +21,7 @@ const SHARED_COMPONENTS = [
2021
FiltersComponent,
2122
ContentCardComponent,
2223
FilterDrawerComponent,
24+
MediaPlayerComponent
2325
];
2426

2527
const SHARED_SERVICES = [
Loading
Loading
Loading
Loading
757 KB
Loading

0 commit comments

Comments
 (0)