Add auto play next video and fix watch progress issue on route change
This commit is contained in:
parent
c7762852f2
commit
df629ff7e1
|
@ -23,7 +23,6 @@
|
|||
.switch-label
|
||||
position: relative
|
||||
display: inline-block
|
||||
min-width: 112px
|
||||
cursor: pointer
|
||||
font-weight: 500
|
||||
text-align: left
|
||||
|
|
|
@ -29,10 +29,7 @@ export default Vue.extend({
|
|||
360,
|
||||
480,
|
||||
720,
|
||||
1080,
|
||||
1440,
|
||||
2160,
|
||||
4320
|
||||
1080
|
||||
]
|
||||
}
|
||||
},
|
||||
|
@ -97,10 +94,7 @@ export default Vue.extend({
|
|||
this.$t('Settings.Player Settings.Default Quality.360p'),
|
||||
this.$t('Settings.Player Settings.Default Quality.480p'),
|
||||
this.$t('Settings.Player Settings.Default Quality.720p'),
|
||||
this.$t('Settings.Player Settings.Default Quality.1080p'),
|
||||
this.$t('Settings.Player Settings.Default Quality.1440p'),
|
||||
this.$t('Settings.Player Settings.Default Quality.4k'),
|
||||
this.$t('Settings.Player Settings.Default Quality.8k')
|
||||
this.$t('Settings.Player Settings.Default Quality.1080p')
|
||||
]
|
||||
}
|
||||
},
|
||||
|
|
|
@ -28,6 +28,12 @@
|
|||
:default-value="proxyVideos"
|
||||
@change="updateProxyVideos"
|
||||
/>
|
||||
<ft-toggle-switch
|
||||
:label="$t('Settings.Player Settings.Enable Theatre Mode by Default')"
|
||||
:compact="true"
|
||||
:default-value="defaultTheatreMode"
|
||||
@change="updateDefaultTheatreMode"
|
||||
/>
|
||||
</div>
|
||||
<div class="switchColumn">
|
||||
<ft-toggle-switch
|
||||
|
@ -43,18 +49,11 @@
|
|||
@change="updateAutoplayPlaylists"
|
||||
/>
|
||||
<ft-toggle-switch
|
||||
v-if="false"
|
||||
:label="$t('Settings.Player Settings.Play Next Video')"
|
||||
:compact="true"
|
||||
:default-value="playNextVideo"
|
||||
@change="updatePlayNextVideo"
|
||||
/>
|
||||
<ft-toggle-switch
|
||||
:label="$t('Settings.Player Settings.Enable Theatre Mode by Default')"
|
||||
:compact="true"
|
||||
:default-value="defaultTheatreMode"
|
||||
@change="updateDefaultTheatreMode"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<ft-flex-box>
|
||||
|
|
|
@ -1,4 +1,15 @@
|
|||
.relative {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.watchVideoRecommendations {
|
||||
display: grid;
|
||||
grid-gap: 8px;
|
||||
}
|
||||
|
||||
.autoPlayToggle {
|
||||
width: 120px;
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 0px;
|
||||
}
|
||||
|
|
|
@ -1,22 +1,37 @@
|
|||
import Vue from 'vue'
|
||||
import { mapActions } from 'vuex'
|
||||
import FtCard from '../ft-card/ft-card.vue'
|
||||
import FtListVideo from '../ft-list-video/ft-list-video.vue'
|
||||
import FtToggleSwitch from '../ft-toggle-switch/ft-toggle-switch.vue'
|
||||
|
||||
export default Vue.extend({
|
||||
name: 'WatchVideoRecommendations',
|
||||
components: {
|
||||
'ft-card': FtCard,
|
||||
'ft-list-video': FtListVideo
|
||||
'ft-list-video': FtListVideo,
|
||||
'ft-toggle-switch': FtToggleSwitch
|
||||
},
|
||||
props: {
|
||||
data: {
|
||||
type: Array,
|
||||
required: true
|
||||
},
|
||||
watchingPlaylist: {
|
||||
type: Boolean,
|
||||
default: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
listType: function () {
|
||||
return this.$store.getters.getListType
|
||||
},
|
||||
playNextVideo: function () {
|
||||
return this.$store.getters.getPlayNextVideo
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
...mapActions([
|
||||
'updatePlayNextVideo'
|
||||
])
|
||||
}
|
||||
})
|
||||
|
|
|
@ -3,6 +3,14 @@
|
|||
<h3>
|
||||
{{ $t("Up Next") }}
|
||||
</h3>
|
||||
<ft-toggle-switch
|
||||
v-if="!watchingPlaylist"
|
||||
class="autoPlayToggle"
|
||||
:label="$t('Video.Autoplay')"
|
||||
:compact="true"
|
||||
:default-value="playNextVideo"
|
||||
@change="updatePlayNextVideo"
|
||||
/>
|
||||
<ft-list-video
|
||||
v-for="(video, index) in data"
|
||||
:key="index"
|
||||
|
|
|
@ -70,54 +70,45 @@ export default Vue.extend({
|
|||
isDev: function () {
|
||||
return process.env.NODE_ENV === 'development'
|
||||
},
|
||||
|
||||
usingElectron: function () {
|
||||
return this.$store.getters.getUsingElectron
|
||||
},
|
||||
|
||||
historyCache: function () {
|
||||
return this.$store.getters.getHistoryCache
|
||||
},
|
||||
|
||||
rememberHistory: function () {
|
||||
return this.$store.getters.getRememberHistory
|
||||
},
|
||||
|
||||
saveWatchedProgress: function () {
|
||||
return this.$store.getters.getSaveWatchedProgress
|
||||
},
|
||||
|
||||
backendPreference: function () {
|
||||
return this.$store.getters.getBackendPreference
|
||||
},
|
||||
|
||||
backendFallback: function () {
|
||||
return this.$store.getters.getBackendFallback
|
||||
},
|
||||
|
||||
invidiousInstance: function () {
|
||||
return this.$store.getters.getInvidiousInstance
|
||||
},
|
||||
|
||||
proxyVideos: function () {
|
||||
return this.$store.getters.getProxyVideos
|
||||
},
|
||||
|
||||
defaultTheatreMode: function () {
|
||||
return this.$store.getters.getDefaultTheatreMode
|
||||
},
|
||||
|
||||
defaultVideoFormat: function () {
|
||||
return this.$store.getters.getDefaultVideoFormat
|
||||
},
|
||||
|
||||
forceLocalBackendForLegacy: function () {
|
||||
return this.$store.getters.getForceLocalBackendForLegacy
|
||||
},
|
||||
|
||||
thumbnailPreference: function () {
|
||||
return this.$store.getters.getThumbnailPreference
|
||||
},
|
||||
playNextVideo: function () {
|
||||
return this.$store.getters.getPlayNextVideo
|
||||
},
|
||||
|
||||
thumbnail: function () {
|
||||
let baseUrl
|
||||
|
@ -145,6 +136,7 @@ export default Vue.extend({
|
|||
},
|
||||
watch: {
|
||||
$route() {
|
||||
this.handleRouteChange()
|
||||
// react to route changes...
|
||||
this.videoId = this.$route.params.id
|
||||
|
||||
|
@ -586,6 +578,46 @@ export default Vue.extend({
|
|||
})
|
||||
}
|
||||
})
|
||||
} else if (this.playNextVideo) {
|
||||
const timeout = setTimeout(() => {
|
||||
const nextVideoId = this.recommendedVideos[0].videoId
|
||||
this.$router.push(
|
||||
{
|
||||
path: `/watch/${nextVideoId}`
|
||||
}
|
||||
)
|
||||
this.showToast({
|
||||
message: this.$t('Playing Next Video')
|
||||
})
|
||||
}, 5000)
|
||||
|
||||
this.showToast({
|
||||
message: this.$t('Playing next video in 5 seconds. Click to cancel'),
|
||||
time: 5500,
|
||||
action: () => {
|
||||
clearTimeout(timeout)
|
||||
this.showToast({
|
||||
message: this.$t('Canceled next video autoplay')
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
handleRouteChange: function () {
|
||||
if (this.rememberHistory && !this.isLoading && !this.isLive) {
|
||||
const player = this.$refs.videoPlayer.player
|
||||
|
||||
if (player !== null && this.saveWatchedProgress) {
|
||||
const currentTime = this.$refs.videoPlayer.player.currentTime()
|
||||
const payload = {
|
||||
videoId: this.videoId,
|
||||
watchProgress: currentTime
|
||||
}
|
||||
|
||||
console.log('update watch progress')
|
||||
this.updateWatchProgress(payload)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -739,21 +771,7 @@ export default Vue.extend({
|
|||
])
|
||||
},
|
||||
beforeRouteLeave: function (to, from, next) {
|
||||
if (this.rememberHistory && !this.isLoading && !this.isLive) {
|
||||
const player = this.$refs.videoPlayer.player
|
||||
|
||||
if (player !== null && this.saveWatchedProgress) {
|
||||
const currentTime = this.$refs.videoPlayer.player.currentTime()
|
||||
const payload = {
|
||||
videoId: this.videoId,
|
||||
watchProgress: currentTime
|
||||
}
|
||||
|
||||
console.log('update watch progress')
|
||||
this.updateWatchProgress(payload)
|
||||
}
|
||||
}
|
||||
|
||||
this.handleRouteChange()
|
||||
next()
|
||||
}
|
||||
})
|
||||
|
|
|
@ -80,6 +80,7 @@
|
|||
/>
|
||||
<watch-video-recommendations
|
||||
v-if="!isLoading"
|
||||
:watching-playlist="watchingPlaylist"
|
||||
:data="recommendedVideos"
|
||||
class="watchVideoSideBar watchVideoRecommendations"
|
||||
:class="{
|
||||
|
|
|
@ -338,6 +338,7 @@ Video:
|
|||
# Context is "X People Watching"
|
||||
Watching: Watching
|
||||
Watched: Watched
|
||||
Autoplay: Autoplay
|
||||
# As in a Live Video
|
||||
Live: Live
|
||||
Live Now: Live Now
|
||||
|
|
Loading…
Reference in New Issue