1

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

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

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

Спасибо!

2

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

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

3

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

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

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

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

4

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

becauseim пишет:

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

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

5

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

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

6

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

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

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

becauseim пишет:

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

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

7

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

Flasher пишет:

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

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

Flasher пишет:

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

Да.

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.
Еще одно дополнение, но уже касательно перемещения: перемещать файлы стоит только тогда, когда количество треков одного исполнителя равно трем и более. Т.е. один или два трека, принадлежащих одному исполнителю перемещать необходимости нет.

10

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

becauseim пишет:

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

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

11

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

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

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

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

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

12

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

becauseim пишет:

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

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

becauseim пишет:

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

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

becauseim пишет:

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

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

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

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

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

14

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

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

15

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

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

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, пока не знаю, как использовать или применять ключи, беглый поиск результата не дал. А корневую директорию для создания в них папок исполнителей/альбомов задать можно?

19

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

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

20

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

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

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.: Извиняюсь, оказывается, неправильно назвал файл скрипта. Сейчас попробую разобраться с ключами и их работой. А кнопка действительно стала бы удобным дополнением.

23

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

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

24

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

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

25

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

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

26

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

Flasher, сейчас запустил из адресной строки эту же команду: wscript.exe "D:\Downloads\1.vbs" /s:"Artist\Artist - Title" /d:" - " /c:2
http://puu.sh/rIyco/81aef305d6.gif

27

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

becauseim
Ну, и что не так?

28

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

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

29

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

Соответствующие утилиты и приложения использовать не пробовали?

Ваш плеер, вероятно, умеет делать такое (например, foobar200 умеет).
Аналогичное можно выполнить с помощью ffmpeg/libav в пакетном режиме.

( 2 * b ) || ! ( 2 * b )

30

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

becauseim
А антивирус какой-нибудь не может стопорить? У меня так.

31

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

Flasher, антивирусов нет. После перезагрузки ничего не изменилось. Пробовал запускать уже из добавленной на панель StEx кнопки. Работает медленно, но в конечном итоге, не переместив все имеющиеся файлы, выдает сообщение об успешном окончании работы. Может, попробовать из ТС? Как это сделать?

32

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

becauseim
В ТС всё то же самое будет. Тут скорее какие-то странности в симбиозе 10-ки и кода скрипта.
Кпопка копипастится на тулбар:

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Scripts\Move_rename_mp3_by_tags.vbs
/s:"Artist\Artist - Title" /d:" - " /c:2
imageres.dll,103
Переместить/переименовать mp3-файлы активного каталога по тег-шаблону

Я могу, в принципе, изменить алгоритм в некоторой части для сравнения скоростей на Win10.

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

33

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

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

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

Я могу, в принципе, изменить алгоритм в некоторой части для сравнения скоростей на Win10.

Думаю, было бы кстати.

Также хотел бы призвать кого-то из пользователей с WIN 10 протестировать сценарий у себя. Спасибо!

34

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

becauseim
Сперва надо бы выяснить, как там дело обстоит с WMP.
Снизу поста по спойлером "Отобразим некоторые теги композиции:" есть скрипт. Проверьте, как быстро появится сообщение.

35 (изменено: becauseim, 2016-10-15 16:48:01)

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

Flasher,

+ открыть спойлер

http://puu.sh/rJJTy/138747bc18.gif

36

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

becauseim
Во второй строке замените путь на существующий mp3 с тегами.

37

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

Flasher

+ открыть спойлер

http://puu.sh/rJLcZ/5ac58726e0.gif

38

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

becauseim
Мда, мои подозрения не сбылись. Кое-что в скрипте поправил, проверьте ещё разок.
Если не выйдет, то вместо 71-72 строки вставьте эту:

    If Not FSO.FileExists(rPath) Then ShA.NameSpace(Path).MoveHere F.Path, 20

Но на 7-ке это замедляет процесс. Посмотрим, как на 10.

39

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

Flasher, не знаю, правильно ли я отредактировал сценарий.

Записал работу сценария с момента запуска до момента финального сообщения об окончании работы:

+ открыть спойлер

http://puu.sh/rK2jH/3d63b1cd13.gif

Думаю, остается ждать, пока кто-то из пользователей "десятки" протестирует сценарий у себя.

40

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

Я же написал

Flasher пишет:

Если не выйдет

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


В части утилит хотел ранее предложить Tag.exe, но там нет этого специфичного момента с ограничением по числу. Раз тут такие трудности возникли, приведу вариант на примере кнопки ТС:

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\Tag\Tag.exe
--hideinfo --hidetags --hidenames --rentag --scheme "A\L\N. T" --move *.mp3
imageres.dll,190
Переместить/переименовать MP3-файлы активного каталога по тег-шаблону

1

Где тегами могут быть: A = исполнитель, L = альбом, T = название,  N = номер трека,  Y = год,  G = жанр.

41

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

Flasher, распаковал содержимое архива рядом с исполняемым файлом ТС, а именно в папку Utils\Tag, но при вызове команды выходит сообщение о том, что файл не найден.

+ открыть спойлер

http://puu.sh/rMpLT/d10a84560e.png

Могу ли я разместтить Ваш сценарий с ссылкой на этот ресурс на каком-либо ресурсе с целью разузнать, как он работает на другоих компьютерах с Windows 10?

