У каждого разработчика есть папка, в которую страшно заглядывать. У меня таких две: node_modules и Music_Old_2007_BACKUP_FINAL_2.

Вторая - это страшная археологическая свалка из MP3-файлов, которые я собирал с 2004 года. Тогда я был студентом, интернет - dial-up, и музыку мы таскали друг к другу на жестких дисках. Приходишь к другу с винтом на 40 гигов, уходишь с новой коллекцией. Рипы с кассет, записи с радио, треки непонятного происхождения с файлопомоек. Половина без тегов, четверть с тегами типа «Íåèçâåñòíûé èñïîëíèòåëü», остальное — Track01.mp3, New Folder (2)/asdf.mp3.

В какой-то момент я понял: либо я это разберу, либо оно так и умрет нераспознанным. Shazam на телефоне? Страшно представить, сколько времени уйдёт на 12 000 файлов. Значит, автоматизируем.

Проблема глубже, чем кажется

Казалось бы - возьми API Shazam, прогони файлы, получи результат. Но нет.

Проблема №1: Shazam не даёт публичный API

Официального API для разработчиков нет. Есть Apple Music API, но он про другое. Пришлось использовать реверс-инженерию - библиотеку shazamio, которая эмулирует запросы мобильного приложения.

Проблема №2: Качество исходников

Мои файлы — это не FLAC с винила. Это 128 kbps рипы, записи с радио с обрезанными началами, треки с артефактами от древних кодеков. Shazam такое не всегда переваривает.

Проблема №3: Скорость

12 000 файлов × 5 секунд на распознавание = 16+ часов. А если делать последовательно и сеть моргнёт — начинай сначала.

Проблема №4: Что делать с результатом?

Получить название трека - полдела. Надо ещё записать теги, переименовать файл, разложить по папкам. И не сломать то, что уже было размечено.

Архитектура решения

Я разбил задачу на три слоя:

┌─────────────────────────────────────────────────────┐
│                   recognize.py                       │
│         CLI-интерфейс, точка входа                  │
├─────────────────────────────────────────────────────┤
│                    music.py                          │
│    Бизнес-логика: конвертация, теги, организация    │
├─────────────────────────────────────────────────────┤
│                 async_music.py                       │
│      Асинхронное распознавание через Shazam         │
└─────────────────────────────────────────────────────┘

Асинхронность — наше всё

Главное узкое место — сеть. Пока ждём ответ от Shazam, можно отправить следующий запрос. Поэтому ядро системы — асинхронное:

import asyncio
from shazamio import Shazam

class AsyncMusicRecognizer:
    def __init__(self, max_concurrent: int = 5):
        self.shazam = Shazam()
        self.semaphore = asyncio.Semaphore(max_concurrent)
    
    async def recognize_file(self, file_path: str) -> dict | None:
        async with self.semaphore:  # Не больше 5 одновременных запросов
            try:
                result = await self.shazam.recognize(file_path)
                if result and 'track' in result:
                    track = result['track']
                    return {
                        'title': track.get('title'),
                        'artist': track.get('subtitle'),
                        'album': track.get('sections', [{}])[0].get('metadata', [{}])[0].get('text'),
                        'year': self._extract_year(track),
                        'genre': track.get('genres', {}).get('primary'),
                    }
            except Exception as e:
                logging.warning(f"Failed to recognize {file_path}: {e}")
            return None
    
    async def recognize_batch(self, files: list[str]) -> dict[str, dict]:
        tasks = [self.recognize_file(f) for f in files]
        results = await asyncio.gather(*tasks, return_exceptions=True)
        return {f: r for f, r in zip(files) if r and not isinstance(r, Exception)}

Семафор — ключевой момент. Без него можно легко получить бан от Shazam за слишком агрессивные запросы. 5 параллельных запросов — эмпирически подобранный баланс между скоростью и стабильностью.

Конвертация: не все форматы одинаково полезны

Shazam принимает не всё подряд. Лучше всего работает с WAV и MP3. А у меня в коллекции — WMA, OGG, FLAC, M4A и даже пара APE-файлов (привет, 2005 год).

from pydub import AudioSegment
import os

