|
Чтение тегов 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> Смотри также
|