42

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

becauseim
Эх.. Вы понимаете, что такое копипаст (выделить/скопировать/вставить через ПКМ) кода кнопки на тулбар?

Размещать код не надо, ссылку дать можете.

43

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

Flasher, т.е. я неверно скопировал значения? Где ошибка?

44

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

Всё-таки повторю свой вопрос: почему не желаете посмотреть в сторону готовых приложений и утилит, которые умеют делать аналогичное. Если это задача достаточно частая, то имеет смысл сказать, установить и "приручить" их, чтобы сделать рутинные дела как задумано и весьма быстро. Связка ffmpeg/libav+batch script Вам помогут.

( 2 * b ) || ! ( 2 * b )

45

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

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

46

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

becauseim
Я разве пишу о значениях? Весь код скопируйте и через контекстное меню (ПКМ) тулбара выберите "Вставить", после увидите все ошибки.

Rumata
Повторять вопрос, когда мы уже смотрим в эту сторону? И наивно думать, что bat точно окажется быстрее vbs. Я не раз убеждался в обратном.

47

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

Rumata, есть готовое решение по переименованию с помощью редактора тегов от AIMP, где я всегда использую одну и ту же маску переименования файлов, в виду чего гибкость этой утилиты, а также ее графисеский интерфейс мне приходится ни к чему. Также необходимо создание директорий на основе исполнителей с дальнейшим перемещением файлов, что на данный момент мне удается сделать только вручную.
Malcev, к сожалению, не умею проводить отладку скриптов, как и их разработку.
Flasher, к сожалению, запутался в действиях и не понимаю, как мне использовать утилиту Tag.exe. Пожалуй, не буду беспокоить по этому поводу, а попробую найти решение по отладке предложенного Вами сценария на Windows 10 при помощи пользователей данной версии ОС.

48

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

becauseim
Я извиняюсь, но это уже какой-то ахтунг. Ещё подробней.
Что касается Tag.exe, то всё, что в данном случае надо править - это параметры ключа --scheme. Принцип тот же, что и в скрипте. Значения букв я расписал.

49

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

Flasher
Полагаю (честно хотелось бы ошибаться), что Вы пытаетесь пробить стену, когда рядом есть дверь.

Чистый bat не сможет этого сделать, а вот связка его и соответствующих утилит - это может быть быстро.

becauseim
Я упоминал foobar2000 - он точно умеет переименовывать/копировать/перемещать. Посмотрите AIMP внимательнее - возможно он тоже умеет перемещать файлы.

( 2 * b ) || ! ( 2 * b )

50

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

Rumata
Стена перед вами. Мы же обсуждаем утилиту Tag, чего вы в упор не хотите замечать. А foobar и AIMP не обсуждаются по опять же указанным и совсем иным причинам.

51 (изменено: Malcev, 2016-10-18 20:20:18)

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

Malcev, к сожалению, не умею проводить отладку скриптов

Можно поставить таймеры между выполнениями комманд, функций и посмотреть на что тратится время.
Может у вас mp3 какие-нибудь специфичные.

52

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

У меня ещё была мысль, что это связано с 3-мя For внутри одного For. Как отрабатывает с этим библиотека 10-ки, пока не знаю. Можно поковырять и заменить на функцию. На 7-ке же мой скрипт отрабатывает быстрее, чем Tag.
Ещё интересно, не может ли AIMP MPEG Layer делать бяку?

53 (изменено: Rumata, 2016-10-19 00:03:21)

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

Скрипт работает в текущем каталоге

1. ищет все mp3 файлы в подкаталоге
unsorted\*.mp3

2. считывает теги в файлы метаданных
metadata\имя-файла.txt

3. переименовывает и перемещает согласно существующим тегам по схеме (можно изменить на требуемое)
sorted\исполнитель\год - альбом\трек. композиция.расширение

4. в случае нахождения одноименных файлов в каталоге-приемнике переименовывает, добавляя к имени файла (2), (3) и т.д.

5. если какие-либо теги отсутствуют - используются предопределенные значения (Unknown или 0; можно изменить)

6. создвет в текущем каталоге лог-файл своих действий

Требования
ffmpeg/libav

Производительность
10-12 секунд на 120 файлах общим объемом 1.5 ГБ


@echo off

setlocal

set "srcdir=unsorted"
set "dstdir=sorted"
set "metadir=metadata"

set "MEDIACONV=avconv"
::set "MEDIACONV=ffmpeg"

echo %DATE% %TIME%

call :main > "%~f0.log" 2>&1

echo %DATE% %TIME%

endlocal
goto :EOF

:main
md "%metadir%"
md "%dstdir%"

for /f "tokens=*" %%f in ( '
	dir /b /s "%srcdir%\*.mp3"
' ) do (
	call :init "%%f"

	call :read-tags
	call :parse-tags

	call :move-file
)
goto :EOF


:init
set "srcfile=%~f1"
set "srcext=%~x1"

for %%f in ( "%~dp1..\%metadir%\%~n1.txt" ) do set "metafile=%%~ff"

echo:Starting: %srcfile%

set "tag.artist=Unknown"
set "tag.date=Unknown"
set "tag.album=Unknown"
set "tag.track=0"
set "tag.title=Unknown"
goto :EOF


