1

Тема: Переименование mp3-файлов по tag-маске с перемещением

Здравствуйте! Помогите, пожалуйста, реализовать переименование всех имеющихся в заданной директории mp3-файлов по формату "Исполнитель - Название композиции" исходя из информации, заложенной в тегах. Если таковой информации в тегах не имеется, то переименовать в формате "NoTitle+индекс, например, по дате и времени записи. Если в результате переименования обнаружено полное соответствие названия нового файла с уже имеющимся в текущей директории, добавить к имени файла индекс "(2)".

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

Спасибо!

Win10x64, AHK v1.1.25

2

Re: Переименование mp3-файлов по tag-маске с перемещением

День добрый, becauseim.
На cmd маловероятно реализовать.
Делал подобное на Powershell, если заинтересует, могу расписать подробнее (или можете поискать самостоятельно, использовались taglib-sharp и powershell).
Ну и хочу сразу предупредить, что основными проблемами являются формат/версия тегов и кодировки всё остальное  - создать структуру папок и раскидать файлы по исполнителям альбомам - ерунда. Зато когда начинаешь править теги, понимаешь, что проще перекачать дискографию с уже поправленными.

3

Re: Переименование mp3-файлов по tag-маске с перемещением

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

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

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

Win10x64, AHK v1.1.25

4

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim пишет:

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

Могу пока поделиться ссылкой (скриптовый язык не особо важен, при желании можно реализовать и на cmd, просто на нём сложнее), прототип по алгоритму набросаю позднее.

5

Re: Переименование mp3-файлов по tag-маске с перемещением

UNDYING, а как использовать информацию по ссылке? Предложенный там сценарий полностью соответствует тому, что необходимо в моем случае? В файл с каким расширением сохранять сценарий?

Win10x64, AHK v1.1.25

6

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim
В Total Commander такое делается в один проход при установке любого wdx-плагина с ID3-тегами (таких полно).

Тут имеется такой скрипт. Правда, есть там существенные излишки, касаемые присвоения тегов. Чистый вариант (переименование/перемещение по тегам) будет, конечно, в разы короче и без утилит. Перемещение MP3 по папкам с именами тегов я давненько делал. Слить это всё несложно. На PoSh это тоже всё без проблем делается, но мне VBS сподручней.

becauseim пишет:

интересует любой метод

Полагаю, тему переносим в "Прочие скриптовые технологии и близкие к ним"?

7

Re: Переименование mp3-файлов по tag-маске с перемещением

Flasher пишет:

В Total Commander такое делается в один проход при установке любого wdx-плагина с ID3-тегами (таких полно).

Вполне годится в качестве альтернативы. Только мне еще необходимо перемещение в созданные подпапки исполнителей.

Flasher пишет:

Полагаю, тему переносим в "Прочие скриптовые технологии и близкие к ним"?

Да.

Win10x64, AHK v1.1.25

8

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim пишет:

Вполне годится в качестве альтернативы.

Устанавливаем плагин id3, выделяем mp3-файлы (установить курсор на любом mp3, выполнить из комстроки cm_SelectCurrentExtension); жмём Ctrl+M; в первое поле вставляем [=id3.Artist]\[=id3.Artist] - [=id3.Title]; смотрим на предварительный результат; если всё в порядке, подтверждаем. По F2 там же можно сохранить шаблон и загружать командой (с кнопки или хоткея) MULTIRENAME <шаблон>.
Подобное же можно проделать с плагинами decID3WDX, MP3Info, anytag, AudioInfo, WDXTagLib, media, MediaInfoWDX, TcMediaInfo, ShellDetails.

Сменил раздел.

9

Re: Переименование mp3-файлов по tag-маске с перемещением

