Code Monkey home page Code Monkey logo

go-musicfox / go-musicfox Goto Github PK

View Code? Open in Web Editor NEW
1.3K 5.0 87.0 26.87 MB

go-musicfox是用Go写的又一款网易云音乐命令行客户端,支持UnblockNeteaseMusic、各种音质级别、lastfm、MPRIS、MacOS交互响应(睡眠暂停、蓝牙耳机连接断开响应、菜单栏控制等)...

License: MIT License

Go 97.40% Makefile 0.54% Rich Text Format 0.11% Shell 1.03% Smarty 0.28% Nix 0.64%
go musicfox musicbox netease-cloud-music go-musicfox netease-musicbox netease-music bubbletea unblockneteasemusic mpris

go-musicfox's Introduction

go-musicfox | 另一个Spotify版 Spotifox

go-musicfox 是用 Go 写的又一款网易云音乐命令行客户端,支持各种音质级别、UnblockNeteaseMusic、Last.fm、MPRIS 和 macOS 交互响应(睡眠暂停、蓝牙耳机连接断开响应和菜单栏控制等)等功能特性。

UI 基于 charmbracelet/bubbletea 进行了部分定制

GitHub repo size GitHub Last Tag GitHub last commit GitHub All Releases

GitHub stars GitHub forks

logo

(The icon is based on kitty-icon)


预览

1. 启动

启动界面

2. 主界面

主界面

3. 通知

通知

4. 登录

登录界面

5. 搜索

搜索界面

6. Last.fm 授权

lastfm

7. macOS NowPlaying

NowPlaying

8. UnblockNeteaseMusic

UNM

9. macOS 歌词显示

LyricsX

Important

需要满足以下条件:

  1. go-musicfox >= v3.7.7
  2. 下载和安装 LyricsX 的 go-musicfox 的 fork 版本
  3. 在 LyricsX 设置中,打开使用系统正在播放的应用

安装

macOS

1. 通过 Homebrew 安装

$ brew install anhoder/go-musicfox/go-musicfox  // 指定 --head 使用master代码编译安装

如果你之前安装过 musicfox,需要使用下列命令重新链接:

$ brew unlink musicfox && brew link --overwrite go-musicfox

2. 直接下载

Release 下载 macOS 的可执行文件。

Linux

1. 使用发行版软件包(推荐)

Arch Linux
AUR 安装
$ paru -S go-musicfox # 下载源代码编译安装
$ paru -S go-musicfox-bin # 下载安装预编译好的二进制
archlinuxcn 安装

首先添加 archlinuxcn 仓库到系统

# pacman -S go-musicfox
Gentoo Linux
$ eselect repository enable gentoo-zh
$ emerge --sync
$ emerge -a media-sound/go-musicfox
NixOS
1. flake support 下面是一个在nixos配置中使用它的例子
{
  description = "My configuration";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    go-musicfox.url = "github:go-musicfox/go-musicfox";
  };

  outputs = { nixpkgs, go-musicfox, ... }:
    {
      nixosConfigurations = {
        hostname = nixpkgs.lib.nixosSystem
          {
            system = "x86_64-linux";
            modules = [
              {
                nixpkgs.overlays = [ go-musicfox.overlays.default ];
                environment.systemPackages = with pkgs;[
                  go-musicfox
                ];
              }
            ];
          };
      };
    };
}

临时运行:

$ nix run github:go-musicfox/go-musicfox
2. 配置 configuration.nix 或使用 Home Manager(推荐)
# configuration.nix
environment.systemPackages = [
  pkgs.go-musicfox
];

# home manager
home.packages = [
  pkgs.go-musicfox
];
3. 从 Nixpkgs 安装 安装到本地 profile:
$ nix-env -iA nixos.go-musicfox

临时安装:

$ nix-shell -p go-musicfox
Void Linux

void-packages-zh 安装。

2. 通过 Homebrew 安装

$ brew install anhoder/go-musicfox/go-musicfox  // 指定 --head 使用master代码编译安装

如果你之前安装过 musicfox,需要使用下列命令重新链接:

