2011/01/19

MediaMonkeyを使ってPCとAndroidの音楽を同期させる(m3u・オートプレイリスト・PlayQ対応) [Win][Ar]

このエントリーをはてなブックマークに追加 0 comment
[ , , , , , ]
この方法でできること
・PCとAndroidの音楽ファイルの同期。
・Android上でもフォルダ構造を維持できる。
・フォルダ内m3uや、オートプレイリストもそのままAndroid上で使える。
・変更されたファイルだけ処理されるので、同期時間が短い。
・MeridianのPlayQ(独自プレイリスト)だと、Androidのプレイリストに影響されない。
普通のプレイリストだと、プレイリストショートカットを作っても
メディアの再スキャン時(特にカスタムROM入れ直し時とか)にショートカットリンクがバラバラになる。

MediaMonkeyはiPhone4でもAndroidでも音楽を同期できるので、かなり使える。
iPhone4と同期できるフリーソフトは珍しいのに、これに言及しているサイトがあまりないのは何故だろう。
オートプレイリストの条件設定がWinampとかより断然細かく指定できるので、有料版かなりオススメ。元は取れると思う。
ファイル同期に関しては、フォルダ構造管理型の音楽プレイヤー全般で使える技。

多分MediaMonkeyのスクリプトを書き換えてまでカスタマイズしてる人はそうそういないだろうな。

※PlayQに関しては日本語を含むファイルが再生できませんでした。URL変換がMeridianの仕様と違うようです。解決法見つけました。暇ができたら変換スクリプト作成するかもです。

変更履歴:
2010/1/19 「Automatically export playlists」でのエラー回避追加
2010/1/19 「Export M3Us/Create Playlists for Child Nodes」がVersion 3.4に上がったので、行番号は微妙にずれるかも。
2010/1/19 非公式MediaMonkey Portable 3.2.4.1304 Development Test 1でも正常動作確認

↓以下設定方法(かなり長い)↓

MediaMonkeyをインスコ

MediaMonkey本体だけではShiftJISのプレイリストしか出力できないので、
Export M3Us/Create Playlists for Child Nodes(UTF-8のm3uを出力できるアドオン)をインスコ
(執筆時点でVersion 3.3)
なぜUTF-8にする必要があるかは今後書く予定。

上記2つを入れた後、
C:\Program Files\MediaMonkey\Scripts\Auto\ExportM3UsForSubNodes.vbsをひたすら編集。
プログラム解析するのに2,3日かかった orz

ピンク字はMeridianのPlayQとしてプレイリストをエクスポートするときのみ実行する。  

●直接は関係ないが、「Automatically export playlists」でのエラー回避
Sub oPrgTimer_OnTimerの(1193行目)をコメントアウト
        'oTimer.Enabled = False


★Sub CreatePlsExportM3Usの入ってすぐ(元1768行目)に以下を追記
    Dim oDelFile
    Dim oShell
    Dim Folder
    Dim FolderItems

★Set oFileSys = SDB.Tools.FileSystemの前の行(元1842行目)に以下を追記
    '元からあったプレイリストファイルを削除
    Set oDelFile = CreateObject("Scripting.FileSystemObject")
    Set oShell = CreateObject("Shell.Application")
    Set Folder = oShell.NameSpace(sCurPath)
    Set FolderItems = Folder.Items()
    If bUrlPaths Then
        FolderItems.Filter &H40,(oDelFile.GetFileName(sCurPath & "*.mpq"))
        If FolderItems.Count <> 0 Then
            oDelFile.DeleteFile sCurPath & "*.mpq"
        End If
    Else FolderItems.Filter &H40,(oDelFile.GetFileName(sCurPath & "*.m3u"))
        If FolderItems.Count <> 0 Then
            oDelFile.DeleteFile sCurPath & "*.m3u"
        End If
    End If

