Главная страница

Новости

Вопрос-ответ

Скрипты

ActiveX

Статьи

Книжная полка

Knowledge Base

Конференции

Ссылки

 

Гостевая книга

Напишите мне письмо

 

Подписка на рассылку

Рассылка 'Windows Scripting'  Архив

 

 

Лучше смотреть с Microsoft Internet Explorer 4.0 и выше

 

Создано с помощью UltraEdit

 

Чтение тегов MP3-файлов (ActiveX, написанный на VBScript)

Вашему вниманию предлагается ActiveX, написанный на VBScript и предназначенный для чтения тегов MP3-файлов (название песни, исполнитель, из какого альбома, т.д.).

Разработан он с помощью малоизвестной и малоиспользуемой технологии Microsoft под названием Windows Script Components (бывшие scriptlets).

Windows Script Components - это технология, позволяющая писать компоненты COM (ActiveX) на скриптовых языках. Подробнее о технологии Windows Script Components можно прочитать на сайте Microsoft и в других источниках (см. список ссылок в конце статьи). Особенно рекомендуется документация по Windows Script Components, ссылка на которую дана чуть ниже.

Ссылки

Последняя версия Windows Script (со встроенными Windows Script Components)
Документация по Windows Script Components
Windows Script Component Wizard, облегчающий создание WSC-файлов

Инсталляция

  1. Скачайте и проинсталлируйте последнюю версию Windows Script (см.ссылку вверху).
    Если Вы работаете под Windows 2000, это делать не обязательно.
  2. Скачайте файл mp3tags.wsc. Это и есть ActiveX, написанный на VBScript.
  3. Зарегистрируйте его (так же, как и обычный ActiveX):
    regsvr32 mp3tags.wsc
  4. Все, теперь скрипт готов к употреблению.
Чтобы использовать ActiveX, необходимо его создать стандартным способом:
Dim MP3Tags
Set MP3Tags = CreateObject("Scripting.Mp3TagsReader")
А теперь - несколько примеров.

Пример 1: sample1.vbs

Этот скрипт показывает теги MP3-файла, имя которого передано в командной строке.
Option Explicit

Const AppName = "MP3 Tags Reader sample 1"

' проверяем число аргументов
If WScript.Arguments.Count <> 1 Then
	ShowHelp
	WScript.Quit
End If

' получаем имя MP3-файла
Dim Mp3Name
Mp3Name = WScript.Arguments(0)

' создаем объект Mp3TagsReader
Dim Reader
Set Reader = CreateObject("Scripting.Mp3TagsReader")

' читаем теги файла
Dim Result
Result = Reader.Read(Mp3Name)

' если ошибка - показываем ее код
If Result <> 0 Then
	MsgBox "Error " & Result & " reading MP3 tags from file" & _
		vbNewLine & Mp3Name, vbExclamation, AppName
	WScript.Quit
End If

' если все нормально - показываем все теги
MsgBox "File:" & vbTab & Reader.FileName & vbNewLine & _
	"Title:" & vbTab & Reader.Title & vbNewLine & _
	"Artist:" & vbTab & Reader.Artist & vbNewLine & _
	"Album:" & vbTab & Reader.Album & vbNewLine & _
	"Year:" & vbTab & Reader.Year & vbNewLine & _
	"Comment:" & vbTab & Reader.Comment & vbNewLine & _
	"Genre:" & vbTab & Reader.Genre & _
	" (" & Reader.GenreIndex & ")" & vbNewLine & _
	"Track:" & vbTab & Reader.Track & vbNewLine, _
	vbInformation, AppName

' уничтожаем созданный ранее объект
Set Reader = Nothing

' показывает справку
Sub ShowHelp
	MsgBox "MP3 file name is not specified." & _
		vbNewLine & vbNewLine & "Usage:" & vbNewLine & _
		"    " & WScript.ScriptName & " mp3_file_name", _
		vbCritical, AppName
End Sub

Пример 2: sample2.vbs

Этот скрипт находит все MP3-файлы, в тегах которых есть заданная строка. Поиск начинается с каталога, где находится скрипт, и включает все подкаталоги.
Option Explicit

