2.00测试版

欢迎下载测试版,尝试新功能。请大家多提反馈意见,感谢各位支持~

v2.00 正式版预览 20230515
核心修正:修复Windows XP下无法启动的问题

https://download.bitcomet.com/achive/BitComet_2.00_setup.exe
https://download.bitcomet.com/achive/BitComet_2.00.zip

v2.00.0 macOS版

https://download.bitcomet.com/mac/BitComet_2.00.0.dmg

v2.00 Beta3 [20230509]
界面改进:点击左下角通行证页面订阅标签后显示介绍窗口
界面改进:点击左下角通行证页面支持标签后显示选项窗口支持页面
界面改进:深色模式下不显示列表网格线
界面改进:改进深色模式下窗格分割条颜色

v2.00 Beta2 [20230504]
界面改进:DPI缩放大于100%时均加载x2高分图片
界面改进:制作torrent时支持64MB分块大小
界面改进:命令行参数制作种子文件时可指定分块大小
界面改进:命令行参数静默模式制作种子文件时,使用默认tracker选项
界面修正:在没有任何任务的情况下状态栏依然会显示准备长效做种
界面修正:远程下载网页界面统计信息里的磁盘写入统计显示有误
核心改进:支持 FUSE-rclone 分区

v2.00 Beta1 [20230428]
界面改进:剪贴板监视功能支持Infohash字符串识别
界面改进:监视剪贴板里的链接时,忽略格式不正确的磁链
界面改进:同一账号在线设备数量达到上限时显示提示
界面改进:新的高级设置项 network.enable_open_dns
界面改进:选项窗口RSS页面里,RSS列表删除按钮替换为添加按钮
界面改进:选项窗口RSS页面里,双击RSS列表打开编辑窗口
界面修正:RSS边栏恢复无边框显示样式
核心改进:种子市场交换磁链时增加来自他人共享的内容
核心修正:只选择部分文件下载的任务,在移动已下载文件时会报错

5個讚

【核心改进:种子市场交换磁链时增加来自他人共享的内容】,想问一下,现在改进后的机制里,每一次交换磁链,我的共享和他人共享分别占多少呀

他人共享最多50%

好的,谢谢回答,这个更新期待很久了:+1:

rclone挂载磁盘不兼容的问题修了吗

image

beta2支持了


顺便把这个webgui简单的界面问题修了吧 1.97版本的帖子上就反馈了,,,

network.enable_open_dns是什么功能?

这个选项的功能主要是修复Windows11下hosts不起效果

黑暗模式不改进下么 是真的太丑了 线条也很刺眼

建议为设置界面添加滚动条以适应低分辨率屏幕或较低的窗口高度


可以参考qb在内容可以完全显示的情况下不展示滚动条 有遮挡时显示滚动条


感谢提醒,beta2已修复

如果windows默认的dns查询得到的ip是loopback地址,彗星会再次向OpenDNS查询,以避免DNS污染。但如果用户手动修改hosts文件设置指定域名为loopback地址,win11下的API会被忽略。为应对这种特殊情况下的个别需求,添加了这个高级选项,一般用户用不着去修改。

现有的UI框架下很难精确控制深色模式的显示效果。下载任务列表里的线条可以点击主菜单 - 查看 - 任务列表 - 显示网格线 关闭。

感谢建议

在高分辨率和高缩放下软件内的部分图标似乎存在显示问题

部分图标显示大小不正确 如底部状态栏图标

有一个问题就是我这里的opendns的ip被封了,我的win10上设置了Adguard Home,但是dns查询错误特别多,似乎是软件支持方面有问题?我的比特彗星使用环境也是win10,同一台电脑开的这2个软件,adgu上设置的无污染doh,

国内确实封了opendns的,我这里用这个dns也是被封的,这个功能主要对国外用户有用吧,国内用不上反而可以关掉,或者应当改为doh去双重查询,例子使用cf作为反代服务器解决谷歌doh国内被封问题

https://diii.tk/https://dns.google/resolve?ct=application/dns-json&name=www.baidu.com.&type=A&edns_client_subnet=0.0.0.0/0

cf workers反代代码 已经设置代码框可以复制使用了