class MusicService:
    SUPPORTED_FORMATS = {'.mp3', '.wav', '.ogg', '.flac', '.m4a', '.wma', '.aac'}
    
    def convert_to_mp3(self, input_path: str, output_dir: str = None) -> str:
        """Конвертирует аудио в MP3 для распознавания."""
        ext = os.path.splitext(input_path)[1].lower()
        
        if ext == '.mp3':
            return input_path
        
        if ext not in self.SUPPORTED_FORMATS:
            raise ValueError(f"Unsupported format: {ext}")
        
        # Определяем выходной путь
        output_dir = output_dir or os.path.dirname(input_path)
        base_name = os.path.splitext(os.path.basename(input_path))[0]
        output_path = os.path.join(output_dir, f"{base_name}_converted.mp3")
        
        # Конвертируем
        audio = AudioSegment.from_file(input_path)
        audio.export(output_path, format='mp3', bitrate='192k')
        
        return output_path
    
    def convert_files_to_mp3(self, directory: str) -> list[str]:
        """Массовая конвертация директории."""
        converted = []
        for root, _, files in os.walk(directory):
            for file in files:
                if os.path.splitext(file)[1].lower() in self.SUPPORTED_FORMATS:
                    try:
                        result = self.convert_to_mp3(os.path.join(root, file))
                        converted.append(result)
                    except Exception as e:
                        logging.error(f"Conversion failed for {file}: {e}")
        return converted

Тегирование: уважай чужой труд

Когда Shazam вернул результат, надо записать теги. Но есть нюанс: файл мог быть уже частично размечен. Может, я вручную подписал исполнителя, но не знал названия альбома. Не хочется затирать эту информацию.

from mutagen.easyid3 import EasyID3
from mutagen.id3 import ID3, ID3NoHeaderError

class TagService:
    def apply_tags(self, file_path: str, metadata: dict, overwrite: bool = False):
        """Применяет теги к файлу."""
        try:
            audio = EasyID3(file_path)
        except ID3NoHeaderError:
            audio = EasyID3()
            audio.save(file_path)
            audio = EasyID3(file_path)
        
        tag_mapping = {
            'title': 'title',
            'artist': 'artist',
            'album': 'album',
            'year': 'date',
            'genre': 'genre',
        }
        
        for meta_key, tag_key in tag_mapping.items():
            if meta_key in metadata and metadata[meta_key]:
                # Записываем только если тег пустой или разрешена перезапись
                existing = audio.get(tag_key, [''])[0]
                if overwrite or not existing or existing == 'Unknown':
                    audio[tag_key] = str(metadata[meta_key])
        
        audio.save()

Флаг overwrite=False по умолчанию — уважение к моим прошлым усилиям по разметке.

CLI: для тех, кто любит терминал

#!/usr/bin/env python3
"""
Music Recognition CLI
Распознавание музыки через Shazam с автоматическим тегированием.

Использование:
    python recognize.py /path/to/music
    python recognize.py /path/to/music --organize --output ./sorted
"""

import argparse
import asyncio
from pathlib import Path

def main():
    parser = argparse.ArgumentParser(description='Bulk music recognition via Shazam')
    parser.add_argument('path', help='Path to audio file or directory')
    parser.add_argument('--organize', action='store_true', help='Organize files into Artist/Album structure')
    parser.add_argument('--output', '-o', help='Output directory for organized files')
    parser.add_argument('--dry-run', action='store_true', help='Show what would be done without making changes')
    parser.add_argument('--concurrent', '-c', type=int, default=5, help='Max concurrent requests')
    
    args = parser.parse_args()
    
    path = Path(args.path)
    if not path.exists():
        print(f"Error: {path} does not exist")
        return 1
    
    # Собираем файлы
    if path.is_file():
        files = [str(path)]
    else:
        files = [str(f) for f in path.rglob('*') if f.suffix.lower() in AUDIO_EXTENSIONS]
    
    print(f"Found {len(files)} audio files")
    
    # Запускаем распознавание
    recognizer = AsyncMusicRecognizer(max_concurrent=args.concurrent)
    results = asyncio.run(recognizer.recognize_batch(files))
    
    recognized = sum(1 for r in results.values() if r)
    print(f"Recognized: {recognized}/{len(files)} ({recognized/len(files)*100:.1f}%)")
    
    # Применяем теги
    if not args.dry_run:
        tag_service = TagService()
        for file_path, metadata in results.items():
            if metadata:
                tag_service.apply_tags(file_path, metadata)
                print(f"Tagged: {metadata['artist']} — {metadata['title']}")
    
    return 0

if __name__ == '__main__':
    exit(main())

Грабли, на которые я наступил

1. Rate limiting

