вторник, 4 сентября 2018 г.

Отключаем создание AlbumArtSmall и Folder.jpg в папках с музыкой

Отключаем AlbumArtSmall.jpg и Folder.jpg У всех, кто пользуется и не пользуется проигрывателем Windows Media Player (далее WMP), существует проблема. Некоторые пока не знают, что она существует, а для некоторых это (пока) не такая уж и проблема, но факт остаётся фактом: странные вещи происходят в вашей музыкальной коллекции, пока вы спите...


В чём проблема?

Последнее время нас активно пытаются подвязать на интернет-сервисы. Документы в онлайне, кино в онлайне, музыка... Но мы-то знаем, что ничего не заменит бережно оцифрованного во flac винила Metallica, правда? И чтобы качественно заслушать это чудо мы настраиваем ASIO, ставим сторонние плееры, но WMP, этот вездесущий проныра, везде суёт свой нос. И везде, где он побывал, в папках остаются мелкие скрытые файлики, где "кеширутся" извлечёные из ID3-тегов обложки альбомов и фотографии исполнителей:
neothe0ne:
"Windows or Windows Media Player 11 keep creating Folder.jpg and multiple AlbumArtSmall.jpg's in my music folders. (I haven't opened WMP in 2 years and all downloading information options are set to off). It may happen just from visiting the folder, or maybe clicking on the mp3's, I have no idea. How do you stop this behavior?" -- hydrogenaud.io
Для меня это стало кошмаром, когда я загрузил свою музыку на Яндекс.Диск. Каждый день я находил в ленте километры новых картиночек, любезно подготовленных WMP. И эта функция неотключаема! Никаких ключей реестра, групповых политик, советов в интернете. Избавиться от WMP тоже нельзя, это часть системы. Пришлось принять его таким, как он есть. На самом деле он добрый и пушистый. Со специфическими форматами у него не очень, зато он лучше многих играет DVD, читает и даже грабит в MP3 аудиодиски и отлично управляется с музыкальными библиотеками (попробуйте, кстати). Всё, что нужно для счастья - немного его поправить, вырезав желание метить территорию. Как и со всеми добрыми-пушистыми.

Прежде чем браться за скальпель, я конечно прикинул варианты. Откинув идею написать свой драйвер-фильтр файловой системы, я подумал, а что, если по аналогии с этим патчем сначала изучить структуру каталога данных WMP? У меня он содержит 1400 файлов. Что же такое там хранится?


Вариант первый


Идём по адресу "AppData\Local\Microsoft\Media Player" и находим любопытную папочку "Кэш файлов графики" (англ. "Art Cache"), а в ней - копии всех обложек AlbumArtSmall с уникальными именами. Сюрприз. Т.е. происходит следующее: WMP сканирует музыку, выдирает обложки из MP3, кеширует их в свою системную папку, а потом ещё раз - по месту прописки MP3. Свидетель обвинения А. утверждает, что лично сталкивался с миллионом файлов в кэше WMP, занявшими всё место на диске:
Андрей:
"У меня там за 6 лет накопилось более миллиона файлов jpg общим весом в 37гб!!! При этом родной проводник вин7 и программа TreeSizeProfessional показывают её как ПУСТУЮ! (...) Слов для разработчиков винды не хватает" - ithabits.ru
С каким же удовольствием я следил за исчезновением этого добра в корзине... После чего убедился, что WMP и его "Служба общих сетевых ресурсов" остановлены, удалил папку "Кэш файлов графики" и создал на её месте пустой файлик с тем же именем. Как обычно с WMP, это сработало. Более того, обломавшись при записи в кэш, он не стал делать попыток писать в альбомы с музыкой. Чистая победа!

Итак, первый способ решения проблемы: создать пустой файл "Кэш файлов графики" ("Art Cache") без расширения взамен одноимённой папки по адресу C:\Users\YourName\AppData\Local\Microsoft\Media Player. WMP по-прежнему будет считывать обложки альбомов, но перестанет их кешировать. Файлы Folder.jpg и AlbumArtSmall появляться перестанут, ура. Плюсы: просто и надёжно. Минусы: без кэша теоретически замедляется построение эскизов (не подтверждено), но если вы не пользуетесь режимом "Библиотека" в WMP, то для вас минусов нет.


Вариант второй