:read-tags
rem ;FFMETADATA1
rem album=From Chaos to Eternity
rem track=1/10
rem genre=Symphonic Power Metal\;Region Italy
rem title=Ad Infinitum
rem artist=Rhapsody of Fire
rem date=2011
rem encoder=Lavf56.7.104
echo:Metadata: %metafile%
"%MEDIACONV%" -i "%srcfile%" -y -f ffmetadata "%metafile%" 2>nul
goto :EOF


:parse-tags
echo:Parse tags
for /f "usebackq tokens=1,* delims==" %%a in ( 
	"%metafile%"
) do (
	if "%%a" == "artist" set "tag.artist=%%b"
	if "%%a" == "date" set "tag.date=%%b"
	if "%%a" == "album" set "tag.album=%%b"
	if "%%a" == "title" set "tag.title=%%b"
	if "%%a" == "track" for /f "tokens=1 delims=/" %%t in ( "%%b" ) do set "tag.track=%%t"
)

rem sprintf "%02d"
set "tag.track=0000%tag.track%"
set "tag.track=%tag.track:~-2%"
goto :EOF


:move-file
rem Artist\Date - Album\Track. Title.Extension
set "newdir=%dstdir%\%tag.artist%\%tag.date% - %tag.album%"
set "newname=%tag.track%. %tag.title%"
set "newext=%srcext%"

if not exist "%newdir%" md "%newdir%"

if exist "%newdir%\%newname%%newext%" call :check-duplicates
echo:Moving: %newdir%\%newname%%newext%
move "%srcfile%" "%newdir%\%newname%%newext%"
goto :EOF


:check-duplicates
echo:Duplicate found
set /a "dup=1"

:check-duplicates-loop
set /a "dup+=1"
set "checkname=%newname% (%dup%)"
if exist "%newdir%\%checkname%%newext%" goto :check-duplicates-loop

set "newname=%checkname%"
goto :EOF

( 2 * b ) || ! ( 2 * b )

54

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

Rumata пишет:

Требования
ffmpeg/libav

Извиняюсь, а как установить требуемое? Скачал архив ffmpeg с официального сайта, но не заметил в нем инсталлятора.

55 (изменено: Rumata, 2016-10-19 01:10:38)

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

https://ffmpeg.zeranoe.com/builds/
Эта ссылка с официального сайта ffmpeg. Там на новой странице прямая ссылка на скачивае архива под Вашу систему (32- или 64 битная).

И там нет инсталятора. Просто распаковываете архив куда-нибудь и пользуетесь - либо указываете полный путь (что не удобно), либо описываете путь до бинарника ffmpeg.exe в переменной PATH (что удобно).

( 2 * b ) || ! ( 2 * b )

56

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

Rumata, а откуда брать libav? Понимаю, что с оф. сайта, но совсем не понимаю, что делаь с архивами без инсталляторов. ffmpeg по указанной Вами ссылке вроде бы установился.

57

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

libav - альтернатива. Достаточно ffmpeg.

( 2 * b ) || ! ( 2 * b )

58

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

Rumata пишет:

10-12 секунд на 120 файлах

Мой скрипт у меня на 7-ке делает это, как можно заметить в gif-e, в 10 раз быстрее.

59

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

Rumata, это все, что происходит после запуска скрипта. До установки ffmpeg выходила ошибка. Сейчас ошибки нет, но и файлы рядом со скриптом не переименовываются. В логе написано: The system cannot find the file specified.

http://puu.sh/rO7kx/20ce6bc00a.gif

60

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

Вам обязательно использовать консоль? Я думаю вам пригодиться утилита tag.exe Ее вполне можно обернуть в скрипт.
Если консоль не главное, советую программы:
Mp3Tag или TagScanner Их хватит за глаза.

Нас невозможно сбить с пути, нам пофигу куда идти.

61

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

Flasher, ранее тестировал Ваш скрипт с уже переименованными mp3-файлами средствами AIMP, сегодня же протестировал с еще непереименованными, заметил, что некоторые файлы хоть и перемещаются в соответствующие папки (все так же медленно), но, как оказалось, не переименовываются перед перемещением. Сценарий заканчивает свою работу не переименовав даже те файлы, что успел перенести. Мне казалось, что по идее, файлы должны переименоваться перед перемещением. Может, с этим связана некорректная работа на Windows 10?

62

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

DnsIs
Я смотрю, баянить тут уже стало в порядке вещей. Переписку хоть почитайте.

becauseim
Жду пример ключей и пару проблемных файлов.
С кнопкой разобрались?

63

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

Flasher, http://dropmefiles.com/uCAYG
В архиве лежит скрипт, в описание которого я добавил пример с ключами, который использовал. С кнопкой вроде разобрался, но ради одного скрипта не планирую использовать кнопку. Лучше привяжу запуск из адресной строки к горячей клавише посредством AHK.

64

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

becauseim
Писать всю комстроку с учётом разных способов вызова не требовалось. Я просил ключи.
Ладно. Вердикт такой. WMP, как, впрочем, и Tag.exe, не видит теги образца ID3v2.4. Я на таких ранее не тестировал.
Но удивительно то, как вы пишите, что скрипт переносит файлы без наличия тегов. В такое трудно поверить, ибо ему их некуда было бы переносить! Можно gif с тестом на залитых файлах?
Что могу предложить касаемо вычисления таких тегов. Задействовать библиотеку MediaInfo с компонентом, тогда с этим проблем не должно быть. Либо при наличии требуемых кодеков в системе можно смотреть атрибуты через GetDetailsOf. Нажмите Alt+Enter на любом из таких файлов и на вкладке "Подробно" посмотрите сводку к секции "Носитель". Если там теги?


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

