Posts: 12,073
Threads: 140
Joined: Dec 2002
id3lib
This free library allows you to read and write MP3 tags (Artist, Title, Album, etc) using QM. Supports ID3v1 and ID3v2. Very easy to use. Download id3com.dll and place in qm folder.
Home page:
http://id3lib.sourceforge.net/
ActiveX dll, version 3.05a.
id3com.zip (Size: 86.52 KB / Downloads: 2,701)
The newest version is available at sourceforge, but only as source files.
_____________________________________________
Examples:
This macro shows Artist and Title tags of a mp3 file.
str s="C:\MP3 temp\Soma Sonic - Road to Nowhere.mp3"
typelib Id3Lib "id3com.dll"
Id3Lib.ID3ComTag t._create
BSTR b=s
t.Link(&b)
out t.Artist
out t.Title
This macro gets artist and title from a mp3 file name and sets Artist and Title tags of that mp3 file.
str s="C:\MP3 temp\Soma Sonic - Road to Nowhere.mp3"
str fn.getfilename(s)
str sa st
tok fn &sa 2 "-"
sa.trim; st.trim
;out sa
;out st
typelib Id3Lib "id3com.dll"
Id3Lib.ID3ComTag t._create
BSTR b=s
t.Link(&b)
t.Artist=sa
t.Title=st
t.SaveV1Tag
t.SaveV2Tag
Posts: 19
Threads: 10
Joined: Mar 2003
Thanks for the tip! This library let me automate what would otherwise have been an unbelievably laborious task.
9: ) Lindsey Dubb
Posts: 1,000
Threads: 253
Joined: Feb 2008
This is great!
How do you get all of the ID3 Info though?
i.e. The Pictures, Lyrics, Composer, etc...
There are quite a few more that are not in the list.
Thanks
Jimmy Vig
Also...How do the other tidbits work in this...
t._create
t._getactive
t._getcontrol
t._getfile
t._setevents
How do you use a dll...I mean how do you know what is in it and how to initialize it...I always feel like you are pulling a rabbit out of a hat when it comes to these things. Thanks
Posts: 12,073
Threads: 140
Joined: Dec 2002
_create etc are added by QM. Documented in QM help.
Quote:How do you use a dll...I mean how do you know what is in it and how to initialize it...
I look what is in its type library:
1. Insert type library declaration using the Type Libraries dialog:
typelib XXX ...
2. Then compile the macro.
3. Then type XXX. and look what classes are there.
4. Pick a class, declare variable and look what's in the class.
XXX.Class var.
5 a. If it's not an ActiveX control that must be in a dialog, I use _create to initialize the variable:
XXX.Class var._create
var. ...
5 b. If it's an ActiveX control, I instead add the control to a dialog in the Dialog Editor.
Read more in QM help, 'Using COM components' topic.
Posts: 1,000
Threads: 253
Joined: Feb 2008
Holy cow...there are tons of things that pop up when I type "Id3Lib."
I'm still not sure how to use it all...I'm still making heads and tails of classes...
This really helps so far.
If you have the time...could you give example how to make "Id3Lib.ID3_CONDUCTOR" into something I could grab data from an MP3 file...that would really help me seal the deal here.
Thanks so Much!
Posts: 12,073
Threads: 140
Joined: Dec 2002
ID3_CONDUCTOR and similar constants should be used with some function but I don't know what function it is. Need to read documentation of this component.
Posts: 1,000
Threads: 253
Joined: Feb 2008
Well how did you get the t.xxx to work in the example?
I'm in way over my head...I know.
I just want to understand the magic.
It'll really help me with dll's in the future.
My only programing experience is with QM...and by only...I mean I stumbled across this program looking for something that could spit out a series of Key commands to automate dating in NexGen...now I am writing full blown programs. It really is pretty rad!
Posts: 12,073
Threads: 140
Joined: Dec 2002
Type t.xxx and look in status bar. (if xxx is a function).
For example, for Artist it is "BSTR Artist() . Property". This function does not have arguments. BSTR is the type of the value that the function returns. The property is not readonly so I can get and set the property.
str s
s=t.Artist ;;get
out s
t.Artist="an artist" ;;set
Another example. "Link(BSTR&FileName)". The function does not return a value but has 1 argument. It must be a BSTR variable.
BSTR b
b="bbbbbb"
t.Link(b)
Posts: 1,000
Threads: 253
Joined: Feb 2008
I'm starting to see...I played around while I've been asking questions...
You started by with "Id3Lib."
gives 3 different options other that the ID3_ stuff that you say needs a funciton.
Then you select "ID3ComTag"
ending up with "Id3Lib.ID3ComTag"
then you type 'var'._create to create the class
From there whenever you type "'var'." you get the options for the dll...
Now...Were would I look to find those functions....I have some funky MP3's written by NexGen that I need to grab whacky id3 tag info....it's not in the artist or album...or any other spot...somehow Windows media play grabs the right stuff...strange? I figure being able to just grab it all would be neat anyways...
I've looked through the documentation a bit, but there's quite a lot and I'm not even sure what I am looking for....Geeze...it's rough.
Thanks again...this really helped me understand quite a bit so far.
You know what they say...give a man a fish he eats for a day, teach a man to fish he eats for life....
Posts: 12,073
Threads: 140
Joined: Dec 2002
displays most of tags of 10 songs from your music folder.
Macro
out
typelib Id3Lib "id3com.dll"
Dir d; int n
foreach(d "Q:\MP3\*.mp3" FE_Dir 0x4)
,n+1; if(n>10) break
,str sPath=d.FileName(1)
,out "--- %s ---" sPath
,Id3Lib.ID3ComTag t._create
,BSTR b=sPath
,t.Link(b)
,;out t.NumFrames
,Id3Lib.ID3ComFrame f
,;foreach f t ;;does not work. why?
,,;out f.FrameName
,int i j
,for i 0 t.NumFrames
,,f=t.FrameByNum(i)
,,out f.FrameName
,,Id3Lib.ID3ComField fi=f.Field(Id3Lib.ID3_FIELD_TEXT)
,,;Id3Lib.ID3ComField fi=f.Field(Id3Lib.ID3_FIELD_DESCRIPTION)
,,if(fi)
,,,str s
,,,for j 1 fi.NumTextItems+1
,,,,s=fi.Text(j)
,,,,s-"[9]"
,,,,out s
Posts: 1,000
Threads: 253
Joined: Feb 2008
Thanks...That pretty much gets everything...still a few things missing, but better! Now, just to get it for one file
Posts: 1,000
Threads: 253
Joined: Feb 2008
Hmm...that works very odd. It definitely grabs information...it just is odd when testing outcome on multiple files.
Nifty.
Posts: 12,073
Threads: 140
Joined: Dec 2002
The first version of the code did not work well with multiple files.
Posts: 795
Threads: 136
Joined: Feb 2009
Hi all and happy new year.
i just revive that topic because i'd like to play with mp3 files, but i can't find an id3com.dll file which does register
on my windows 7 box.
If someone has a link.
Thanks and nice 2010 to all.
Laurent.
Posts: 12,073
Threads: 140
Joined: Dec 2002
Thank you, I added the dll in the first topic.
Posts: 795
Threads: 136
Joined: Feb 2009
Useful and fast response as usual.
Any chance to have a binary compiled for Windows seven 32 bits of the latest one (0.8.3 i beleive)? Can't do it by myself.
Would be great.
Thanks Gintaras
Posts: 13
Threads: 3
Joined: Sep 2008
Hi all, reviving this old topic to ask:
Has anyone used this to change (or add) lyric tags? (unsyncronised). Or any other of the "advanced" tags. What's the exact command?
This seems pretty basic yet I've lost 2 nights and I'm still where I started!
Thanks in advance for any help.
Posts: 135
Threads: 33
Joined: Aug 2009
Hi Gintaras and all QM fellows. Happy year for everybody!
I have several mp3 files with spam in almost all the tag fields, something like BuySnakeOil.com.
I would like to remove all these strings. I used your last example, the macro removes the strings of few files but suddenly shows:
Error (RT) in MP3 Tags: Exception 0xC0000005. Access violation. Cannot write memory at 0x4. In id3com.dll at 0x35350C6 (0x3520000+0x150C6). ?
Exception in destructors of local variables of MP3 Tags.
Any help, please!
Macro MP3 Tags
str spam1=" - www.SPAM.com"
str spam2="www.moreSPAM.com"
str spam.from(spam1 "|" spam2)
out
typelib Id3Lib "id3com.dll"
Dir d
foreach(d "$desktop$\MP3\*.mp3" FE_Dir 0x4)
,str sPath=d.FileName(1)
,str s=sPath
,if sPath.replacerx(spam)
,,ren s sPath
,out "--- %s ---" sPath
,Id3Lib.ID3ComTag t._create
,BSTR b=sPath
,t.Link(&b)
,;out t.NumFrames
,Id3Lib.ID3ComFrame f
,int i j
,for i 0 t.NumFrames
,,f=t.FrameByNum(i)
,,out f.FrameName
,,Id3Lib.ID3ComField fi=f.Field(Id3Lib.ID3_FIELD_TEXT)
,,;Id3Lib.ID3ComField fi=f.Field(Id3Lib.ID3_FIELD_DESCRIPTION)
,,if(fi)
,,,for j 1 fi.NumTextItems+1
,,,,s=fi.Text(j)
,,,,if s.replacerx(spam)
,,,,,BSTR bs=s
,,,,,fi.Text(j)=bs
,,,,s-"[9]"
,,,,out s
,t.SaveV1Tag
,t.SaveV2Tag
Posts: 12,073
Threads: 140
Joined: Dec 2002
Does it show in which line is the error?
Posts: 135
Threads: 33
Joined: Aug 2009
Posts: 12,073
Threads: 140
Joined: Dec 2002
Either a bug in the component, or don't need to call SaveV2Tag for each file.
VBScript also fails after eg 10 files.
Macro Macro1867
Dir d
foreach(d "$desktop$\MP3\*.mp3" FE_Dir 0x4)
,str sPath=d.FileName(1)
,str s=sPath
,out "--- %s ---" sPath
,str vbs=
,F
,;dim t
,;set t=CreateObject("Id3COM.ID3ComTag")
,;t.Link("{sPath}")
,;t.SaveV1Tag
,;t.SaveV2Tag
,VbsExec vbs
Posts: 135
Threads: 33
Joined: Aug 2009
Any other option like Taglib or cddbcontrol.dll?
There are several implementations for the MP3 Tag Standard, but I am not sure wich one fits better with our targets.
http://id3.org/Implementations
Thanks.
Posts: 135
Threads: 33
Joined: Aug 2009
It's not the best code but it works for me.
Macro MP3 Tags
str spam1=" - www.SPAM.com"
str spam2="www.moreSPAM.com"
str sSpam.from(spam1 "|" spam2)
out
;typelib Id3Lib "id3com.dll"
Dir d
foreach(d "$desktop$\MP3\*.mp3" FE_Dir 0x4)
,str sPath=d.FileName(1)
,Rename_MP3Tag sPath sSpam
Function Rename_MP3Tag
;/
function str'sPath str'sSpam
str s=sPath
if sPath.replacerx(sSpam)
,ren s sPath
out "--- %s ---" sPath
typelib Id3Lib "id3com.dll"
Id3Lib.ID3ComTag t._create
BSTR b=sPath
t.Link(&b)
;out t.NumFrames
Id3Lib.ID3ComFrame f
int i j
for i 0 t.NumFrames
,f=t.FrameByNum(i)
,;out f.FrameName
,Id3Lib.ID3ComField fi=f.Field(Id3Lib.ID3_FIELD_TEXT)
,;Id3Lib.ID3ComField fi=f.Field(Id3Lib.ID3_FIELD_DESCRIPTION)
,if(fi)
,,for j 1 fi.NumTextItems+1
,,,s=fi.Text(j)
,,,if s.replacerx(sSpam)
,,,,BSTR bs=s
,,,,fi.Text(j)=bs
,,,;s-"[9]"
,,,;out s
t.SaveV1Tag
t.SaveV2Tag
|