Skip to content

404name/bilibili-terminal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

BiliBili-Terminal

分支0.1.x基于bubbletea全新UI进行重构,已兼容全平台windows 需要 chcp 65001编码+nerd+终端完美显示

本项目长期维护~目前仅开发分支

等待V 1.x.x版本应该才是可以使用的

【食用技巧for win】确保开启了unicode字符集chcp 65001 + 安装了nerd字体 + 使用windows terminal终端打开项目(即可完美显示图标内容)

ChangeLog

feat 新功能、fix 修补 bug、docs 文档、style 格式、refactor 重构、test 增加测试、chore 构建过程、辅助工具、perf 提高性能

后面预期【0.0.6 配置和日志】、【0.0.7 首页布局制作&音频同步视频】、【0.0.8 封装视频组件】

Date Versiton Describe Changelog
2023.03.20 v0.1.0 基于bubbletea全新UI进行重构~ 🚀 [feat] 【重构框架及UI】/【暂时只支持刷新推荐列表+跳转】
☀️ [perf] 添加action脚本自动构建产物
2023.01.09 v0.0.8 使用ctx取消任务,优雅退出视频~ 🚀 [feat] 【支持取消下载iocopy任务】/【支持取消cmd指令】
2023.01.04 v0.0.7 支持页面跳转、首页视频推荐~ 🚀 [feat] 【首页视频推荐】/【选择视频跳转详细页】/【多了一堆线程bug~】
2023.01.01 v0.0.6 viper读取配置、封装页面组件~ 🚀 [feat] 【viper读取配置】/【log日志输出到窗口组件】/【封装page组件更为优雅】
2022.12.29 v0.0.5 支持中文!修复部分bug~ 🚀 [fix] 【修复中文显示】/【修复结束不能重新播放】
2022.12.29 v0.0.4 支持bv解析了~ 🚀 [feat] 【bv解析播放!】/【加载进度条】
2022.12.29 v0.0.3 支持音频了~ ☀️ [perf] 优化播放逻辑
💬 [fix] 修复线上问题及添加gitignore
🚀 [feat] 【支持音频播放!】/【同步拉取图片及音频】/ 【初步实现音视频同步播放】
2022.12.28 v0.0.2 优化架构,优化播放 📺 [refactor] 重构项目框架
☀️ [perf] 优化播放逻辑
📑 [docs] 更新README文档
🚀 [feat] 【实现响应式布局】/【实现进度条】/ 【实现预加载播放】
2022.12.27 v0.0.1 页面布局、支持视频播放 📺 [init] 初始化界面
🚀 [feat] 完成页面布局
🚀 [feat] 实现视频播放

FeaturesV0.0.6

系统进度 [==>20%------------------------] 设计进度 [========>35%------------------]

  • 命令行播放视频
  • 音频播放
  • 直接解析bv go run main.go -b BV1xx411c79H
  • 完成组件构建
  • viper读取本地配置
  • 日志收集器
  • 弹幕解析
  • ...

Build

  1. 运行环境需要【ffmpeg:命令行输入ffmpeg有输出即可

  2. 编译环境需要【golang】:我的是go1.9.4,理论上都行

(win推荐使用choco,任何环境直接choco install xxx搞定,完全不需要自己动手下载和配置环境变量)

# mod load
$ go mod tidy
# r启动
$ go run main.go
# 打包
$ go build main.go

架构逻辑

├───core          服务组件(viper、zap)
├───ffmpeg        视频抽帧音频分离逻辑
├───global        全局变量或者服务
├───output        输出内容
│   ├───audio         分割的音频
│   ├───img           分割的图片
│   └───video         处理的视频
├───resource      资源目录
│   ├───images        本地图片(封面,视频暂停ui等)
│   └───doc           readme里面的图片
├───utils         工具
└───view          页面视图
└───main.go       主程序
└───config.yaml   配置文件

  1. 主程序负责启动项目
// 初始化页面逻辑
Init()

// 开始渲染
for {
  select {
  // 判断事件,然后系统事件这里处理
  case e := <-ui.PollEvents():
    //println(e.ID)
    switch e.ID {
    case "q", "<C-c>":
      return
    // 页面事件交给页面处理
    case "<Resize>":
      view.NowPage.Refresh()
    default:
      view.NowPage.EventHander(e)
  }
}

  1. 页面组件封装

抽象页面组件,不同的页面只要实现【刷新】【关闭】【事件处理器】就可以了,main程序会负责分发

type Page interface {
	Refresh()
	Close()
	EventHander(e termui.Event)
}
  1. 视频page举例子

视频页面封装了 termui的组件和视频内容通用熟悉,以及b站视频相关

type VideoPage struct {
	video.VideoDetail
	Gauge      *widgets.Gauge
	List       *widgets.List
	Tab        *widgets.TabPane
	TabView    []interface{}
	Grid       *ui.Grid
	CurTabView interface{}
}
  • VideoDetail包括Img组件和进度条组件,同时提供如下方法
    • Init() : 初始化
    • DownLoad(): 解析bv号拿到下载链接并下载或者在线预览
    • Load():根据currentPos当前进度获取preload设定的缓存秒数后面的内容
  • VideoPage会启动一个视频播放线程,同时自己本身会响应主线程发来的事件

TODO

近期

  1. 缓存视频再播放
  2. 自定义日志,日志可以输出到面板
  3. 对接音频
  4. 继续重构架构

后期

  1. 对接b站api
  2. 对接弹幕

已完成

  1. ffmpeg 获取视频长度,做个进度条
  2. 让视频刷新更快
  3. 尝试先缓存视频到本地再播放
  4. 包装ffmpeg出来 二期
  5. 记录播放上次时间
  6. 根据resize设置不同的布局 长宽比小于1 就是手机layout 大于1就是电脑布局

Bugs

qwq

  • P0:暂不支持中文(win)
  • P1:音视频不同步
  • p1:视频结束没出现结束界面及重新播放失效
  • P2:音频转换卡顿
  • P3:go 线程管理不到位,小概率卡死
  • ...

Dependence

  • github.com/gizak/termui/v3 Go命令行UI组件库
  • github.com/hajimehoshi/go-mp3 音频播放组件
  • github.com/hajimehoshi/oto/v2 音频播放组件
  • go.uber.org/zap 高性能日志库zap

备注

  • 后期把resource里面被项目引用的图片都转成base64存放
    • 目前策略是读取不到resource就读取默认本地base64
    • resource文件夹不会被打包的exe携带,最好用base64存放icon

License

Copyright