Apple Music クラウドライブラリへのMP3アップロード方法草案
Go 単体で「直接」Apple Music のクラウドライブラリへ MP3 ファイルをアップロードすることは、残念ながら Apple の公開 API ではサポートされていません。しかし、ローカルの Music(旧 iTunes)アプリを操作してファイルをインポートし、結果として iCloud Music Library(Apple Music/iTunes Match)と同期させる、という“間接的”な方法なら可能です。
以下、大きく 2 つのアプローチ例をご紹介します。
1. macOS:AppleScript + osascript 経由で Music アプリを操作
macOS の Music(旧 iTunes)アプリは AppleScript を通じて「ファイルをライブラリに追加」できます。Go からは exec.Command("osascript", …) を呼び出して AppleScript を実行します。
package main
import (
"fmt"
"os/exec"
"path/filepath"
)
// importMP3 は、引数で渡された MP3 ファイルを Music アプリのライブラリに追加します
func importMP3(path string) error {
// AppleScript の命令を生成
// POSIX file でファイルパスを指定し、library playlist 1 (ライブラリ) へ追加
script := fmt.Sprintf(`tell application "Music"
add POSIX file "%s" to library playlist 1
end tell`, filepath.Clean(path))
// osascript を使って AppleScript を実行
cmd := exec.Command("osascript", "-e", script)
out, err := cmd.CombinedOutput()
if err != nil {
return fmt.Errorf("osascript error: %w\n%s", err, string(out))
}
return nil
}
func main() {
mp3 := "/Users/you/Music/mytrack.mp3"
if err := importMP3(mp3); err != nil {
fmt.Println("Import failed:", err)
} else {
fmt.Println("Imported:", mp3)
}
}
- osascript が AppleScript を起動
- Music アプリに対して「このファイルをライブラリに追加して」と指示
- Music 側で iCloud Music Library が有効なら自動的にクラウドへ同期されます
- macOS で Music(または iTunes)アプリがインストールかつ初期設定済みであること
- iCloud Music Library(Apple Music または iTunes Match)をオンにしていること
2. Windows:iTunes COM オートメーションを Go から呼ぶ
Windows 上の iTunes には COM インターフェースがあり、Go では go-ole などのパッケージを使って呼び出せます。概要:
import (
"fmt"
"github.com/go-ole/go-ole"
"github.com/go-ole/go-ole/oleutil"
)
func importMP3Windows(path string) error {
ole.CoInitialize(0)
defer ole.CoUninitialize()
unknown, err := oleutil.CreateObject("iTunes.Application")
if err != nil {
return err
}
itunes, err := unknown.QueryInterface(ole.IID_IDispatch)
if err != nil {
return err
}
// ライブラリプレイリスト取得
lib := oleutil.MustGetProperty(itunes, "LibraryPlaylist").ToIDispatch()
// AddFile メソッドでファイルを追加
_, err = oleutil.CallMethod(lib, "AddFile", path)
return err
}
func main() {
if err := importMP3Windows(`C:\Music\song.mp3`); err != nil {
fmt.Println("Failed:", err)
} else {
fmt.Println("Imported to iTunes:", `C:\Music\song.mp3`)
}
}
まとめ
どちらの環境をお使いか(macOS vs. Windows)で手法が変わりますが、ご参考になれば幸いです!もしより深い実装サンプルやトラブルシュートが必要でしたらお知らせください。
← Go home