65 (изменено: becauseim, 2016-10-21 12:31:31)

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

Flasher, на тех файлах, что прикрепил, не сработало перемещение. Впрочем, эти файлы не были перемещены скриптом из общей массы изначально. А следующие файлы были перемещены: http://dropmefiles.com/fAQQ9

+ открыть спойлер

http://puu.sh/rQox8/57bb4a240f.gif

Нет, с Tag.exe я не разобрался. Думаю, если скрипт, как Вы упомянули, не умеет работать с данной версией тегов, буду переименовывать старым способом, но в таком случае, хотелось бы иметь сценарий, перемещающий треки в подпапки, названия которых бы брались не из тегов, а уже из переименованных файлов. Т.е. из файла "Исполнитель - Название.mp3" необходимо брать первую часть названия файла. В таком случае, я теряю лишь возможность сортировки по альбомам. И желательно, чтобы при запуске из адресной строки, если такое возможно, можно было указать корневую директорию для создания в ней папок с исполнителями и дальнейшего перемещения файлов. Например, что-то вроде этого: wscript.exe "D:\Soft\system\MP3 mover.vbs" /s:"Artist\Artist - Title" /d:" - " /c:2 /p:D:\music\sort

66

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

becauseim
Да. Пожалуй, надо было сразу предложить выложить файлы, ибо в них по части медленного перемещения и дело. Причина совсем не на поверхности. Пока думаю, как обойти.
Что касается умения скрипта работать, то прежде стоило бы прочесть и ответить на всё, что я пишу и спрашиваю, а не делать это избирательно. Не так ли?

Насчёт корневой директории, не совсем понимаю - зачем? В первом посте же речь шла о подкаталогах. Ведь всё равно придётся заходить в каталог с mp3 и проверять результат. Проще же сразу в нём всё и делать. Нет?

67

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

Flasher, по части работы скрипта vbs старался уточнить все интересующие моменты. Возможно, что-то упустил, не знаю. Корневая директория нужна, т.к. mp3-файлы будут обрабатываться из папки Downloads, где помимо вероятно созданных папок с исполнителями у меня зачастую распологаются папки из распакованных (иногда автоматически) архивов. Чтобы не приходилось вручную отделять папки с музыкой от других папок и подразумевается задание корневой директории.
Так понимаю, Вы предпочли постараться поработать над версией того же сценария, работающего со всеми типами тегов, нежели над сценарием, не привязанным к тегам каким-либо образом. Пожалуй, так было бы еще лучше. Спасибо!

68 (изменено: Malcev, 2016-10-22 00:35:28)

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

Я бы делал с помощью mediainfo.dll
На AHK 6 файлов переносит за 47/1000 секунд.
Тут я, конечно, не учел проверку файла на валидатность имени, прибавления индекса если не найдены таги.
Просто проверка скорости.

InputFolder := "D:\DropMeFiles_uCAYG"
OutputFolder := "D:\DropMeFiles_uCAYG\TEMP"
MediainfoDll := "C:\MediaInfo.dll"

a := A_TickCount
SetBatchLines -1
DllCall("LoadLibrary", Str, MediainfoDll)
Loop, Files, %InputFolder%\*.mp3
{
   file := A_LoopFileLongPath
   Media_GetTag(file)
   IfNotExist, %OutputFolder%\%Artist%
      FileCreateDir, %OutputFolder%\%Artist%
   FileMove, %file%, %OutputFolder%\%Artist%\%Artist% - %Track%.mp3
}
msgbox % A_TickCount - a


Media_GetTag(file) {
 hnd := MediaInfo_New()
 MediaInfo_Open( hnd, file )
 Global Artist := MediaInfo_Get( hnd, 0,0, "Artist", 1 )
 Global Track := MediaInfo_Get( hnd, 0,0, "Track", 1 )
 MediaInfo_Close(hnd)
 return
}

;  Video Properties - MediaInfo.Dll  www.autohotkey.com/forum/topic66500.html

MediaInfo_New() {
 Return DllCall( "mediainfo\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_New" )
}

MediaInfo_Open( hnd, MediaFile ) {
 Return DllCall( "mediainfo.dll\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Open", UInt,hnd
               , Str,MediaFile, UInt )
}

MediaInfo_Get( hnd, StrK=0, StrN=0, Comm="", InfK=0, Srch=0 ) {
 Return DllCall( "mediainfo.dll\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Get", UInt,hnd
               , Int,StrK, Int,StrN, Str,Comm, Int,InfK, Int,Sech, Str )
}

MediaInfo_Close( hnd ) {
 Return DllCall( "mediainfo\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Close", UInt,hnd )
}

69

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

becauseim пишет:

Нет, с Tag.exe я не разобрался.

В чём там разбираться? По кнопкам я дал полноценное описание. Как править параметры в --sheme неясно? Что там вообще понимать? --sheme "A\A - T" - это? Это же очевидность очевидная.

