gaogaotiantian / biliscope

Bilibili chrome extension to show uploader's stats
MIT License
575 stars 45 forks source link

[FR] 悬停在视频上显示当前视频的视频AI总结 #106

Closed F-park closed 8 months ago

F-park commented 9 months ago

新需求背景

B站web端增加了获取AI总结内容(测试版),感觉可以加入至 biliscope 中。

新功能操作方式

悬停在视频上按下某个键将显示当前视频的视频AI总结(固定显示在标题下方)

实现难度

可能需要一个新的卡片UI用来专门显示

gaogaotiantian commented 9 months ago

不要总想一些奇怪的互动方式……尽量少增加新的操作。现在的卡片是悬停在用户名上的,这个feature如果出现只需要悬停在视频上就好了。

但是更重要的是,现在有多少视频支持这个功能。

F-park commented 9 months ago

不要总想一些奇怪的互动方式……尽量少增加新的操作。现在的卡片是悬停在用户名上的,这个feature如果出现只需要悬停在视频上就好了。

但是更重要的是,现在有多少视频支持这个功能。

确实不应该增加新的操作,但悬停在视频上就显示 “视频AI总结” 会导致很容易误触吧(视频封面占据的区域还挺大的,可能会导致 api 访问太过频繁),我觉得还是需要一个按键来触发。(但不应该是鼠标中键,我试了一下按下这个键会在新标签页打开这个视频)


我看了一下我 web 端主页推荐的视频,好几个几千播放的视频都有视频AI总结(有人声音频就会产生AI总结),具体有多少视频支持要交给 python 脚本来验证。


偷了一下懒,直接写到了 biliscope 里调试。 先说下结果,在我的推荐里,10个有6个以上是有视频AI总结的,看起来是可以增加这个功能的。

async function biliWbiGet(url, params, retry = 5) {
    // 强制使用Wbi签名
    const origUrl = url;

    if (biliMixin === null) {
        biliMixin = await getBiliMixin();
    }

    // convert params to url in a sorted order
    params["wts"] = Math.floor(Date.now() / 1000);
    let keys = Object.keys(params).sort();
    let paramsStr = keys.map((key) => `${key}=${params[key]}`).join("&");
    let sign = md5(paramsStr + biliMixin);
    url = `${url}?${paramsStr}&w_rid=${sign}`;

    return fetch(url, {"credentials": "include", "mode": "cors"})
        .then((response) => response.json())
        .then((data) => {
            if (data['code'] == -403) {
                biliMixin = null;
            }
            if (data['code'] == -799 && retry > 0) {
                return new Promise(resolve => setTimeout(resolve, 1000))
                    .then(() => biliGet(origUrl, params, retry - 1));
            }
            return data;
        });
}
const sleep = (timeout) => {
    return new Promise((func)=>{
        setTimeout(func, timeout)
    })
}
async function get_ai_sum(){
    // 获取主页推荐,默认获取10个视频
    let data = await biliGet('https://api.bilibili.com/x/web-interface/index/top/rcmd', {})
    console.log('推荐视频的数量:' + data.data.item.length);
    for (let video of data.data.item) {
        let bvid = video.bvid;
        let cid = video.cid;
        let mid = video.owner.mid;
        console.log(video.title, video.bvid)
        // 判断是否可以AI视频总结
        biliWbiGet(`https://api.bilibili.com/x/web-interface/view/conclusion/judge`, {bvid: bvid, cid: cid, up_mid: mid})
        .then(data => { 
            // 0 不能总结,1 可以总结
            console.log(data.data.judge);
        })
        // 强制等待200ms
        await sleep(200);
    }
}

get_ai_sum();
gaogaotiantian commented 9 months ago

悬停在视频上显示总结和悬停在up主名字上显示卡片是一样的啊,由于debounce的存在,鼠标不是经过视频就会触发这个卡片,需要在上面停留一定的时间才会触发,现在卡片也是这样的,你的鼠标滑过up主名字的时候什么都不会发生。

F-park commented 9 months ago

悬停在视频上显示总结和悬停在up主名字上显示卡片是一样的啊,由于debounce的存在,鼠标不是经过视频就会触发这个卡片,需要在上面停留一定的时间才会触发,现在卡片也是这样的,你的鼠标滑过up主名字的时候什么都不会发生。

如果有一定响应延迟的话那看起来可以增加这个特性,应该能很好的提升用户体验。


看了一下,显示卡片现在是 300ms 的延迟触发,悬停在视频上估计得做 1s 的延迟触发。