From ece7c650f6bac3a8c024d71d34e5a61da3795d55 Mon Sep 17 00:00:00 2001 From: bivashy Date: Tue, 12 Aug 2025 23:56:52 +0500 Subject: [PATCH 1/8] Initial implementation of "Next episode" button in player --- app/components/ui/player/Player.vue | 19 +++++++++++++++++++ app/pages/watch.vue | 23 +++-------------------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/app/components/ui/player/Player.vue b/app/components/ui/player/Player.vue index b220fac..21c7e47 100644 --- a/app/components/ui/player/Player.vue +++ b/app/components/ui/player/Player.vue @@ -5,6 +5,7 @@ import Hls from "hls.js"; interface Props { urls: any; id: string; + nextEpisodeButton: boolean; } const props = withDefaults(defineProps(), { @@ -13,6 +14,23 @@ const props = withDefaults(defineProps(), { const emit = defineEmits(['get-instance']) const options = computed(() => { + const controls = [] + if (props.nextEpisodeButton) { + controls.push( + { + name: 'next-episode', + index: 50, + position: 'left', + html: '', + tooltip: 'Next episode', + style: { + color: 'red', + }, + click: function () { + }, + }, + ) + } return { url: props.urls[0].url || '', type: 'm3u8', @@ -30,6 +48,7 @@ const options = computed(() => { autoOrientation: true, autoPlayback: true, id: props.id, + controls: controls, } }) const artplayerRef = ref(); diff --git a/app/pages/watch.vue b/app/pages/watch.vue index e338908..f55ee74 100644 --- a/app/pages/watch.vue +++ b/app/pages/watch.vue @@ -8,7 +8,8 @@

Episode: {{ episode }}

- +
@@ -24,7 +25,7 @@ + + + + diff --git a/app/components/ui/player/Player.vue b/app/components/ui/player/Player.vue index 21c7e47..86db32b 100644 --- a/app/components/ui/player/Player.vue +++ b/app/components/ui/player/Player.vue @@ -1,11 +1,14 @@ + + - - diff --git a/app/components/ui/player/Player.vue b/app/components/ui/player/Player.vue index 86db32b..5a57e92 100644 --- a/app/components/ui/player/Player.vue +++ b/app/components/ui/player/Player.vue @@ -6,7 +6,7 @@ import { EpisodeChangeType } from "./ChangeEpisodeButton.vue"; import { UiPlayerChangeEpisodeButton } from "#components"; interface Props { - urls: any; + urls: any[]; id: string; episodeButton: boolean; } @@ -17,36 +17,12 @@ const props = withDefaults(defineProps(), { const emit = defineEmits(['get-instance']) const options = computed(() => { - const controls = [] - if (props.episodeButton) { - controls.push( - createVueControlSmart(UiPlayerChangeEpisodeButton, { - name: "next-episode", - index: 50, - tooltip: "Next episode", - type: EpisodeChangeType.NEXT - }, { - click: () => console.log("NEXT") - }) - ) - controls.push( - createVueControlSmart(UiPlayerChangeEpisodeButton, { - name: "previous-episode", - index: 50, - tooltip: "Previous episode", - type: EpisodeChangeType.PREVIOUS - }, { - click: () => console.log("Previous") - }) - ) - } return { url: props.urls[0].url || '', type: 'm3u8', customType: { m3u8: playM3u8, }, - quality: props.urls, autoSize: true, autoMini: true, playbackRate: true, @@ -57,7 +33,6 @@ const options = computed(() => { autoOrientation: true, autoPlayback: true, id: props.id, - controls: controls, } }) const artplayerRef = ref(); @@ -83,6 +58,24 @@ onMounted(() => { container: artplayerRef.value, ...options.value, }) + if (props.episodeButton) { + instance.value.controls.add( + createVueControlSmart(UiPlayerChangeEpisodeButton, { + name: "next-episode", + index: 50, + tooltip: "Next episode", + type: EpisodeChangeType.NEXT, + }) + ) + instance.value.controls.add( + createVueControlSmart(UiPlayerChangeEpisodeButton, { + name: "previous-episode", + index: 50, + tooltip: "Previous episode", + type: EpisodeChangeType.PREVIOUS, + }) + ) + } nextTick(() => { emit('get-instance') }) @@ -93,6 +86,13 @@ onBeforeUnmount(() => { instance.value.destroy(false) } }) + +watch([instance, () => props.urls], async ([artplayer, urls]) => { + if (!artplayer) return; + artplayer.quality = urls; + artplayer.switch = urls[0].url; + instance.value = artplayer; +})