becauseim пишет:

старался уточнить все интересующие моменты.

Серьезно? Я предложил библиотеку MediaInfo, Вы не отреагировали. Я просил данные из "Подробно", Вы  не ответили. Я спросил про скорость с кнопкой Tag, Вы не ответили.

becauseim пишет:

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

Лучше, конечно, со всеми. В каком смысле "не привязанным"? Это вообще как?

Кстати, проблему с тормозами я определил. Проверьте, как сейчас скрипт работает.
Ключ с получателем добавил. Остальное - после ответов.

70 (изменено: becauseim, 2016-10-23 05:13:24)

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

Flasher, новая версия работает быстро. Спасибо! К сожалению, все так же пропускает ряд файлов, в моем случае, большую часть файлов.
upd.: Заметил, что у меня не работает ключ /c: для задания минимального числа для перемещения.

Tag.exe после приведенной инструкции не тестировал, т.к. вариант с ТС интересует меньше всего по упомянутым причинам. Потому не привел уточнений по его использованию. Еще одна причина: не активируется панель инструментов в ТС. Переустанавливать не стал из-за текущих тонких настроек. В "Подробно" теги не отображаются, но видны редактору тегов (AIMP).

Не привязанным к тегам - значит, что названия для папок могут браться не из тегов файла, а из его имени после переименования редактором. Файл называется "Christie Front Drive - Field.mp3", соответственно, переносится в подпапку "Christie Front Drive". Файл "Track01.mp3" никуда не переносится, т.к. нет разделителя " - ".

Malcev, спасибо! Попробую протестировать Ваш вариант.

71

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

becauseim пишет:

Заметил, что у меня не работает ключ /c: для задания минимального числа для перемещения.

Случайно строку затёр, вернул.

becauseim пишет:

т.к. вариант с ТС интересует меньше всего по упомянутым причинам.

Внимательно читаем:

Flasher пишет:

кнопку, которая давалась для упрощения тестов с Tag. А откуда в конечном счёте будет вызываться комстрока с утилитой - дело десятое.

ТС не является обязательным для постоянки, речь шла о тестах.

becauseim пишет:

Еще одна причина: не активируется панель инструментов в ТС.

В смысле?

becauseim пишет:

а из его имени после переименования редактором.

Всё не так просто. В такой ситуации имя файла должно быть тождественно последнему компоненту (имени) в шаблоне, притом что в части вышестоящих папок других тегов быть не должно. Допустим, шаблон - Genre\Artist\(Year) Album\TrackNumber - Title c разделителем " - ", и из тегов есть только Artist и Title, а реальное имя "<Album> - <Title>", то как быть? И таких ситуаций достаточно можно придумать. Т.е. нужен какой-то общий алгоритм для разных схем, коли мы сошлись на универсальном средстве.

72

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

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

73

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

becauseim
Т.е. вызов cm_VisButtonbar из космтроки ни к чему не приводит? Тогда дело в размерах.
Вызываем команду панели инструментов cm_ButtonConfig из космтроки или гл. меню и смотрим, чтобы "Размер:" был положительным, стоит брать [22+], если отмечены и "Маленькие", то [16+].

Я не пишу, что вообще нецелесообразно. Я пишу, что алгоритм должен быть общий. Например, если в схеме указано тегов больше/меньше, чем их есть в имени (например, "Artist\Album\Artist - Title" при "Исполнитель - Название.mp3") и/или в имени число разделителей (вкл. 0) не соответствует схеме, то файл не трогать. Как-то так.

74

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

Не вижу причин тянуть с ответом. Сделал так, как описал:

'•••••••••••••••••••••••••••••• VBS •••••••••••••••••••••••••••••••
' Переместить/переименовать MP3-файлы в рабочем каталоге по шаблону
'
' Условие: требуются MediaInfoActiveX.dll и MediaInfo.dll
'
' Ключи: /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
Dim T, WMP, STg, ShA, MIA, 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