Flasher, большое спасибо! Небольшое дополнение (изменение): файлы, в тегах которых информации не имеется, переименовывать в NoTitle не стоит. Так как только сейчас понял, что имена многих mp3-файлов уже соответствует необходимому шаблону (Исполнитель - Композиция), а теги этих файлов при этом пустые. Попробовал плагин для TC - некоторые файлы не переименовывает (не видит теги). В свою очередь, редактор тегов от AIMP переименовывает эти же файлы. Насклько мне понятно, плагин в отличие от программы не поддерживает различные версии тегов. И все-таки, скрипт без визуальной оболочки пришелся бы кстати, т.к. по удобству процедура из TC приравнивается к методу на основе AIMP.
Еще одно дополнение, но уже касательно перемещения: перемещать файлы стоит только тогда, когда количество треков одного исполнителя равно трем и более. Т.е. один или два трека, принадлежащих одному исполнителю перемещать необходимости нет.

Win10x64, AHK v1.1.25

10

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim пишет:

Попробовал плагин для TC - некоторые файлы не переименовывает (не видит теги).

Можно другие попробовать по той же схеме. Ссылки-то даны. Примеры:
[=anytag.Artist]\[=anytag.Artist] - [=anytag.Title]
[=audioinfo.Исполнитель]\[=audioinfo.Исполнитель] - [=audioinfo.Название]
[=mp3info.Исполнитель]\[=mp3info.Исполнитель] - [=mp3info.Название]
и т. п.
Насчёт скрипта. Что-то идея с предварительной проверкой всех файлов мне не очень по душе. Т.е. лишняя нагрузка на скрипт. Не лучше сразу переместить, а потом уже разбирать перемещённые?
И кстати, мне не очень понятно, почему папки-альбомы в этом процессе не участвуют? Мне всегда импонировала такая схема:
<Артист>\<год> - <альбом>\<№ трека> - <название композиции>.

11

Re: Переименование mp3-файлов по tag-маске с перемещением

Flasher, вариант с ТС оставлю на крайний случай, т.к. не подходит при частом обращении и при обращении из проводника.

Не лучше сразу переместить, а потом уже разбирать перемещённые?

Не понял, о чем идет речь.

Пожалуй, папку-альбом стоит добавить. Год в моем случае не указывается в большинстве файлов.

Win10x64, AHK v1.1.25

12

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim пишет:

не подходит при частом обращении и при обращении из проводника

Проводник как сюда залез, когда проще всё в ТС делать? А насчёт частого обращения - можно сделать кнопку вызова по шаблону и автонажатия Enter.

becauseim пишет:

Не понял, о чем идет речь.

Ну, раскидали файлы, потом уже смотрим число файлов в папках. Если их 1-2, то кидать их обратно с удалением папки.

becauseim пишет:

Год в моем случае не указывается в большинстве файлов.

А зря. Довольно удобно сортировать альбомы по годам. Это касается и номера трека.

13 (изменено: becauseim, 2016-10-08 09:25:15)

Re: Переименование mp3-файлов по tag-маске с перемещением

Flasher, скриптом также будет пользоваться моя девушка, которая боится ТС, а хоткей я попробую повесить посредством AHK. Если с т.з. программирования удобнее (грамотнее) сначала переместить все, то пусть будет так. Речь идет о сграббленных записях малоизвестных исполнителей или отдельных (выборочных) треках некоторых исполнителей. Когда мне нужны все релизы, я просто скачиваю дискографию с готовой структурой.

Win10x64, AHK v1.1.25

14

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim
Ладно. Чего я спрашиваю. Всё равно бы сделал универсальный вариант (чтобы и другим полезно было).

15

Re: Переименование mp3-файлов по tag-маске с перемещением

Flasher, да, я тоже хотел добавить, что целесообразнее сделать универсальный вариант, т.к. мои конкретные желания узковостребованы. Просто упомяните, какие строки стоит закомментировать в зависимости от потребностей.

Win10x64, AHK v1.1.25

16

Re: Переименование mp3-файлов по tag-маске с перемещением

Не-не-не. Я так не делаю. Всё только через параметры. Будут необязательные ключи со схемами и минимальным числом на перемещение.

