YouTube の URL から音声をダウンロードする macOS アプリ。
Tauri 2 製。既定では m4a(変換なし・高音質) で保存するため yt-dlp
だけで動作します。mp3 が必要なときだけ、オプションを ON にした時点で変換用の ffmpeg を
各自の環境へ自動ダウンロードします(ffmpeg は同梱していません)。
Important
このソフトウェアは、自分が権利を持つコンテンツや、ダウンロードが許諾されている/ 著作権の制限を受けないコンテンツ(自作物・パブリックドメイン・クリエイティブ・コモンズ等)を 個人的に扱うことを目的とした学習・実験用のツールです。
- 各動画サービスの利用規約(YouTube では原則、事前の許可なくダウンロードを禁止)を確認し、遵守してください。
- 著作権者の許諾なく、著作物をダウンロード・複製・再配布する行為は法律で禁止されています。 日本では、違法にアップロードされた著作物と知りながらダウンロードする行為は、私的使用目的であっても違法となる場合があります。
- 本ツールの利用によって生じたいかなる損害・法的責任についても、作者は一切の責任を負いません(MIT ライセンスの無保証条項に基づく)。
- 利用者は、自身の責任において、適用される法令および各サービスの規約の範囲内で本ツールを使用するものとします。
This is a personal/educational utility intended only for content you own or are otherwise permitted to download. Respect the terms of service of each platform and all applicable copyright laws. The author assumes no liability for any use of this software.
開発環境やターミナルは不要です。ビルド済みアプリをダウンロードするだけで使えます。
- 直接ダウンロード:Sonora_1.0.0_universal.dmg
- 対応環境:macOS 11 以降(Intel / Apple Silicon 両対応)
- 上のリンクから
.dmgをダウンロードして開く Sonora.appを「アプリケーション」フォルダにドラッグ- 初回だけ:
Sonora.appを 右クリック →「開く」→ ダイアログで「開く」- このアプリは Apple の公証をしていないため、初回はそのままダブルクリックすると 「開けません」と表示されます。**右クリック →「開く」**なら起動できます(2回目以降は普通にダブルクリックでOK)。
- うまくいかない場合は、ターミナルで次を実行してから起動してください:
xattr -dr com.apple.quarantine /Applications/Sonora.app
mp3 で保存したいときは、アプリ内で「mp3 に変換する」を ON にすると、初回だけ変換用の ffmpeg(約 45MB)が自動でダウンロードされます。m4a(既定)はそのまま使えます。
開発者向けに自分でビルドする方法は 開発・ビルド を参照してください。
- アプリを起動し、YouTube の URL を貼り付ける
- 保存先フォルダを選ぶ(既定はダウンロードフォルダ)
- 形式を選ぶ
- 既定 = m4a(変換なし・高音質・すぐ落とせる・ffmpeg 不要)
- 「mp3 に変換する」を ON = mp3(最高音質)。初回 ON のときだけ ffmpeg の取得確認が出る(取得後は次回以降そのまま使える)
- **「ダウンロード」**を押す。進捗バーとログで状況がわかる
- 完了後、「ダウンロード済み」の項目をクリックすると Finder で表示される
URL に &list=... や &start_radio=1 が含まれていると、自動で曲一覧が表示されます。
- 各曲は既定でチェック済み。落としたくない曲のチェックを外す
- 「全選択 / 全解除」で一括切り替え
- チェックした曲だけダウンロードされる
list=を含まない単体 URL は、そのまま 1 本だけ取得
ここから下はソースから動かす人向けの情報です。
git clone https://github.com/machida/Sonora.git
cd Sonora
npm install
# yt-dlp の macOS universal バイナリを取得し、実行確認して配置する
npm run setup:yt-dlpffmpeg は同梱しません。アプリ内で mp3 オプションを ON にしたときに自動取得されます。
YouTube 側の変更により、古い yt-dlp では動画データ取得時に HTTP 403 になることがあります。
開発開始時と配布ビルドの直前に npm run setup:yt-dlp を実行し、最新版を同梱してください。
必要ツール:
- Node.js / npm
- Rust(cargo)
- Tauri CLI(
devDependenciesに含まれる) - librsvg(
rsvg-convert)… アイコン再生成で SVG を PNG に書き出す場合のみ(brew install librsvg)
npm run tauri dev # ホットリロード付きIntel / Apple Silicon 両対応の universal バイナリでビルドする(配布用)。
# 初回のみ:x86_64 ターゲットを追加
rustup target add x86_64-apple-darwin
npm run tauri build -- --target universal-apple-darwin成果物は src-tauri/target/universal-apple-darwin/release/bundle/ に生成される。
bundle/macos/Sonora.appbundle/dmg/Sonora_<version>_universal.dmg
Apple Silicon 専用でよければ
npm run tauri build(ターゲット指定なし)でも可。 その場合の成果物はsrc-tauri/target/release/bundle/.../Sonora_<version>_aarch64.dmg。
注意: 必ずプロジェクトルート(
Sonora/)で実行すること。 別ディレクトリでnpm run tauri buildするとpackage.jsonが見つからずエラーになる。
git tag -a v1.0.0 -m "Sonora v1.0.0"
git push origin v1.0.0
gh release create v1.0.0 \
src-tauri/target/universal-apple-darwin/release/bundle/dmg/Sonora_1.0.0_universal.dmg \
--title "Sonora v1.0.0" --notes "(リリースノート)"リリースノートには、上記の 免責事項・利用上の注意も併記しておくとよい。
ad-hoc 署名(公証なし)。自分の Mac では問題なく起動するが、他人の Mac に配布すると初回に Gatekeeper の警告が出る(→ 右クリック →「開く」で回避)。警告なしの配布には Apple Developer ID による署名+公証が必要。
bundle_dmg.sh でエラーになるときは、前回の中断で一時 DMG がマウントされたまま残っている
ことが多い。以下で解除・削除してから再ビルドする。
hdiutil info | grep Sonora # マウント中の image-path を確認
hdiutil detach /dev/diskN -force # 該当ディスクを解除
rm -f src-tauri/target/**/bundle/macos/rw.*.dmgSonora/
├── ui/ フロントエンド(HTML/CSS/JS、バニラ)
│ ├── index.html
│ ├── main.js UI イベント → Rust コマンド呼び出し
│ └── styles.css テーマ(スレート背景+パープルのアクセント)
├── src-tauri/
│ ├── src/lib.rs バックエンド本体(コマンド定義とイベント emit)
│ ├── src/main.rs エントリポイント
│ ├── bin/ yt-dlp を置く場所(リポジトリには含めず取得する。ffmpeg は同梱しない)
│ ├── icons/ 生成済みアプリアイコン(各サイズ)
│ ├── tauri.conf.json Tauri 設定
│ └── Cargo.toml
├── app-icon.svg アイコンの元データ(ここを編集して再生成)
├── app-icon.png app-icon.svg を 1024px に書き出したもの
├── package.json
└── dist/ ビルド済み成果物(.app / .dmg)の保管先
mp3 用の ffmpeg は同梱せず、実行時に各ユーザーの App Support (
~/Library/Application Support/local.machida.sonora/bin/ffmpeg)へ取得する。
fetch_playlist(url) -> Vec<Entry>…--flat-playlistで曲一覧(番号+タイトル)を取得。 単体動画や取得不可のときは空 Vec を返し、フロント側で通常 DL に倒す。 ラジオ等で取得に数十秒かかってもUIが固まらないよう async コマンドにし、 本体(fetch_playlist_blocking)はtauri::async_runtime::spawn_blockingで 別スレッドに逃がしてメインスレッド(UI)をブロックしないstart_download(url, outdir, items, mp3)…yt-dlpを起動して音声取得。mp3=falseは-f bestaudio[ext=m4a]/bestaudio(変換なし)、mp3=trueは-x --audio-format mp3 --audio-quality 0 --ffmpeg-location <App Support>/bin。items("1,3,5"形式)があれば--playlist-itemsで選択分のみ、無ければ--no-playlistffmpeg_ready() -> bool… mp3 変換用の ffmpeg が取得済みかを返す(UI 初期化に使用)ensure_ffmpeg()… ffmpeg を配布元から App Support 配下へ取得(既にあれば何もしない)。 ダウンロード中は一時ファイルのサイズから算出した進捗をffmpeg-progress(%) で emit。 async コマンド+spawn_blockingで UI を固めないreveal_in_finder(path)… 完成ファイルを Finder で選択表示(macOS のopen -R)- yt-dlp の場所は
resource_dir()/bin、ffmpeg はapp_data_dir()/binから解決 - Gatekeeper 対策として、起動前にバイナリの quarantine 属性を外し実行権限を付与
yt-dlpの標準出力を 1 行ずつ読み、progress/file/log/doneイベントを emit
- UI はスレート系のダークテーマにパープル(
#7c3aed)のアクセント。配色トークンはui/styles.cssの:rootにまとまっている - アプリアイコンの元データは
app-icon.svg(パープルのグラデ角丸スクエア+ 白い「再生+イコライザー」モチーフ)。macOS の慣習に合わせて squircle の周囲に 透明余白を持たせている(scale(0.8))
アイコンを変えたら、app-icon.svg を編集してから以下で全サイズを再生成する。
# 1024px の PNG を書き出し(任意。配布物に app-icon.png を残す用)
rsvg-convert -w 1024 -h 1024 app-icon.svg -o app-icon.png
# macOS / iOS / Android の全アイコン(icon.icns/.ico 含む)を src-tauri/icons へ生成
npx tauri icon app-icon.svgDock やウィンドウのアイコンはビルド時に埋め込まれるため、再生成後は
npm run tauri build(または dev 再起動)で反映される。
このプロジェクト(Sonora)のソースコードは MIT ライセンス で提供します。
| バイナリ | 役割 | ライセンス | 取り扱い |
|---|---|---|---|
yt-dlp |
音声のダウンロード | Unlicense(パブリックドメイン相当) | src-tauri/bin/ に同梱 |
ffmpeg |
mp3 への変換(任意機能) | GPLv3 | 同梱しない。mp3 利用時に配布元から各自の環境へ自動ダウンロード |
ffmpeg(GPL) と本体ライセンスの関係
- 本アプリは ffmpeg / yt-dlp をライブラリとしてリンクせず、別プロセスとして起動して使います。 GPL のコピーレフト(派生物への伝播)は静的/動的リンク等で生じるもので、コマンド実行による 別プロセス連携には及びません。よってコード本体は MIT のままで問題ありません。
- さらに ffmpeg は配布物に同梱せず、mp3 を使うユーザーが配布元から直接ダウンロードする 方式にしています。Sonora 側で GPL バイナリを「再配布」しないため、GPLv3 の配布義務 (ライセンス全文や対応ソースの提供)は発生しません。
- 注意:ffmpeg バイナリを自前のサーバーやリリースに再ホストしたり、
.app/.dmgに 同梱したりすると、その時点で「配布」にあたり GPLv3 遵守が必要になります。現行の 「実行時に配布元から取得」を維持してください。 - (※将来
libav*を自前バイナリへ静的リンクする構成に変えた場合は、GPL が本体にも及びます。)