Const AppName = "MP3 Tags Reader sample 2"

' запрашиваем текст для поиска
Dim SearchText
SearchText = InputBox("Enter text to search in MP3 tags:", AppName)
If Len(SearchText) = 0 Then WScript.Quit

' определяем стартовый каталог
Dim Root
Root = WScript.ScriptFullName
Dim I
I = InStrRev(Root, "\")
If I = 0 Then I = InStrRev(Root, "/")
Root = Left(Root, I - 1)

' создаем объект FileSystemObject -
' он будет использоваться в функции рекурсивного обхода каталогов
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")

' создаем объект Mp3TagsReader для тех же целей
Dim Reader
Set Reader = WScript.CreateObject("Scripting.Mp3TagsReader")

' строка, в которой будут накапливаться имена найденных файлов
Dim S

' начинаем рекурсивный обход каталогов
ScanFolder Root

' уничтожаем созданные ранее объекты
Set Reader = Nothing
Set FSO = Nothing

If Len(S) = 0 Then
	' если ничего не найдено
	S = "Search string not found!"
Else
	' иначе добавляем вводную строчку
	S = "Search string found in:" & vbNewLine & S
End If

' выводим диалог с результатом
MsgBox S, vbOkOnly + vbInformation, AppName

' это функция рекурсивного обхода каталогов

Sub ScanFolder(FolderName)
	' порлучаем текущий каталог
	Dim Folder
	Set Folder = FSO.GetFolder(FolderName)

	' рекурсивно проходим все файлы
	Dim File
	For Each File In Folder.Files
		' пытаемся прочитать теги MP3
		Dim Result
		Result = Reader.Read(File.Path)
		If Result = 0 Then	' этот файл содержит теги MP3
			' ищем строку поиска в тегах
			If InStr(Reader.Title, SearchText) > 0 Or _
					InStr(Reader.Artist, SearchText) > 0 Or _
					InStr(Reader.Album, SearchText) > 0 Or _
					InStr(Reader.Comment, SearchText) > 0 Then
				' если нашли - добавляем к строке результата
				S = S & File.Path & vbNewLine
			End If
		End If
	Next
	
	' рекурсивно проходим все подкаталоги
	Dim SubFolder
	For Each SubFolder In Folder.SubFolders
		ScanFolder SubFolder.Path
	Next
End Sub

Листинг: mp3tags.wsc

Исходный текст ActiveX.
<?XML version="1.0" standalone="yes" encoding="UTF-16" ?>
<?component error="true" debug="true"?>

<component>

    <registration
        description="MP3 Tags Reader"
        progid="Scripting.Mp3TagsReader"
        version="1"
        classid="{C2DE6203-17AE-11d5-8CF4-8EBC99C67466}">
    
        <script language="VBScript">
            <![CDATA[

                Option Explicit
                
                Function Register()
                    Dim ScriptFileName
                    Dim Shell
                    Set Shell = CreateObject("WScript.Shell")
                    ScriptFileName = _
                        Shell.RegRead("HKEY_CLASSES_ROOT\CLSID\{C2DE6203-17AE-11D5-8CF4-8EBC99C67466}\ScriptletURL\")
                    Set Shell = Nothing
                    Const Prefix = "file://"
                    If 0 = StrComp(Left(ScriptFileName, Len(Prefix)), Prefix, 1) Then
                        ScriptFileName = Mid(ScriptFileName, Len(Prefix) + 1)
                    End If
                    Dim TypelibFileName
                    TypelibFileName = ScriptFileName
                    Dim I
                    I = InStrRev(TypelibFileName, ".")
                    If I > 0 Then
                        TypelibFileName = Left(TypelibFileName, I - 1)
                    End If
                    TypelibFileName = TypelibFileName & ".tlb"
                
                    Dim GTL
                    Set GTL = CreateObject("Scriptlet.TypeLib")
                    GTL.AddURL ScriptFileName
                    GTL.Path = TypelibFileName
                    GTL.Doc = "MP3 Tags Reader"
                    GTL.GUID = "{C2DE6203-17AE-11d5-8CF4-8EBC99C67467}"
                    GTL.Name = "Mp3TagsReader"
                    GTL.MajorVersion = 1
                    GTL.MinorVersion = 0
                    GTL.Write
                    GTL.Reset
                    Set GTL = Nothing
                End Function

                Function Unregister()
                End Function

            ]]>
        </script>
    
    </registration>

    <public>
        <property name="Title"><get/></property>
        <property name="Artist"><get/></property>
        <property name="Album"><get/></property>
        <property name="Year"><get/></property>
        <property name="Comment"><get/></property>
        <property name="GenreIndex"><get/></property>
        <property name="Genre"><get/></property>
        <property name="Track"><get/></property>
        <property name="FileName"><get/></property>
        <method name="Read">
            <parameter name="FileName"/>
        </method>
    </public>

    <script language="VBScript">
        <![CDATA[

            Option Explicit

            Const AppName = "MP3 Tags Reader"
    
            Dim Title, Artist, Album, Year, Comment, GenreIndex, Genre, Track
            Dim FileName
            
            Function get_Title()
                get_Title = Title
            End Function
    
            Function get_Artist()
                get_Artist = Artist
            End Function
    
            Function get_Album()
                get_Album = Album
            End Function
    
            Function get_Year()
                get_Year = Year
            End Function
    
            Function get_Comment()
                get_Comment = Comment
            End Function
    
            Function get_GenreIndex()
                get_GenreIndex = GenreIndex
            End Function
    
            Function get_Genre()
                get_Genre = Genre
            End Function
    
            Function get_Track()
                get_Track  = Track 
            End Function
    
            Function get_FileName()
                get_FileName = FileName
            End Function
    
            Function Read(FileNameToRead)
                ' function return codes
                Const mp3Success = 0
                Const mp3FileNotFound = 1
                Const mp3FileTooSmall = 2
                Const mp3CannotOpenFile = 3
                Const mp3CannotReadFile = 4
                Const mp3BadFileFormat = 5
                Const mp3CreateObjectFailed = 6

                ' Clear info
                Title = ""
                Artist = ""
                Album = ""
                Year = ""
                Comment = ""
                GenreIndex = 0
                Genre = ""
                Track = 0
                FileName = ""
                
                ' Start handling file errors
                On Error Resume Next
            
                ' Create FileSystemObject
                Dim FSO
                Set FSO = CreateObject("Scripting.FileSystemObject")
                If Err.Number <> 0 Then
                    Read = mp3CreateObjectFailed
                    Exit Function
                End If
            
                ' Test for file existance
                If Not FSO.FileExists(FileNameToRead) Then
                    Read = mp3FileNotFound
                    Exit Function
                End If
            
                ' Get file length and test it
                ' It must be at least 128 bytes long (the size
                ' of the info structure)
                Dim File
                Set File = FSO.GetFile(FileNameToRead)
                Dim FileLength
                FileLength = File.Size
                If FileLength <= 128 Then
                    Read = mp3FileTooSmall
                    Exit Function
                End If
            
                ' Open MP3 file for reading and check for errors
                Dim Stream
                Set Stream = File.OpenAsTextStream(1)   ' 1 = ForReading
                If Err.Number <> 0 Then
                    Read = mp3CannotOpenFile
                    Exit Function
                End If
                
                ' Reserve space for info structure
                Dim Data 
                Data = String(256, 0)
                
                ' Read info structure and check for errors
                Stream.Skip(FileLength - 128)
                Data = Stream.Read(128)
                If Err.Number <> 0 Then
                    Read = mp3CannotReadFile
                    Exit Function
                End If
                
                ' Close stream
                Stream.Close
            
                ' Release file
                Set File = Nothing
            
                ' Release FileSystemObject
                Set FSO = Nothing
            
                ' Stop handling file errors
                On Error GoTo 0
                
                ' Test for proper info structure - it must start with
                ' "TAG" string if it is correct
                If Left(Data, 3) <> "TAG" Then
                    Read = mp3BadFileFormat
                    Exit Function
                End If
                
                ' Get string info
                Title = Trim(Mid(Data, 4, 30))
                Artist = Trim(Mid(Data, 34, 30))
                Album = Trim(Mid(Data, 64, 30))
                Year = Trim(Mid(Data, 94, 4))
                Comment = Trim(Mid(Data, 98, 30))
            
                ' Get track number
                Track = Asc(Mid(Data, 127, 1))
                If Track = 32 Then Track = 0
                
                ' Get genre index
                GenreIndex = Asc(Mid(Data, 128, 1))
            
                ' Make genre names array
                Dim GenreNamesMatrix
                GenreNamesMatrix = "Blues|Classic Rock|Country|Dance|Disco|Funk|Grunge|" & _
                    "Hip-Hop|Jazz|Metal|New Age|Oldies|Other|Pop|R&B|Rap|Reggae|Rock|Techno|" & _
                    "Industrial|Alternative|Ska|Death Metal|Pranks|Soundtrack|Euro-Techno|" & _
                    "Ambient|Trip Hop|Vocal|Jazz+Funk|Fusion|Trance|Classical|Instrumental|Acid|" & _
                    "House|Game|Sound Clip|Gospel|Noise|Alt. Rock|Bass|Soul|Punk|Space|Meditative|" & _
                    "Instrumental Pop|Instrumental Rock|Ethnic|Gothic|Darkwave|Techno-Industrial|Electronic|" & _
                    "Pop-Folk|Eurodance|Dream|Southern Rock|Comedy|Cult|Gangsta Rap|Top 40|Christian Rap|" & _
                    "Pop/Punk|Jungle|Native American|Cabaret|New Wave|Phychedelic|Rave|Showtunes|Trailer|" & _
                    "Lo-Fi|Tribal|Acid Punk|Acid Jazz|Polka|Retro|Musical|Rock & Roll|Hard Rock|Folk|" & _
                    "Folk/Rock|National Folk|Swing|Fast-Fusion|Bebob|Latin|Revival|Celtic|Blue Grass|" & _
                    "Avantegarde|Gothic Rock|Progressive Rock|Psychedelic Rock|Symphonic Rock|Slow Rock|" & _
                    "Big Band|Chorus|Easy Listening|Acoustic|Humour|Speech|Chanson|Opera|Chamber Music|" & _
                    "Sonata|Symphony|Booty Bass|Primus|Porn Groove|Satire|Slow Jam|Club|Tango|Samba|Folklore|" & _
                    "Ballad|Power Ballad|Rhythmic Soul|Freestyle|Duet|Punk Rock|Drum Solo|A Capella|Euro-House|" & _
                    "Dance Hall|Goa|Drum & Bass|Club-House|Hardcore|Terror|indie|Brit Pop|Negerpunk|Polsk Punk|" & _
                    "Beat|Christian Gangsta Rap|Heavy Metal|Black Metal|Crossover|Comteporary Christian|" & _
                    "Christian Rock|Merengue|Salsa|Trash Metal|Anime|JPop|Synth Pop"
                Dim GenreNamesArray
                GenreNamesArray = Split(GenreNamesMatrix, "|")
                
                ' Get genre name
                If GenreIndex <= UBound(GenreNamesArray) Then
                    Genre = GenreNamesArray(GenreIndex)
                Else
                    Genre = "Unknown"
                End If
            
                ' Save and fix file name
                FileName = FileNameToRead
                FileName = Replace(FileName, "/", "\")
                
                ' Function finished successfully
                Read = mp3Success
            End Function

        ]]>
    </script>

</component>

Смотри также

  • Windows Script Components на сайте MicrosoftДругой сайт
  • Колонка Visual Programmer в журнале Microsoft Systems Journal (февраль 2000)Другой сайт
  • ASP and Windows Script Components (Microsoft Internet Developer, декабрь 1999)Другой сайт
  • Windows Script Components - They Get Around, by Andrew ClinickДругой сайт
  • Создание COM-компонентов с помощью скриптовых языков в журнале "Технология Клиент-Сервер" (1 квартал 2000)Другой сайт
  • Статьи из Microsoft Knowledge Base, посвященные Windows Script Components