T = InStrRev(Scheme, "\") : Dim RScheme
If T Then
  Dim Test : Test = InStr(Mid(Scheme, T), Delim)
  RScheme = Mid(Scheme, T) & Left(Scheme, T)
Else Count = 0 : RScheme = Scheme End If
If Count > 1 Then Dim Dic : _
Set Dic = CreateObject("Scripting.Dictionary")
Set STg = CreateObject("Scripting.Dictionary")
Set ShA = CreateObject("Shell.Application")
Set MIA = CreateObject("MediaInfo.ActiveX")
Dim Reg : Set Reg = New RegExp : Reg.Global = True
Set FSO = CreateObject("Scripting.FileSystemObject")
R = Array(-230,-225,-246,698,894,-24,-24,706,707)
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, F, Handle
Set Items = Dir.Items : Items.Filter 90304, "*.mp3"
If Items.Count = 0 Then Msg "В каталоге нет MP3-файлов!", 4144

For Each F in Split("Year TrackNumber Title Album Artist Genre")
  If InStr(RScheme, F) > 0 Then STg.Add F, ""
Next : Handle = MIA.MediaInfo_New()

Dim rPath, Arr, Check, i, n, c, Tag, RelPath, Path, BN, Ext, Name, Pr
For Each F in Items
  MIA.MediaInfo_Open Handle, F.Path : rPath = Scheme : c = 0
  Arr = Split(FSO.GetBaseName(F), Delim) : Check = 1
  For Each i in STg.Keys
    n = i
    Select Case i
      Case "Year" n = "Recorded_Date"
      Case "TrackNumber" n = "Track/Position"
    End Select
    MIA.MediaInfo_Option Handle, "Inform", "General;%" & n & "%"
    Tag = Trim(MIA.MediaInfo_Inform(Handle, 0))
    If i = "TrackNumber" Then Reg.Pattern = "^0+" : Tag = Reg.Replace(Tag, "")
    If Tag = "" And Delim <> "" Then
      If UBound(Arr) + 1 = STg.Count Then Tag = Arr(c) Else Check = 0 : Exit For
    End If
    rPath = Replace(rPath, i, Tag) : c = c + 1
  Next
  If Check Then
    For Each i in Array("[ \.\(\{-]+\\+", "\\+[ \.\)\}-]+", "\\{2,}")
      Reg.Pattern = i : rPath = Reg.Replace(rPath, "\")
    Next
    For i = 0 To 8 : rPath = Replace(rPath, S(i), ChrW(R(i))) : Next
    RelPath = Left(rPath, InStrRev(rPath, "\"))
    Path = FSO.BuildPath(oDir, RelPath)
    If (Not Test Or (Test And InStr(RelPath, Delim) > 0)) And Right(rPath, 1) <> "\" Then
      If Not FSO.FolderExists(Path) Then Disk.NewFolder(Mid(Path, 4))
      BN = FSO.GetFileName(rPath) : Ext = "." & FSO.GetExtensionName(F)
      Name = BN & Ext : c = 0 : Pr = ""
      If Len(FSO.BuildPath(Path, Name)) > 259 Then Pr = "\\?\"
      If T Then
        While FSO.FileExists(Pr & FSO.BuildPath(Path, Name))
          c = c + 1 : Name = BN & " (" & c & ")" & Ext
        Wend
      End If : FSO.GetFile(F.Path).Move Pr & FSO.BuildPath(Path, Name)
      If Count > 1 Then If Not Dic.Exists(Path) Then Dic.Add Path, ""
    End If
  End If
Next
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

Придётся только это поставить.

75 (изменено: becauseim, 2016-10-25 15:41:49)

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

Flasher,
http://puu.sh/rUZwJ/cac56835af.png
Malcev, Ваш вариант создает одну папку TEMP c единственным внутри mp3-файлом с именем " - .mp3". Путь расположения MediaInfo.dll я предварительно указал.

76

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

Я проверял на автохотки 32bit c mediainfo.dll 32bit.
Всё работает.

77 (изменено: becauseim, 2016-10-25 16:08:49)

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

Malcev, переустановил AHK на 32bit, заработало примерно с такой скоростью (6-7 файлов в секунду):
http://puu.sh/rV0kd/80f72fab2e.gif
Это нормальная скорость?
Да, и сценарий окончил свою работу, оставив часть файлов. При повторном запуске скрипта, эти файлы опять же игнорируются.
Один из таких файлов: http://dropmefiles.com/FUeNV

78 (изменено: Malcev, 2016-10-25 16:35:11)

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

У меня этот файл не игнорируется и переносится.
Файлы игнорируются, те у которых mediainfo не видит тагов.
Mediainfo у меня отсюда:
https://mediaarea.net/download/binary/l … staller.7z
Также у меня и не тормозит.
Cкорей всего тормозит при переносе.
Можно проверить:

InputFolder := "D:\DropMeFiles_uCAYG"
OutputFolder := "D:\DropMeFiles_uCAYG\TEMP"
MediainfoDll := "C:\MediaInfo.dll"

a := A_TickCount
SetBatchLines -1
DllCall("LoadLibrary", Str, MediainfoDll)
Loop, Files, %InputFolder%\*.mp3
{
   file := A_LoopFileLongPath
   Media_GetTag(file)
}
msgbox % A_TickCount - a

a := A_TickCount
Loop, Files, %InputFolder%\*.mp3
{
   file := A_LoopFileLongPath
   FileMove, %file%, %OutputFolder%\
}
msgbox % A_TickCount - a


Media_GetTag(file) {
 hnd := MediaInfo_New()
 MediaInfo_Open( hnd, file )
Global Artist := MediaInfo_Get( hnd, 0,0, "Artist", 1 )
Global Track := MediaInfo_Get( hnd, 0,0, "Track", 1 )
 MediaInfo_Close(hnd)
 return
}

;  Video Properties - MediaInfo.Dll  www.autohotkey.com/forum/topic66500.html

MediaInfo_New() {
 Return DllCall( "mediainfo\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_New" )
}

MediaInfo_Open( hnd, MediaFile ) {
 Return DllCall( "mediainfo.dll\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Open", UInt,hnd
               , Str,MediaFile, UInt )
}

MediaInfo_Get( hnd, StrK=0, StrN=0, Comm="", InfK=0, Srch=0 ) {
 Return DllCall( "mediainfo.dll\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Get", UInt,hnd
               , Int,StrK, Int,StrN, Str,Comm, Int,InfK, Int,Sech, Str )
}

MediaInfo_Close( hnd ) {
 Return DllCall( "mediainfo\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Close", UInt,hnd )
}

79

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

becauseim
Хм. Значит он компонент не ставит. Странно. В %WinDir%\SysWOW64 закиньте файлик и зарегистрируйте:

Post's attachments

MediaInfoActiveX.dll 21.5 kb, 2 downloads since 2016-10-25 

You don't have the permssions to download the attachments of this post.

80

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

Flasher, результат попытки зарегестрировать файл
http://puu.sh/rVhMg/961783ea89.png

81 (изменено: becauseim, 2016-10-25 22:30:26)

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

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

82

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

becauseim
А если из какой-нибудь несистемной папки?

83

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

Flasher
http://puu.sh/rVkm2/069335d888.png
Регестрирую таким способом:
http://puu.sh/rVko7/0eb5aa3d77.png

84

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

becauseim
Не, в корень диска не надо. Киньте рядом с MediaInfo.dll и оттуда пробуйте.

Скрипт поправил немного.

85

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

Если брать во внимание, что в win10 можно настроить длину пути файла - как любую длину, то можно так:

InputFolder := "D:\DropMeFiles_fAQQ9"
OutputFolder := "D:\DropMeFiles_fAQQ9\TEMP"
MediainfoDll := "C:\MediaInfo.dll"

a := A_TickCount
SetBatchLines -1
DllCall("LoadLibrary", Str, MediainfoDll)
Loop, Files, %InputFolder%\*.mp3
{
   InputFile := A_LoopFileLongPath
   Media_GetTag(InputFile)
   Artist := RegExReplace(Artist, "[<>:""/\\\|\?\*]")
   Track := RegExReplace(Track, "[<>:""/\\\|\?\*]")
   If (Artist = "") or (Track = "")
      Continue
   Dir := OutputFolder "\" Artist
   File := FileName := Artist " - " Track
   Ext := "mp3"
   IfNotExist, %Dir%
      FileCreateDir, %Dir%
   IfExist, %Dir%\%File%.%Ext%
   {
      loop
      {
         File := FileName "(" A_Index ")" 
         IfNotExist, %Dir%\%File%.%Ext%
            break
      }
   }
   FileMove, %InputFile%, %Dir%\%File%.%Ext%
}
msgbox % A_TickCount - a


Media_GetTag(file) {
 hnd := MediaInfo_New()
 MediaInfo_Open( hnd, file )
 Global Artist := MediaInfo_Get( hnd, 0,0, "Artist", 1 )
 Global Track := MediaInfo_Get( hnd, 0,0, "Track", 1 )
 MediaInfo_Close(hnd)
 return
}

;  Video Properties - MediaInfo.Dll  www.autohotkey.com/forum/topic66500.html

MediaInfo_New() {
 Return DllCall( "mediainfo\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_New" )
}

MediaInfo_Open( hnd, MediaFile ) {
 Return DllCall( "mediainfo.dll\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Open", UInt,hnd
               , Str,MediaFile, UInt )
}

MediaInfo_Get( hnd, StrK=0, StrN=0, Comm="", InfK=0, Srch=0 ) {
 Return DllCall( "mediainfo.dll\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Get", UInt,hnd
               , Int,StrK, Int,StrN, Str,Comm, Int,InfK, Int,Sech, Str )
}

MediaInfo_Close( hnd ) {
 Return DllCall( "mediainfo\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Close", UInt,hnd )
}

86 (изменено: becauseim, 2016-10-26 01:01:24)

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

Malcev, работает! Только смущает всплывающее иногда несколько раз окно с каким-то числовым значением. (Или это значение времени, за которое были произведены все операции?) В целом, то, что нужно. Было бы отлично, если бы Вы добавили условие для минимального числа файлов, для которых не надо создавать папку с именем исполнителя, а лишь перемещать по заданному пути (OutputFolder). Также, если это не сложно, как предложил Flasher, вложить в директорию исполнителя также директорию альбома.

Flasher, скрипт перезаписал, расположил MediaInfoActiveX.dll рядом с MediaInfo.dll по пути c:\Program Files (x86)\MediaInfo Lite\, но выходит прежняя ошибка. Файл MediaInfoActiveX.dll перед этим еще раз попытался зарегестрировать - к сожалению, безуспешно.

87

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

becauseim
Давайте возьмём несистемную папку, скажем, C:\Portable\. Распакуем туда приложенный архив и запустим таким образом:

C:\Portable\MediaInfoActiveX\wscript.exe C:\Portable\MediaInfoActiveX\RenMoveMP3.vbs <ключи>

Post's attachments

MediaInfoActiveX.7z 1.15 mb, 3 downloads since 2016-10-26 

You don't have the permssions to download the attachments of this post.

88

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

Flasher

+ открыть спойлер

http://puu.sh/rVvll/6a9fe881ec.gif

89

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

becauseim пишет:

Также, если это не сложно, как предложил Flasher, вложить в директорию исполнителя также директорию альбома.

Вообще-то я предложил куда более универсальный вариант.


becauseim
Мда. Сколько уже набралось поводов ненавидеть 10-ку...
Попробуйте на этом wscript.exe зайти в Свойства на вкладку "Совместимость", в секции "Уровень прав" отметить флажок с запуском от админа и применить.
Вообще я бы не отказался на удалёнке посмотреть, что можно сделать.

90

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

InputFolder := "D:\DropMeFiles_fAQQ9"
OutputFolder := "D:\DropMeFiles_fAQQ9\TEMP"
MediainfoDll := "C:\MediaInfo.dll"
MinFiles := 2

SetBatchLines -1
DllCall("LoadLibrary", Str, MediainfoDll)
Array := []
Loop, Files, %InputFolder%\*.mp3
{
   InputFile := A_LoopFileLongPath
   Media_GetTag(InputFile)
   If (Artist = "") or (Track = "") or (Album = "")
      Continue
   if (Array[Artist] = "")
      Array[Artist] := 1
   else
      Array[Artist]++
   n++
   Obj%n% := {InputFileKey: InputFile, ArtistKey: Artist, AlbumKey: Album, TrackKey: Track}
}
loop % n
{
   In := Obj%A_Index%.InputFileKey
   If (Array[Obj%A_Index%.ArtistKey] < MinFiles)
      Dir := OutputFolder
   Else
      Dir := OutputFolder "\" Obj%A_Index%.ArtistKey "\" Obj%A_Index%.AlbumKey
   File := FileName := Obj%A_Index%.ArtistKey " - " Obj%A_Index%.TrackKey
   Ext := "mp3"
   IfNotExist, %Dir%
      FileCreateDir, %Dir%
   IfExist, %Dir%\%File%.%Ext%
   {
      loop
      {
         File := FileName "(" A_Index ")" 
         IfNotExist, %Dir%\%File%.%Ext%
            break
      }
   }
   FileMove, %In%, %Dir%\%File%.%Ext%
}
msgbox Done


Media_GetTag(file) {
 hnd := MediaInfo_New()
 MediaInfo_Open( hnd, file )
 Global Artist := Regex(MediaInfo_Get( hnd, 0,0, "Artist", 1 ))
 Global Track := Regex(MediaInfo_Get( hnd, 0,0, "Track", 1 ))
 Global Album := Regex(MediaInfo_Get( hnd, 0,0, "Album", 1 ))
 MediaInfo_Close(hnd)
 return
}

;  Video Properties - MediaInfo.Dll  www.autohotkey.com/forum/topic66500.html

MediaInfo_New() {
 Return DllCall( "mediainfo\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_New" )
}

MediaInfo_Open( hnd, MediaFile ) {
 Return DllCall( "mediainfo.dll\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Open", UInt,hnd
               , Str,MediaFile, UInt )
}

MediaInfo_Get( hnd, StrK=0, StrN=0, Comm="", InfK=0, Srch=0 ) {
 Return DllCall( "mediainfo.dll\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Get", UInt,hnd
               , Int,StrK, Int,StrN, Str,Comm, Int,InfK, Int,Sech, Str )
}

MediaInfo_Close( hnd ) {
 Return DllCall( "mediainfo\MediaInfo" ( A_IsUnicode ? "" : "A" ) "_Close", UInt,hnd )
}

Regex(File)
{
   return, RegExReplace(File, "[<>:""/\\\|\?\*\n\r]")
}

91

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

Malcev, спасибо! Работает!
Flasher, после изменения совместимости, кажется, ничего не изменилось. Запускал из Вашего архива. У меня есть TeamViewer, можно было бы подключиться, но сейчас нахожусь за городом, где безлимит, к сожалению, только ночью. Пока пользуюсь вариантом от Malcev. Спасибо Вам за любезное старание!

92

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

becauseim пишет:

Запускал из Вашего архива.

Без распаковки? o_O
Пока пользуйтесь тем, но он сыроват по ряду пунктов.
Ночь меня не пугает. Только см. ссылку (этот клиент возьмём).

93 (изменено: becauseim, 2016-10-27 22:10:47)

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

Flasher, с распаковкой. Имел в виду, что конкретно этому wscript.exe задал необходимые свойства. Для запуска использовал следующий ключ: C:\Portable\MediaInfoActiveX\wscript.exe C:\Portable\MediaInfoActiveX\RenMoveMP3.vbs /s:"Artist\Artist - Title" /d:" - "
http://puu.sh/rXAxK/c289b34763.png

94

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

becauseim
Я, конечно, сомневаюсь, что это поможет, но попробуйте временно заменить wscript.exe тем, что в SysWOW64.

95

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

Flasher, то же самое.

96

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

becauseim
Ясно. Сбрасывайте ID для Ammyy мне в ЛС, посмотрим, что там.

97

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

becauseim
Попробуйте установить этот рантайм и ещё раз протестировать.

98

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

Flasher, извиняюсь, забыл сразу ответить. Рантайм установил, перезагрузился, но ошибка та же. Запускал на основе распакованного архива в C:\Portable c упомянутым ранее ключом.

99

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

becauseim
Давайте попробуем узнать, что там отсутствует. Нужно поставить в ТС этот плагин, установить курсор на MediaInfoActiveX.dll, нажать F3/Ctrl+Q, в окне/панели просмотра перейти на вкладку DLL Dependency, нажать плюсик. Если там будут библиотеки, отмеченные красным, то стоит скачать, закинуть в SysWOW64 и зарегистрировать.

Ссылку поправил. Её обсуждение убрал.

100

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

becauseim, как ваша проблема? Решилась? Расскажите на чем остановились.

Нас невозможно сбить с пути, нам пофигу куда идти.