Show HN:我的 macOS 音乐播放器和自动点唱机应用 Sol 现已免费开源
Show HN: Sol, my macOS music player and jukebox app, is now free and open source

原始链接: https://github.com/FulltimeFeline/Sol

Sol 是一款功能强大、免费且开源的 macOS 音乐播放器。它高度重视用户隐私,无需注册账户、不含遥测数据,亦无任何订阅费用。其所有功能均为开箱即用。 Sol 专为大型本地音乐库设计,能够处理数十万首曲目并实现即时搜索。它支持几乎所有音频格式,包括高分辨率 DSD 和 FLAC,并提供无缝隙播放和位深完美的音频输出。此外,它能将本地文件与云存储、网络共享以及如 Navidrome 等流媒体服务器无缝集成。 除播放功能外,Sol 还包含全面的功能集:强大的元数据编辑、智能播放列表、播客与网络电台支持、歌词同步,以及 AI 驱动的 DJ 模式。它具有极高的可扩展性,支持 AppleScript/快捷指令、Last.fm 记录功能,并提供用于自动化的本地控制 API。Sol 基于 Swift 6 构建并针对性能进行了优化,完全透明,用户既可以从源代码构建,也可以下载已签名的版本。该软件采用 GPL-3.0 协议授权,确保其永远属于社区且保持免费。

Hacker News 最新 | 往日 | 评论 | 提问 | 展示 | 招聘 | 提交 登录 Show HN: Sol,我的 macOS 音乐播放器和点唱机应用,现已免费开源 (github.com/fulltimefeline) 8 点,由 fulltimefeline 发布于 2 小时前 | 隐藏 | 往日 | 收藏 | 讨论 | 帮助 指南 | 常见问题 | 列表 | API | 安全 | 法律 | 申请 YC | 联系 搜索:
相关文章

原文

There is no paid tier, no subscription, no trial, no in-app purchase and no account. Every feature is in every copy.

Download it from Releases, a signed and notarized build, or build it yourself from this repository. Sol tells you when a new version is out and never nags about anything else.

There is a Homebrew cask too:

brew install --cask fulltimefeline/tap/sol

The library you remember, modernized

The classic pane browser filing by library, genre, artist and album. A grid view that lays your artwork out as a wall, grouped by artist, letter or year with an A to Z rail to skim. An album carousel for flipping through a collection like a record crate. A multi-pane view, and a resident mini player.

Built for real collections: browsing stays instant at hundreds of thousands of tracks. One search bar covers songs, albums, playlists and podcast episodes across every library and server at once, and it reaches every tag you have, down to catalog number and filename.

Every format that matters

FLAC, ALAC, WAV, AIFF, MP3, AAC, Ogg Vorbis and Opus, plus the deep cuts: DSD, Monkey's Audio, Musepack and Wave64. Cue sheets work both as a sidecar .cue and embedded inside the file itself.

Gapless playback, crossfade, a full equalizer with presets, and ReplayGain levelling with clipping protection.

Match sample rate and bit depth switches your DAC to each file's own rate and depth. Bit-perfect output sends the file's own bits to your DAC untouched when the device supports it, and falls back honestly when it does not.

Your music, wherever it lives

Watch as many folders as you like across internal disks, external drives, network shares and iCloud Drive. Offline libraries are detected instantly, greyed gracefully, and rescanned by themselves when they come back.

Stream from your own Navidrome, Subsonic or OpenSubsonic server right beside your local files, with two way sync of playlists, favourites and ratings, and downloads for offline listening.

Podcasts with subscriptions, transcripts, chapters, Voice Boost for quiet talkers and one click import from Apple Podcasts. Internet radio with station artwork and live song titles. Lyrics that follow along line by line, a full screen visualizer, and karaoke.

Sol DJ builds an endless, radio-style mix that favours loved tracks, surfaces overlooked discoveries and avoids repeats.

A real metadata editor: thirty fields written into the files themselves, on every format Sol can tag, artwork included. Edit many files at once, find and replace with regular expressions, and look tags up on MusicBrainz.

Ratings and loves go into your files' actual tags, so they are readable by other players and portable forever.

Smart playlists with nested rule groups across more than thirty fields, a duplicates finder, play statistics, and an import organizer that renames and files new music by your own template.

Real AppleScript support and sixteen Shortcuts actions. Media keys, Dock transport controls and system Now Playing integration. Last.fm scrobbling with loved track sync. Discord Rich Presence through the free Sol Activity companion. An optional local control API for companion apps, stream decks and your own automations.

Translated into 34 languages.

No telemetry, no analytics, no account.


  • macOS 14 or later
  • Xcode 26 or later, for the macOS 26 SDK. Swift 6 language mode with full strict concurrency checking
  • XcodeGen, brew install xcodegen

The project file is generated

project.yml is the source of truth and the Xcode project is not in version control, so xcodegen generate is a required first step rather than an optional one. Do not edit the generated project directly. Change project.yml and regenerate.

This step is optional. A fresh checkout builds and runs as it is. Config.xcconfig defaults the Last.fm credentials to empty, LastFM.configured returns false, and the scrobbling UI reports itself unavailable. Nothing else in the app is affected.

To enable scrobbling, register an application at last.fm/api/account/create, then:

cp Secrets.example.xcconfig Secrets.xcconfig

Paste the two values in. Config.xcconfig pulls it in with an optional include, so the values override the empty defaults when the file is there and are ignored when it is not. Secrets.xcconfig is gitignored, so the keys never reach the repository.

xcodegen generate
open Sol.xcodeproj

Or from a terminal:

xcodebuild -project Sol.xcodeproj -scheme Sol -configuration Debug build

One Swift package, resolved automatically:

SFBAudioEngine, a trimmed fork of sbooth/SFBAudioEngine with the LGPL decoders removed, pinned to a revision. That fork's own history records what differs from upstream.

Everything else is vendored as static libraries in Sol/Vendor/lib with headers in Sol/Vendor/include: TagLib, Monkey's Audio, Musepack, Ogg, Vorbis and opencore-amr. They are checked in, so there is nothing to fetch or build.

project.yml         the real project definition
Sol/App/            model, playback, library, tagging, integrations
Sol/Views/          SwiftUI and AppKit views
Sol/Vendor/         vendored static libraries and headers
Sol/Resources/      the string catalog, 34 languages
docs/               screenshots used by this README

Sol/App holds no references to Sol/Views outside the composition root in SolApp.swift, and services take their dependencies as injected closures rather than reaching back into the model. Please keep it that way.

  • Debug builds define SOLDEBUG, which enables the /debug/probe and /debug/snapshot endpoints on the local control server. Release never defines it.
  • Strict concurrency is fully on. Each @unchecked Sendable and nonisolated(unsafe) carries a written justification of the invariant that makes it safe. If you add one, explain it.
  • There is no test target yet. LibraryStore.slots, TagWriter, CueParser, FeedParser, ReplayGain and TagReader are pure and deterministic, and are the obvious place to start.

Discord Rich Presence needs a small companion app, because Discord's IPC socket cannot be reached from inside the App Sandbox. It is free, GPL-3.0, and lives in its own repository.

Download it here, or brew install --cask fulltimefeline/tap/sol-activity.


Website · Sol Activity · Sol API · Acknowledgements · Privacy

Sol is free software under the GNU General Public License v3.0 or later. You may use, study, modify and redistribute it, and any fork you distribute has to come with its source under the same terms.

Bundled third party components keep their own licences, all of them GPL-3.0 compatible. See THIRD-PARTY.md for the list and for why the version is 3.0 rather than 2.0.

联系我们 contact @ memedata.com