2.16测试版


是不是像这种 长时间 没有 100% 做种的 就没有必要在下载了吧。

看健康度最准,比如种子用户进度显示20%也是有可能成功下载的,因为每个人分布有不同的区块数据,大家组合起来就能100%

如果健康度 非常低 或者是0的情况是不是 就没有必要 下载了 进度已经卡 好多天了。

一直挂着一个月,万一遇到个有人用迅雷离线下载后补种的人,说不定救活了

都用迅雷了,还会补种嘛 :joy:

反馈两个 docker webui版本的问题
1、两个docker无法共享使用同一个文件做源。
2、无法长时间做种,总会自动停止。
3、重启docker会有概率TCP无端口,导致端口阻塞。

Task auto-stop condition reached: share ratio(42969%>=200%), seed num(10>=10), seeding time(92415s>=86400s)
根据三个做种规则自动停止任务改成false关闭,这样就不会自动停止上传任务了

<ConditionAutoStopTask>false</ConditionAutoStopTask>

这是在哪配置?docker webui版本没有高级选项,直接添加到 docker 里的 BitComet.xml 吗?

配置文件和下载的文件存储在路径
/opt/1panel/docker/compose/bitcomet-webui/BitComet
/opt/1panel/docker/compose/bitcomet-webui/Downloads

注:如果要修改配置文件请先停止容器,修改完成后在启动,这样才能修改成功
BitComet.xml 推荐设置

多谢多谢!

我没测试过,理论上如果做种文件可以被docker同时映射到两个容器,那就可以同时做种,但两个容器的配置文件目录需要独立,避免写入冲突。

感谢反馈,新版webui已加入BT任务自动停止做种的相关设置页面

之前也遇到过,启动时偶尔会出现监听端口无法成功打开的错误,重启程序能解决,具体原因还没分析出来

Beta5 已发布,欢迎试用

2個讚

官网似乎还没发2.15 版本

磁力下載點:magnet:?xt=urn:btih:4HYNKUV3NXE6OOFFUN43T5YQNE2WYIJK
BitComet 2.16 Beta5 version.

1個讚

两个docker映射同一个下载文件夹,配置文件是独立目录(一共三个文件夹),这两个步骤都没问题。
接下来,第一个docker,如果下载文件夹中本身没有文件,就跟预期一样从0%开始下载直到100%。
如果已存在文件,不管是添加种子还是磁链,都会直接跳过已存在的文件,又生成了一个带数字编号的文件,重新开始下载。
于是,只要第一个docker中存在了文件A,那么根据上面的逻辑,第二个docker无论如何都不可能再使用到文件A,最终是 文件A(1)。

有另一个新问题,如果公网IP发生变更,有时候会自动检测更新,有时候不会,没更新的就一直处于0速状态,得手动检测一下才能恢复。

伟大的人儿 给你点赞

docker会更新么

反馈一个小问题,一直存在的, 就是 浏览器集成插件之后,下载没办法像其他下载工具那般 第一时间接管下载。只会下载后右下角提示, 能不能 改成直接下载。

目前可以尝试右键下载链接 选择使用比特彗星下载

这个应该和彗星浏览器扩展识别下载的方式有关
而彗星的扩展似乎无法捕获那些以js脚本驱动的下载


也许彗星可以参考一下 xdown的浏览器扩展 @wxhere15
这个xdown 本质是给旧版的qb中加上了https下载功能

但重要的是他也依靠浏览器扩展来捕获下载的
而且效果看起来更好 其似乎是通过拦截浏览器下载来实现的
即浏览器内置下载 解析出任务后 对齐进行拦截并转发主程序进行下载

xdown

xdonw浏览器扩展

xdown_worker.js


self.importScripts('cookie_manager.js');
self.importScripts('native_host_manager.js');
self.importScripts('xdown_extension.js');
self.importScripts('xdown_context.js');

var xdownExt = new XDownExtension;
xdownExt.initialize();

