Logo wizaman's blog (legacy)

WMPが作るシステムファイル属性のアルバムアートを一括削除

February 11, 2017
3 min read
Table of Contents

普段Windowsを使っていて、隠しファイルは表示しているんですが、システムファイルは非表示にしてました。

そのせいで、Windows Media Playerが曲に埋め込まれているアルバムアートを、勝手に抜き出して同じディレクトリにシステムファイルとして縮小版を保存する、という挙動を勝手にしていることを見落としていました。

  • AlbumArtSmall.jpg
  • Folder.jpg

上記の2ファイルがシステムファイル属性で保存されます。こういう汚いファイルの散らかし方はいかにもMSだなぁ。

私はアルバムアートをfolder.jpgとして保存することがあって、それで上記ファイルと衝突して気が付きました(Windowsのファイルシステムではアルファベットの大小を区別しません)。

そんな感じで実際に不都合が生じているので、対処します。

ライブラリの自動登録をやめる

ファイル再生時にライブラリに勝手に登録された結果として、ライブラリで使うために勝手にファイル生成されるようです。

なので、WMPのライブラリを使ってない私は、ライブラリの自動登録を切ります。

  1. WMPのメニューバーから「ツール」→「オプション」を選択
  2. オプションダイアログで「プレイヤー」タブを開く
  3. 「ローカルメディアファイルを再生するときライブラリに追加する」のチェックを外す

ついでに余計にライブラリに登録されてしまってるファイルがあれば登録解除しておきます。

不要なアートワークファイルを一括削除

勝手にファイル生成されなくなったので、あとは既に作成されたファイルを一括で削除します。自分で用意した画像は残したいので、システムファイル属性のものだけ消します。

これぐらいならサクッとPython3で書けます。Windows独自のファイル属性を扱うため、pywin32を利用しています。

RemoveHiddenArtworks.py

#!python3
# -*- coding: utf-8 -*-
 
'''
WMPに勝手に作られるシステムファイル属性のアートワークを一括削除
 
参考)
    - [GetFileAttributes 関数](https://msdn.microsoft.com/ja-jp/library/cc429313.aspx)
'''
 
targetFiles = [
    'AlbumArtSmall.jpg',
    'Folder.jpg',
]
 
import os, sys
 
# Python for Windows Extensions(pywin32)の導入が必要
import win32api, win32con
 
def isTargetName(name):
    name = name.lower()
    for target in targetFiles:
        if name == target.lower():
            return True
    return False
 
def isSystemFile(path):
    attr = win32api.GetFileAttributes(path)
    if attr < 0:
        return False
    if attr & win32con.FILE_ATTRIBUTE_SYSTEM > 0:
        return True
    return False
 
def main():
    os.chdir(os.path.dirname(__file__))
    for root, dirs, files in os.walk('.'):
        for file in files:
            if not isTargetName(file):
                continue
            path = os.path.join(root, file)
            if not isSystemFile(path):
                continue
            print(path)
            os.remove(path)
    input('Press Enter...')
 
if __name__ == '__main__':
    main()