|
Чтение тегов 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-файлов Инсталляция
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>
Смотри также
|