FreeTube/src/renderer/components/watch-video-comments/watch-video-comments.js

238 lines
7.0 KiB
JavaScript
Raw Normal View History

2020-02-16 19:30:00 +01:00
import Vue from 'vue'
2020-08-05 05:44:34 +02:00
import { mapActions } from 'vuex'
2020-02-16 19:30:00 +01:00
import FtCard from '../ft-card/ft-card.vue'
import FtLoader from '../../components/ft-loader/ft-loader.vue'
// import ytcs from 'yt-comment-scraper'
2020-02-16 19:30:00 +01:00
export default Vue.extend({
name: 'WatchVideoComments',
components: {
'ft-card': FtCard,
'ft-loader': FtLoader
},
props: {
id: {
type: String,
required: true
}
},
data: function () {
return {
isLoading: false,
showComments: false,
2020-02-16 19:30:00 +01:00
nextPageToken: null,
commentData: []
}
},
computed: {
backendPreference: function () {
return this.$store.getters.getBackendPreference
},
backendFallback: function () {
return this.$store.getters.getBackendFallback
},
invidiousInstance: function () {
return this.$store.getters.getInvidiousInstance
}
},
methods: {
getCommentData: function () {
this.isLoading = true
switch (this.backendPreference) {
case 'local':
this.getCommentDataLocal()
break
case 'invidious':
this.getCommentDataInvidious(this.nextPageToken)
break
}
},
getMoreComments: function () {
if (this.commentData.length === 0 || this.nextPageToken === null || typeof this.nextPageToken === 'undefined') {
this.showToast({
message: this.$t('Comments.There are no more comments for this video')
})
} else {
this.getCommentData()
}
},
2020-02-16 19:30:00 +01:00
getCommentReplies: function (index) {
switch (this.commentData[index].dataType) {
case 'local':
this.commentData[index].showReplies = !this.commentData[index].showReplies
break
case 'invidious':
if (this.commentData[index].showReplies || this.commentData[index].replies.length > 0) {
this.commentData[index].showReplies = !this.commentData[index].showReplies
} else {
this.getCommentRepliesInvidious(index)
}
break
}
},
getCommentDataLocal: function () {
2020-08-05 05:44:34 +02:00
console.log('Getting comment data please wait..')
this.showToast({
message: 'Comments through the local API are temporarily disabled'
})
if (this.backendFallback && this.backendPreference === 'local') {
2020-08-05 05:44:34 +02:00
this.showToast({
message: this.$t('Falling back to Invidious API')
2020-08-05 05:44:34 +02:00
})
this.getCommentDataInvidious()
} else {
this.isLoading = false
}
// ytcs.scrape_next_page_youtube_comments(this.id).then((response) => {
// console.log(response)
// const commentData = response.comments.map((comment) => {
// comment.showReplies = false
// comment.dataType = 'local'
//
// return comment
// })
// console.log(commentData)
// this.commentData = this.commentData.concat(commentData)
// this.isLoading = false
// this.showComments = true
// }).catch((err) => {
// console.log(err)
// const errorMessage = this.$t('Local API Error (Click to copy)')
// this.showToast({
// message: `${errorMessage}: ${err}`,
// time: 10000,
// action: () => {
// navigator.clipboard.writeText(err)
// }
// })
// if (this.backendFallback && this.backendPreference === 'local') {
// this.showToast({
// message: this.$t('Falling back to Invidious API')
// })
// this.getCommentDataInvidious()
// } else {
// this.isLoading = false
// }
// })
2020-02-16 19:30:00 +01:00
},
getCommentDataInvidious: function () {
const payload = {
resource: 'comments',
id: this.id,
params: {
continuation: this.nextPageToken
}
}
this.invidiousAPICall(payload).then((response) => {
2020-02-16 19:30:00 +01:00
console.log(response)
const commentData = response.comments.map((comment) => {
comment.showReplies = false
comment.authorThumb = comment.authorThumbnails[1].url
comment.likes = comment.likeCount
comment.text = comment.content
comment.date = comment.publishedText
comment.dataType = 'invidious'
if (typeof (comment.replies) !== 'undefined' && typeof (comment.replies.replyCount) !== 'undefined') {
comment.numReplies = comment.replies.replyCount
comment.replyContinuation = comment.replies.continuation
} else {
comment.numReplies = 0
comment.replyContinuation = ''
}
comment.replies = []
return comment
})
console.log(commentData)
this.commentData = this.commentData.concat(commentData)
this.nextPageToken = response.continuation
this.isLoading = false
this.showComments = true
2020-02-16 19:30:00 +01:00
}).catch((xhr) => {
console.log('found an error')
console.log(xhr)
const errorMessage = this.$t('Invidious API Error (Click to copy)')
this.showToast({
message: `${errorMessage}: ${xhr.responseText}`,
time: 10000,
action: () => {
navigator.clipboard.writeText(xhr.responseText)
}
})
2020-02-16 19:30:00 +01:00
if (this.backendFallback && this.backendPreference === 'invidious') {
this.showToast({
message: this.$t('Falling back to local API')
})
2020-02-16 19:30:00 +01:00
this.getCommentDataLocal()
} else {
this.isLoading = false
}
})
},
getCommentRepliesInvidious: function (index) {
this.showToast({
message: this.$t('Comments.Getting comment replies, please wait')
})
2020-02-16 19:30:00 +01:00
const payload = {
resource: 'comments',
id: this.id,
params: {
continuation: this.commentData[index].replyContinuation
}
}
this.$store.dispatch('invidiousAPICall', payload).then((response) => {
console.log(response)
const commentData = response.comments.map((comment) => {
comment.showReplies = false
comment.authorThumb = comment.authorThumbnails[1].url
comment.likes = comment.likeCount
comment.text = comment.content
comment.date = comment.publishedText
comment.dataType = 'invidious'
comment.numReplies = 0
comment.replyContinuation = ''
comment.replies = []
return comment
})
console.log(commentData)
this.commentData[index].replies = commentData
this.commentData[index].showReplies = true
this.isLoading = false
}).catch((xhr) => {
console.log('found an error')
console.log(xhr)
const errorMessage = this.$t('Invidious API Error (Click to copy)')
this.showToast({
message: `${errorMessage}: ${xhr.responseText}`,
time: 10000,
action: () => {
navigator.clipboard.writeText(xhr.responseText)
}
})
2020-02-16 19:30:00 +01:00
this.isLoading = false
})
2020-08-05 05:44:34 +02:00
},
...mapActions([
'showToast',
'invidiousAPICall'
2020-08-05 05:44:34 +02:00
])
2020-02-16 19:30:00 +01:00
}
})