17

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim
Нашёл таки времеце. Не знаю, всё ли получилось, проверяйте:

'•••••••••••••••••••••••••••••• VBS •••••••••••••••••••••••••••••••
' Переместить/переименовать MP3-файлы в рабочем каталоге по шаблону
'
' Ключи: /s:[<шаблон для перемещения/переименования>]
'        /d:[<разделитель между тегами в шаблоне, если есть>]
'        /c:<минимальное число mp3 для перемещения>  (1 по умолч.)
'        /o:[<путь назначения>]        (рабочий каталог по умолч.)
'
' В шаблоне могут участвовать следующие теги:
' TrackNumber, Year, Title, Album, Artist, Genre
'
' Примеры ключей:
' 1) /s:"TrackNumber. Title" /d:". "
' 2) /s:"Artist\Artist - Title" /d:" - " /c:2
' 3) /s:"Artist\Year - Album\TrackNumber. Title" /d:" - "
' 4) /s:"Genre\Artist\Album - Title" /d:" - " /o:C:\Music
'••••••••••••••••••••••••••••••••••••••••••••••• Автор: Flasher •••

Option Explicit
Dim Scheme, Delim, Count, oDir, WMP, ShA, FSO, R, S, Dir, Disk

With WScript.Arguments.Named
  If .Count < 2 Then Msg "Не задано ни одного ключа!", 4144
  If Not .Exists("s") Then Msg "Ключ /s: обязателен!", 4144
  Scheme = .Item("s")
  If .Exists("d") Then Delim  = .Item("d") : _
  If InStr(Scheme, Delim) = 0 Then _
  Msg "В шаблоне отсутствует разделитель '" & Delim & "'!", 4144
  If .Exists("c") Then Count = .Item("c") Else Count = 0
  If .Exists("o") Then oDir  = .Item("o")
End With

Sub Msg(Text, Num)
  MsgBox Text, Num, " Переименование (перемещение) MP3     " : WScript.Quit
End Sub

