<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript/WSH: Конвертация flac в mp3]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=4996&amp;type=atom" />
	<updated>2010-10-04T14:28:53Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=4996</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=39876#p39876" />
			<content type="html"><![CDATA[<p>OFF:</p><div class="quotebox"><cite>Высокий пишет:</cite><blockquote><p>…теги не сможете перенести…</p></blockquote></div><p>Да, ну, совсем не смогу <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" />: <a href="http://api.farmanager.com/ru2/macro/macrocmd/functions.html">Функции</a>?!</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-10-04T14:28:53Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=39876#p39876</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=39873#p39873" />
			<content type="html"><![CDATA[<p>Как минимум, теги не сможете перенести и ручной работы многовато.</p>]]></content>
			<author>
				<name><![CDATA[Высокий]]></name>
			</author>
			<updated>2010-10-04T13:46:13Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=39873#p39873</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=39871#p39871" />
			<content type="html"><![CDATA[<p>OFF: </p><div class="quotebox"><cite>Высокий пишет:</cite><blockquote><p>Как вы предлагаете делать конвертацию Far&#039;ом?</p></blockquote></div><p>Не Far&#039;ом, а с помощью Far&#039;а; например: поиск *.flac, помещение результатов во временную панель, выделение, обработка файлов по Ctrl-G (на каждую команду) или, лучше, через подготовленный пункт UserMenu (так же, как Вы делаете посредством «WshShell.Run»). Естественно, без транслитерации; если она понадобиться — будет транслитерация, то надо будет уже писать макрос.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-10-04T12:46:42Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=39871#p39871</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=39869#p39869" />
			<content type="html"><![CDATA[<p>Обновил. Изменения:<br />* Учтён рабочий каталог скрипта. Протестирован SendTo.<br />* Учтён регистр тегов. Это нужно тестировать, мой metaflac 1.2.1 создает их в верхнем регистре. Возможно зависит от файла.<br />* Добавлено предварительное сканирование на наличие файлов flac.</p><div class="codebox"><pre><code>&#039;*********************************************************************************
&#039;script        : flac_v_mp3.vbs
&#039;description    : Recode flac to mp3  
&#039;usage        : create a shortcut to this file in the &quot;SendTo&quot; folder or run with source path
&#039;date        : 04.10.2010
&#039;version    : 1.1
&#039;req        : flac.exe metaflac.exe http://flac.sourceforge.net/ lame.exe http://lame.sourceforge.net
&#039;author        : Ivan@Lapenkov.ru
&#039;    Описание    
&#039;    У вас есть папка вида    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы&quot;
&#039;    внутри которой папки и файлы, в том числе .flac :    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы\[01] Моцарт\01 - Маленькая ночная серенада соль мажор (KV 525) - Allegro.flac&quot;
&#039;    Запускаете     
&#039;        flac_v_mp3.vbs &quot;I:\Звук\Классика\_Сборники\Великие композиторы&quot;
&#039;    Создается папка    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3&quot;
&#039;    внутри которой:    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3\[01] Моцарт\01 - Маленькая ночная серенада соль мажор (KV 525) - Allegro.mp3&quot;
&#039;    или при запуске с настройкой RecodeRus=1 :    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3\[01] Mocart\01 - Malen&#039;kaja nochnaja serenada sol&#039; mazhor (KV 525) - Allegro.mp3&quot;
&#039;    Переносятся теги, высокое качество, VBR, стерео. Все настройки кодирования можно изменить. На посторонние файлы внимания не обращает.    
&#039;    Скрипт создает временный файл в %Temp%, из тегов удаляются символы &quot;?*\/|&lt;&gt;:
&#039;    Скрипт можно запускать повторно, уже созданные файлы пропускаются.
&#039;        
&#039;    Скрипт требует следующие компоненты в своей папке:    
&#039;    flac.exe metaflac.exe    
&#039;    Версия     1.2.1
&#039;    http://flac.sourceforge.net    
&#039;        
&#039;    lame.exe    
&#039;    Версия    3.98.4
&#039;    http://lame.sourceforge.net    
&#039;        
&#039;    Протестировано на WinXP Prof sp3 rus.    
&#039;    Автор программы разрешает её свободное распространение и использование любых её фрагментов.
&#039;*********************************************************************************

&#039;***********************************
&#039;Настройки
&#039;***********************************
Option Explicit

&#039; Настройки кодировщика LAME
Const LameKeys = &quot;-V 0 --vbr-new -m s -q 2 --add-id3v2 --ignore-tag-errors --nohist --quiet&quot; 

&#039; 1 - перекодировать имена файлов в транслит, 0 - нет. Удобно для устройств не поддерживающих кириллицу.
Const RecodeRus=0

&#039; Пауза на сообщениях о некритических ошибках, секунды
Const PauseSize = 5     

&#039; 0 - окна кодировщиков скрыты, 1 - показываются
Const WindowState = 0    

&#039; Будет добавлено к имени исходной папки при создании выходной папки
Const sPostfixFolder = &quot;-mp3&quot; 

&#039; Расширения файлов
Const sExtToGet = &quot;flac&quot;
Const sExtToSet = &quot;mp3&quot;

&#039; Название приложения
Const sAppName = &quot;Конвертер FLAC в mp3&quot;

&#039; Таблицы конвертации символов
Const tr=&quot;а б в г д е ё  ж  з и й  к л м н о п р с т у ф х  ц ч  ш  щ   ъ  ы ь э  ю  я  А Б В Г Д Е Ё  Ж  З И Й  К Л М Н О П Р С Т У Ф Х  Ц Ч  Ш  Щ   Ъ  Ы Ь Э  Ю  Я  &quot;
Const tl=&quot;аaбbвvгgдdеeёjoжzhзzиiйjjкkлlмmнnоoпpрrсsтtуuфfхkhцcчchшshщshhъ&#039;&#039;ыyь&#039;эehюjuяjaАAБBВVГGДDЕEЁJoЖZhЗZИIЙJjКKЛLМMНNОOПPРRСSТTУUФFХKhЦCЧChШShЩShhЪ&#039;&#039;ЫYЬ&#039;ЭEhЮJuЯJa&quot;

&#039;***********************************
&#039;Начало основной программы
&#039;***********************************
Dim fso, WshShell, Kav, cptTot, objArgs, arg, dicPath, TagKeys, ScriptPath
Dim sSourceFolder, sSavePath, sTempFolder
Dim FlacExeFile, MetaFlacExeFile, LameExeFile
Dim nTime

Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)
Set dicPath = CreateObject(&quot;Scripting.Dictionary&quot;)
cptTot = 0 
nTime = Timer

sTempFolder = WshShell.ExpandEnvironmentStrings(&quot;%Temp%&quot;)

ScriptPath = FSO.GetParentFolderName(WScript.ScriptFullName)
FlacExeFile = FSO.BuildPath(ScriptPath, &quot;flac.exe&quot;)
MetaFlacExeFile = FSO.BuildPath(ScriptPath, &quot;metaflac.exe&quot;)
LameExeFile = FSO.BuildPath(ScriptPath, &quot;lame.exe&quot;)

If Not fso.FileExists(FlacExeFile) Then
    WshShell.Popup &quot;Не найден &quot; &amp; FlacExeFile, 0, sAppName, 48
    WScript.Quit
End If

If Not fso.FileExists(MetaFlacExeFile) Then
    WshShell.Popup &quot;Не найден &quot; &amp; MetaFlacExeFile, 0, sAppName, 48
    WScript.Quit
End If

If Not fso.FileExists(LameExeFile) Then
    WshShell.Popup &quot;Не найден &quot; &amp; LameExeFile, 0, sAppName, 48
    WScript.Quit
End If



Set objArgs = WScript.Arguments
if (objArgs.Count = 0) then
    WshShell.Popup &quot;В командной строке должен быть путь к исходным файлам. Need source path in arguments.&quot;, 0, sAppName, 48
    WScript.Quit
End If

&#039;-- Работа
Call startScanning()
Call endPopup()

&#039;-- Очистка
Set fso = nothing
Set WshShell = nothing                    
Set dicPath = nothing
&#039;***********************************
&#039;Конец основной программы
&#039;***********************************


&#039;***********************************
&#039;Функции
&#039;***********************************

Sub startScanning()

    Dim arg, fold, sSourceFoldName

    &#039; перебирает пути из командой строки
    For each arg in objArgs
        If fso.FolderExists(arg) Then
            
            Set sSourceFolder = fso.Getfolder(arg)

            &#039; Определимся с папкой для сохранения
            sSourceFoldName = sSourceFolder.Path
            sSavePath = sSourceFoldName &amp; sPostfixFolder
            dicPath.add sSavePath, sSavePath

            &#039;Обойдем папки, проверяя нужность конвертации
            Call DoCheck(sSourceFolder)

            If cptTot=0 Then
                WshShell.Popup &quot;Файлов для конвертации нет&quot;, PauseSize, sAppName, 48
                WScript.Quit
            Else
                &#039;WshShell.Popup &quot;Файлов для конвертации &quot; &amp; cptTot, PauseSize, sAppName, 64
            End If
            
            cptTot=0

            &#039; Создание папки для сохранения
            If Not fso.FolderExists(sSavePath) Then
                &#039;WshShell.Popup &quot;Создание папки &quot; &amp; sSavePath, PauseSize, sAppName, 64
                fso.CreateFolder(sSavePath)
            End If

            &#039;Обойдем папки, конвертируя
            Call DoIt(sSourceFolder)
        End If
    Next
End Sub 
&#039;*********************************************************************************

Sub DoIt(fold)
&#039; Рекурсия
    Dim sfold, sfoo
    Call ProceedFiles(fold)        &#039; обработывает все файлы в текущей папке
    Set sfold = fold.subfolders 
    for each sfoo in sfold        &#039; работа с подпапками
        Call DoIt(sfoo)
    Next
End Sub  

&#039;*********************************************************************************
&#039; Основная процедура обработки

Sub ProceedFiles(fold)

    Dim RetCode, strExt, mpFiles, objFile, strName, strNameNew, foldPath, cpt, f, mp3filename, mp3filepath, tempfilename, flacfilename, RunFlacCommand, RunLameCommand
    Dim temptagfile, temptagfilename, TagsText, TextLine

    tempfilename = sTempFolder &amp;&quot;\&quot;&amp; FSO.GetTempName()
    temptagfilename = sTempFolder &amp;&quot;\&quot;&amp; FSO.GetTempName()
    If fso.FileExists(tempfilename) Then
                  fso.DeleteFile tempfilename, 1
    End If
    If fso.FileExists(temptagfilename) Then
                  fso.DeleteFile temptagfilename, 1
    End If

    cpt = 0
    foldPath = fold.Path
    mp3filepath = Replace(foldPath, sSourceFolder.Path, &quot;&quot;)
    If RecodeRus = 1 Then
        mp3filepath=translit(mp3filepath)
    End If
    mp3filepath=sSavePath &amp; mp3filepath

    &#039; ***** Создание конечной папки 
    If Not fso.FolderExists(mp3filepath) Then
        fso.CreateFolder(mp3filepath)
    End If

    &#039; ***** обработаем все файлы в папке
    Set mpfiles = fold.Files
    
    For each f in mpfiles

        strName = f.Name
        strExt = LCase(fso.GetExtensionName(strName)) &#039; Получим расширение

        If strExt = sExtToGet Then

            &#039; ***** Подготовка имен файлов
            flacfilename = foldPath &amp;&quot;\&quot;&amp; strName
            strNameNew = Replace(strName, sExtToGet, sExtToSet)
            If RecodeRus = 1 Then
                strNameNew=translit(strNameNew)
            End If
                   mp3filename = mp3filepath &amp; &quot;\&quot; &amp; strNameNew

            &#039; ***** Проверка нужности конвертации
            If Not fso.FileExists(mp3filename) Then

            &#039; ***** Раскодирование во временный файл
            RunFlacCommand = FlacExeFile &amp;&quot; -d -F -f &quot;&quot;&quot;&amp; flacfilename &amp;&quot;&quot;&quot; -o &quot;&quot;&quot;&amp; tempfilename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunFlacCommand, WindowState , true)
            If RetCode = 1 Then
                WshShell.Popup &quot; Ошибка в &quot;&amp; RunFlacCommand, PauseSize, sAppName, 48
            End If
            &#039; если у файла назначения есть атрибут ReadOnly, снимаем его
            If fso.FileExists(tempfilename) Then
                    Set objFile = FSO.GetFile(tempfilename)
                If objFile.Attributes And 1 Then
                    objFile.Attributes = objFile.Attributes - 1
                End If
                set objFile = nothing
            End If

            &#039; ***** теги
            TagKeys=&quot;&quot; &#039; главная переменная куда будут сохраняться ключи командной строки
            RunFlacCommand = MetaFlacExeFile &amp;&quot; --export-tags-to=&quot;&amp; temptagfilename &amp;&quot; &quot;&quot;&quot;&amp; flacfilename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunFlacCommand, WindowState , true)
            If fso.FileExists(temptagfilename) Then
                Set temptagfile = FSO.GetFile(temptagfilename)
                Set TagsText = temptagfile.OpenAsTextStream(1,0)
                Do While Not TagsText.AtEndOfStream
                    ParseTagToKeys(TagsText.ReadLine)
                Loop
                TagsText.Close
                set temptagfile = nothing
                fso.DeleteFile temptagfilename, 1
                TagKeys = TagKeys &amp;&quot; --tv &quot;&quot;TENC=FLAC-&gt;LAME&quot;&quot;&quot;
            End If

            &#039; ***** Кодирование в mp3
            RunLameCommand = LameExeFile &amp;&quot; &quot;&amp; LameKeys &amp;&quot; &quot;&amp; TagKeys &amp;&quot; &quot;&quot;&quot;&amp; tempfilename &amp;&quot;&quot;&quot;  &quot;&quot;&quot;&amp; mp3filename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunLameCommand, WindowState , true)
            If not RetCode = 0 Then
                WshShell.Popup &quot; Ошибка в &quot;&amp; RunLameCommand, PauseSize, sAppName, 48
            End If


            &#039; ***** Удаление временного файла
            If fso.FileExists(tempfilename) Then
                            fso.DeleteFile tempfilename, 1
            End If

            cpt = cpt + 1
                          
            End If
        End If
    Next

    cptTot = cptTot + cpt    &#039; общий счетчик файлов
End Sub
&#039;*********************************************************************************

Sub ParseTagToKeys(textline)

    ParseTag textline,&quot;TITLE&quot;, &quot;--tt&quot;
    ParseTag textline,&quot;DATE&quot;,&quot;--ty&quot;
    ParseTag textline,&quot;ARTIST&quot;,&quot;--ta&quot;
    ParseTag textline,&quot;ALBUM&quot;,&quot;--tl&quot;
    ParseTag textline,&quot;TRACKNUMBER&quot;,&quot;--tn&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TCOM=&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TPE2=&quot;
    ParseTag textline,&quot;COMMENT&quot;,&quot;--tc&quot;

&#039;    ParseTag textline,&quot;YEAR&quot;,&quot;--ty&quot;
    &#039;ParseTag textline,&quot;GENRE&quot;,&quot;--tg&quot;     &#039;&quot;genre&quot; нужно включать таблицу, но нет желания с ней возиться
    &#039;ParseTag textline,&quot;ENCODER&quot;,&quot;&quot;     &#039; FLAC-&gt;LAME

End Sub
&#039;*********************************************************************************

Sub ParseTag(textline,tag,cmdkey)
        Dim TagText, Pos, TagKey
    TagKey=&quot;&quot;
    Pos=0
    textline=trim(textline)
    tag=tag&amp;&quot;=&quot;
    
    Pos=InStr(UCase(textline), UCase(tag))

        If Not Pos=0 Then
        TagText=Mid(textline, len(tag)+1)
        TagText=StrConvert(TagText, &quot;windows-1251&quot;, &quot;cp866&quot;)
        TagText = Replace(TagText, &quot;&quot;&quot;&quot;, &quot;&#039;&quot;) 
        TagText = Replace(TagText, &quot;:&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;&lt;&quot;, &quot;&#039;&quot;)
        TagText = Replace(TagText, &quot;&gt;&quot;, &quot;&#039;&quot;)
        TagText = Replace(TagText, &quot;|&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;?&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;*&quot;, &quot;+&quot;)
        TagText = Replace(TagText, &quot;/&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;\&quot;, &quot; &quot;)
        If RecodeRus = 1 Then
            TagText=translit(TagText)
        End If
        If InStr(cmdkey, &quot;&quot;&quot;&quot;)=0 Then &#039; часть cmdkey идёт с открытыми кавычками
            TagKey=cmdkey &amp; &quot; &quot;&quot;&quot; &amp; TagText &amp; &quot;&quot;&quot;&quot;
        Else
            TagKey=cmdkey &amp; TagText &amp; &quot;&quot;&quot;&quot;
        End If
        TagKeys = TagKeys &amp;&quot; &quot;&amp; TagKey
    End If
End Sub
&#039;*********************************************************************************

&#039;=============================================================================
&#039; HKEY_CLASSES_ROOT\MIME\Database\Charset
&#039; cp866, windows-1251, koi8-r, unicode, utf-8, _autodetect
&#039;=============================================================================
Function StrConvert(ByVal strText, ByVal strSourceCharset, ByVal strDestCharset)
    Const adTypeText      = 2
    Const adModeReadWrite = 3
    
    
    With WScript.CreateObject(&quot;ADODB.Stream&quot;)
        .Type      = adTypeText
        .Mode      = adModeReadWrite
        
        .Open
        
        .Charset   = strSourceCharset
        .WriteText strText
        
        .Position  = 0
        .Charset   = strDestCharset
        StrConvert = .ReadText
        
        .Close
    End With
End Function

Function showTime(nTime)
    showTime = &quot;Затрачено времени : &quot; &amp; Round((Timer - nTime),2) &amp;&quot; секунд&quot;
End Function
&#039;*********************************************************************************

&#039; функция транслитерации строки по ГОСТ 7.79 2000
Function translit(ByVal sIncoming)
    Dim pos, findpos, sSymbol
    
    translit=&quot;&quot;

    For pos = 1 To len(sIncoming) Step 1

        sSymbol=mid(sIncoming,pos,1)
        findpos=InStr(1, tr, sSymbol)
        If findpos=0 or sSymbol=&quot; &quot; Then
            &#039; ***** В транслитерации не нуждается
            translit=translit+sSymbol
        Else
            &#039; ***** Первый символ
            translit=translit+mid(tl,findpos+1,1)
            &#039; ***** Второй символ
            If mid(tr,findpos+2,1)=&quot; &quot; Then
                translit=translit+mid(tl,findpos+2,1)
                &#039; ***** Третий символ
                If mid(tr,findpos+3,1)=&quot; &quot; Then
                    translit=translit+mid(tl,findpos+3,1)
                End If
            End If
        End If
    Next
End Function

&#039;*********************************************************************************
&#039; проверяет наличие файлов для конвертации
Sub DoCheck(fold)

    Dim sfold, sfoo
    Dim strExt, mpFiles, strName, strNameNew, foldPath, cpt, f, mp3filename, mp3filepath

    cpt = 0
    foldPath = fold.Path
    mp3filepath = Replace(foldPath, sSourceFolder.Path, &quot;&quot;)
    If RecodeRus = 1 Then
        mp3filepath=translit(mp3filepath)
    End If
    mp3filepath=sSavePath &amp; mp3filepath

    &#039; ***** обработаем все файлы в папке
    Set mpfiles = fold.Files
    
    For each f in mpfiles

        strName = f.Name
        strExt = LCase(fso.GetExtensionName(strName)) &#039; Получим расширение

        If strExt = sExtToGet Then

            strNameNew = Replace(strName, sExtToGet, sExtToSet)
            If RecodeRus = 1 Then
                strNameNew=translit(strNameNew)
            End If
                   mp3filename = mp3filepath &amp; &quot;\&quot; &amp; strNameNew

            &#039; ***** Проверка нужности конвертации
            If Not fso.FileExists(mp3filename) Then

                cpt = cpt + 1
    
            End If
                          
        End If
    Next

    cptTot = cptTot + cpt    &#039; общий счетчик файлов

    &#039; ***** обработаем все подпапки в папке
    Set sfold = fold.subfolders 
    for each sfoo in sfold
        Call DoCheck(sfoo) &#039; Рекурсия
    Next
End Sub  


Sub endPopup()
    WshShell.Popup &quot;Завершено. &quot;  &amp; chr(13) &amp; chr(13) &amp; cptTot &amp; _
                    &quot; файлов обработано в &quot; &amp; chr(13) &amp; _
                    Join(dicPath.items, vbCrLf) &amp; Chr(13) &amp; Chr(13) &amp; _
                    showTime(nTime), 0, sAppName, 64    
End Sub
&#039;*********************************************************************************</code></pre></div><div class="quotebox"><blockquote><p>я не вижу необходимости пользовать подобное при наличии Far&#039;а.</p></blockquote></div><p>Как вы предлагаете делать конвертацию Far&#039;ом?</p>]]></content>
			<author>
				<name><![CDATA[Высокий]]></name>
			</author>
			<updated>2010-10-04T12:33:39Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=39869#p39869</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=39864#p39864" />
			<content type="html"><![CDATA[<p>OFF: Мне не то, чтобы лень, а:<br />* у меня нет ни одного *.flac (так что, я даже толком не знаю, каково оно на вкус <img src="//forum.script-coding.com/img/smilies/wink.png" width="15" height="15" />);<br />* я не вижу необходимости пользовать подобное при наличии Far&#039;а.</p><p>Могу сказать лишь, что такие конструкции:<br /></p><div class="codebox"><pre><code>If Not fso.FileExists(&quot;lame.exe&quot;) Then
    WshShell.Popup &quot;В папке со скриптом должен быть файл lame.exe&quot;, 0, sAppName, 48
…</code></pre></div><p>красиво работают лишь до тех пор, пока рабочий каталог тождественен каталогу, содержащему скрипт. При попытке вызвать скрипт посредством ярлыка в SendTo или Drag-n-Drop на него:<br /></p><div class="quotebox"><blockquote><p>&#039;usage&nbsp; &nbsp; &nbsp; &nbsp; : create a shortcut to this file in the &quot;SendTo&quot; folder or drag-drop folders on it or…</p></blockquote></div><p>або вызвать из иного каталога с указанием полного пути к скрипту — последний закономерно отваливается на данной конструкции. Так делать нельзя.</p><p>P.S. Есть ли необходимость создавать выходную папку при отсутствии хотя бы одного сконвертированного файла?</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2010-10-04T08:22:42Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=39864#p39864</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=39862#p39862" />
			<content type="html"><![CDATA[<p>Создал папку с хаотичной структурой с максимальной вложенностью 3 уровня. Все отлично сконвертилось. Получилось аналогичное зеркало mp3-шек.<br />НО! Теги не перенеслись.</p><p>Поковырял, оказалось что названия тегов во временном файле у меня получились строчными буквами.<br /></p><div class="codebox"><pre><code>artist=Ali Farka Toure
title=I Go Ka
album=The Source
date=1991
tracknumber=08
genre=World
comment=shared by pastafari cubensis</code></pre></div><p>У вас же в скрипте <br /></p><div class="codebox"><pre><code>    ParseTag textline,&quot;TITLE&quot;, &quot;--tt&quot;
    ParseTag textline,&quot;YEAR&quot;,&quot;--ty&quot;
    ParseTag textline,&quot;ARTIST&quot;,&quot;--ta&quot;
    ParseTag textline,&quot;ALBUM&quot;,&quot;--tl&quot;
    ParseTag textline,&quot;TRACKNUMBER&quot;,&quot;--tn&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TCOM=&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TPE2=&quot;
    ParseTag textline,&quot;COMMENT&quot;,&quot;--tc&quot;</code></pre></div><p>Я так понимаю, либо не хватает функции toLowerCase() (или какая она там в VBS) либо metaflac.exe другой версии.<br />Хотя проверил только что. v1.2.1, свеже скачанная.</p>]]></content>
			<author>
				<name><![CDATA[DnsIs]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=26282</uri>
			</author>
			<updated>2010-10-04T06:43:24Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=39862#p39862</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript/WSH: Конвертация flac в mp3]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=39861#p39861" />
			<content type="html"><![CDATA[<p>Прошу отписаться всех, кому не лень протестировать.</p>]]></content>
			<author>
				<name><![CDATA[The gray Cardinal]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=2</uri>
			</author>
			<updated>2010-10-04T05:15:01Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=39861#p39861</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript/WSH: Конвертация flac в mp3]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=39855#p39855" />
			<content type="html"><![CDATA[<p>Написал скрипт конвертация flac в mp3. Описание в шапке.</p><div class="codebox"><pre><code>&#039;*********************************************************************************
&#039;script        : flac_v_mp3.vbs
&#039;description    : Recode flac to mp3  
&#039;usage        : create a shortcut to this file in the &quot;SendTo&quot; folder or drag-drop folders on it or run with source path
&#039;date        : 01.10.2010
&#039;version    : 1.0
&#039;req        : flac.exe metaflac.exe http://flac.sourceforge.net/ lame.exe http://lame.sourceforge.net
&#039;author        : Ivan@Lapenkov.ru
&#039;    Описание    
&#039;    У вас есть папка вида    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы&quot;
&#039;    внутри которой папки и файлы, в том числе .flac :    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы\[01] Моцарт\01 - Маленькая ночная серенада соль мажор (KV 525) - Allegro.flac&quot;
&#039;    Запускаете     
&#039;        flac_v_mp3.vbs &quot;I:\Звук\Классика\_Сборники\Великие композиторы&quot;
&#039;    Создается папка    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3&quot;
&#039;    внутри которой:    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3\[01] Моцарт\01 - Маленькая ночная серенада соль мажор (KV 525) - Allegro.mp3&quot;
&#039;    или при запуске с настройкой RecodeRus=1 :    
&#039;        &quot;I:\Звук\Классика\_Сборники\Великие композиторы-mp3\[01] Mocart\01 - Malen&#039;kaja nochnaja serenada sol&#039; mazhor (KV 525) - Allegro.mp3&quot;
&#039;    Переносятся теги, высокое качество, VBR, стерео. Все настройки кодирования можно изменить. На посторонние файлы внимания не обращает.    
&#039;    Скрипт создает временный файл в %Temp%, из тегов удаляются символы &quot;?*\/|&lt;&gt;:
&#039;    Скрипт можно запускать повторно, уже созданные файлы пропускаются.
&#039;        
&#039;    Скрипт требует следующие компоненты в своей папке:    
&#039;    flac.exe metaflac.exe    
&#039;    Версия     1.2.1
&#039;    http://flac.sourceforge.net    
&#039;        
&#039;    lame.exe    
&#039;    Версия    3.98.4
&#039;    http://lame.sourceforge.net    
&#039;        
&#039;    Протестировано на WinXP Prof sp3 rus.    
&#039;    Автор программы разрешает её свободное распространение и использование любых её фрагментов.
&#039;*********************************************************************************

&#039;***********************************
&#039;Настройки
&#039;***********************************
Option Explicit

&#039; Настройки кодировщика LAME
Const LameKeys = &quot;-V 0 --vbr-new -m s -q 2 --add-id3v2 --ignore-tag-errors --nohist --quiet&quot; 

&#039; 1 - перекодировать имена файлов в транслит, 0 - нет. Удобно для устройств не поддерживающих кириллицу.
Const RecodeRus=0

&#039; Пауза на сообщениях о некритических ошибках, секунды
Const PauseSize = 5     

&#039; 0 - окна кодировщиков скрыты, 1 - показываются
Const WindowState = 0    

&#039; Будет добавлено к имени исходной папки при создании выходной папки
Const sPostfixFolder = &quot;-mp3&quot; 

&#039; Расширения файлов
Const sExtToGet = &quot;flac&quot;
Const sExtToSet = &quot;mp3&quot;

&#039; Название приложения
Const sAppName = &quot;Конвертер FLAC в mp3&quot;

&#039; Таблицы конвертации символов
Const tr=&quot;а б в г д е ё  ж  з и й  к л м н о п р с т у ф х  ц ч  ш  щ   ъ  ы ь э  ю  я  А Б В Г Д Е Ё  Ж  З И Й  К Л М Н О П Р С Т У Ф Х  Ц Ч  Ш  Щ   Ъ  Ы Ь Э  Ю  Я  &quot;
Const tl=&quot;аaбbвvгgдdеeёjoжzhзzиiйjjкkлlмmнnоoпpрrсsтtуuфfхkhцcчchшshщshhъ&#039;&#039;ыyь&#039;эehюjuяjaАAБBВVГGДDЕEЁJoЖZhЗZИIЙJjКKЛLМMНNОOПPРRСSТTУUФFХKhЦCЧChШShЩShhЪ&#039;&#039;ЫYЬ&#039;ЭEhЮJuЯJa&quot;

&#039;***********************************
&#039;Начало основной программы
&#039;***********************************
Dim fso, WshShell, Kav, cptTot, objArgs, arg, dicPath, TagKeys
Dim sSourceFolder, sSavePath, sTempFolder
Dim nTime

Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set WshShell = WScript.CreateObject(&quot;WScript.Shell&quot;)
Set dicPath = CreateObject(&quot;Scripting.Dictionary&quot;)
cptTot = 0 
nTime = Timer

sTempFolder = WshShell.ExpandEnvironmentStrings(&quot;%Temp%&quot;)

If Not fso.FileExists(&quot;lame.exe&quot;) Then
    WshShell.Popup &quot;В папке со скриптом должен быть файл lame.exe&quot;, 0, sAppName, 48
    WScript.Quit
End If

If Not fso.FileExists(&quot;flac.exe&quot;) Then
    WshShell.Popup &quot;В папке со скриптом должен быть файл flac.exe&quot;, 0, sAppName, 48
    WScript.Quit
End If

If Not fso.FileExists(&quot;metaflac.exe&quot;) Then
    WshShell.Popup &quot;В папке со скриптом должен быть файл metaflac.exe&quot;, 0, sAppName, 48
    WScript.Quit
End If


Set objArgs = WScript.Arguments
if (objArgs.Count = 0) then
    WshShell.Popup &quot;В командной строке должен быть путь к исходным файлам. Need source path in arguments.&quot;, 0, sAppName, 48
    WScript.Quit
End If

&#039;-- Работа
Call startScanning()
Call endPopup()

&#039;-- Очистка
Set fso = nothing
Set WshShell = nothing                    
Set dicPath = nothing
&#039;***********************************
&#039;Конец основной программы
&#039;***********************************


&#039;***********************************
&#039;Функции
&#039;***********************************

Sub startScanning()

    Dim arg, fold, sSourceFoldName

    &#039; перебирает пути из командой строки
    For each arg in objArgs
        If fso.FolderExists(arg) Then
            
            Set sSourceFolder = fso.Getfolder(arg)

            &#039; Определимся с папкой для сохранения
            sSourceFoldName = sSourceFolder.Path
            sSavePath = sSourceFoldName &amp; sPostfixFolder
            dicPath.add sSavePath, sSavePath

            &#039; Создание папки для сохранения
            If Not fso.FolderExists(sSavePath) Then
                &#039;WshShell.Popup &quot;Создание папки &quot; &amp; sSavePath, PauseSize, sAppName, 64
                fso.CreateFolder(sSavePath)
            End If

            &#039;Обойдем папки, конвертируя
            Call DoIt(sSourceFolder)        
        End If
    Next
End Sub 
&#039;*********************************************************************************

Sub DoIt(fold)
&#039; Рекурсия
    Dim sfold, sfoo
    Call ProceedFiles(fold)        &#039; обработывает все файлы в текущей папке
    Set sfold = fold.subfolders 
    for each sfoo in sfold        &#039; работа с подпапками
        Call DoIt(sfoo)
    Next
End Sub  

&#039;*********************************************************************************
&#039; Основная процедура обработки

Sub ProceedFiles(fold)

    Dim RetCode, strExt, mpFiles, objFile, strName, strNameNew, foldPath, cpt, f, mp3filename, mp3filepath, tempfilename, flacfilename, RunFlacCommand, RunLameCommand
    Dim temptagfile, temptagfilename, TagsText, TextLine

    tempfilename = sTempFolder &amp;&quot;\&quot;&amp; FSO.GetTempName()
    temptagfilename = sTempFolder &amp;&quot;\&quot;&amp; FSO.GetTempName()
    If fso.FileExists(tempfilename) Then
                  fso.DeleteFile tempfilename, 1
    End If
    If fso.FileExists(temptagfilename) Then
                  fso.DeleteFile temptagfilename, 1
    End If

    cpt = 0
    foldPath = fold.Path
    mp3filepath = Replace(foldPath, sSourceFolder.Path, &quot;&quot;)
    If RecodeRus = 1 Then
        mp3filepath=translit(mp3filepath)
    End If
    mp3filepath=sSavePath &amp; mp3filepath

    &#039; ***** Создание конечной папки 
    If Not fso.FolderExists(mp3filepath) Then
        fso.CreateFolder(mp3filepath)
    End If

    &#039; ***** обработаем все файлы в папке
    Set mpfiles = fold.Files
    
    For each f in mpfiles

        strName = f.Name
        strExt = LCase(fso.GetExtensionName(strName)) &#039; Получим расширение

        If strExt = sExtToGet Then

            &#039; ***** Подготовка имен файлов
            flacfilename = foldPath &amp;&quot;\&quot;&amp; strName
            strNameNew = Replace(strName, sExtToGet, sExtToSet)
            If RecodeRus = 1 Then
                strNameNew=translit(strNameNew)
            End If
                   mp3filename = mp3filepath &amp; &quot;\&quot; &amp; strNameNew

            &#039; ***** Проверка нужности конвертации
            If Not fso.FileExists(mp3filename) Then

            &#039; ***** Раскодирование во временный файл
            RunFlacCommand = &quot;flac -d -F -f &quot;&quot;&quot;&amp; flacfilename &amp;&quot;&quot;&quot; -o &quot;&quot;&quot;&amp; tempfilename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunFlacCommand, WindowState , true)
            If RetCode = 1 Then
                WshShell.Popup &quot; Ошибка в &quot;&amp; RunFlacCommand, PauseSize, sAppName, 48
            End If
            &#039; если у файла назначения есть атрибут ReadOnly, снимаем его
            If fso.FileExists(tempfilename) Then
                    Set objFile = FSO.GetFile(tempfilename)
                If objFile.Attributes And 1 Then
                    objFile.Attributes = objFile.Attributes - 1
                End If
                set objFile = nothing
            End If

            &#039; ***** теги
            TagKeys=&quot;&quot; &#039; главная переменная куда будут сохраняться ключи командной строки
            RunFlacCommand = &quot;metaflac.exe --export-tags-to=&quot;&amp; temptagfilename &amp;&quot; &quot;&quot;&quot;&amp; flacfilename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunFlacCommand, WindowState , true)
            If fso.FileExists(temptagfilename) Then
                Set temptagfile = FSO.GetFile(temptagfilename)
                Set TagsText = temptagfile.OpenAsTextStream(1,0)
                Do While Not TagsText.AtEndOfStream
                    ParseTagToKeys(TagsText.ReadLine)
                Loop
                TagsText.Close
                set temptagfile = nothing
                fso.DeleteFile temptagfilename, 1
                TagKeys = TagKeys &amp;&quot; --tv &quot;&quot;TENC=FLAC-&gt;LAME&quot;&quot;&quot;
            End If

            &#039; ***** Кодирование в mp3
            RunLameCommand = &quot;lame &quot;&amp; LameKeys &amp;&quot; &quot;&amp; TagKeys &amp;&quot; &quot;&quot;&quot;&amp; tempfilename &amp;&quot;&quot;&quot;  &quot;&quot;&quot;&amp; mp3filename &amp;&quot;&quot;&quot; &quot;
            RetCode = WshShell.Run(RunLameCommand, WindowState , true)
            If not RetCode = 0 Then
                WshShell.Popup &quot; Ошибка в &quot;&amp; RunLameCommand, PauseSize, sAppName, 48
            End If


            &#039; ***** Удаление временного файла
            If fso.FileExists(tempfilename) Then
                            fso.DeleteFile tempfilename, 1
            End If

            cpt = cpt + 1
                          
            End If
        End If
    Next

    cptTot = cptTot + cpt    &#039; общий счетчик файлов
End Sub
&#039;*********************************************************************************

Sub ParseTagToKeys(textline)

    ParseTag textline,&quot;TITLE&quot;, &quot;--tt&quot;
    ParseTag textline,&quot;YEAR&quot;,&quot;--ty&quot;
    ParseTag textline,&quot;ARTIST&quot;,&quot;--ta&quot;
    ParseTag textline,&quot;ALBUM&quot;,&quot;--tl&quot;
    ParseTag textline,&quot;TRACKNUMBER&quot;,&quot;--tn&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TCOM=&quot;
    ParseTag textline,&quot;ENSEMBLE&quot;,&quot;--tv &quot;&quot;TPE2=&quot;
    ParseTag textline,&quot;COMMENT&quot;,&quot;--tc&quot;

    &#039;ParseTag textline,&quot;GENRE&quot;,&quot;--tg&quot;     &#039;&quot;genre&quot; нужно включать таблицу, но нет желания с ней возиться
    &#039;ParseTag textline,&quot;ENCODER&quot;,&quot;&quot;     &#039; FLAC-&gt;LAME

End Sub
&#039;*********************************************************************************

Sub ParseTag(textline,tag,cmdkey)
        Dim TagText, Pos, TagKey
    TagKey=&quot;&quot;
    tag=tag&amp;&quot;=&quot;
    Pos=InStr(textline, tag)
        If Not Pos=0 Then
        TagText=Mid(textline, len(tag)+1)
        TagText=StrConvert(TagText, &quot;windows-1251&quot;, &quot;cp866&quot;)
        TagText = Replace(TagText, &quot;&quot;&quot;&quot;, &quot;&#039;&quot;) 
        TagText = Replace(TagText, &quot;:&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;&lt;&quot;, &quot;&#039;&quot;)
        TagText = Replace(TagText, &quot;&gt;&quot;, &quot;&#039;&quot;)
        TagText = Replace(TagText, &quot;|&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;?&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;*&quot;, &quot;+&quot;)
        TagText = Replace(TagText, &quot;/&quot;, &quot; &quot;)
        TagText = Replace(TagText, &quot;\&quot;, &quot; &quot;)
        If RecodeRus = 1 Then
            TagText=translit(TagText)
        End If
        If InStr(cmdkey, &quot;&quot;&quot;&quot;)=0 Then &#039; часть cmdkey идёт с открытыми кавычками
            TagKey=cmdkey &amp; &quot; &quot;&quot;&quot; &amp; TagText &amp; &quot;&quot;&quot;&quot;
        Else
            TagKey=cmdkey &amp; TagText &amp; &quot;&quot;&quot;&quot;
        End If
        TagKeys = TagKeys &amp;&quot; &quot;&amp; TagKey
    End If
End Sub
&#039;*********************************************************************************

&#039;=============================================================================
&#039; HKEY_CLASSES_ROOT\MIME\Database\Charset
&#039; cp866, windows-1251, koi8-r, unicode, utf-8, _autodetect
&#039;=============================================================================
Function StrConvert(ByVal strText, ByVal strSourceCharset, ByVal strDestCharset)
    Const adTypeText      = 2
    Const adModeReadWrite = 3
    
    
    With WScript.CreateObject(&quot;ADODB.Stream&quot;)
        .Type      = adTypeText
        .Mode      = adModeReadWrite
        
        .Open
        
        .Charset   = strSourceCharset
        .WriteText strText
        
        .Position  = 0
        .Charset   = strDestCharset
        StrConvert = .ReadText
        
        .Close
    End With
End Function

Function showTime(nTime)
    showTime = &quot;Затрачено времени : &quot; &amp; Round((Timer - nTime),2) &amp;&quot; секунд&quot;
End Function
&#039;*********************************************************************************

&#039; функция транслитерации строки по ГОСТ 7.79 2000
Function translit(ByVal sIncoming)
    Dim pos, findpos, sSymbol
    
    translit=&quot;&quot;

    For pos = 1 To len(sIncoming) Step 1

        sSymbol=mid(sIncoming,pos,1)
        findpos=InStr(1, tr, sSymbol)
        If findpos=0 or sSymbol=&quot; &quot; Then
            &#039; ***** В транслитерации не нуждается
            translit=translit+sSymbol
        Else
            &#039; ***** Первый символ
            translit=translit+mid(tl,findpos+1,1)
            &#039; ***** Второй символ
            If mid(tr,findpos+2,1)=&quot; &quot; Then
                translit=translit+mid(tl,findpos+2,1)
                &#039; ***** Третий символ
                If mid(tr,findpos+3,1)=&quot; &quot; Then
                    translit=translit+mid(tl,findpos+3,1)
                End If
            End If
        End If
    Next
End Function

Sub endPopup()
    WshShell.Popup &quot;Завершено. &quot;  &amp; chr(13) &amp; chr(13) &amp; cptTot &amp; _
                    &quot; файлов обработано в &quot; &amp; chr(13) &amp; _
                    Join(dicPath.items, vbCrLf) &amp; Chr(13) &amp; Chr(13) &amp; _
                    showTime(nTime), 0, sAppName, 64    
End Sub
&#039;*********************************************************************************</code></pre></div><p>Если качество устраивает, то можете добавить в коллекцию.</p>]]></content>
			<author>
				<name><![CDATA[Высокий]]></name>
			</author>
			<updated>2010-10-03T20:51:05Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=39855#p39855</id>
		</entry>
</feed>
