# bili-video-get-android **Repository Path**: check_null/bili-video-get-android ## Basic Information - **Project Name**: bili-video-get-android - **Description**: BiliBili 视频提取转换工具 无需 root,一键提取 B站 下载视频并转换为 MP4 格式。 支持:国内版 / 国际版 / HD版 / 概念版 特点:批量转换 | 自动分组 | MX Player 预览 技术:Kotlin + Jetpack Compose + FFmpeg - **Primary Language**: Kotlin - **License**: MulanPSL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-23 - **Last Updated**: 2026-03-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BVideoGet bilibili视频提取器 - 提取手机已下载的Bilibili视频文件,导出为MP4格式。 ## 功能特点 - 兼容 Android 13+ (SDK 33+) - 使用 Shizuku 扫描视频源目录 - 使用 SAF (Storage Access Framework) 选择输出目录 - 支持多个Bilibili版本(国内版/国际版/HD版/概念版) - 视频信息解析(标题、作者、VIP标识、时长、质量、大小) - 封面显示(支持本地和远程URL) - **视频按合集分组显示**(按season_id分组第一规则,season_id为0时按avid第二规则) - **ALL列表统一时间排序**(分组和单视频按最后更新时间混合排序,不再分开) - 分组内按ep.sort_index排序(season_id不为0),否则按page_data.cid排序 - 分组子标题显示ep.index_title(season_id不为0),否则显示page_data.part - 分组视频项第二行左侧显示大小和质量,右侧显示播放按钮;播放按钮仅在任务已完成且输出文件存在时可点击;若任务已完成但输出文件不存在,播放按钮禁用且文字显示删除线 - **任务名/文件名生成**(解析entry.json时预计算):season_id不为0时为title-indexTitle,否则按downloadSubtitle/part与title组合(若包含title则仅用subtitle,否则title+" "+subtitle) - 分组支持展开/收起 - 长按进入多选模式,支持分组全选/反选 - 批量导出 - **TabRow标签筛选**(全部/转换中/已完成/失败,可左右滑动切换) - **横向FAB悬浮按钮**,选择模式时显示,点击开始转换 - **转换中列表显示完整队列**(等待中+正在转换的任务) - **视频列表持久化**,应用重启后自动加载 - **转换任务持久化**,应用重启后保留 - **任务去重**,使用md5(entryJsonPath的MD5值的完整32字符)作为唯一标识符,相同的任务自动重启转换 - **任务重试**,支持重试失败/重命名失败的任务 - **进度条显示**,每个任务项底部显示进度条,颜色根据状态区分(蓝色=转换中/已完成,青色=等待中,红色=失败);视频列表也显示关联任务的进度条 - **IO线程异步转换**,大文件转换不阻塞主线程 - **源文件不存在提示** - 封面显示为黑白,标题显示删除线 - **文件存在性检查** - 应用启动时检查 entry.json 和输出文件是否存在 - **转换前源文件检查** - 转换前检查源文件是否存在,不存在则直接标记失败,不生成临时文件 - **转换失败时样式更新** - 因源文件不存在而转换失败时,立即更新样式(封面黑白、标题删除线) - **错误信息持久化显示** - 错误信息优先显示转换时的结果,即使源文件恢复后仍显示 - **播放按钮** - 已完成视频封面上显示播放按钮,点击可调用外部播放器播放;分组视频项右侧显示文字播放按钮,仅在任务已完成且输出文件存在时可点击;若任务已完成但输出文件不存在,播放按钮禁用且文字显示删除线 - **输出文件不存在提示** - 输出文件不存在时显示裂开图标,点击弹出提示具体路径的文件不存在 - **搜索过滤** - 输入关键词搜索,按回车键执行过滤;有光标时按返回键回退搜索内容并失去光标;搜索完成后按返回键清空搜索 - **文件名冲突检测** - 输出目录存在同名文件时自动添加序号,序号在实际转换时动态分配 - **序号池** - 进入序号池页面,所有转换都使用序号池计数(按标题记录),每次转换后先增再拿序号(首次为0或1,文件名不加序号;>=2时才加序号);支持添加条目、长按修改序号或删除;支持搜索、批量选择(进入选择模式后支持全选、反选、删除);返回键和左上角返回按钮在选择模式下退出选择模式,在搜索模式下清空搜索;转换时如文件名冲突处理为"添加序号",会弹出对话框先选择是否使用序号池(是:使用序号池,否:使用普通序号),再弹出对话框选择是否删除原文件 - **单任务队列** - 强制使用单一任务队列 - **不支持字符替换** - 生成文件名时自动替换Windows/macOS不支持的字符(\ / : * ? " < > | 等),支持用户自定义替换规则 - **转换完成后删除原文件** - 转换前弹出对话框询问是否删除原文件(是:删除,否:保留),转换成功后自动删除源文件目录(entry.json所在目录),若上级目录为空则递归删除 - **输出目录检查** - 未设置输出目录时禁用转换按钮 - **独立选择状态** - 每个Tab页有独立的选择状态,切换Tab时互不干扰 - **选择模式行为** - 取消勾选最后一个不会自动退出选择模式(所有Tab页统一) - **列表排序** - 转换中(CONVERTING按startTime倒序在顶部,PENDING按createTime正序)、已完成(按endTime倒序)、错误(按endTime倒序) - **刷新功能** - 刷新按钮根据当前Tab页过滤要检查的内容(全部/转换中/已完成/错误各自独立) - **文件检查加载动画** - 检查文件存在性时在封面显示微博风格加载动画(半透明底圈+进度弧,每圈1秒),同时隐藏播放按钮和裂开图标 ## 使用方法 1. 安装应用并授权Shizuku(如未授权,应用会显示授权界面) 2. 点击右上角菜单 -> 选择输出目录 3. (可选)点击右上角菜单 -> 设置 -> 转换完成后删除原文件 4. 点击右上角菜单 -> 重载,扫描视频 5. 在"全部"标签下选择要转换的视频(支持分组选择、搜索过滤) 6. 点击横向FAB悬浮按钮开始转换 7. 可通过左右滑动切换不同标签查看不同状态的转换任务 8. 如有失败任务,可点击重试 ## 临时文件说明 - **临时文件位置**: 应用的外部缓存目录 `/storage/emulated/0/Android/data/com.bget.video/cache/tmp/` - **为什么需要临时文件**: - FFmpeg 需要直接的文件路径才能处理 - Bilibili 视频位于应用的私有目录 (`/Android/data/tv.danmaku.bili/`),需要通过 Shizuku 复制出来 - **转换完成后**: 临时源文件会自动删除,输出文件通过 Shizuku mv 命令移动到用户选择的目录(比复制+删除更快) ## 技术栈 - Kotlin - Jetpack Compose - MVVM + Clean Architecture - Hilt - Coil - Room - FFmpeg-kit - Shizuku ## 构建 ```bash ./gradlew assembleDebug ``` APK 输出目录: `app/build/outputs/apk/debug/`