If InStrRev(Scheme, "\") Then
  Dim Test : Test = InStr(Mid(Scheme, InStrRev(Scheme, "\")), Delim)
Else Count = 0 End If
If Count > 1 Then Dim Dic : _
Set Dic = CreateObject("Scripting.Dictionary")
Set ShA = CreateObject("Shell.Application")
Set WMP = CreateObject("WMPlayer.OCX")
Set FSO = CreateObject("Scripting.FileSystemObject")
R = Array(-230,-225,-246,698,894) : S = Split(": ? * "" ;")
Dir = FSO.GetAbsolutePathName("")
If IsEmpty(oDir) Then oDir = Dir
Set Disk = ShA.NameSpace(FSO.GetDriveName(Dir))
Set Dir  = ShA.NameSpace(Dir) : Dim Items
Set Items = Dir.Items : Items.Filter 90304, "*.mp3"
If Items.Count = 0 Then Msg "В каталоге нет MP3-файлов!", 4144

Dim F, Path, Song, rPath, i, Name, RelPath
For Each F in Items
  Set Song = WMP.NewMedia(F.Path)
  For Each i in Split("WM/Year WM/TrackNumber Title Album Artist Genre")
    Execute "t" & Replace(i, "WM/", "") & "= Trim(Song.getItemInfo(i))"
  Next : Set Song = Nothing : rPath = LCase(Scheme)
  For Each i in Split(LCase("Year TrackNumber Title Album Artist Genre"))
    Execute "rPath = Replace(rPath, i, t" & i & ")"
  Next
  With New RegExp
    .Global = True
    For Each i in Array("[ \.\(\{-]+\\+", "\\+[ \.\)\}-]+", "\\{2,}")
      .Pattern = i : rPath = .Replace(rPath, "\")
    Next
    For i = 0 To 4 : rPath = Replace(rPath, S(i), ChrW(R(i))) : Next
  End With : RelPath = Left(rPath, InStrRev(rPath, "\"))
  Path = FSO.BuildPath(oDir, RelPath)
  If Not Test Or (Test And InStr(RelPath, Delim) > 0) Then
  If Right(rPath, 1) <> "\" And Len(tTitle) Then
    If Not FSO.FolderExists(Path) Then Disk.NewFolder(Mid(Path, 4))
    rPath = FSO.BuildPath(Path, FSO.GetFileName(rPath) & "." & FSO.GetExtensionName(F))
    If Len(rPath) > 259 Then rPath = "\\?\" & rPath
    If Not FSO.FileExists(rPath) Then FSO.GetFile(F.Path).Move rPath
    If Count > 1 Then If Not Dic.Exists(Path) Then Dic.Add Path, ""
  End If
  End If
Next : WMP.Close
If Count > 1 Then
  For Each I in Dic.Keys
    Set Items = ShA.NameSpace(I).Items
    Items.Filter 90304, "*.mp3"
    If Items.Count < CLng(Count) Then _
    Dir.MoveHere Items, 20 : FSO.GetFolder(I).Delete
  Next : Dic.RemoveAll
End If : Msg "Файлы переименованы/перемещены!", 4160

18

Re: Переименование mp3-файлов по tag-маске с перемещением

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

Win10x64, AHK v1.1.25

19

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim
Ключи комстроки со скриптом работают так же, как и с утилитами.
Рабочий каталог не означает обязательное наличие в папке запускаемого приложения.
Для работы в активном каталоге в настройках тулбара достаточно оставлять путь запуска пустым. Это касается почти всех файлменеджеров. Для Проводника можно создать кнопку с помощью StExBar (пример создания), QTabBar или ручным способом.

20

Re: Переименование mp3-файлов по tag-маске с перемещением

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

Win10x64, AHK v1.1.25

21

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim
Именно из Проводника? В поле с путём пишите: wscript.exe "<путь к скрипту>" <ключи> и жмёте Enter.
Либо ярлыки (можно без wscript.exe) создайте с пустым, как уже писалось, полем рабочей папки. Но по факту кнопки куда юзабильней (в т.ч. для барышни). К тому же сам тулбар можно скрыть и пользоваться хоткеем.

22 (изменено: becauseim, 2016-10-14 13:48:07)

Re: Переименование mp3-файлов по tag-маске с перемещением

Ввожу в адресную строку проводника, где лежат mp3-файлы, а также файл сценария следующее:
wscript.exe "D:\Downloads\1.vbs" /s:"TrackNumber. Title" /d:". ", получаю в ответ ошибку:
http://puu.sh/rIx8u/d3bcc729b0.png

Пробовал установить  StExBar и QTabBar, но никаких изменений в проводнике не пронаблюдал. Система:  Windows 10 Anniversary Update Version

upd.: Извиняюсь, оказывается, неправильно назвал файл скрипта. Сейчас попробую разобраться с ключами и их работой. А кнопка действительно стала бы удобным дополнением.

Win10x64, AHK v1.1.25

23

Re: Переименование mp3-файлов по tag-маске с перемещением

Даже не сомневался, что проблема в неверном имени.
Насчёт аддонов не могу судить, как они работают на 10-ке, ибо у меня не она. Но на всякий советую заглянуть в меню Вид > Панель инстурментов и проверить установку птиц на них.

24

Re: Переименование mp3-файлов по tag-маске с перемещением

Flasher, запустил сценарий из ярлыка, процесс перемещения файлов по заданной маске наблюдается, но очень медленно, буквально по одному файлу в несколько секунд, это нормально или у меня что-то идет не так, как задумано? К слову, AIMP переименовывает файлы мгновенно.

Win10x64, AHK v1.1.25

25

Re: Переименование mp3-файлов по tag-маске с перемещением

becauseim
Такого точно не должно быть. Может, дело в заторможенном обновлении окна?