Как стать автором
Обновить

Скрипт автоматического преобразования m3u в m3u8

Время на прочтение3 мин
Количество просмотров7.9K
Относительно недавно переехал на GNU/Linux. Преобразовывая плей-листы от foobar2000 в .m3u, заметил, что бывают еще .m3u8. Оказывается, это тот же .m3u, но в кодировке UTF-8. Непорядок, подумал я, и решил привести всё в кошерный вид, т.е. перевести списки .m3u в .m3u8, т.к. все файлы храню в UTF-8. Этих самых плей-листов у меня довольно много (более 100), пэтому решил написать скрипт на баше.

Поскольку музыка была скопирована с NTFS раздела на раздел ext4 – кодировка всех файлов (плей-листов) была CP1251, а права всех файлов включали в себя бит «исполняемый» – это я тоже решил пофиксить.

Итак, что делает написанный скрипт:
  • устанавливает стандартные права на файлы
  • устанавливает стандартные права на папки
  • преобразовывает все плейлисты из .m3u в .m3u8

Реализован «тихий» и подробный режимы выполнения, предусмотрено аккуратное преобразование списков (старые будут удалены, только если преобразование пройдёт успешно); выявлен и пофикшен баг кривого именования русских файлов (мой Debian Squeeze в качестве sh использует dash, он и тупил – bash точно правильно отрабатывает).

Представленный ниже листинг скрипта нужно сохранить как «m3migr», и сделать его исполняемым («chmod +x m3migr»). Запуск — "./m3migr <каталог_с_музыкой>" — тихий режим, или "./m3migr -v <каталог_с_музыкой>" — выведет все действия в консоль.

Полученные после преобразования плей-листы протестированы на Amarok 2.3.0 – всё работает.

Собственно, сам скрипт:


#!/bin/bash

# NOTE: не использовать /bin/sh - портит русские имена файлов

# Скрипт автоматической миграции музыкальных файлов из Windows
# Преобразовывает .m3u в .m3u8 и устанавливает стандартные
# права на все файлы

# --------------------------------- ФУНКЦИИ ------------------------------------

# Функция преобразования m3u плейлиста в m3u8 (UTF-8)
convert_m3u() {
    old_filename="$1"    # .m3u
    new_filename="${1}8" # .m3u8

    if [ "$is_verbose" = "true" ]; then
        printf "convert \"${old_filename}\" to \"${new_filename}\"\\n"
    fi

    iconv -f CP1251 -t UTF-8 "$old_filename" > "$new_filename"

    ls_tmp=$(ls -s "$new_filename")
    new_file_size=${ls_tmp%% *}
    if [ -f "$new_filename" ] && [ -n "$new_file_size" ] && [ "$new_file_size" -gt 0 ]; then
        rm -f "$old_filename"
        rm -f "${old_filename}~"
        rm -f "${new_filename}~"
    fi
}

# Функция установки прав для файлов
chmod_file() {
    if [ -f "$1" ]; then  # для файлов
        if [ "$is_verbose" = "true" ]; then
            printf "change mode for file \"${1}\"\\n"
        fi
        chmod 644 "$1"    # - rw- r-- r--
    fi
}

# Функция установки прав для директорий
chmod_dir() {
    if [ -d "$1" ]; then  # для директорий
        if [ "$is_verbose" = "true" ]; then
            printf "change mode for dir \"${1}\"\\n"
        fi
        chmod 755 "$1"     # d rwx- r-x r-x
    fi
}

# ---------------------------- ТЕЛО ПРОГРАММЫ ----------------------------------

is_verbose="false"

# Проверка переданных аргументов
if [ "$1" = "-v" ] || [ "$1" = "--verbose" ]; then
    is_verbose="true"
    shift
fi
if [ -d "$1" ]; then
    music_dir="$1"
else
    printf "usage: m3migr [{-v | --verbose}] music_dir\\n"
    exit 1
fi

printf "Запуск приложения...\\n"

sleep 1
printf "Изменение прав для файлов...\\n"
cur_file=""
find "$1" -name "*" -type f -print | while read cur_file
do
    chmod_file "$cur_file"
done

sleep 1
printf "Изменение прав для директорий...\\n"
cur_dir=""
find "$1" -name "*" -type d -print | while read cur_dir
do
    chmod_dir "$cur_dir"
done

sleep 1
printf "Преобразование всех m3u плейлистов в m3u8...\\n"
cur_file=""
find "$1" -name "*.m3u" -type f -print | while read cur_file
do
    convert_m3u "$cur_file"
done

printf "\\nOK!\\n"

exit 0


Список использованной литературы


1. Нейл Мэтью, Ричард Стоунс. Основы программирования в Linux, 4-е издание. Глава 2
2. Конспект по Bash на LOR
3. Habrahabr. Основы Bash, часть 1
4. Habrahabr. Основы Bash, часть 2
Теги:
Хабы:
+4
Комментарии22

Публикации