субота, 8 вересня 2007 р.

Перекодування тегів музичних файлів з CP1251 до UTF-8

Одна з основних неприємностей, що виникає перед користувачем Ubuntu (та й будь-якого Linux) після переходу на нього з Windows - це різні кодування символів прийняті у цих системах. Зокрема є проблеми з правильним відображенням mp3-тегів з кирилицею. Як відомо Windows використовує для роботи з кирилицею восьмибітне кодування CP1251, тому якщо ви прописували теги у цій системі, то вони швидше за все і записані у даному кодуванні. Ubuntu ж використовує у якості основного системного кодування - UTF-8 (тобто Unicode) у якому один символ може займати від одного до чотирьох байтів в залежності від його типу. Звісно ж UTF-8 надає безліч переваг, зокрема дозволяє у рамках одного текстового рядку використовувати одночасно багато алфавітів (наприклад латиницю, кирилицю, івріт, грецький алфавіт, грузинський, вірменський, арабський, хірагану, катакану і більше того можна використовувати навіть китайські ієрогліфи). Якщо ви кодуєте у Windows треки з музичного CD у наприклад формат OGG, то ніяких проблем не буде, у ньому теги вже сидять у кодуванні UTF-8, тому для нього кінцева система значення не має. З MP3 ж система інша.

Який же метод розв'язання проблеми вибрати? Дехто радить створити окрему локаль і запускати плеєр під нею. Я все ж таки рекомендую перекодувати колекцію музики. Скористаємося для цього утилітою mid3iconv.

Спочатку необхідно встановити пакет python-mutagen, саме у ньому й міститься потрібна нам утиліта:
sudo apt-get install python-mutagen

А тепер знаходячись у папці з музичними файлами даємо у терміналі наступну команду:
find -name "*.mp3" -print0 | xargs -0 mid3iconv -e CP1251 -d

Тобто ми знаходимо усі файли *.mp3 у вибраній папці, виводимо їх особливим чином (опція -print0 означає виведення переліку файлів в один рядок розділяючи їх символом null), потім через конвейєр (символ |) передаємо перелік файлів команді xargs з параметром -0 яка виокремлює з отриманого переліку імена файлів і передаючи кожен з них у стандартний поток вводу викликає команду mid3iconv власне вже для конвертації у юнікод. Опція -e вказує початкове кодування (у даному випадку CP1251), а опція -d виводить на екран результати конвертації.

Все. Віднині всі плеєри всі Ubuntu будуть відображати теги коректно.

Щоб не згадувати постійно цю команду коли вам принесуть нову музикі, можна просто написати ще один скрипт для Nautilus. Для цього у папці ~/.gnome2/nautilus-scripts створимо файл з назвою "Конвертація mp3-тегів з CP1251 до UTF-8" наступного змісту:

#!/bin/bash
find -name "*.mp3" -print0 | xargs -0 mid3iconv -e CP1251 -d


Поставимо тепер у властивостях галочку на можливість виконання цього файлу як програми і тепер у меню Сценарії з'явиться новий пункт. Тепер достатньо просто зайти у папку з музикою, клацнути у будь-якому місці правою кнопкою мишки і запустити цей файл церез підменю Сценарії. Теги усіх файлів у даній папці буде переконвертовано в юнікод і тепер вони будуть вірно відображатися у плеєрі.

8 коментарів:

  1. Дякую, корисна порада. Теги не тільки в Ubuntu успішно відображаються, а й на телефоні(на SE перевірив, Nokia теж повинна фуричити), де є проблема з відображенням кириличних тегів.

    ВідповістиВидалити
  2. чи можна якось рекурсивно перекодовувати? тобто починаючи з деякої теки?

    ВідповістиВидалити
  3. Не впевнений, що зрозумів питання...

    ВідповістиВидалити
  4. ну в запропонованому варианті перекодується лише 1 тека (обрана) а в мене дуже багато файлів з неправильним кодуванням - чи можна їх за 1 раз перекодувати а не пігати по кожнії теці і виконувати скрипт?
    тобто наприклад в мене є така структура:
    Музика/Виконавець1
    Музика/Виконавець2
    щоб я зайшов в теку Музика - виконав якийсь скрипт та в мене за один раз перекодувались всі файли в теках Виконавець1, Виконавець2?

    ВідповістиВидалити
  5. Дивно, бо в мене саме так ця команда й працює, обходячи підкаталоги. Ну можеш спробувати додати для команди find опцію -depth

    ВідповістиВидалити
  6. Хех :)
    я не пробував і думав що не буде працювати а тут - дійсно працює :)
    дякую

    ВідповістиВидалити
  7. Чому в мене на примонтованих дисках не працює? Себто поза Home :( ПРиходиться копіювати на робочий стіл, перекодувати і пізніше повертати назад в привичне розташування :((

    ВідповістиВидалити
  8. Тому що проблема у праві на запис файлу.

    ВідповістиВидалити