LinuxForum.Fans
Тема

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

Автор: anthony3d 8 сообщений 3800 просмотров
#300249

Я прошу прощения, что гружу своими задачами, но, просмотрев несколько часов форум и попробовав пару дюжин вариантов, понял, что без подсказки не разберусь.

Дано:
Каталог музыки с именами вида: "<Исполнитель> - <Песня>.mp3"
Нужно привести этот каталог к виду "<Исполнитель>/<Песня>.mp3"

Пример:
./Алла Пугачева - Белый снег.mp3
./Алла Пугачева - В Петербурге сегодня гроза.mp3
./Алсу - Всё равно.mp3
./Алсу - Вчера.mp3
./Алсу - Зимний сон.mp3
./Андрей Губин - Девушки как звёзды.mp3
./Андрей Губин - Птица.mp3
./Андрей Макаревич - Перекресток.mp3

...должно превратиться в:
./Алла Пугачева/Белый снег.mp3
./Алла Пугачева/В Петербурге сегодня гроза.mp3
./Алсу/Всё равно.mp3
./Алсу/Вчера.mp3
./Алсу/Зимний сон.mp3
./Андрей Губин/Девушки как звёзды.mp3
./Андрей Губин/Птица.mp3
./Андрей Макаревич/Перекресток.mp3

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

Может, кто-то сталкивался с такой задачей?
Если не сложно, вспомните, как вы с ней справились.

Заранее благодарен!

Антон.

#300253

Если гуёвое решение устроит, то используй EasyTAG.

#300254
text

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import os

for f in os.listdir('.'): if os.path.isfile(f) and f[-3:] == 'mp3': dir_name = f.split('-', 1)[0].strip() file_name = f.split('-', 1)[1].strip() os.renames(f, os.path.join(dir_name, file_name))

#300257
text

 mkdir $(find . -type f | rev | cut -d - -f2- | rev |  sed 's/[ \t]*$//' | sed 's/^[./]*//') 2> /dev/null 

так можно создать каталоги

#300281
text

a=$(ls)
IFS='
'
files=(`find -type f -print | sed 's/^[./]*//'`)
for item in "${files[@]}"; do
    echo $item;
tdir=$(echo $item | rev | cut -d - -f2 | rev |  sed 's/[ \t]*$//')   
   if [ -f $tdir ]
then mv $item $tdir/${item#$tdir - }
else mkdir $tdir
 mv $item $tdir/${item#$tdir - }
fi
done

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

#300352
-=Serj=- написал:
text

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import os

for f in os.listdir('.'): if os.path.isfile(f) and f[-3:] == 'mp3': dir_name = f.split('-', 1)[0].strip() file_name = f.split('-', 1)[1].strip() os.renames(f, os.path.join(dir_name, file_name))

Супер! Это работает и очень быстро! И Питон, конечно, рулит.

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

То есть.
/откуда надо/Алла Пугачева - Белый снег.mp3

...должно превратиться в:
/куда надо/Алла Пугачева/Белый снег.mp3

где "Белый снег.mp3" это симлинк на /откуда надо/Алла Пугачева - Белый снег.mp3

#300372
"anthony3d" написал:
А можно ли модифицировать код так, чтобы вместо перемещения файлов только создавались симлинки и чтобы каталог, где создается результат, можно было задать вручную.

если я правильно понял задачу, то должно быть примерно так:

text
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import os

result_path = raw_input('Куда будем делать симлинки?') if os.path.exists(result_path): pass else: os.makedirs(result_path)

for f in os.listdir('.'): if os.path.isfile(f) and f[-3:] == 'mp3': dir_name = f.split('-', 1)[0].strip() file_name = f.split('-', 1)[1].strip() if os.path.exists(os.path.join(result_path, dir_name)): pass else: os.makedirs(os.path.join(result_path, dir_name)) os.symlink(f, os.path.join(result_path, dir_name, file_name))

скрипт спросит куда создавать симлинки и после обработает все mp3-файлы в каталоге, где скрипт расположен.
условно, пусть "куда надо" = /home/vasya/mp3
скрипт сделает симлинки вида /home/vasya/mp3/Исполнитель/Песня.mp3 для всех mp3-файлов в текущем каталоге.

p.s. этот скрипт для python 2. в python 3 вроде raw_input() нету, там через input(), емнип, строки вводят.

#300680

Супер! Всем спасибо!
(Вы открыли мне Пайтон! Уже второй день программирую - оторваться не могу!)

Уже написал сортировку по каталогам, дуэты раскладываю по исполнителям, и обработку исключений приделал, и с изменением регистра русских слов разобрался.

Войдите или зарегистрируйтесь, чтобы ответить.