addEventListener('fetch', event => {
    event.passThroughOnException()
  
    event.respondWith(handleRequest(event))
  })
  
  /**
  * Respond to the request
  * @param {Request} request
  */
  async function handleRequest(event) {
    const { request } = event;
  
    //请求头部、返回对象
    let reqHeaders = new Headers(request.headers),
        outBody, outStatus = 200, outStatusText = 'OK', outCt = null, outHeaders = new Headers({
            "Access-Control-Allow-Origin": reqHeaders.get('Origin'),
            "Access-Control-Allow-Methods": "GET, POST, PUT, PATCH, DELETE, OPTIONS",
            "Access-Control-Allow-Headers": reqHeaders.get('Access-Control-Allow-Headers') || "Accept, Authorization, Cache-Control, Content-Type, DNT, If-Modified-Since, Keep-Alive, Origin, User-Agent, X-Requested-With, Token, x-access-token, Notion-Version"
        });
  
    try {
        //取域名第一个斜杠后的所有信息为代理链接
        let url = request.url.substr(8);
        url = decodeURIComponent(url.substr(url.indexOf('/') + 1));
  
        //需要忽略的代理
        if (request.method == "OPTIONS" && reqHeaders.has('access-control-request-headers')) {
            //输出提示
            return new Response(null, PREFLIGHT_INIT)
        }
        else if(url.length < 3 || url.indexOf('.') == -1 || url == "favicon.ico" || url == "robots.txt") {
            return Response.redirect('https://baidu.com', 301)
        }
        //阻断
        else if (blocker.check(url)) {
            return Response.redirect('https://baidu.com', 301)
        }
        else {
            //补上前缀 http://
            url = url.replace(/https:(\/)*/,'https://').replace(/http:(\/)*/, 'http://')
            if (url.indexOf("://") == -1) {
                url = "http://" + url;
            }
            //构建 fetch 参数
            let fp = {
                method: request.method,
                headers: {}
            }
  
            //保留头部其它信息
            let he = reqHeaders.entries();
            for (let h of he) {
                if (!['content-length'].includes(h[0])) {
                    fp.headers[h[0]] = h[1];
                }
            }
            // 是否带 body
            if (["POST", "PUT", "PATCH", "DELETE"].indexOf(request.method) >= 0) {
                const ct = (reqHeaders.get('content-type') || "").toLowerCase();
                if (ct.includes('application/json')) {
                      let requestJSON = await request.json()
                      console.log(typeof requestJSON)
                    fp.body = JSON.stringify(requestJSON);
                } else if (ct.includes('application/text') || ct.includes('text/html')) {
                    fp.body = await request.text();
                } else if (ct.includes('form')) {
                    fp.body = await request.formData();
                } else {
                    fp.body = await request.blob();
                }
            }
            // 发起 fetch
            let fr = (await fetch(url, fp));
            outCt = fr.headers.get('content-type');
            if(outCt && (outCt.includes('application/text') || outCt.includes('text/html'))) {
              try {
                // 添加base
                let newFr = new HTMLRewriter()
                .on("head", {
                  element(element) {
                    element.prepend(`<base href="${url}" />`, {
                      html: true
                    })
                  },
                })
                .transform(fr)
                fr = newFr
              } catch(e) {
              }
            }

            for (const [key, value] of fr.headers.entries()) {
              outHeaders.set(key, value);
            }

            outStatus = fr.status;
            outStatusText = fr.statusText;
            outBody = fr.body;
        }
    } catch (err) {
        outCt = "application/json";
        outBody = JSON.stringify({
            code: -1,
            msg: JSON.stringify(err.stack) || err
        });
    }
  
    //设置类型
    if (outCt && outCt != "") {
        outHeaders.set("content-type", outCt);
    }
  
    let response = new Response(outBody, {
        status: outStatus,
        statusText: outStatusText,
        headers: outHeaders
    })
  
    return response;
  
    // return new Response('OK', { status: 200 })
  }
  
  /**
  * 阻断器
  */
  const blocker = {
    keys: [".m3u8", ".ts", ".acc", ".m4s", "photocall.tv", "googlevideo.com"],
    check: function (url) {
        url = url.toLowerCase();
        let len = blocker.keys.filter(x => url.includes(x)).length;
        return len != 0;
    }
  }

我的无污染DOH是正常的,但是电脑用了mosdns或者Adguard Home这种DNS软件之后,比特彗星的DNS查询会报错

是指统计中的DNS故障吗?

如果是的话 可以将报错的域名复制出来
使用其他工具进行查询
以确定其是否存在有效记录

若有记录则为BC的问题
若无记录则为域名本身的问题

bitcomet不支持稀疏檔案吧?

所以取消下載前分配磁碟空間不起作用


这样算有记录吗?
报错的tracker日志是
2023-04-29 18:40:36 UDP Tracker DNS resolve failed.
image