Первая версия работала быстро. Слишком быстро. После ~200 запросов Shazam начинал возвращать ошибки. Решение — семафор + случайные задержки:

async def recognize_file(self, file_path: str) -> dict | None:
    async with self.semaphore:
        await asyncio.sleep(random.uniform(0.5, 1.5))  # Антибан
        # ... остальной код

2. Кодировки в тегах

Старые MP3 — это кладезь кривых кодировок. Íåèçâåñòíûé — это «Неизвестный» в CP1251, прочитанный как Latin-1. Пришлось добавить эвристику:

def fix_encoding(self, text: str) -> str:
    """Пытается исправить кривую кодировку."""
    if not text:
        return text
    
    # Типичные паттерны кривой кодировки
    try:
        # CP1251 → Latin-1 → UTF-8
        fixed = text.encode('latin-1').decode('cp1251')
        if self._is_readable(fixed):
            return fixed
    except (UnicodeDecodeError, UnicodeEncodeError):
        pass
    
    return text

def _is_readable(self, text: str) -> bool:
    """Проверяет, что текст содержит читаемые символы."""
    cyrillic = sum(1 for c in text if '\u0400' <= c <= '\u04FF')
    return cyrillic > len(text) * 0.3  # Хотя бы 30% кириллицы

3. Дубликаты

В моей коллекции один и тот же трек мог лежать в 5 разных папках с разными именами. После распознавания получаем 5 файлов с одинаковыми тегами. Решение — хеширование аудио:

import hashlib
from pydub import AudioSegment

def audio_hash(file_path: str, duration_ms: int = 30000) -> str:
    """Хеш первых 30 секунд аудио."""
    audio = AudioSegment.from_file(file_path)
    sample = audio[:duration_ms]
    return hashlib.md5(sample.raw_data).hexdigest()

4. Память

12 000 файлов × метаданные = потенциально много памяти. Решение — обработка батчами и запись промежуточных результатов:

BATCH_SIZE = 100

async def process_directory(self, directory: str, state_file: str = '.recognition_state.json'):
    """Обработка с сохранением состояния."""
    state = self._load_state(state_file)
    files = self._get_unprocessed_files(directory, state)
    
    for i in range(0, len(files), BATCH_SIZE):
        batch = files[i:i + BATCH_SIZE]
        results = await self.recognize_batch(batch)
        
        # Сохраняем промежуточное состояние
        state['processed'].extend(batch)
        state['results'].update(results)
        self._save_state(state_file, state)
        
        print(f"Progress: {i + len(batch)}/{len(files)}")

Теперь можно прервать процесс и продолжить с того же места.

Результаты

После прогона по моей коллекции:

  • 12 847 файлов обработано

  • 9 623 (74.9%) успешно распознано

  • 2 891 дубликат найден и удалён

  • ~6 часов общего времени работы

Оставшиеся 25% — это в основном:

  • Записи с радио с обрезанными началами

  • Ремиксы и бутлеги

  • Совсем уж экзотика, которую Shazam не знает

Что дальше

Этот проект — часть большей экосистемы для работы с аудио:

  1. music_recognition (этот проект) — распознавание

  2. audiobook-cleaner — очистка аудиокниг от шума через MDX-Net

  3. vinyl_pipeline — полный пайплайн оцифровки винила

У меня есть небольшая коллекция пластинок — в основном электроника 80-х уж не знаю как он оказался у родителей, но сейчас он мой. Идея в том, чтобы записать пластинку целиком, автоматически убрать щелчки и шум, нарезать на треки, распознать каждый и получить готовую цифровую коллекцию с правильными тегами.

А ещё я слушаю много аудиокниг — в основном sci-fi, пока пишу код. Лем, Стругацкие, иногда что-то современное. И качество записей бывает... разным. Отсюда и audiobook-cleaner — MDX-Net отлично справляется с фоновым шумом и артефактами сжатия.

Заключение

Иногда лучший проект — тот, который решает твою личную боль. Я потратил пару выходных на код, который сэкономил мне недели ручной работы. И попутно попрактиковался с реверс-инженерингом API и археологией кодировок.

Код открыт: github.com/formeo/music_recognition

P.S. Если у вас тоже есть папка «Music_OLD_FINAL_BACKUP_2» — вы знаете, что делать.

P.P.S. Да, в той папке нашёлся трек, который я искал лет 15. Это был какой-то немецкий транс из начала нулевых, записанный с «Радио Рекорд». Без названия, 128 kbps, но с правильными воспоминаниями. Теперь знаю — Cosmic Gate, «Exploration of Space». И с правильными тегами.

