AIM Music LinkAIM Music Link is an Open AIM plugin written in C++ and COM/ATL that will set your AIM status based on the music you are listening from 7 supported media players. The AIM status can be viewed by you and your buddies in the buddy list. AIM Music Link gets the current playing song from the following media players:
| Player | Version |
|---|---|
| 4.0+ | |
| 3.0+ | |
| 3.4.2.1+ | |
| 2.0+ | |
| 10+ | |
| 0.5+ | |
| 0.9.5.4+ |
| Player | Version |
|---|---|
| 4.0+ | |
| 3.0+ | |
| 3.4.2.1+ | |
| 2.0+ | |
| 10+ | |
| 0.5+ | |
| 0.9.5.4+ | |
Q: How do I access the AIM MusicLink preferences?
A: AIM MusicLink preferences can be found via the Actions menu at the bottom of the buddy list.

Q: How can I turn on or off AIM MusicLink logging?
A: Open the AIM MusicLink preferences and choose the appropriate check box. AIM MusicLink supports a wide variety of preferences as you can see below.

The latest version of AIM Music Link is 2.2.0.0. You can download AIM Music Link at the AIM Galery. Older versions are available below, but users download these older versions at their own risk as these older version may not work with the latest AIM client.
AIM Music Link takes advantage of the Open AIM APIs available at http://open.aim.com. Anyone can use the APIs that I am using to build AIM Music Link. Below are code samples in a variety of programming languages that Open AIM supports. The code samples will show how to set a user's profile/buddy info as well as their status message and the url that the status message may point to. The code samples will not show how to obtain music information from any of the supported AIM Music Link players.
AIM Status message dates back to 2003, when we added OSCAR protocol to support Apple's iChat client setting a user's status message for display in the iChat Buddy List. Soon after we added additional protocol for the "Status Link" which allowed developers to set a URL associated with the status message.
HRESULT CAimMusicLink::SetProfileAndStatusMsg(const CComBSTR& song, const CComBSTR& url)
{
CComBSTR profile, plain, type;
CString xSong(song);
CComVariant vProfile;
HRESULT hrProfile = m_spiSession->get_Property(AccSessionProp_Profile, &vProfile);
if (hrProfile == ACC_E_NOT_LOGGED_ON)
return S_FALSE;
if (vProfile.vt == VT_DISPATCH)
{
CComQIPtr spiIm(vProfile.pdispVal);
if (spiIm)
{
spiIm->GetConvertedText(OLESTR("text/plain"), &plain);
}
CString work;
if (plain)
work = plain;
work.TrimLeft();
if (work.IsEmpty())
{
// no profile, write a nice sentence
work.Format(_T("I'm currently listening to %s."), xSong);
type = OLESTR("text/x-aolrtf");
}
// copy your work back into the profile
profile = work;
// Set the new profile
CComPtr spiProfile;
if (SUCCEEDED(m_spiSession->CreateIm(profile, type, &spiProfile)))
m_spiSession->put_Property(AccSessionProp_Profile, CComVariant(spiProfile));
}
// now lets set the status message
CString cSong(song);
if (cSong.GetLength() > 0)
{
CString cNote(_T("\u266B"));
cNote += " ";
cNote += cSong;
CComBSTR finalSong(cNote);
hr = m_spiSession->put_Property(AccSessionProp_StatusTextLink, CComVariant(url));
hr = m_spiSession->put_Property(AccSessionProp_StatusText, CComVariant(finalSong));
}
}
public void SetProfileAndStatusMsg(string song, string url)
{
string profile, plain, type = "";
string xSong = song;
object vProfile = "";
try
{
vProfile = s.get_Property(AccSessionProp.AccSessionProp_Profile);
}
catch (COMException e)
{
if (e.ErrorCode == (int)AccResult.ACC_E_NOT_LOGGED_ON)
return;
}
IAccIm im = (IAccIm) vProfile;
plain = im.GetConvertedText("text/plain");
string work = "";
if (plain.Length > 0)
work = plain;
work.Trim();
if (work.Length > 0)
{
// no profile, write a nice sentence
work = string.Format("I'm currently listening to {0}.", xSong);
type = "text/x-aolrtf";
}
// copy your work back into the profile
profile = work;
// Set the new profile
IAccIm piProfile = s.CreateIm(profile, type);
s.set_Property(AccSessionProp.AccSessionProp_Profile, (object)piProfile);
// now lets set the status message
string cSong = song;
if (cSong.Length > 0)
{
string cNote= "\u266B";
cNote += " ";
cNote += cSong;
s.set_Property(AccSessionProp.AccSessionProp_StatusTextLink, (object)url);
s.set_Property(AccSessionProp.AccSessionProp_StatusText, (object)cNote);
}
}
Public Sub SetProfileAndStatusMsg(ByVal song As String, ByVal url As String)
Dim profile As String,plain As String,type As String = ""
Dim xSong As String = song
Dim vProfile As Object = ""
Try
vProfile = s.get_Property(AccSessionProp.AccSessionProp_Profile)
Catch e As COMException
If e.ErrorCode = CType(AccResult.ACC_E_NOT_LOGGED_ON,Integer) Then
Return
End If
End Try
Dim im As IAccIm = CType(vProfile, IAccIm)
plain = im.GetConvertedText("text/plain")
Dim work As String = ""
If plain.Length > 0 Then
work = plain
End If
work.Trim()
If work.Length > 0 Then
' no profile, write a nice sentence
work = String.Format("I'm currently listening to {0}.", xSong)
type = "text/x-aolrtf"
End If
' copy your work back into the profile
profile = work
' Set the new profile
Dim piProfile As IAccIm = s.CreateIm(profile,type)
s.set_Property(AccSessionProp.AccSessionProp_Profile, CType(piProfile, Object))
' now lets set the status message
Dim cSong As String = song
If cSong.Length > 0 Then
Dim cNote As String = "\u266B"
cNote += " "
cNote += cSong
s.set_Property(AccSessionProp.AccSessionProp_StatusTextLink, CType(url, Object))
s.set_Property(AccSessionProp.AccSessionProp_StatusText, CType(cNote, Object))
End If
End Sub
function SetProfileAndStatusMsg(song, url)
{
var xSong = song;
var vProfile = session.Profile;
var plain = vProfile.getConvertedText("text/plain");
var type;
if (plain.length == 0)
{
work = "I'm currently listening to " + xSong " ".;
type = "text/x-aolrtf";
}
var im = s.createIm(work, type);
session.Profile = im;
var cSong = "\u266B" + " " + song;
session.StatusText = cSong;
session.StatusTextLink = url;
}
AIM MusicLink is property of Gregory Cypes and AOL LLC