Разумеется, я пользуюсь режимом "Библиотека". Иначе стал бы я его вам советовать? Поэтому - скальпель. Оставим дизассемблер скучающим хакерам, ограничимся блокнотом Notepad++. Идея в том, что, раз уж исключения при выполнении файловых операций хорошо отлавливаются, и плеер не сыпет ошибками, то сделаем так, чтобы он всегда получал отказ, создавая очередной AlbumArtSmall.jpg. Найдём в бинарнике эти буквы и заменим один байт в середине: Alb?mArtSmall.jpg. Вопросительные знаки запрещены в именах Windows*. Вас отправят лесом, даже если вы - суперкрутое системное приложение и у вас есть (была) валидная подпись Microsoft.

Подумаем, где может располагаться этот текст. В "Program Files\Windows Media Player"? Возможно. Берём всю папку и перетягиваем в Notepad++. Блокнот заглатывает сотню файлов не подавившись. Бессменный Process Explorer от камрада Марка сигнализирует, что много библиотек подгружается также из SysWOW64. Выберем интересные и добавим их тоже. Сразу скажу, что по запросу AlbumArt нужный кусок не находится. Если что и находится, так это забавные комментарии от разработчиков, косвенно подтверждающие слухи о происхождении WMP откуда-то из индийского подразделения Microsoft:
Разработчик Microsoft: "...раньше я сохранял картинку в файл, чтобы узнать её размеры. Это работало в XP, но под семёркой Longhorn почему-то всегда выходит ноль... в общем, пришлось написать этот костыль."

Тут вспомним, что WMP - штука многоязычная, а значит строковые константы - в UTF16 LE для совместимости с API Windows, а значит после каждой буквы идёт нулевой байт. Забиваем в поиск выражение A\0l\0b\0u\0m\0A\0r\0t\0S\0m\0a\0l\0l\0.\0j\0p\0g, переключаем тип поиска на regexp, включаем "Учитывать регистр" и получаем несколько совпадений. Заменяем в каждом по одной букве на произвольную, сохраняем и смотрим, какая буква попадёт в название jpg-файла. Так выясняем, что за имя файла отвечает второе вхождение этой строки в wmp.dll, хотя если пропатчить все, хуже не станет. Меняем одну из букв на вопросительный знак. Готово!

Всего WMP генерирует пять видов файлов:
AlbumArtSmall.jpg
AlbumArt_{994C80AA-E4A4-43BF-8A65-B40C9DF0DA04}_Small.jpg
AlbumArtLarge.jpg 
AlbumArt_{994C80AA-E4A4-43BF-8A65-B40C9DF0DA04}_Large.jpg
Folder.jpg
 Соответственно проведём пять замен. Вторая ждёт нас рядом с первой, это строка _Small.jpg. Меняем на _Small.jp?. Тут же рядом третья, Folder.jpg. Остались AlbumArtLarge.jpg и _Large.jpg, но они встречаются в файле всего по одному разу, с ними проще.

Просто так сохранить проделанные изменения нам не дадут - владельцем wmp.dll является TrustedInstaller, группе администраторов даны только права на чтение. Поэтому выбираем владельцем файла себя и даём себе полные права ("Свойства файла - Безопасность - Дополнительно - Владелец - Изменить").
Теперь можно сохраняться, запускать плеер и проверять, что мы натворили. Сам wmp.dll не попадает под механизм защиты системных библиотек, возражений со стороны ОС не последует, хотя сам факт правки может быть обнаружен через sfc /scannow.

Решение №2: чтобы скрытые файлы Folder.jpg и AlbumArtSmall.jpg больше не появлялись, достаточно заменить 5 байт в библиотеке wmp.dll - самостоятельно, или скачав версию, пропатченную мной. Плюсы: не ломает кэширование (база картинок в системной папке проигрывателя). В режиме "Библиотека" эскизы подгружаются сразу. Минусы: при обновлении патч слетит.



Скачать


wmp.dll patched: https://yadi.sk/d/EUAK8OJcl9QvLQ 

В архиве - пропатченные библиотеки версий 12.0.7601.18741 и 23930. Поместите нужную в SysWOW64. Если у вас другая версия, придётся патчить самостоятельно, неправильную версию плеер не примет.

P.S. Думаю, не нужно напоминать о необходимости делать резервные копии файлов, с которыми вы собираетесь экспериментировать? В крайнем случае оригиналы wmp.dll разных версий можно иногда добыть из папки Windows\winsxs\wow64_microsoft-windows-mediaplayer-core.

Ну и приятная часть: стираем вот это всё. Теперь уже навсегда.

Обсуждение: