From d208f0f543413f2df12ff4260d47dfd45999556b Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 3 Dec 2019 23:44:05 +0100 Subject: [PATCH] Starting a stats menu. --- Kyoo/ClientApp/src/app/app.module.ts | 12 +++-- .../src/app/player/player.component.html | 46 ++++++++++++++++- .../src/app/player/player.component.ts | 35 +++++++++---- .../videoSupport/playbackMethodDetector.js | 41 ++++++++++----- .../playbackMethodDetector.js.map | 2 +- .../videoSupport/playbackMethodDetector.ts | 51 +++++++++++++------ Kyoo/InternalAPI/Transcoder/Transcoder.cs | 6 +-- 7 files changed, 145 insertions(+), 48 deletions(-) diff --git a/Kyoo/ClientApp/src/app/app.module.ts b/Kyoo/ClientApp/src/app/app.module.ts index 879f3146..6294413e 100644 --- a/Kyoo/ClientApp/src/app/app.module.ts +++ b/Kyoo/ClientApp/src/app/app.module.ts @@ -1,6 +1,7 @@ import { HttpClientModule } from '@angular/common/http'; import { NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; +import { MatCardModule } from '@angular/material/card'; import { MatRippleModule } from '@angular/material/core'; import { MatIconModule } from '@angular/material/icon'; import { MatMenuModule } from '@angular/material/menu'; @@ -17,10 +18,10 @@ import { BrowseComponent } from './browse/browse.component'; import { CollectionComponent } from './collection/collection.component'; import { EpisodesListComponent } from './episodes-list/episodes-list.component'; import { NotFoundComponent } from './not-found/not-found.component'; -import { PlayerComponent } from './player/player.component'; -import { ShowDetailsComponent } from './show-details/show-details.component'; -import { SearchComponent } from './search/search.component'; import { PeopleListComponent } from './people-list/people-list.component'; +import { PlayerComponent } from './player/player.component'; +import { SearchComponent } from './search/search.component'; +import { ShowDetailsComponent } from './show-details/show-details.component'; import { ShowsListComponent } from './shows-list/shows-list.component'; @@ -50,8 +51,9 @@ import { ShowsListComponent } from './shows-list/shows-list.component'; MatMenuModule, MatSliderModule, MatTooltipModule, - MatRippleModule - ], + MatRippleModule, + MatCardModule + ], providers: [], bootstrap: [AppComponent] }) diff --git a/Kyoo/ClientApp/src/app/player/player.component.html b/Kyoo/ClientApp/src/app/player/player.component.html index 9f424835..ebe1882f 100644 --- a/Kyoo/ClientApp/src/app/player/player.component.html +++ b/Kyoo/ClientApp/src/app/player/player.component.html @@ -16,6 +16,25 @@
{{this.item.showTitle}}
+ + + Stats + + + Play method: {{this.playMethod}} +
+
+ Video Container: {{this.supportList?.container ? check_circle : cancel}}{{this.item.container}} +
+ Video Codec: cancel {{this.item.video.codec}} +
+ Audio Codec: {{this.item.audios[0].codec}} +
+ Subtitle Codec: {{this.selectedSubtitle ? this.selectedSubtitle.codec : "none"}} +
+
+
+
@@ -72,7 +91,7 @@ -
+ + + + + + + + + + + + + + +
diff --git a/Kyoo/ClientApp/src/app/player/player.component.ts b/Kyoo/ClientApp/src/app/player/player.component.ts index 2fcffa90..f3525aec 100644 --- a/Kyoo/ClientApp/src/app/player/player.component.ts +++ b/Kyoo/ClientApp/src/app/player/player.component.ts @@ -5,7 +5,7 @@ import { ActivatedRoute, Event, NavigationCancel, NavigationEnd, NavigationStart import { Track, WatchItem } from "../../models/watch-item"; import { Location } from "@angular/common"; import * as Hls from "hls.js" -import { getPlaybackMethod, method } from "../../videoSupport/playbackMethodDetector"; +import { getPlaybackMethod, method, getWhatIsSupported, SupportList } from "../../videoSupport/playbackMethodDetector"; declare var SubtitleManager: any; @@ -40,7 +40,10 @@ export class PlayerComponent implements OnInit playTooltip: string = "Pause"; //Text used in the play tooltip fullscreenTooltip: string = "Fullscreen"; //Text used in the fullscreen tooltip - playMethod: method; + playMethod: method = method.direct; + + displayStats: boolean = false; + supportList: SupportList; private player: HTMLVideoElement; private hlsPlayer: Hls = new Hls(); @@ -75,8 +78,11 @@ export class PlayerComponent implements OnInit $("#fullscreen").addClass("d-none"); $("#volume").addClass("d-none"); } - if (this.player) - this.init(); + setTimeout(() => + { + if (this.player) + this.init(); + }); }); } @@ -138,8 +144,11 @@ export class PlayerComponent implements OnInit } else { - this.playMethod += 1; - this.selectPlayMethod(); + if (this.playMethod == method.direct) + this.playMethod = method.transmux; + else + this.playMethod = method.transcode; + this.selectPlayMethod(this.playMethod); } } @@ -350,7 +359,10 @@ export class PlayerComponent implements OnInit } }); - this.init(); + setTimeout(() => + { + this.init(); + }); } init() @@ -360,8 +372,8 @@ export class PlayerComponent implements OnInit this.playMethod = method[queryMethod]; else this.playMethod = getPlaybackMethod(this.player, this.item); - - this.selectPlayMethod(); + + this.selectPlayMethod(this.playMethod); let sub: string = this.route.snapshot.queryParams["sub"]; if (sub != null) @@ -372,14 +384,17 @@ export class PlayerComponent implements OnInit this.selectSubtitle(this.item.subtitles.find(x => x.language == languageCode && x.isForced == forced), false); } + this.supportList = getWhatIsSupported(this.player, this.item); + setTimeout(() => { this.snackBar.open("Playing: " + this.item.showTitle + " S" + this.item.seasonNumber + ":E" + this.item.episodeNumber, null, { verticalPosition: "top", horizontalPosition: "right", duration: 2000, panelClass: "info-panel" }); }, 750); } - selectPlayMethod() + selectPlayMethod(playMethod: method) { + this.playMethod = playMethod; if (this.playMethod == method.direct) { this.player.src = "/video/" + this.item.link; diff --git a/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.js b/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.js index c5e89f0a..bdb7492d 100644 --- a/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.js +++ b/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.js @@ -3,28 +3,45 @@ Object.defineProperty(exports, "__esModule", { value: true }); var detect_browser_1 = require("detect-browser"); var method; (function (method) { - method[method["direct"] = 0] = "direct"; - method[method["transmux"] = 1] = "transmux"; - method[method["transcode"] = 2] = "transcode"; + method["direct"] = "Direct Play"; + method["transmux"] = "Transmux"; + method["transcode"] = "Transcode"; })(method = exports.method || (exports.method = {})); ; +var SupportList = /** @class */ (function () { + function SupportList() { + } + return SupportList; +}()); +exports.SupportList = SupportList; function getPlaybackMethod(player, item) { - var browser = detect_browser_1.detect(); - // If we can't find the browser, transcode (It may or may not support containers/codecs) - if (!browser) - return method.transcode; - if (containerIsSupported(player, item.container, browser.name) && item.audios.length <= 1) { - if (videoCodecIsSupported(player, item.video.codec, browser.name) && - audioCodecIsSupported(player, item.audios.map(function (value) { return value.codec; }), browser.name)) + var supportList = getWhatIsSupported(player, item); + if (supportList.container) { + if (supportList.videoCodec && supportList.audioCodec) return method.direct; return method.transcode; } - if (videoCodecIsSupported(player, item.video.codec, browser.name) && - audioCodecIsSupported(player, item.audios.map(function (value) { return value.codec; }), browser.name)) + if (supportList.videoCodec && supportList.audioCodec) return method.transmux; return method.transcode; } exports.getPlaybackMethod = getPlaybackMethod; +function getWhatIsSupported(player, item) { + var supportList = new SupportList(); + var browser = detect_browser_1.detect(); + if (!browser) { + supportList.container = false; + supportList.videoCodec = false; + supportList.audioCodec = false; + } + else { + supportList.container = containerIsSupported(player, item.container, browser.name) && item.audios.length <= 1; + supportList.videoCodec = videoCodecIsSupported(player, item.video.codec, browser.name); + supportList.videoCodec = audioCodecIsSupported(player, item.audios.map(function (value) { return value.codec; }), browser.name); + } + return (supportList); +} +exports.getWhatIsSupported = getWhatIsSupported; function containerIsSupported(player, container, browser) { var supported = false; switch (container) { diff --git a/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.js.map b/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.js.map index 44c4d25c..ecc34bd9 100644 --- a/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.js.map +++ b/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.js.map @@ -1 +1 @@ -{"version":3,"file":"playbackMethodDetector.js","sourceRoot":"","sources":["playbackMethodDetector.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"playbackMethodDetector.js","sourceRoot":"","sources":["playbackMethodDetector.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.ts b/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.ts index 4bb54bfa..3c178496 100644 --- a/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.ts +++ b/Kyoo/ClientApp/src/videoSupport/playbackMethodDetector.ts @@ -1,35 +1,56 @@ -import { WatchItem, Track } from "../models/watch-item"; -import { detect, BrowserInfo } from "detect-browser"; +import { detect } from "detect-browser"; +import { Track, WatchItem } from "../models/watch-item"; export enum method { - direct, - transmux, - transcode + direct = "Direct Play", + transmux = "Transmux", + transcode = "Transcode" }; +export class SupportList +{ + container: boolean; + videoCodec: boolean; + audioCodec: boolean; +} + export function getPlaybackMethod(player: HTMLVideoElement, item: WatchItem): method { - let browser = detect(); + let supportList: SupportList = getWhatIsSupported(player, item); - // If we can't find the browser, transcode (It may or may not support containers/codecs) - if (!browser) - return method.transcode; - - if (containerIsSupported(player, item.container, browser.name) && item.audios.length <= 1) + if (supportList.container) { - if (videoCodecIsSupported(player, item.video.codec, browser.name) && - audioCodecIsSupported(player, item.audios.map((value: Track) => value.codec), browser.name)) + if (supportList.videoCodec && supportList.audioCodec) return method.direct; return method.transcode; } - if (videoCodecIsSupported(player, item.video.codec, browser.name) && - audioCodecIsSupported(player, item.audios.map((value: Track) => value.codec), browser.name)) + if (supportList.videoCodec && supportList.audioCodec) return method.transmux; return method.transcode; } +export function getWhatIsSupported(player: HTMLVideoElement, item: WatchItem): SupportList +{ + let supportList: SupportList = new SupportList(); + let browser = detect(); + + if (!browser) + { + supportList.container = false; + supportList.videoCodec = false; + supportList.audioCodec = false; + } + else + { + supportList.container = containerIsSupported(player, item.container, browser.name) && item.audios.length <= 1; + supportList.videoCodec = videoCodecIsSupported(player, item.video.codec, browser.name); + supportList.videoCodec = audioCodecIsSupported(player, item.audios.map((value: Track) => value.codec), browser.name); + } + return (supportList); +} + function containerIsSupported(player: HTMLVideoElement, container: string, browser: string): boolean { let supported: boolean = false; diff --git a/Kyoo/InternalAPI/Transcoder/Transcoder.cs b/Kyoo/InternalAPI/Transcoder/Transcoder.cs index 55308362..4e542381 100644 --- a/Kyoo/InternalAPI/Transcoder/Transcoder.cs +++ b/Kyoo/InternalAPI/Transcoder/Transcoder.cs @@ -52,13 +52,11 @@ namespace Kyoo.InternalAPI if (File.Exists(manifest)) return manifest; - // Added an await and removed the while -> await because the dynamic dash file can't be played for now (maybe ffmpeg doesn't process in the playback order). - /*await */Task.Run(() => + Task.Run(() => { transmuxFailed = TranscoderAPI.transmux(episode.Path, manifest.Replace('\\', '/'), out playableDuration) != 0; - //playableDuration = float.MaxValue; }); - while (playableDuration < 20 || (!File.Exists(manifest) && !transmuxFailed)) + while (playableDuration < 10 || (!File.Exists(manifest) && !transmuxFailed)) await Task.Delay(10); return transmuxFailed ? null : manifest; }