preload
5月 14

お知らせl(2008/8/10) こちらにiTunes for Windows向け重複した曲を削除するソフトchutilを公開しました。


音楽ファイルはもっぱらiTunesで管理しているんだけど、音楽ファイルが重複している事がよくある。 最初は手動で削除していたけど、時間はかかるし、重複ファイルは増えるし。

重複した音楽ファイルを削除するフリーソフトもなかなか見つからないので、重複した音楽ファイルを削除するスクリプトをrubyで作ってみた。iTunesはCOMで操作できるので、とっても楽。 コードについて少し解説すると、曲名、アーティスト名、アルバム名が同一の音楽ファイルを、同じ曲として判断して、最初にみつかったファイル以外を削除しています。自分用につくったので、かなり大雑把な仕様ですが。あとは、煮るなり焼くなり好きしてください。

ActiveRuby 1.8.6 + iTunes 7.6にて動作確認。 コードは以下の通り。MITライセンスです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#  iTunes上の重複ファイルを削除する  itunesdup.rb
#  (c) 2008 demuyan
#
#  This code is freely distributable under the terms of an MIT-style license.
#  For details, see my web site: http://cocoa.jpn.org/
#
require 'win32ole'
 
$KCODE = 's'
 
# 重複した曲情報を削除する
def delete_music(music_list)
    music_list.keys.each do |key|
 
        # 同名のKeyがあれば、削除する
        if music_list[key].size > 1
            cnt = music_list[key].size
 
            # 最初に見つけた曲以外は削除する
            0.upto(cnt-2) do |i|
                mu = music_list[key].pop
                p "DELETE: #{mu.trackobj.Location}"
 
                # ファイルを削除する
                File.delete(mu.trackobj.Location) if File.exist?(mu.trackobj.Location)
 
                # プレイリストから削除する
                mu.trackobj.Delete
            end
 
        end
    end
 end
 
 ITTrackKindFile = 1
 
 # 初期化
 itunes_app = WIN32OLE.new('iTunes.Application')
 main_library = itunes_app.LibraryPlayList
 tracks = main_library.Tracks
 
 num_tracks = tracks.Count
 music_list = Hash.new
 music_info = Struct.new("MusicInfo", :name, :trackobj)
 
 num_tracks.downto(1) do |i|
 
 # 音楽ファイル情報を取り出す
 cur_track = tracks.Item(i);
 
 # 音楽ファイルとして存在する
 if cur_track.Kind == ITTrackKindFile
 
  # 曲名+アーティスト名+アルバム名をキーにする
key =  cur_track.Name+":"+cur_track.Artist+":"+cur_track.Album+":"
        music_list[key] = Array.new if music_list[key].nil?
        music_list[key] << music_info.new(cur_track.Name, cur_track)
 
    end
 
    # 適当なタイミングで重複ファイルを削除
    if i % 1000 == 0
        delete_music(music_list)
    end
 
end
 
# 残りの重複ファイルを削除する
delete_music(music_list)

ただ、このままじゃ使える人も限られるので、そのうちWindowsアプリとしてもリリースするつもり。 COMを使ったiTunesの扱い方も判ってきたしね。

参考サイト

COM Meets Ruby COMも操作できるWindows向けRuby(ActiveRuby)を配布している

iTunes Com for Windows SDK iTunesをCOMから操作するためのSDK。ヘルプファイルとサンプルプログラム(jscript)があります

関連記事

TrackBack URL :

コメントをどうぞ

Comments links could be nofollow free.