Skip to content

Commit

Permalink
Merge branch 'feature/videoplayer-rework' of https://github.com/ViewT…
Browse files Browse the repository at this point in the history
…ube/viewtube into feature/videoplayer-rework
  • Loading branch information
moisout committed Jan 17, 2024
2 parents d92f9cd + 596c1a5 commit 700ff76
Show file tree
Hide file tree
Showing 8 changed files with 19,756 additions and 10 deletions.
10,155 changes: 10,155 additions & 0 deletions 5USuekk16e0.json

Large diffs are not rendered by default.

30 changes: 26 additions & 4 deletions client/components/flip/Settings.vue
Original file line number Diff line number Diff line change
@@ -1,17 +1,28 @@
<script setup lang="ts">
const uiState = inject<UIState>('uiState');
const videoState = inject<VideoState>('videoState');
</script>

<template>
<div class="flip-settings-container clickaway-div" @click="uiState.closeSettings">
<div class="flip-settings">
<div class="flip-settings" @click.stop>
<div class="flip-setting mobile-only">
<VTIcon class="flip-setting-icon" name="mdi:volume" />
<FlipVolume mobile />
</div>
<div class="flip-setting">
<VTIcon class="flip-setting-icon" name="mdi:cog" />
<p>Other setting</p>
<VTIcon class="flip-setting-icon" name="mdi:high-definition-box" />
<p>Video Quality</p>
<div class="quality-list">
<div
v-for="(quality, index) in videoState.video.videoQualityList"
:key="index"
:class="{ selected: index === videoState.video.videoQualityIndex }"
class="quality"
>
{{ quality.label }}
</div>
</div>
</div>
</div>
</div>
Expand All @@ -37,9 +48,20 @@ const uiState = inject<UIState>('uiState');
.flip-setting {
padding: 10px 15px 10px 40px;
display: flex;
flex-direction: row;
flex-direction: column;
position: relative;
.quality-list {
display: flex;
flex-direction: column;
.quality {
&.selected {
color: var(--theme-color);
}
}
}
&.mobile-only {
@media screen and (min-width: $mobile-width) {
display: none;
Expand Down
15 changes: 13 additions & 2 deletions client/composables/videoplayer/videoState.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import type {
QualityInfo,
VideoplaybackAdapterResponse,
VideoplaybackAdapterType
} from '@/utils/videoplayer/adapters/adapter';
Expand All @@ -24,8 +25,12 @@ export const useVideoState = (
volume: 1,
loop: false,
speed: 1,
videoQualityList: [],
audioQualityList: [],
videoQualityList: [] as QualityInfo[],
audioQualityList: [] as QualityInfo[],
videoQualityAuto: true,
audioQualityAuto: true,
videoQualityIndex: 0,
audioQualityIndex: 0,
videoTrackList: [],
audioTrackList: []
});
Expand Down Expand Up @@ -87,6 +92,12 @@ export const useVideoState = (
adapterInstance.value.onPlaybackRateChanged(() => {
videoState.speed = adapterInstance.value?.getPlaybackRate() ?? 1;
});
adapterInstance.value.onVideoQualityChanged(e => {
videoState.videoQualityIndex = e.newQuality;
});
adapterInstance.value.onAudioQualityChanged(e => {
videoState.audioQualityIndex = e.newQuality;
});
};

onMounted(async () => {
Expand Down
3 changes: 2 additions & 1 deletion client/utils/icons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ export const iconSafelist = [
'mdi-chevron-left',
'mdi-chevron-right',
'mdi-chevron-up',
'mdi-clipboard-text-time-outline',
'mdi-close',
'mdi-cloud-check-outline',
'mdi-cog',
'mdi-comment-outline',
'mdi-comment-remove-outline',
'mdi-content-copy',
'mdi-clipboard-text-time-outline',
'mdi-counter',
'mdi-database-export-outline',
'mdi-delete',
Expand All @@ -39,6 +39,7 @@ export const iconSafelist = [
'mdi-github',
'mdi-heart',
'mdi-high-definition',
'mdi-high-definition-box',
'mdi-history',
'mdi-home',
'mdi-import',
Expand Down
18 changes: 15 additions & 3 deletions client/utils/videoplayer/adapters/adapter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,16 @@
import type { BitrateInfo, MediaInfo } from 'dashjs';

export type EventListenerCallback = (e: any) => void;
import type { BitrateInfo, MediaInfo, MediaType } from 'dashjs';

export type EventListenerCallback<E = any> = (e: E) => void;

export class QualityInfo implements BitrateInfo {
mediaType: MediaType;
bitrate: number;
width: number;
height: number;
scanType: string;
qualityIndex: number;
label: string;
}

export interface VideoplaybackAdapterResponse {
type: 'dash' | 'hls' | 'native';
Expand All @@ -17,6 +27,8 @@ export interface VideoplaybackAdapterResponse {
onWaiting: (callback: EventListenerCallback) => void;
onVolumeChanged: (callback: EventListenerCallback) => void;
onPlaybackRateChanged: (callback: EventListenerCallback) => void;
onVideoQualityChanged: (callback: EventListenerCallback) => void;
onAudioQualityChanged: (callback: EventListenerCallback) => void;

getTime: () => number;
getDuration: () => number;
Expand Down
21 changes: 21 additions & 0 deletions client/utils/videoplayer/adapters/dashAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,23 @@ export const dashAdapter: VideoplaybackAdapter = async options => {
const onWaiting = registerCallback(dashjs.MediaPlayer.events.PLAYBACK_WAITING);
const onVolumeChanged = registerCallback(dashjs.MediaPlayer.events.PLAYBACK_VOLUME_CHANGED);
const onPlaybackRateChanged = registerCallback(dashjs.MediaPlayer.events.PLAYBACK_RATE_CHANGED);
const onQualityChanged = registerCallback(dashjs.MediaPlayer.events.QUALITY_CHANGE_RENDERED);

const onVideoQualityChanged = (callback: EventListenerCallback) => {
onQualityChanged((e: dashjs.QualityChangeRenderedEvent) => {
if (e.mediaType === 'video') {
callback(e.newQuality);
}
});
};

const onAudioQualityChanged = (callback: EventListenerCallback) => {
onQualityChanged((e: dashjs.QualityChangeRenderedEvent) => {
if (e.mediaType === 'audio') {
callback(e);
}
});
};

const destroy = () => {
unregisterCallback(dashjs.MediaPlayer.events.PLAYBACK_STARTED);
Expand Down Expand Up @@ -67,6 +84,8 @@ export const dashAdapter: VideoplaybackAdapter = async options => {
return bufferLevel;
};
const getVideoQualityList = () => {
console.log(mediaPlayer.getBitrateInfoListFor('video'));
console.log(mediaPlayer.getTracksFor('video'));
return mediaPlayer.getBitrateInfoListFor('video').map(bitrateInfo => ({
...bitrateInfo,
label: `${bitrateInfo.height}p - ${humanizeBitrate(bitrateInfo.bitrate)}`
Expand Down Expand Up @@ -136,6 +155,8 @@ export const dashAdapter: VideoplaybackAdapter = async options => {
onCanPlay,
onWaiting,
onVolumeChanged,
onVideoQualityChanged,
onAudioQualityChanged,

getTime,
getDuration,
Expand Down
Loading

0 comments on commit 700ff76

Please sign in to comment.