Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
e553616
Fix lyrics and download followups
RetricSu Jul 2, 2026
32ea6e1
Polish download button and scrollbars
RetricSu Jul 2, 2026
1a51e93
Fix library sync and playlist removal polish
RetricSu Jul 2, 2026
d366298
Fix playlist continuation and lyrics controls
RetricSu Jul 2, 2026
c4f9807
Move search to player tools and add folder resync
RetricSu Jul 2, 2026
2330eb7
Polish player tool search layout
RetricSu Jul 2, 2026
d696044
Fix library search enter trigger
RetricSu Jul 2, 2026
4f23737
Fix library search result state ids
RetricSu Jul 2, 2026
645ad93
Polish search results list UI
RetricSu Jul 2, 2026
6940911
Fix player top row height regression
RetricSu Jul 2, 2026
3938550
Fix search result row interactions
RetricSu Jul 3, 2026
6050061
Center player tool icons
RetricSu Jul 3, 2026
cee0f43
Align search input height with tool buttons
RetricSu Jul 3, 2026
de86455
Unify active search control styling
RetricSu Jul 4, 2026
c7b12dc
Refine active search field alignment
RetricSu Jul 4, 2026
5d49531
Expand active search field
RetricSu Jul 4, 2026
21c618d
Constrain active search layout
RetricSu Jul 4, 2026
26461f7
Reduce active search width
RetricSu Jul 4, 2026
c225463
Right align search close button
RetricSu Jul 4, 2026
784280e
Add YouTube discovery search
RetricSu Jul 4, 2026
a8376fa
Show thumbnails in YouTube discovery
RetricSu Jul 5, 2026
9763485
Persist YouTube download folder
RetricSu Jul 5, 2026
79c64fc
Make footer draggable and show version
RetricSu Jul 5, 2026
26620f2
Slim footer version bar
RetricSu Jul 5, 2026
bb3b46d
Add bird mark to window chrome
RetricSu Jul 5, 2026
9f34991
Refine bird mark proportions
RetricSu Jul 5, 2026
900fce5
Remove Bird title from chrome
RetricSu Jul 5, 2026
fbc2736
Refresh bundled git version info
RetricSu Jul 5, 2026
2108249
Add playlist archive export
RetricSu Jul 5, 2026
0af4242
Address PR review feedback
RetricSu Jul 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
196 changes: 196 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ tracing = "0.1.29"
tracing-subscriber = "0.3.3"
log = { version = "0.4", features = ["release_max_level_info"] }
walkdir = "2.5"
zip = "0.6"
rubato = "0.12.0"
rand = "0.8.5"
symphonia = { version = "0.5.4", features = ["mp3", "flac", "wav", "aac", "ogg", "vorbis"] }
Expand Down
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,18 @@ cargo build --release

The compiled binary will be available in `target/release/bird-player`.

### macOS App Bundle

Build a macOS `.app` bundle with:

```bash
cargo bundle --release
```

The bundle is written to `target/release/bundle/osx/Bird Player.app`. To install it locally, copy it to `/Applications`.

When the app is launched from Finder, Dock, or LaunchServices, it does not inherit the interactive shell `PATH`. Any bundled build that calls user-installed command line tools must set a runtime `PATH` explicitly. Bird Player currently does this for `yt-dlp` by adding common user binary directories such as `~/.local/bin`, `~/bin`, `/opt/homebrew/bin`, and `/usr/local/bin` before spawning the command. Keep this in mind when adding future external tools, otherwise a tool that works in Terminal may fail inside the packaged app with "not found".

## Usage

1. Launch Bird Player:
Expand Down
19 changes: 18 additions & 1 deletion build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,13 @@ use std::path::Path;
use std::process::Command;

fn main() {
// Make cargo track changes to Cargo.toml
// Make cargo track changes to Cargo.toml and the current git ref.
println!("cargo:rerun-if-changed=Cargo.toml");
print_rerun_if_exists(".git/HEAD");
print_rerun_if_exists(".git/packed-refs");
if let Some(ref_path) = current_git_ref_path() {
print_rerun_if_exists(&ref_path);
}

// Configure Windows to use the windows subsystem (no console window)
if env::var("CARGO_CFG_TARGET_OS").unwrap_or_default() == "windows" {
Expand Down Expand Up @@ -39,3 +44,15 @@ fn main() {
)
.unwrap();
}

fn print_rerun_if_exists(path: &str) {
if Path::new(path).exists() {
println!("cargo:rerun-if-changed={path}");
}
}

fn current_git_ref_path() -> Option<String> {
let head = fs::read_to_string(".git/HEAD").ok()?;
let ref_name = head.strip_prefix("ref: ")?.trim();
Some(format!(".git/{ref_name}"))
}
1 change: 1 addition & 0 deletions src/app/bootstrap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ pub fn start_app() -> Result<()> {
cc.egui_ctx.style_mut(|style| {
crate::app::style::apply_brand_visuals(&mut style.visuals);
crate::app::style::apply_compact_spacing(&mut style.spacing);
crate::app::style::apply_light_scrollbars(&mut style.spacing);
});

Ok(Box::new(app))
Expand Down
Loading
Loading