我正在制作一个音乐应用程序,如何更新/计算播放



我正在制作一个音乐应用程序,我想在每次用户播放歌曲30秒时更新播放,但我无法为它创建逻辑。我试着这样做:

let current_final;
let current_inital;

this.audio.addEventListener("play", (e)=>{
current_inital = this.audio.currentTime
})
this.audio.addEventListener("pause", (e)=>{
current_final = this.audio.currentTime
this.updateViews(current_inital, current_final)
})
this.audio.addEventListener("ended", (e)=>{
current_final = this.audio.currentTime
this.updateViews(current_inital, current_final)
})


updateViews(initialTime, finalTime)
{
const url = "/api/music/views/update"
const data = 
{
info:{
initialTime: initialTime,
finalTime: finalTime,
},
track: this.song
}
this.postData(url, data)
}

每次用户播放歌曲时,初始时间被记录,每次用户暂停歌曲时,最终时间被记录并发送到我的服务器,

我的服务器:

function update_views(track, info)
{
const intialTime = info.initialTime;
const finalTime = info.finalTime;
if(finalTime - intialTime > 30){
const current_views = track.stats.views;
const updated_views = current_views+1;
db.ref("users/"+track.info.userID+"/public/songs/"+track.info.songID+"/stats").update({
views: updated_views
})
}
}   

router.post("/update", (req, res)=>{
const track = req.body.track;
const info = req.body.info;
update_views(track, info)
res.end("success")
})

函数检查初始时间和最终时间的差值是否大于30秒,如果大于30秒,则更新1个视图。

我试过这样做,但我不认为这是一个好方法。我认为用户会滥用这个。

On "play"事件">setTimeout";为30秒或30秒-当前时间,所以如果视频是在17秒当前,我们将发送调用">updateViews"函数在13秒后(30 - 17 = 13),只要确保你正在处理用户在30秒之前跳过歌曲或歌曲已经结束的情况,你可以使用">clearartimeout"。我还没有测试过代码,所以记住它,我只是给你一种解决问题的方法,当然我猜你必须深入挖掘。所以,如果你需要一个工作和测试的解决方案,只是写一个评论,所以我可以删除它!

let current_final;
let current_inital;
let callApiWithDelay;
let areViewsUpdated = false;
this.audio.addEventListener("play", (e)=>{
current_inital = this.audio.currentTime
if(!areViewsUpdated) {
callApiWithDelay = setTimeout(() => {
updateViews(current_inital, this.audio.currentTime)
areViewsUpdated = true;
}, 30000 - this.audio.currentTime)
}
})
this.audio.addEventListener("pause", (e)=>{
current_final = this.audio.currentTime
this.updateViews(current_inital, current_final)
clearTimeout(callApiWithDelay)
})
this.audio.addEventListener("ended", (e)=>{
current_final = this.audio.currentTime
this.updateViews(current_inital, current_final)
clearTimeout(callApiWithDelay)
})

最新更新