Комментарии (31)


  1. vcherney
    14.01.2026 23:10

    Увлекательная статья! Всегда душа радуется, когда кому-то удается с помощью программирования решить свою головную боль)


  1. aborouhin
    14.01.2026 23:10

    Остался последний этап автоматизации - настроить интеграцию с Рутрекером :) и перекачать оттуда всё в нормальном качестве полными альбомами на замену "128 kbps рипам, записям с радио с обрезанными началами, трекам с артефактами от древних кодеков"...

    P.S. У меня в старых папках с музыкой примерно в 10 раз больше треков, чем у Вас. Причём 50% - скрупулёзно размеченный тегами (включая выходные данные конкретного издания, обложки и пр.) FLAC, 50% - как придётся. В эпоху победившего стриминга заставить себя уделить время и привести вторую часть в соответствие со стандартами первой уже никак не получается...


    1. Heggi
      14.01.2026 23:10

      В эпоху победившего стриминга стало очень сложно найти где бы скачать оффлайн версии понравившихся треков хотя бы в каком-то качестве (тут процентов на 90 помогает ютуб мюзик, но не всегда), а хорошее качество (flac) обычно вообще без шансов.


      1. aborouhin
        14.01.2026 23:10

        Ну торренты-то никуда не делись. Иногда добавляю в оффлайн-коллекцию новые альбомы уже сохранённых там групп для полноты дискографии, реже что-то новое хочется тоже не только на Спотифае слушать, но и FLAC схоронить в закрома - ни разу сложностей с нахождением желаемого не испытывал.


        1. Heggi
          14.01.2026 23:10

          Увы, но с инди исполнителями или просто малоизвестными торренты помогают крайне редко. Ну или я просто не умею искать.


          1. aborouhin
            14.01.2026 23:10

            Мне с моими предпочтениями в основном хватает Рутрекера, безвременную кончину What.cd я даже не заметил :( Но если заморочиться, можно добыть инвайт на RED или Orpheus...

            Ещё пишут, что если поменять Spotify на Deezer, то (а) становится доступно больше лосслеса и (б) есть инструмент скачивать его оттуда в оффлайн (deemix). Не пробовал.

            Ну и совсем экзотика - Soulseek, тоже не пробовал, но хвалят.


            1. nnutts
              14.01.2026 23:10

              Для тех, кто до сих пор оплакивает несравненный what.cd, на случай, если не всем известно — его место надёжно заняли redacted.ch и orpheus.network


              1. aborouhin
                14.01.2026 23:10

                ...оба которых я упомянул во втором предложении своего комментария :)


      1. nidalee
        14.01.2026 23:10

        Все гораздо проще, чем вы думаете. Я лично качаю только FLAC-и, начал прошлым летом и успешно накачал 6144 трек от 919 исполнителей. Учитывая недавний слив Spotify, можете хоть всю их библиотеку скачать, если вам все равно, что хранить. А так: https://lidarr.audio/

        А стриминг проиграл в тот момент, когда копирасты решили, что могут по велению левой пятки убирать треки с определенных стримингов. Поскольку мне не доплачивают за то, чтобы я искал, где лежит тот или иной трек - я решил все качать и назад уже не вернусь.


        1. Heggi
          14.01.2026 23:10

          Интересная софтина, спасибо, попробую.

          То что стримминг проиграл из-за копирастов согласен. У самого избранное в спотифае изрядно похудело и продолжает худеть с каждым днем.

          Слив со спотика попробую найти, если удастся - значительно пополню свою оффлайн коллекцию


          1. nidalee
            14.01.2026 23:10

            Слив со спотика попробую найти, если удастся - значительно пополню свою оффлайн коллекцию

            На самом деле я вижу с релиза меты пока сами треки-то и не выложили. Ну будем посмотреть. В любом случае, лично у меня нет желания разгребать 300ТБ, проще качать то, что нужно.


          1. aborouhin
            14.01.2026 23:10

            Вроде, из скачанного Спотифая только метаданные выложили, сами файлы с музыкой только пообещали, но пока не начинали даже.


      1. aPiks
        14.01.2026 23:10

        Не знаю откуда, но в сети много музыки дернутой с Tidal в Hi-Res.


    1. Dr_Faksov
      14.01.2026 23:10

      в старых папках с музыкой примерно

      Знакомая ситуация. Когда-то давно тоже было. А потом произошло первое переосмысление. "Какого чёрта мучить уши и слушать разное г..?" спросил я себя. Отсортировал все MP3 по битрейту и удалил всё что меньше 192, не глядя на названия.. Думал вообще оставить только с 256, но очень уж жиденькая коллекция оставалась. После чего началась планомерная работа по замене худшего качества на лучшее и беспотерьное. Большей частью удалось.

      А потом произошло второе переосмысление. "Какого чёрта мучить себя и слушать разное г... только потому, что оно входит в тот-же альбом, где есть-то, что нравится?" И началась чистка... Я не буду спорить с теми кто, считает, что "альбом" это целое и неделимое художественное произведение, создаваемое автором в муках творчества. Я просто знаю, что в звукозаписи есть такое понятие как "наполнитель". И осталось у меня от некоторых альбомов по одной композиции. И обложки. Храню все обложки, что были с альбомами. Ещё скажу, что действительно есть альбомы из которых ничего не выкинешь. Но пересчитать их можно по пальцам.

      Ну и двойники, куда без них. Борьба была жёсткой. В ходе неё произошло третье переосмысление. О том, что гораздо проще искать двойников вручную, если имя трека имеет вид не "Миша ДжекаСын - Витю Ели Волки" а "ДжекаСын Миша - Витю Ели Волки". И было большое переименование. И почти нирвана. В ходе которой произошло четвёртое переосмысление. О том, что не все двойники - двойники. Одно и тоже произведение, записанное одним и тем-же исполнителем в разное время обычно звучит по разному. И часто трудно сказать, какое исполнение лучше. Так что просто стал добавлять год в имя трека.

      Сейчас у меня около 8 000 треков. В основном FLAС, с примесями МР3 и OGG. И есть подозрение, что каждый из них я угадаю с трех нот :) Хотя нет - колокольные звоны точно не угадаю. Да и с рэпом могут быть проблемы.


      1. aborouhin
        14.01.2026 23:10

        Я не буду спорить с теми кто, считает, что "альбом" это целое и неделимое художественное произведение, создаваемое автором в муках творчества.

        От жанра же зависит. У меня, наверное, треть оффлайн коллекции (общий размер которой ~120k треков) - progressive rock, progressive metal и около них. Ещё треть - просто классическая музыка (там другая боль, т.к. понятие "альбом" и традиционный набор тегов на неё натягивается с трудом). И там, и там в большинстве случаев из диска трека не выкинешь.


    1. LeVoN_CCCP
      14.01.2026 23:10

      Однажды засел за подобное и с тех пор у меня 100% полностью размеченной музыки, с тегами, альбомами, текстами (причём если кавер, то текст кавера) и т.п. Главная проблема которую я не решил - если у исполнителя у которого мне нравится много композиций выходит новый альбом - как это отслеживать? Пока кидаю текстовый файл с датой когда перебирал, хотя с другой стороны я ни разу не возвращался в музыке на "добрать нового", потому что или радио или случайно_услышал помогает.


      1. aborouhin
        14.01.2026 23:10

        если у исполнителя у которого мне нравится много композиций выходит новый альбом - как это отслеживать?

        Тут задача из двух частей состоит:

        а) как собрать список отслеживаемых исполнителей, если слушаем в разных местах, как через стриминг, так и из оффлайн-коллекций - тут ничего лучше старого доброго last.fm придумать не могу;

        б) как по полученному в п. "а" списку получать уведомления о новых релизах; раньше был сервис soundamus, который ровно это делал, но больше нет; но задачка, в целом, простая; можно встроенным функционалом того же last.fm пользоваться, прикрутив к нему уведомления в удобной форме; или для бóльшего охвата и контроля брать список новых релизов на каком-нибудь Allmusic и т.п.


        1. LeVoN_CCCP
          14.01.2026 23:10

          Да, я использовал ласт.фм, но в какой-то момент они что-то поменяли (уже не помню что) и я не мог больше использовать по потребности.
          Ну и плюс к этому, музыку перебирать всё же под настроение и должно быть время чтоб совпало. А придёт оповещение не вовремя (думаю 98% случаев) и забудешь о нём.


          1. aborouhin
            14.01.2026 23:10

            А придёт оповещение не вовремя (думаю 98% случаев) и забудешь о нём

            Опять же про старые добрые решения - слать оповещения по эл. почте, фильтровать эти письма в отдельную папочку и там оставлять непрочитанными или отмечать флажками/тегами.

            Ну или, можно, конечно, отдельную табличку завести в каком-нибудь Google Sheets и пополнять её, а потом отмечать статусы "новый", "послушал", "скачал", "оформил в лучшем виде и положил в коллекцию", "ерунда, такое мне не надо" и т.п. Но я бы не плодил сущности.


      1. nidalee
        14.01.2026 23:10

        https://lidarr.audio/ умеет отслеживать исполнителей и искать новые треки. Дергает он их через torznab с торрентов. Чем больше трекеров добавите - тем быстрее новый альбом появится.


        1. LeVoN_CCCP
          14.01.2026 23:10

          Поиск и добавление новых это малая часть. Я неудачно выразился, добавить ко мне значит:

          1. отследить, что новый появился и скачать во временную

          2. полностью его прослушать, чтоб понять что нравится и хочешь оставить

          3. полностью заполнить необходимые теги (включая картинки с определённым разрешением и тексты)

          Вот собственно проблема в 2 с недостатком времени и желания на это.


  1. beliy1
    14.01.2026 23:10

    На удивление мало проектов, которые распознают неизвестную музыку для целей тегирования. Я пользовался One Tagger - результат в моем случае где-то 95% попадания. Тоже юзает апи Шазам. Неприятное открытие - Шазам определяет иногда левые песни, неправильно и соответственно прописываются теги и обложка. Надо всегда перепроверять что оно там нашазамилось.

    Для разметки также mp3tag pro и Musicbrainz Pickard. У них есть зачаточные способы определения музыки по известным сигнатурам (не Шазам), плюс запрос в discogs на предмет обложек и тегов - иногда помогает, если One Tagger неправильно определил.


    1. rybnikov
      14.01.2026 23:10

      У OneTagger есть один косяк - он не может распознать альбом целиком, только по отдельным трекам. В итоге у меня получилась в некоторых альбомах мешанина - он треки в них отнес к разным альбомам, пришлось вручную править.

      Поэтому вернулся к старому доброму Pickard + mp3tag. Pickard круто работает с большим количеством файлов, сразу можно раскидать по альбомам и пакетно применить все изменения. Но там не всегда полная информация и нет интеграции с Discogs. И далее можно точечно поправить в mp3tag. В нем тоже можно работать по альбомам, хоть и не так удобно (Ctrl+G, запрос в Discogs,Ctrl+S, Ctrl+Shift+G).


  1. onets
    14.01.2026 23:10

    В Winamp был AutoTag


  1. BReal
    14.01.2026 23:10

    Круть! Попробую. Спасибо!


  1. Sazonov
    14.01.2026 23:10

    MusicBrainz пробовали? У них есть апи и достаточно простой сдк.


    1. formeo Автор
      14.01.2026 23:10

      Добрый день, нет не пробовал, идея вообще спонтанно родилась, смотрел на хаос музыки и подумал - дай попробую python все разобрать, даже не гуглил особо что то готовое, инетерсно было самому попробовать.
      Но спасибо за совет - посмотрю что там у MusicBrainz


  1. Caterpillar-KZ
    14.01.2026 23:10

    Пользовался https://Audiotag.info - всё устраивало, кроме капчи на распознавание


  1. Lissodelphis
    14.01.2026 23:10

    Прекрасная статья, я как-то делал скрипт чтобы плейлист с вк скачивал с ютуба. Но здесь реализация гораздо удобнее.


  1. KMiNT21
    14.01.2026 23:10

    Когда Shazam вернул результат, надо записать теги. Но есть нюанс: файл мог быть уже частично размечен
    ....
    Флаг overwrite=False по умолчанию — уважение к моим прошлым усилиям по разметке.

    А я бы вообще не рисковал. Проще сначала все папки отсканировать, прохэшировать, считав все тэги и записав все важное просто в dictionary (для простоты) и сдампить на диск. Затем уже прогнать через Шазам, заполняя в этом dictionary дополнительное поле с информацией от Шазама. И только на третьем этапе переименовывать файлы и заполнять теги, чтоб можно было или где-то откатиться (предыдущая информация вся останется на всякий случай, мало ли).


  1. Akr0n
    14.01.2026 23:10

    Тоже в студенчестве кайфовал от Exploration Of Space, даже название его вспомнил сейчас. Что самое интересное, Я.Музыка этот трек мне сама порекомендовала спустя лет эдак 20, так он и нашелся мне в коллекцию.