見出し画像

スクリプトを使ってiTunesをいじった話

あれは夢だったか・・・

iTunesのバグのくだりは、今やってみても再現しないので、きっと夢で見た話です。


Track 10 (Left Handshake)

Skinny Puppyの『Last Rights』というアルバムをiTunesで聴いていた時、画面を見て気がついた。
10曲目の再生回数だけが上がっていない。おかしい。

この曲(?)はそもそも曰くつきで、権利関係の問題で削除されているんだけど、削除されていないという。
曲は削除されているんだけど、CD上はゼロ秒の曲として残っています。Track 10がゼロ秒で残っていると。

さすがにSpotifyにはないですね。

ダブルクリックすると、再生したのかエラーなのかわからん感じで、一瞬で次の曲へ移動。再生回数は上がらず。

VBScriptで再生回数を修正

どうでもいいけど、見た目が気持ち悪いので、その昔どこかで拾ってきた VBScript で修正することにした。
(使用される場合は自己責任でお願いします。)

Option Explicit

Dim iTunesApp       ' iTunes.Application
Dim SelectedTracks  ' iTunes上で選択されている曲(複数選択可)
Dim i               ' カウンター
Dim TargetTrack     ' 処理対象の曲
Dim NewPlayedCount  ' 新しい再生回数

Set iTunesApp = WScript.CreateObject("iTunes.Application")
Set SelectedTracks = iTunesApp.SelectedTracks
For i = 1 To SelectedTracks.Count
    Set TargetTrack = SelectedTracks.Item(i)
    NewPlayedCount = InputBox(TargetTrack.Name, "新しい再生回数の設定", TargetTrack.PlayedCount)
   If Trim(NewPlayedCount) <> "" And isNumeric(NewPlayedCount) = True Then
        TargetTrack.PlayedCount = NewPlayedCount
    End If
Next

iTunesのバグか?

しかし、、、反応しない。iTunesの仕様が変わったか?
Windowsの仕様が変わったか?
キーワードをあれこれ変えながらネット検索すること数日。
こんな記事を見つけました。

まさにこれや―、と歓喜!

Set SelectedTracks = iTunesApp.BrowserWindow.SelectedTracks

BrowserWindowを挟むと回避できるのね。
2009年の記事!そんな前からこんな状態か。
確かにPowerShellでデバッグしてみると、 iTunesApp.SelectedTracks は null になってる。

いつの間にか問題は解消されていた

それから数カ月後、せっかくだから記事にしてみるかと書き始め、件の10曲目をダブルクリックする。
あれ?再生回数上がるやん。
再生時間が短すぎてカウントされんのかと思ったけど、そうでもない。
しかも、BrowserWindow挟まんスクリプトで再生回数が更新されるやん。

iTunesのバージョンを確認すると「12.13.3.2」
2024/9/19リリースとなってる。
(この記事執筆の1週間前。自動更新にしておいたのが仇になったか。良かったのか。)
このタイミングでバグ修正された?まじで?ググっても分からん。
そもそもこんな機能使う人おらんのやろうな。

おまけのPowerShell版

おまけでPowerShellに移植しました。
といっても中でVB使ってます。InputBox使いたいので。
自己責任で使用をお願いします。
PowerShellだと起動するのが面倒ですよね。

Set-PSDebug -Strict
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"

# PowerShellでVisualBasicを利用する
Add-Type -AssemblyName Microsoft.VisualBasic

# iTunes アプリケーションのオブジェクトを作成
$iTunesApp = New-Object -ComObject iTunes.Application
$SelectedTracks = $iTunesApp.SelectedTracks

# 各トラックに対して処理を行う
foreach($TargetTrack in $SelectedTracks) {
    # 新しい再生回数の入力を要求するダイアログを表示
    $NewPlayedCount = [Microsoft.VisualBasic.Interaction]::InputBox(
        "現在の再生回数: $($TargetTrack.PlayedCount)`n新しい再生回数を入力してください。",
        "新しい再生回数の設定",
        $TargetTrack.PlayedCount.ToString()
    )

    # 入力がキャンセルされなかった場合
    if ($NewPlayedCount -ne "") {
        # 数値かどうかをチェック
        if ([int]::TryParse($NewPlayedCount, [ref]$null)) {
            # 新しい再生回数を設定
            $TargetTrack.PlayedCount = [int]$NewPlayedCount
        } else {
            # 数値でない場合の警告を表示
            [System.Windows.Forms.MessageBox]::Show("無効な入力です。再生回数は数値でなければなりません。", "エラー")
        }
    }
}

MSはInputBoxを自作せよと

MS公式はInputBoxを自作する方法を教えてくれてるんですが、めんどくさい。

さらに詳しく知りたい人は

iTunes COM Interfacesについての資料は、Apple Developer のサイトでダウンロードできます。

ログインしないと見れないけど、アカウント持ってる人は、
https://developer.apple.com/download/all/?q=iTunes%20COM で検索。

おしまい

なんだ、夢か。という話でした。
ちゃんちゃん

この記事が気に入ったらサポートをしてみませんか?