-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Leonardo
committed
Mar 20, 2023
1 parent
d56050c
commit cfee81c
Showing
9 changed files
with
181 additions
and
76 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
import { Injectable } from '@angular/core'; | ||
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'; | ||
|
||
@Injectable({ | ||
providedIn: 'root', | ||
}) | ||
export class FfmpegService { | ||
public isReady: boolean = false; | ||
private ffmpeg; | ||
constructor() { | ||
this.ffmpeg = createFFmpeg({ log: true }); | ||
} | ||
|
||
async init(): Promise<void> { | ||
if (this.isReady) { | ||
return; | ||
} | ||
await this.ffmpeg.load(); | ||
this.isReady = true; | ||
} | ||
|
||
async getScreenshots(file: File): Promise<string[]> { | ||
const data = await fetchFile(file); | ||
this.ffmpeg.FS('writeFile', file.name, data); | ||
const seconds = [1, 2, 3]; | ||
const commands: string[] = []; | ||
seconds.forEach((second) => { | ||
commands.push( | ||
'-i', | ||
file.name, | ||
'-ss', | ||
`00:00:0${second}`, | ||
'-frames:v', | ||
'1', | ||
'-filter:v', | ||
'scale=510:-1', | ||
`output_0${second}.png` | ||
); | ||
}); | ||
|
||
await this.ffmpeg.run(...commands); | ||
|
||
const screenshots: string[] = []; | ||
|
||
seconds.forEach((second) => { | ||
const screenshotFile = this.ffmpeg.FS( | ||
'readFile', | ||
`output_0${second}.png` | ||
); | ||
const screenshotBlob = new Blob([screenshotFile.buffer], { | ||
type: 'image/png', | ||
}); | ||
|
||
const screenshotUrl = URL.createObjectURL(screenshotBlob); | ||
console.log(screenshotUrl); | ||
screenshots.push(screenshotUrl); | ||
}); | ||
return screenshots; | ||
} | ||
|
||
// makerScreenshotCommander(second) {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
import { Pipe, PipeTransform } from '@angular/core'; | ||
import { DomSanitizer } from '@angular/platform-browser'; | ||
|
||
@Pipe({ | ||
name: 'safeURL', | ||
}) | ||
export class SafeURLPipe implements PipeTransform { | ||
constructor(private sanitizer: DomSanitizer) {} | ||
|
||
transform(value: string) { | ||
return this.sanitizer.bypassSecurityTrustUrl(value); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,55 +1,56 @@ | ||
<section class="container mx-auto my-8 bg-secondary p-6"> | ||
<div class="rounded relative flex flex-col"> | ||
<div class="font-bold mb-6">Upload Video</div> | ||
|
||
<!-- Upload Dropbox --> | ||
<ng-container *ngIf="!nextStep; else uploadFormContainer"> | ||
<div (dragend)="isDragOver = false" (dragover)="isDragOver = true" (dragenter)="isDragOver = true" | ||
(dragleave)="isDragOver = false" (mouseleave)="isDragOver = false" (drop)="storeFile($event)" | ||
[ngClass]="{'bg-indigo-400 border-indigo-400 border-solid': isDragOver}" app-event-blocker class="w-full px-10 py-40 rounded text-center cursor-pointer border border-dashed | ||
<ng-container *ngIf="ffmpegService.isReady; else loading"> | ||
<!-- Upload Dropbox --> | ||
<ng-container *ngIf="!nextStep; else uploadFormContainer"> | ||
<div (dragend)="isDragOver = false" (dragover)="isDragOver = true" (dragenter)="isDragOver = true" | ||
(dragleave)="isDragOver = false" (mouseleave)="isDragOver = false" (drop)="storeFile($event)" | ||
[ngClass]="{'bg-indigo-400 border-indigo-400 border-solid': isDragOver}" app-event-blocker class="w-full px-10 py-40 rounded text-center cursor-pointer border border-dashed | ||
border-gray-400 transition duration-500 hover:text-white | ||
hover:bg-indigo-400 hover:border-indigo-400 hover:border-solid text-xl"> | ||
<h5>Drop your file here (mp4 only!)</h5> | ||
</div> | ||
<input type="file" class='mt-4' (change)="storeFile($event)"> | ||
</ng-container> | ||
<h5>Drop your file here (mp4 only!)</h5> | ||
</div> | ||
<input type="file" class='mt-4' (change)="storeFile($event)"> | ||
</ng-container> | ||
|
||
<!-- Video Editor --> | ||
<ng-template #uploadFormContainer> | ||
<app-alert *ngIf="showAlert" [color]="alertColor"> | ||
<p>{{alertMessage}}</p> | ||
<p *ngIf="showPercentage">{{ percentage | percent}}</p> | ||
</app-alert> | ||
<!-- Form --> | ||
<form [hidden]="!nextStep" [formGroup]="uploadFrom" (ngSubmit)="uploadFile()"> | ||
<!-- Screenshots --> | ||
<h2 class="mb-4 text-xl">Select a Thumbnail</h2> | ||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-4"> | ||
<div class="border-8 cursor-pointer border-green-400"> | ||
<img src="assets/img/1.jpg"> | ||
<!-- Video Editor --> | ||
<ng-template #uploadFormContainer> | ||
<app-alert *ngIf="showAlert" [color]="alertColor"> | ||
<p>{{alertMessage}}</p> | ||
<p *ngIf="showPercentage">{{ percentage | percent}}</p> | ||
</app-alert> | ||
<!-- Form --> | ||
<form [hidden]="!nextStep" [formGroup]="uploadFrom" (ngSubmit)="uploadFile()"> | ||
<!-- Screenshots --> | ||
<h2 class="mb-4 text-xl">Select a Thumbnail</h2> | ||
<div class="grid grid-cols-1 lg:grid-cols-3 gap-4"> | ||
<div *ngFor="let screenshot of screenshots" class="border-8 cursor-pointer border-green-400"> | ||
<img [src]="screenshot | safeURL"> | ||
</div> | ||
</div> | ||
<div class="border-8 cursor-pointer border-transparent"> | ||
<img src="assets/img/2.jpg"> | ||
</div> | ||
<div class="border-8 cursor-pointer border-transparent"> | ||
<img src="assets/img/3.jpg"> | ||
|
||
<!-- Title --> | ||
<div class="mt-4"> | ||
<label class="block text-xl mb-4">Title</label> | ||
<app-input [control]="title" placeholder="Enter title"></app-input> | ||
</div> | ||
</div> | ||
|
||
<!-- Title --> | ||
<div class="mt-4"> | ||
<label class="block text-xl mb-4">Title</label> | ||
<app-input [control]="title" placeholder="Enter title"></app-input> | ||
</div> | ||
<div class="mt-4 text-right"> | ||
<button type="submit" [disabled]="inSubmission" | ||
[ngClass]="{'opacity-50': inSubmission, 'hover:bg-indigo-700': !inSubmission}" | ||
class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm rounded-md text-white bg-indigo-600 focus:outline-none"> | ||
Publish | ||
</button> | ||
</div> | ||
</form> | ||
</ng-template> | ||
</ng-container> | ||
|
||
<div class="mt-4 text-right"> | ||
<button type="submit" [disabled]="inSubmission" | ||
[ngClass]="{'opacity-50': inSubmission, 'hover:bg-indigo-700': !inSubmission}" | ||
class="inline-flex justify-center py-2 px-4 border border-transparent shadow-sm rounded-md text-white bg-indigo-600 focus:outline-none"> | ||
Publish | ||
</button> | ||
</div> | ||
</form> | ||
<ng-template #loading> | ||
<span class="material-icon text-center text-6xl p-8 animate-spin"> | ||
| | ||
</span> | ||
</ng-template> | ||
</div> | ||
</section> | ||
</section> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters