Skip to content

AliceJump/DanbooruViewer

Repository files navigation

Danbooru Viewer

一个功能丰富的 Flutter 应用,用于浏览和管理来自 Danbooru 图像服务的图片和视频内容。

功能特性

核心功能

  • 🔍 搜索功能:支持多标签搜索,直接与 Danbooru API 集成
  • 📱 响应式网格视图:3 列网格展示,自动加载缩略图
  • 🎞️ 详细页面查看:支持滑动浏览多张图片/视频
  • 🎬 视频支持:自动识别并播放视频内容,加载失败时回退到预览图
  • 📥 批量下载:支持多选图片批量下载到本地相册
  • 📋 链接复制:快速复制选中图片的原图链接

筛选与搜索

  • 内容等级筛选:支持 4 个等级的内容筛选
    • 全年龄 (R-0)
    • 轻度提示 (R-12)
    • 青少年警告 (R-15)
    • 成人限制 (R-18)
  • 动态搜索:输入标签时自动过滤,支持空搜索展示所有内容
  • 下拉刷新:支持下拉刷新以重新加载当前搜索结果

高级交互

  • 多选模式:长按图片进入多选模式
    • 点击图片切换选择状态
    • 返回按钮智能处理:当在多选状态下,首先退出多选而非直接返回
  • 全屏浏览:点击图片进入全屏查看模式
    • 支持放大缩小(使用 photo_view)
    • 视频内容可在全屏模式播放/暂停

媒体处理

  • 自适应加载:优先加载高分辨率图片,加载失败自动回退到预览图
  • 视频处理
    • 自动识别视频格式
    • 支持在详细页面和全屏页面播放
    • 点击可控制播放/暂停
  • 图片保存:支持长按保存当前图片到本地相册
  • 链接管理:可打开原始来源链接(如果可用)

标签系统

  • 分类标签:展示图片的各类标签
    • 作者标签
    • 版权标签
    • 角色标签
    • 通用标签
  • 快速搜索:点击任何标签可直接搜索相关内容

技术栈

框架与语言

  • Flutter:跨平台 UI 框架 (3.10.7+)
  • Dart:编程语言

核心依赖

包名 版本 用途
http ^1.2.1 HTTP 请求,API 调用
dio ^5.4.3 高级 HTTP 客户端,文件下载
video_player ^2.7.0 视频播放支持
photo_view ^0.15.0 图片缩放浏览
gal ^2.1.1 相册/图库访问
path_provider ^2.1.3 文件路径管理
url_launcher ^6.3.0 链接打开

项目结构

lib/
├── main.dart                    # 应用入口,主页面(搜索&网格视图)
├── post_detail_page.dart        # 详细页面(PageView 浏览)
├── full_screen_image_page.dart  # 全屏浏览页面
└── reusable_image_view.dart     # 可复用图片视图组件

主要类与模型

Post 类

表示单个图片/视频内容的数据模型:

class Post {
  final int id;                      // 内容 ID
  final String rating;               // 内容等级
  final String tagString;            // 标签字符串
  final String? fileUrl;             // 原图链接
  final String? largeFileUrl;        // 大图链接
  final String? previewFileUrl;      // 预览图链接
  final String? tag_string_*;        // 分类标签
  final String? source;              // 原始来源链接
}

_MyHomePageState 类

主页面状态管理:

  • 搜索和筛选逻辑
  • 列表加载和分页
  • 多选模式管理
  • API 请求处理

_PostDetailPageState 类

详细页面状态管理:

  • 高分辨率图片/视频缓存
  • PageView 翻页管理
  • 视频控制器生命周期管理

_FullScreenImagePageState 类

全屏页面状态管理:

  • 图片/视频智能加载(优先尝试图片,失败时尝试视频)
  • 播放控制

API 集成

Danbooru API 端点

https://danbooru.donmai.us/posts.json

请求参数

  • tags:搜索标签(支持 space 分隔和 rating: 前缀)
  • limit:每页加载数量(设为 100)
  • page:页码(从 1 开始)

示例查询

# 搜索特定标签且等级为全年龄的内容
https://danbooru.donmai.us/posts.json?tags=tag1+tag2+rating:g&limit=100&page=1

# 空搜索(显示所有内容)
https://danbooru.donmai.us/posts.json?tags=&limit=100&page=1

使用指南

安装与运行

前置需求

  • Flutter SDK (3.10.7+)
  • Dart SDK
  • Android Studio / Xcode(用于模拟器/设备)
  • 网络连接(访问 Danbooru API)

步骤

  1. 克隆项目
  2. 运行依赖安装:
    flutter pub get
  3. 选择目标设备/模拟器:
    flutter devices
  4. 运行应用:
    flutter run

基本操作

搜索内容

  1. 在搜索框输入标签(例:character_nameartist_name
  2. 点击搜索图标或按 Enter 键
  3. 应用启动时自动加载一次空搜索

筛选内容

  1. 点击下方的内容等级筛选按钮(R-0、R-12、R-15、R-18)
  2. 选中的筛选条件会自动应用到搜索
  3. 修改筛选条件时自动重新搜索

查看详细信息

  1. 点击网格中的图片进入详细页面
  2. 在详细页面可左右滑动浏览其他图片
  3. 点击图片可进入全屏查看模式
  4. 长按图片可保存到本地相册

多选与批量操作

  1. 长按任何图片进入多选模式
  2. 继续点击图片切换选择状态
  3. 顶部显示已选择数量
  4. 使用操作按钮:
    • 📥 下载:将选中的图片保存到相册
    • 🔗 链接:复制所有选中图片的原图链接
  5. 按返回键时首先退出多选模式(而非直接返回应用)

下拉刷新

  1. 在网格视图界面向下拉动
  2. 释放时自动重新加载当前搜索结果

视频播放

  1. 如果内容是视频格式,会自动在详细页面和全屏页面识别
  2. 点击视频区域可播放/暂停
  3. 加载失败时自动显示预览图

界面与用户体验

主界面布局

┌─────────────────────────────┐
│  AppBar: Danbooru Viewer    │
├─────────────────────────────┤
│ [搜索框..................] 🔍  │
├─────────────────────────────┤
│ ◉全年龄 ◯轻度提示 ◯警告 ◯成人 │
├─────────────────────────────┤
│  ┌─────┬─────┬─────┐        │
│  │ IMG │ IMG │ IMG │        │
│  ├─────┼─────┼─────┤        │
│  │ IMG │ IMG │ IMG │        │
│  ├─────┼─────┼─────┤        │
│  │ IMG │ IMG │ IMG │        │
│  └─────┴─────┴─────┘        │
│      ⭘ 加载中 (3 列网格)      │
└─────────────────────────────┘

详细页面布局

┌─────────────────────────────┐
│ ◀ Post #12345               │
├─────────────────────────────┤
│                             │
│       [大图预览区域]         │
│    (可左右滑动浏览)         │
│     (点击进入全屏模式)      │
│                             │
├─────────────────────────────┤
│  作者: [标签1] [标签2] ...  │
│  版权: [标签1] [标签2] ...  │
│  角色: [标签1] [标签2] ...  │
│  普通: [标签1] [标签2] ...  │
└─────────────────────────────┘

全屏模式

  • 黑色背景,最大化图片/视频显示
  • 支持手势缩放(图片)
  • 点击关闭,长按保存

注意事项与限制

网络要求

  • 需要稳定的互联网连接访问 Danbooru API
  • 图片和视频通过网络流式加载,无本地缓存机制

媒体处理

  • 图片格式:支持 JPEG、PNG、WebP 等常见格式
  • 视频格式:取决于 video_player 支持的格式
    • Android:H.264、VP9 等
    • iOS:H.264、HEVC 等
  • 加载策略
    • 优先加载高分辨率原图
    • 原图加载失败时回退到预览图
    • 视频识别失败时显示预览图

内存管理

  • 视频控制器在页面销毁时释放
  • 缓存的高分辨率 URL 在页面导航时保留

权限需求

  • Android 13+:需要文件访问权限保存图片
  • iOS:需要相册访问权限保存图片
  • 应用会在需要时动态请求权限

开发建议

代码扩展

  1. 添加本地缓存:考虑使用 hivesqflite 缓存搜索历史和已下载图片
  2. 收藏夹功能:保存喜欢的图片
  3. 离线模式:支持离线浏览已下载的内容
  4. 高级搜索:UI 改进的搜索界面,支持高级筛选选项

性能优化

  1. 图片懒加载:只加载可见网格区域的图片
  2. 内存优化:限制同时缓存的高分辨率图片数量
  3. 网络优化:实现连接池和请求去重

用户体验改进

  1. 搜索历史:记录最近搜索
  2. 收藏标记:用户可标记喜欢的内容
  3. 快捷键支持:支持键盘快捷操作
  4. 深色模式:完整的深色主题支持

已知问题与 TODO

当前限制

  • ⚠️ 无本地缓存机制
  • ⚠️ 搜索不支持复杂的高级查询语法(仅支持基本标签)
  • ⚠️ 内存中 URL 缓存可能导致大量浏览时内存占用增加

未来改进

  • 添加搜索建议/自动完成
  • 实现本地数据库缓存
  • 支持用户自定义主题
  • 添加通知和订阅功能
  • 性能监控和分析

许可证

本项目为私有项目。

发布与 CI/CD

本项目使用 GitHub Actions 进行自动化构建和发布。详见 工作流指南

快速发布版本

方法 1:使用脚本(推荐)

Linux/macOS:

chmod +x scripts/release.sh
./scripts/release.sh

Windows:

scripts\release.bat

脚本会引导你完成整个发布流程。

方法 2:手动发布

创建并推送 Git Tag 以自动构建所有平台的 Release 版本:

# 创建版本 Tag
git tag v1.0.0
git push origin v1.0.0

构建产物

构建完成后,会自动在 GitHub Releases 页面创建发布版本,包含以下构建产物:

  • 📱 Android APK (支持 arm64、armeabi-v7a、x86_64)
  • 🍎 iOS IPA
  • 🐧 Linux 可执行程序
  • 🪟 Windows 可执行程序
  • 🌐 Web 应用(同时部署到 GitHub Pages)

工作流说明

工作流 触发条件 功能
CI Push 到 main/develop 或 PR 代码分析、测试、Debug 构建
Build Release 推送 v* Tag 多平台 Release 构建
Deploy Web 推送 Tag 或 main 分支 部署 Web 版本到 GitHub Pages

详细信息请参考:

作者与维护

开发于 2026 年 2 月


常见问题 (FAQ)

Q: 为什么图片加载很慢?

A: Danbooru API 的响应速度和网络连接有关。首次加载会获取缩略图,然后异步加载高分辨率图片。

Q: 如何搜索多个标签?

A: 在搜索框中输入标签,使用空格分隔。例:tag1 tag2 tag3

Q: 可以搜索特定用户或艺术家吗?

A: 可以,使用标签搜索。例:artist:artist_name 或直接输入标签

Q: 视频为什么不播放?

A: 请确保:

  1. 该内容确实是视频格式
  2. 网络连接正常
  3. 设备支持该视频格式
  4. 权限已授予(如需要)

Q: 保存图片失败怎么办?

A: 检查以下几点:

  1. 存储权限是否已授予
  2. 设备存储空间是否充足
  3. 网络连接是否正常

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published