Войти

Показать полную графическую версию : [решено] Вставить имя файла в текстовый файл (UTF-8 without BOM)


Jahnhoy
17-09-2011, 23:38
Как бы сделать батник у которого входным параметром был путь до папки и делал он следующие:
Рекурсивно обходил все подпапки от заданной начальной, а также в ней самой для всех файлов с расширенем .mp3 .flac .ape .wv создавал (но не перезаписывал если такой уже есть) текстовой файл в той же папки и с таким же именем, но с расширением .apl и кодировкой UTF-8 without BOM (Dos\Windows). Плюс содержимое этого файла было следующие[Monkey's Audio Image Link File]
Image File=ИМЯ_ФАЙЛА.РАСШИРЕНИЕ
Start Block=0

----- APE TAG (DO NOT TOUCH!!!) -----

P.S. Если кому интересно таким образом можно сделать музыкальную библиотеку в foobar2000 которая будет иметь правильные теги (APEv2) не трогая саченных с торрента файлов (нужен только foo_input_monkey.dll). Можно прям в uTorrent вставить этот батник, чтоб он генерировал аплки когда докачает, и они автоматом добавлялись в библиотеку fb2k, в 3 секунды стянуть теги и вуаля мы и продолжаем сидировать и имеем правильные теги. Также apl позволяет указывать полный путь до файла, а хранить его в другом месте, но такой способ имеет ряд недостатков. Единственная загвоздка с image+сue раздачами, конечно можно добавить в батник проверка если файл только один и есть файл .cue то запустить или другой батник или програмку которая можно превращать cue в apl, но такого батника у меня нет, а единственная программа (http://www.hydrogenaudio.org/forums/index.php?showtopic=56906) которая может это делать не может принимать параметров, да еще часто в одной папки лежать несколько image файлов. Так что с данным бат, будет просто создаваться ссылка на один длинный файл, через который можно попасть в папку добавить оттуда cue в foobar2000 и им разрезать на апл, благо такая возможность в нем есть и музыки в image формате появляется все меньше и меньше. Заранее спасибо.

SendMessage
18-09-2011, 13:10
Jahnhoy, могу предложить решение на WSH:
' Запуск:
' wscript.exe маршрут_скрипта обрабатываемая_папка1 [обрабатываемая_папка2] [...]

Option Explicit

Const EXT_FILTER = "*.mp3; *.flac; *.ape; *.wv"

If WScript.Arguments.Length Then
Dim objShApp
Dim objFSO
Dim objOC
Dim i
Set objShApp = CreateObject("Shell.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objOC = CreateObject("OlePrn.OleCvt.1")
For i = 0 To WScript.Arguments.Count - 1
RecDirs objFSO.getfolder(WScript.Arguments.Item(i))
Next
Set objShApp = Nothing
Set objFSO = Nothing
Set objOC = Nothing
End If

MsgBox "Скрипт отработал."

WScript.Quit

Sub RecDirs(sDir)
Dim SubDir
Dim arrFiles
Dim i
For Each SubDir In sDir.SubFolders
RecDirs(SubDir)
Next
Set arrFiles = objShApp.NameSpace(sDir.Path).Items
arrFiles.Filter 192, EXT_FILTER
For i = 0 To arrFiles.Count - 1
CreateAplFile arrFiles.Item(i).Path
Next
End Sub

Sub CreateAplFile(fPath)
Dim aplFile
Dim aplFileName
aplFileName = objFSO.GetParentFolderName(fPath) & "\" & objFSO.GetBaseName(fPath) & ".apl"
If Not objFSO.FileExists(aplFileName) Then
Set aplFile = objFSO.CreateTextFile(aplFileName)
aplFile.Write "[Monkey's Audio Image Link File]" & vbCrLf & _
"Image File=" & objOC.ToUtf8(fPath) & vbCrLf & _
"Start Block=0" & vbCrLf & vbCrLf & _
"----- APE TAG (DO NOT TOUCH!!!) -----"
aplFile.Close
End If
End Sub

Jahnhoy
18-09-2011, 16:17
SendMessage, спасибо огромное вам, мне то всеравно, на чем, главное чтоб работал, только вот с ним есть небольшые проблемки почасти unicode'а. Во первых он создает файлы .apl в кодировки ANSI (по крайне мере так показывает notepad++) и выдает ошибку если встречает файлы по типу 01. Transe Amazônico.mp3. А во вторых ну это не ошибка конечно, но можно ли в "Image File=" вписывать не полный путь до файла, а только само название файла.

P.S. Может я неправильно поступил, но я дал скрипту расширение .vbs и сначала он мне выдавал ошибки, потом погуглил оказывается его надо сохранить в ANSI, а до этого он был в UTF-8, и не работал.

P.S.S. Я тут вручную поправлял все кодировки и точно убедился, что если в файлах присуствуют диакритические символы (а я любитель французкой музыки и таких файлов у меня очень много), то работает только с такой кодировкой http://i.imgur.com/sttWj.jpg в меню notepad++ она носит названее UTF-8 without BOM

SendMessage
18-09-2011, 17:06
Во первых он создает файлы .apl в кодировки ANSI (по крайне мере так показывает notepad++) и выдает ошибку если встречает файлы по типу 01. Transe Amazônico.mp3 »
Файл определится как utf-8 только при наличии символов >127. Ведь BOM в начале файла отсутствует, а символы 0-127 в utf-8 совпадают с ansi.
Кстати, я назвал у себя файл 01. Transe Amazônico.mp3 и все нормально (смотрите прикрепленный рисунок).
А во вторых ну это не ошибка конечно, но можно ли в "Image File=" вписывать не полный путь до файла, а только само название файла. »
Замените строку
"Image File=" & objOC.ToUtf8(fPath) & vbCrLf & _
на
"Image File=" & objOC.ToUtf8(objFSO.GetFileName(fPath)) & vbCrLf & _

Jahnhoy
18-09-2011, 17:49
SendMessage, у вас на скриншоте, имя самого апл файла без этой ô. Я когда запускаю скрипт он сначало выдаёт это http://i.imgur.com/scsVM.jpg и в папке появляется 01. Transe Amazônico.apl, но совершенно пустой, затем я жму ок и он обрабатывает все остальные файлы нормлально.

P.S. Win 7 Enterprise SP1 EN но system codepage русская. 1.vbs имеет кодировку ANSI.

SendMessage
18-09-2011, 17:58
Jahnhoy, SendMessage, у вас на скриншоте, имя самого апл файла без этой ô. »
Внимательней смотрите - на вкладке написано имя файла. А в заголовке окна просто не поддерживается.

Я когда запускаю скрипт он сначало выдаёт это »
Понятно. В семерке или нет файла oleprn.dll, или в нем нет соответствующей функции кодирования в utf-8.

Jahnhoy
18-09-2011, 18:15
SendMessage, действительно извините пожалуйста. Но тут чертовщина какая твориться. Проверял щас как на Win7 en так и на WinXP SP3 rus, создал папочку и начинал переименовывать файлы со всякими разными символами и так, на символах ô и ê выдают ошибку, а вот é É à ошибку не выдают, но скрипт все равно делает с é É à не рабочие апл в кодировки ANSI :-( может выложите ваш скрипт которые правильно сработал, мож это как то не так скопировал, а то ничего не могу понять, почему такая избирательность не рабочих символов.

UPD: Прикрепил архив с тестовыми файлами (обычные txt переименованные в Mp3 c разными именами) + сам скрипт. Итог моего теста абсолютно одинаковый на Win7_Enterprise_SP1_ENG и на WinXP_Proffesional_SP3_RUS создаются без ошибок только 3 апл файла (1,2 и 7 трек), но и они с нерабочей кодировкой ANSI.

kiripanda
18-09-2011, 19:22
Я когда запускаю скрипт он сначало выдаёт это и в папке появляется 01. Transe Amazônico.apl, но совершенно пустой »
Подтверждаю на WinXP SP3 rus
oleprn.dll ver. 5.1.2600.5512 (xpsp.080413-0852)

SendMessage
19-09-2011, 13:21
Jahnhoy
Честно говоря, я в тупике. У меня никаких ошибок не выдает и создает все файлы нормально. Я прикрепил результат отработки по тестовой папке. Обрабатывалось присланным скриптом.
Все файлы notepad++ идентифицирует как "Encode in UTF-8 without BOM".

Ждите, когда прояснят ситуацию более компетентные люди.

Jahnhoy
19-09-2011, 13:43
SendMessage, действительно все сделало как надо, скажите пожалуйста какая у вас система (и системная локализация) и версия этого oleprn.dll. Может это баг этой dll в новых версиях.

SendMessage
19-09-2011, 14:33
скажите пожалуйста какая у вас система (и системная локализация) и версия этого oleprn.dll. »
win xp pro sp2 rus
oleprn.dll v.5.1.2600.2180

Jahnhoy
19-09-2011, 17:39
Решил проблему. На сколько я понял проблема на моих системах вызывали эти куски
Set objOC = CreateObject("OlePrn.OleCvt.1")
objOC.ToUtf8
т.е. предложенный SendMessage'ом путь создавать текстовый файл в ansi и в него впихивать unicode символы почему у меня не сработал, я погугули и нашел решение котрое действует наооборот т.е. создает изначально UTF-8 а потом удаляет из него это чертов BOM, кстати нашел на этом же форуме (http://forum.oszone.net/showpost.php?p=1684859), а тут (http://forum.sysadmins.su/index.php?showtopic=40247759&st=0&p=641047&#entry641047) есть решение с отдельной функцией, но уже не стал заморачиваться. Так, что вот версия которая у меня работает не отлично.

' Запуск:
' wscript.exe маршрут_скрипта обрабатываемая_папка1 [обрабатываемая_папка2] [...]

Option Explicit

Const EXT_FILTER = "*.mp3; *.flac; *.ape; *.wv"

If WScript.Arguments.Length Then
Dim objShApp
Dim objFSO
Dim objOC
Dim i
Set objShApp = CreateObject("Shell.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objOC = CreateObject("OlePrn.OleCvt.1")
For i = 0 To WScript.Arguments.Count - 1
RecDirs objFSO.getfolder(WScript.Arguments.Item(i))
Next
Set objShApp = Nothing
Set objFSO = Nothing
Set objOC = Nothing
End If

MsgBox "Скрипт отработал."

WScript.Quit

Sub RecDirs(sDir)
Dim SubDir
Dim arrFiles
Dim i
For Each SubDir In sDir.SubFolders
RecDirs(SubDir)
Next
Set arrFiles = objShApp.NameSpace(sDir.Path).Items
arrFiles.Filter 192, EXT_FILTER
For i = 0 To arrFiles.Count - 1
CreateAplFile arrFiles.Item(i).Path
Next
End Sub

Sub CreateAplFile(fPath)
Dim aplFileUTF8
Dim aplFileWithoutBOM
Dim aplFileName
aplFileName = objFSO.GetParentFolderName(fPath) & "\" & objFSO.GetBaseName(fPath) & ".apl"
If Not objFSO.FileExists(aplFileName) Then
Set aplFileUTF8 = CreateObject("ADODB.Stream")
aplFileUTF8.Type=2
aplFileUTF8.Charset = "UTF-8"
aplFileUTF8.Open
aplFileUTF8.WriteText "[Monkey's Audio Image Link File]" & vbCrLf & _
"Image File=" & objFSO.GetFileName(fPath) & vbCrLf & _
"Start Block=0" & vbCrLf & vbCrLf & _
"----- APE TAG (DO NOT TOUCH!!!) -----"
aplFileUTF8.Position=3
Set aplFileWithoutBOM = CreateObject("ADODB.Stream")
aplFileWithoutBOM.Type=1
aplFileWithoutBOM.Open
aplFileUTF8.CopyTo aplFileWithoutBOM
aplFileWithoutBOM.SaveToFile(aplFileName)
End If
End Sub

SendMessage еще раз вам говорю спасибо за помощь.




© OSzone.net 2001-2012