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)
    }
}
  • 動作
    1. osascript が AppleScript を起動
    2. Music アプリに対して「このファイルをライブラリに追加して」と指示
    3. 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 などのパッケージを使って呼び出せます。概要:

  • go-olego-ole/oleutil をインストール
  • iTunes の COM オブジェクトを生成し、LibraryPlaylist.AddFile(path) を呼ぶ
  • 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`)
        }
    }
    
  • 前提:Windows+iTunes がインストールされていること。

  • まとめ

  • 公開 Apple Music API では MP3 ファイルのアップロードは不可
  • ローカルの Music/iTunes アプリを自動操作(AppleScript または COM)することで、事実上「Go からライブラリに MP3 を追加→クラウド同期」することは可能
  • 上記スクリプトを適切にゴルーチン化/エラーハンドリングすれば、Go の CLI/バックエンドからバッチ的に MP3 をインポートできます
  • どちらの環境をお使いか(macOS vs. Windows)で手法が変わりますが、ご参考になれば幸いです!もしより深い実装サンプルやトラブルシュートが必要でしたらお知らせください。

    ← Go home