function checkIsDownloadFile(d) {
  var file = true;
  let mime = d.mime || '';
  if (mime) {
      var cType = mime.toLowerCase();
      if (cType.indexOf("json") != -1 || cType.indexOf("image/") != -1 ||
         (cType.indexOf("text") != -1 && cType.indexOf("text/x-sql") == -1) ||
          cType.indexOf("javascript") != -1 ||
          cType.indexOf("application/x-protobuf") != -1 ||
          cType.indexOf("application/binary") != -1 ||
          cType.indexOf("application/pdf") != -1 ||
          cType.indexOf("application/x-bittorrent") != -1) {
          file = false;
      }
      else if (cType.indexOf("application") != -1) {
          file = true;
      }
  }

  if (d.fileSize >= 0) {
      // int64 too long 
      var iLength = parseInt(d.fileSize);
      if (iLength < 2 * 1024 * 1024) {
          file = false;
      }
  }
  return file;
}

const usedXDown = d => new Promise((resolve, reject) => {
  let downList = [];
  if(!checkIsDownloadFile(d)) {
    return resolve({id: d.id, result: 0});
  }
  let url = d.finalUrl || d.url;
  var cManager = new CookieManager;
  cManager.getCookiesForUrl(
      url,
      function (cookies) {
        let cur_length = d.totalBytes || 0;
        let file_name = d.filename || '';
        if(typeof(file_name) != 'undefined' && file_name.length < 1) {
          var curUrl = url;
          var iPosVal = curUrl.indexOf("?");
          if(iPosVal > 1) {
              curUrl = curUrl.substring(0,iPosVal);
          }
          iPosVal = curUrl.indexOf("#");
          if(iPosVal > 1) {
              curUrl = curUrl.substring(0,iPosVal);
          }
          iPosVal = curUrl.lastIndexOf('/');
          if(iPosVal > 10) {
              file_name = curUrl.substring(iPosVal + 1);
          }
        }
        var downItem = {
          'httpReferer': d.referrer,
          'url': url,
          'originalUrl': url,
          'userAgent': navigator.userAgent,
          'httpCookies': cookies || '',
          'httpContentType': d.mime || '',
          'httpContentLength': cur_length.toString(),
          'httpFileName': file_name || '',
        };
        downList.push(downItem);
        let cur_id = d.id || 1;
        let downTask = {
          'id': cur_id.toString(),
          'type': 'create_downloads',
          'create_downloads': {
            'downloads':downList,
          }
        }
        setTimeout(resolve, 10000);
        xdownExt.postMessage(downTask, res => {
          if (!res) {
            return reject(Error('empty response'));
          }
          resolve(res);
        });
      }
  );
});


const transfer = async d => {
  try {
    await usedXDown(d);
    if (d.id) {
      chrome.downloads.erase({
        id: d.id
      });
    }
  }
  catch (e) {
    console.log('error:',e);
  }
};

const onDeterminingFilename = (item, suggest) => {
  usedXDown(item).then(res => {
    let is_intercept = false;
    if(res && res.id) {
      if( typeof(res.result) != 'undefined' && res.result === 1) {
        is_intercept = true;
      }
    }
    if(is_intercept) {
      try{
        chrome.downloads.cancel(item.id), function(){
          console.log('cancel:',item.id);
        }
      } 
      catch (e) {
        console.log('error:',e);
      }
    } else {
      suggest({filename: item.filename, conflictAction: 'uniquify'});
    }
  },err =>{
    suggest({filename: item.filename, conflictAction: 'uniquify'});
  });
  return true;
}

chrome.downloads.onDeterminingFilename.addListener(onDeterminingFilename);


chrome.runtime.onMessage.addListener((request, sender, response) => {
  if(request && request.type) {
      if(request.type === 'SHOW-XDOWN-SETTING') {
      var settingMsg = {
        'id': "1",
        'type': 'show_settings'
      };
      xdownExt.postMessage(settingMsg, res => {
        if(!res) {
          console.log('[error] start xdown failed....');
          return;
        }
        response(res);
      });
    }
    else if(request.type == 'ADD-XDOWN-EVENT') {
      xdownExt.postMessage(request, res => {
        console.log('ADD-XDOWN-EVENT: ', res);
        response(res);
      });
    }
    return true;
  }
  return false;
});