Imgur 集成(imgur 段)

基本信息

属性 值
配置段名 imgur
依赖 Imgur 应用 Client-ID、Gallery/Album ID
离线模式 系统属性 -Dbls.offlineMode=true 启用

配置项

useImgur

  • 类型:Boolean
  • 默认:false
  • 作用:开启后从指定 Imgur gallery 拉取图片作为随机背景。

imgurAppClientId

  • 类型:String
  • 默认:""(空)
  • 作用:你自己的 Imgur 应用的 Client-ID,作为 Authorization: Client-ID <id> HTTP 头。
  • 必须:需要到 imgur.com 注册一个应用获得。

imgurGalleryId

  • 类型:String
  • 默认:""(空)
  • 作用:要 Gallery 或 Album 的 ID(Ks0TrYE 这种)。
  • 来源:从 <https://imgur.com/a/<id> 或 <https://imgur.com/gallery/<id> 提取。

imgurRequestTimeout

  • 类型:int
  • 默认:5000
  • 范围:[100, Integer.MAX_VALUE] ms
  • 作用:连接 / 读取超时。

运行行为

启动流程(MinecraftDisplayer.open 末尾)

  1. randomBackgrounds && !salt 时才执行;
  2. 实例化 ImgurCacheManager;
  3. 调 setupImgurGallery(resourceLocation -> { … }):
    • 第一次回调 → 直接覆盖 background(避免要等定时切换才看见新图);
    • 每次回调都把 ResourceLocation 字符串路径 add 到 imgurBackgrounds;
    • randomBackgroundArray = imgurBackgrounds.toArray(new String[0]);
    • 配合 changing background 段进行定时切换。

ImgurClient(HTTP 客户端)

  • 自定义 CloseableHttpClient:只设 Authorization 头与超时(连接/连接请求/socket 都用 requestTimeout)。
  • fetchGalleryImageIDs(galleryId, ignoreAds=true):GET https://api.imgur.com/3/album/<id>,解析 data.images,返回过滤后的 id 列表。
  • fetchImage(imageId):GET https://i.imgur.com/<id>.png(注意:imgur 允许把 jpg 当 png 请求,返回仍是 jpg)。

ImgurCacheManager(缓存)

  • 磁盘缓存目录:bls-imgur-cache/<imageID>.png。
  • 同步发布:每拿到一张图就通过回调 textureLocationConsumer.accept(new ResourceLocation(IMGUR_CACHE_DIR, imageID)) 让 MinecraftDisplayer 注册新背景。
  • 启动时优先本地:先扫缓存目录里所有 PNG 的 imageID,按线程局部随机起点循环(ThreadLocalRandom.current().nextInt),firstOnly=true 时读完第一张就退出(让启动时图尽早出现);后续 gallery 流程拉到新图时再补。
  • 失效图清理:gallery 流程结束后,对比当前 cachedImageIDs(不在 gallery 中的项),Files.deleteIfExists(...) 删除。

离线模式

OFFLINE_MODE = Boolean.getBoolean("bls.offlineMode"):

  • OFFLINE_MODE=true → 跳过 ImgurClient,仅扫描磁盘缓存(并发)。
  • 用法:开发/无网环境启动参数加 -Dbls.offlineMode=true。

数值

字段 默认
useImgur false
imgurAppClientId ""
imgurGalleryId ""
imgurRequestTimeout 5000 ms

相关条目