$ brew unlink musicfox && brew link --overwrite go-musicfox

3. 直接下载

Release 下载 Linux 的可执行文件。

Windows

1. 通过 scoop 安装

scoop bucket add go-musicfox https://github.com/go-musicfox/go-musicfox.git

scoop install go-musicfox

2. 直接下载

Release 下载 Windows 的可执行文件。

手动编译

注:需要 Go v1.21 及以上版本

前往 下载 Go 页面选择适合你的 Go 安装包体。

在 Linux 上编译

Linux 需要 libFLAC-dev 开发套件

请根据你的发行版,选择适合你的安装命令:

  • APT (Debian, Ubuntu)
$ sudo apt install -y libflac-dev
  • pacman (Arch)
$ sudo pacman -S flac
  • DNF (Fedora)
$ sudo dnf install flac-devel

其他发行版请根据相应文档寻找 libflac-dev 开发套件安装说明。

开始编译

$ git clone https://github.com/go-musicfox/go-musicfox

$ go mod download

$ make # 编译到 bin 目录下
$ make install # 安装到 $GOPATH/bin下

使用

$ musicfox

注意事项

Important

  • 请务必使用等宽字体,或将配置项 doubleColumn 设为 false,否则双列显示排版可能会混乱

  • 如果在使用时出现莫名奇妙的光标移动、切歌或暂停等现象,请将配置项 enableMouseEvent 设置为 false

  • 本应用不对 macOS 原生终端和 Windows 的命令提示符(CMD)做兼容处理(#99

    macOS 用户推荐使用 iTerm2Kitty

    Linux 用户推荐使用 Kitty

    Windows 用户推荐使用 Windows Terminal,使用体验更佳

  • 如果在执行文件时遇到以下错误,说明你的操作系统内不包含 libFLAC.so.8

    ./musicfox: error while loading shared libraries: libFLAC.so.8: cannot open shared object file: No such file or directory
    

    例如 Ubuntu 23.10 及它的衍生版系列,libFLAC.so.12 已经将 libFLAC.so.8 替换。

    遇到这种问题,你可以自行安装 libflac8 (不推荐)或参照手动编译一节自行编译。

快捷键

应用内快捷键

按键 作用 备注
h/H/← (左方向)
l/L/→ (右方向)
k/K/↑ (上方向)
j/J/↓ (下方向)
g 上移到顶部
G 下移到底部
q/Q 退出
Space (空格) 暂停/播放
[ 上一曲
] 下一曲
-/滚轮下 减小音量
=/滚轮上 加大音量
n/N/Enter (回车) 进入选中的菜单
b/B/Escape (退出) 返回上级菜单
w/W 退出并退出登录
p 切换播放方式
P 心动模式(仅在歌单中时有效)
r/R 重新渲染 UI 如果 UI 界面因为某种原因出现错乱,可以使用这个重新渲染
c/C 当前播放列表
v/V 快进 5 s / 10 s
x/X 快退 1 s / 5 s
, 喜欢当前播放歌曲
< 喜欢当前选中歌曲
. 当前播放歌曲移除出喜欢
> 当前选中歌曲移除出喜欢
` 当前播放歌曲加入歌单
~ 当前播放歌曲移出歌单
Tab 当前选中歌曲加入歌单
Shift+Tab 当前选中歌曲移出歌单
> 当前选中歌曲移除出喜欢
> 当前选中歌曲移除出喜欢
t 标记当前播放歌曲为不喜欢
T 标记当前选中歌曲为不喜欢
d 下载当前播放歌曲
D 下载当前选中歌曲
/ 搜索当前列表
? 帮助信息
a 播放中歌曲的所属专辑
A 选中歌曲的所属专辑
s 播放中歌曲的所属歌手
S 选中歌曲的所属歌手
o 网页打开播放中歌曲
O 网页打开选中歌曲/专辑...
e 添加为下一曲播放
E 添加到播放列表末尾
\ 从播放列表删除选中歌曲 仅在当前播放列表界面有效
;/: 收藏选中歌单
'/" 取消收藏选中歌单
u/U 清除音乐缓存
ctrl+u 上一页
ctrl+d 下一页

全局快捷键

默认不设置任何全局快捷键,如果需要请在配置文件中的global_hotkey下进行配置,例如:

[global_hotkey]
# 格式:键=功能 (https://github.com/go-musicfox/go-musicfox/blob/master/internal/ui/event_handler.go#L15)
ctrl+shift+space=toggle

因为Linux下开启全局快捷键需要安装比较多的依赖,可能你并不需要这个功能,所以Releases中的Linux二进制文件是不支持全局快捷键的

如果需要开启,请安装依赖后手动进行编译:

BUILD_TAGS=enable_global_hotkey make build

配置文件

配置文件路径为用户配置目录下的 go-musicfox.ini 文件,详细可参见配置示例

用户配置目录路径:

macOS:$HOME/Library/Application Support/go-musicfox

Linux:$XDG_CONFIG_HOME/go-musicfox$HOME/.config/go-musicfox

Windows:%AppData%\go-musicfox

你可以通过设置 MUSICFOX_ROOT 环境变量来自定义用户配置的存储位置

旧版本的 go-musicfox 的默认用户配置目录为 $HOME/.go-musicfox(*nix)或 %USERPROFILE%\.go-musicfox(Windows),升级到新版本时将自动迁移到上述的新路径

CHANGELOG

See CHANGELOG.md

相关项目

  1. go-musicfox/bubbletea:基于 bubbletea 进行部分定制
  2. go-musicfox/netease-music:fork 自 NeteaseCloudMusicApiWithGo ,在原项目的基础上去除 API 功能,只保留 service 和 util 作为一个独立的包,方便在其他 Go 项目中调用

感谢

感谢以下项目及其贡献者们(但不限于):

感谢 JetBrains Open Source 为项目提供免费的 IDE 授权

Star History Chart

go-musicfox's People

Contributors

aleksanaa avatar anhoder avatar anhoderai avatar cloudwindy avatar dependabot[bot] avatar fuyu0425 avatar imxyy1soope1 avatar kylezb avatar mokurin000 avatar muxinxy avatar ruixi-rebirth avatar sakarie9 avatar soloopooo avatar st0nie avatar tenshi65535 avatar whiredplanck avatar xiarenfan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

go-musicfox's Issues

功能建议:集成 MPRIS

MPRIS 在大多数发行版中都有良好的集成,可以通过菜单栏/控件等方式控制播放状态,使用上比较类似 Mac NowPlaying

目前的 musicfox 想要使用 MPRIS 似乎只能配置 MPD 并安装 mpd-mpris,但因为 musicfox 另起了一个 MPD 进程,mpd-mpris 并没有生效。考虑到 MPD 为外部实现可能不太方便集成,能否在使用内置的 beep 引擎时实现 MPRIS 功能呢

播放歌曲报错

2023/01/23 23:44:59 catch panic, err: winmm error at waveOutOpen: MMSYSERR_BADDEVICEID
failed to initialize speaker
github.com/faiface/beep/speaker.Init
/go/src/go-musicfox/vendor/github.com/faiface/beep/speaker/speaker.go:42
go-musicfox/pkg/player.(*beepPlayer).listen
/go/src/go-musicfox/pkg/player/beep_player.go:183
go-musicfox/pkg/player.NewBeepPlayer.func1
/go/src/go-musicfox/pkg/player/beep_player.go:67
runtime.goexit
/usr/local/go/src/runtime/asm_amd64.s:1571, stack: goroutine 6 [running]:
runtime/debug.Stack()
/usr/local/go/src/runtime/debug/stack.go:24 +0x65
go-musicfox/utils.Recover(0x0)
/go/src/go-musicfox/utils/recover.go:8 +0x4f
panic({0x1564e00, 0xc000432768})
/usr/local/go/src/runtime/panic.go:838 +0x207
go-musicfox/pkg/player.(*beepPlayer).listen(0xc000131e60)
/go/src/go-musicfox/pkg/player/beep_player.go:184 +0xbb0
go-musicfox/pkg/player.NewBeepPlayer.func1()
/go/src/go-musicfox/pkg/player/beep_player.go:67 +0x3f
created by go-musicfox/pkg/player.NewBeepPlayer
/go/src/go-musicfox/pkg/player/beep_player.go:65 +0x216

MacOS优化

  • 使用OC原生播放器AVPlayer
  • 接入MacOS MPNowPlayingInfoCenter
    • 菜单栏控制播放器
    • 响应系统事件,例如蓝牙耳机连接断开等

CPU占用是否正常?

我发现内存占用少的同时CPU占用要稍微高一点, 这点占用确实不算高, 但想确认下是否符合预期?
image
image

Feature Request: 歌词翻译

如题,希望可以增加显示歌词翻译的选项。

个人的排版建议(加粗表示当前的歌词):
歌词下方:
歌词
翻译

歌词
翻译

歌词右边:
歌词 翻译
歌词 翻译

LyricsX 无法识别Musicfox

版本

musicfox 3.3.3
lyricsx(https://github.com/ddddxxx/LyricsX) 1.6.3
macos 10.15.7

musicfox配置:

# 启动页配置
[startup]
# 是否显示启动页
show=true
# 启动页进度条是否有回弹效果
progressOutBounce=true
# 启动页时长
loadingSeconds=2
# 启动页欢迎语
welcome=musicfox
# 启动时自动签到
signin=true

# 进度条配置
[progress]
# 进度条已加载字符
fullChar=#
# 进度条未加载字符
emptyChar=.

# 主页面配置
[main]
# 是否显示标题
showTitle=true
# 加载中提示
loadingText=[加载中...]
# 歌曲音质,standard,higher,exhigh,lossless,hires
songLevel=hires
# 主题颜色
# 随机
primaryColor=random
# 经典网易云音乐红
#primaryColor="#f90022"
# 是否显示歌词
showLyric=true
# 歌词偏移 ms
lyricOffset=0
# 是否显示通知信息
showNotify=false
# 通知icon,仅MacOS下terminal-notifier可用
#notifySender=com.netease.163music
# 开启pprof, --pprof时会开启
pprofPort=9876
# altScreen显示模式
altScreen=true
# 双列显示,开启务必使用等宽字体
#doubleColumn=true

[player]
# 播放引擎 beep / mpd(需要安装配置mpd) / osx(Mac才可用)
# 不填Mac默认使用osx,其他系统默认使用beep
#engine=beep

# mpd配置
#mpdBin=/usr/local/bin/mpd
# !!!注意!!! 一定要在配置文件中设置pid_file,否则在退出时不会kill掉mpd进程
#mpdConfigFile=/Users/anhoder/.mpd/mpd.conf
#mpdNetwork=unix
#mpdAddr=

[unm]
# UNM开关
switch=true
# UNM源: kuwo,kugou,migu,qq
sources=kuwo,qq,migu
# UNM搜索其他平台限制 0-3
searchLimit=3
# 解除会员限制
enableLocalVip=true
# 解除音质限制
unlockSoundEffects=true
# QQ音乐cookie文件
#qqCookieFile=

lyricsx 配置

  • 自动选择

显示问题

1、播放歌曲的时候,按R会导致界面显示错乱:
image
2、按了多少下C就得按多少下ESC才能回到原来的界面

主播电台分页

目前主播电台只能加载最近的50个节目,作为一个把电台当歌单的用户希望可以在条件允许的情况下加载完所有的电台节目。

希望下载歌曲时自带歌曲封面和信息

虽然目前现在的版本支持歌曲下载功能,对于我这种需要下载歌曲到本地上来说非常方便,但是我下载过来的歌曲是不带歌曲封面和信息,导致我部分本地音乐播放器检测不到歌手和专辑是谁,而且没有封面显示也非常难受,希望下个版本支持音乐封面图和信息,省得自己手动添加.

内容过长时水平滚动、分行

希望长歌词、长 歌名+作者 添加水平滚动功能。
对于超长的英文歌词翻译考虑双行显示,或者根据窗口宽度自适应调整。

更新到3.0.1后切歌闪退

闪退后终端输出如下

net/http.(*persistConn).Read(0xc0004d4120, {0xc0005ae000?, 0xc000213b50?, 0x100000000429fc5?})
	/usr/local/go/src/net/http/transport.go:1929 +0x4e
bufio.(*Reader).Read(0xc00030ecc0, {0xc0005ae000, 0x8000, 0x466e5b?})
	/usr/local/go/src/bufio/bufio.go:222 +0x106
io.(*LimitedReader).Read(0xc00056e948, {0xc0005ae000?, 0xc000213c00?, 0x4b52fb?})
	/usr/local/go/src/io/io.go:476 +0x45
net/http.(*body).readLocked(0xc0006160c0, {0xc0005ae000?, 0x4d04e6?, 0xc000682ba0?})
	/usr/local/go/src/net/http/transfer.go:844 +0x3c
net/http.(*body).Read(0xc000646118?, {0xc0005ae000?, 0xc0003462a0?, 0xc000682bb8?})
	/usr/local/go/src/net/http/transfer.go:836 +0x125
net/http.(*bodyEOFSignal).Read(0xc000616100, {0xc0005ae000, 0x8000, 0x8000})
	/usr/local/go/src/net/http/transport.go:2774 +0x142
go-musicfox/utils.Copy.func1({0xc0005ae000, 0x8000, 0x8000})
	/go/src/go-musicfox/utils/io_copy.go:21 +0xa5
go-musicfox/utils.readerFunc.Read(0x10?, {0xc0005ae000?, 0xc0003822b0?, 0xc000300000?})
	/go/src/go-musicfox/utils/io_copy.go:11 +0x2a
io.copyBuffer({0xacb3a0, 0xc0003822b0}, {0xacac80, 0xc0001783f0}, {0x0, 0x0, 0x0})
	/usr/local/go/src/io/io.go:426 +0x1b2
io.Copy(...)
	/usr/local/go/src/io/io.go:385
os.genericReadFrom(0x0?, {0xacac80, 0xc0001783f0})
	/usr/local/go/src/os/file.go:162 +0x67
os.(*File).ReadFrom(0xc000330050, {0xacac80, 0xc0001783f0})
	/usr/local/go/src/os/file.go:156 +0x1b0
io.copyBuffer({0xaca5a0, 0xc000330050}, {0xacac80, 0xc0001783f0}, {0x0, 0x0, 0x0})
	/usr/local/go/src/io/io.go:412 +0x14b
io.Copy(...)
	/usr/local/go/src/io/io.go:385
go-musicfox/utils.Copy({0xacdd88?, 0xc000646100?}, {0xaca5a0?, 0xc000330050?}, {0xaca2a0?, 0xc000616100?})
	/go/src/go-musicfox/utils/io_copy.go:16 +0xd7
go-musicfox/pkg/player.(*beepPlayer).listen.func1({0xacdd88, 0xc000646100}, 0xc00029dfd0?, {0xacc800?, 0xc000616100})
	/go/src/go-musicfox/pkg/player/beep_player.go:141 +0x88
created by go-musicfox/pkg/player.(*beepPlayer).listen
	/go/src/go-musicfox/pkg/player/beep_player.go:139 +0x45b

goroutine 147 [chan receive]:
github.com/tosone/minimp3.(*Decoder).Started.func1()
	/go/src/go-musicfox/vendor/github.com/tosone/minimp3/decode.go:135 +0x45
created by github.com/tosone/minimp3.(*Decoder).Started
	/go/src/go-musicfox/vendor/github.com/tosone/minimp3/decode.go:123 +0xad

rax    0x0
rbx    0x2fc0
rcx    0x7f2becca849c
rdx    0x6
rdi    0x2fad
rsi    0x2fc0
rbp    0x7f2b967fc6c0
rsp    0x7f2b967fbac0
r8     0xffffffff
r9     0x0
r10    0x8
r11    0x246
r12    0x6
r13    0x7f2bc4153000
r14    0x1
r15    0x1
rip    0x7f2becca849c
rflags 0x246
cs     0x33
fs     0x0
gs     0x0

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.