★プレイリストの階層構造をセパレータで記述しない場合は以下も実行
Function ScanSubNodes内のsSubPath = sSubFolderの行(元2084行目)を以下の文に置換
                    'セパレータがない場合
                    If InStr(sSubFolder, sNodeSeparat) = 0 Then
                        sSubPath = Left(sCurPath, InStrRev(sCurPath, "\", Len(sCurPath), 1)) _
                          & Right(sSubFolder, Len(sSubFolder) - InStrRev(sSubFolder, "\", Len(sSubFolder), 1))
                    'セパレータがある場合
                    Else
                        sSubPath = Left(sCurPath, InStrRev(sCurPath, "\", Len(sCurPath), 1)) _
                          & Right(sSubFolder, Len(sSubFolder) _
                          - InStrRev(sSubFolder, sNodeSeparat, Len(sSubFolder), 1) _
                          - Len(sNodeSeparat) + 1)
                    End If

★MeridianのPlayQに対応させるには以下も実行
Sub CreatePlsExportM3Us内oStream.Charset = "UTF-8"(元1838行)を以下に置換
            If bUrlPaths Then
                oStream.Charset = "Shift_JIS"
            Else
                oStream.Charset = "UTF-8"
            End If

Function ExportTracks内のElse sFileText = ""(元2256行)の前に以下の文を挿入
    ElseIf bUrlPaths Then
        sFileText = "1" & sNewLine

同Function内sTextLine = "file:///" & CStr(sTextLine)の行(元2342行)を以下の文に置換
                    sTextLine = "LocalAudio<>file:///" & CStr(sTextLine)


ExportTracks内のSelect Case iFileFormat内のCase1(元2386~2403行)を以下に置換
            Case 1
                oStream.Type = adTypeText
                oStream.Open
                oStream.Position = 0
                oStream.WriteText sFileText
                If Not bUrlPaths Then
                    If Not bBOMark Then
                        oStream.Flush
                        oStream.Position = 0
                        oStream.Type = adTypeBinary
                        oStream.Position = 3 'Skip Byte-Order Mark
                        sFileText = oStream.Read()
                        oStream.Position = 0
                        oStream.Write sFileText
                        oStream.SetEOS
                    End If
                End If
                If bUrlPaths Then
                    oStream.SaveToFile sSubPath & ".mpq", adSaveCreateOverWrite
                Else
                    oStream.SaveToFile sSubPath & ".m3u", adSaveCreateOverWrite
                End If
              
                oStream.Close
            End Select


★スクリプトを反映させるためMM再起動


★アドオン設定
ツール→拡張機能→Exprt M3Us~→オプション→

「Export to single folder」にチェック、「Node separator」を「 --- 」にする。
    (セパレータはプレイリスト名で使わないような文字列ならおそらくなんでもOK)
「All sub-levels of nodes」にチェック
「UTF-8」と「BOM」にチェック 
URL paths in .m3u filesにチェック
「Replace paths in .m3u files」のところは、PC上での音楽ファイルのパスを削除するよう記述する。
   例えば、D:\MusicPCに音楽ファイルを入れているなら、
  「^.+\\MusicPC\\」 with: 「..\Music\」 /「^.+\\MusicPC\\」 with: 「mnt/sdcard/Music/」 
とする。(with内を空白にすると設定が初期設定に戻ってしまう)

「Skip export of nodes/folders」はお好みで。


★AndroidのSDとの同期設定
ツール→オプション→携帯オーディオ デバイス→
d_WMDM.dllのプラグインのチェックを外す
d_USBMass1.dllのプラグインのチェックを入れる
 
ツール→オプション→携帯オーディオ デバイス→設定→
 
自動同期リスト→とりあえず、音楽は全チェック
自動同期オプション→
「自動同期リストにない~」にチェック
「削除を確認」のチェックオフ(チェック入れるとMMの不具合で同期できない)
 
デバイス設定→
・「トラックの同期先」→「\Music\<フォルダ:1>\<ファイル名>」
<フォルダ:1>部分は音楽ファイルを置いているパスによって適宜変える。
・「プレイリストをコピー」のチェックオフ
・デバイス名→MM上で表示される名前。ドライブラベルと揃えると吉。
・ドライブ レター→「ー」
・ドライブ ラベル→AndroidのSDカードのドライブラベルを記述
ドライブラベル(ドライブ名)はエクスプローラでドライブ右クリ→プロパティから変更できる

=========ここまでは初回だけ設定すればOK===========


2回目以降は以下のことだけすればいい.。
前回の同期から変更されたファイルだけが同期処理されるっぽい。
★AndroidのSDと同期
・デバイス名のノードを右クリック→自動同期
・「プレイリスト」ノード右クリック→「Export M3Us for Child Nodes」→同期先フォルダ選択(通常は"E:\Playlists"/"E:\PlayQueues"

AndroidのSDがMMに認識されないときは、
・ドライブ レター→「ー」
・ドライブ ラベル→AndroidのSDカードのドライブラベルを記述
あたりをいじってみると認識されるようだ。

この方法編み出すまでに軽く1週間くらいかかった OTL

0 件のコメント: